3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg 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 * FFmpeg 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 FFmpeg; 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"
48 #include "libswresample/swresample.h"
50 #include "libavformat/ffm.h" // not public API
53 # include "libavfilter/avcodec.h"
54 # include "libavfilter/avfilter.h"
55 # include "libavfilter/avfiltergraph.h"
56 # include "libavfilter/buffersink.h"
57 # include "libavfilter/vsrc_buffer.h"
60 #if HAVE_SYS_RESOURCE_H
61 #include <sys/types.h>
63 #include <sys/resource.h>
64 #elif HAVE_GETPROCESSTIMES
67 #if HAVE_GETPROCESSMEMORYINFO
73 #include <sys/select.h>
78 #include <sys/ioctl.h>
88 #include "libavutil/avassert.h"
90 const char program_name[] = "ffmpeg";
91 const int program_birth_year = 2000;
93 /* select an input stream for an output stream */
94 typedef struct StreamMap {
95 int disabled; /** 1 is this mapping is disabled by a negative map */
99 int sync_stream_index;
103 int file_idx, stream_idx, channel_idx; // input
104 int ofile_idx, ostream_idx; // output
108 * select an input file for an output file
110 typedef struct MetadataMap {
111 int file; ///< file index
112 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
113 int index; ///< stream/chapter/program number
116 static const OptionDef options[];
118 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
120 static int frame_bits_per_raw_sample = 0;
121 static int video_discard = 0;
122 static int same_quant = 0;
123 static int do_deinterlace = 0;
124 static int intra_dc_precision = 8;
125 static int loop_input = 0;
126 static int loop_output = AVFMT_NOOUTPUTLOOP;
127 static int qp_hist = 0;
128 static int intra_only = 0;
129 static const char *video_codec_name = NULL;
130 static const char *audio_codec_name = NULL;
131 static const char *subtitle_codec_name = NULL;
133 static int file_overwrite = 0;
134 static int no_file_overwrite = 0;
135 static int do_benchmark = 0;
136 static int do_hex_dump = 0;
137 static int do_pkt_dump = 0;
138 static int do_psnr = 0;
139 static int do_pass = 0;
140 static const char *pass_logfilename_prefix;
141 static int video_sync_method= -1;
142 static int audio_sync_method= 0;
143 static float audio_drift_threshold= 0.1;
144 static int copy_ts= 0;
145 static int copy_tb= -1;
146 static int opt_shortest = 0;
147 static char *vstats_filename;
148 static FILE *vstats_file;
150 static int audio_volume = 256;
152 static int exit_on_error = 0;
153 static int using_stdin = 0;
154 static int run_as_daemon = 0;
155 static volatile int received_nb_signals = 0;
156 static int64_t video_size = 0;
157 static int64_t audio_size = 0;
158 static int64_t extra_size = 0;
159 static int nb_frames_dup = 0;
160 static int nb_frames_drop = 0;
161 static int input_sync;
163 static float dts_delta_threshold = 10;
165 static int print_stats = 1;
167 static uint8_t *audio_buf;
168 static uint8_t *audio_out;
169 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
171 static void *samples;
172 static uint8_t *input_tmp= NULL;
174 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
176 typedef struct InputStream {
179 int discard; /* true if stream data should be discarded */
180 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
183 int64_t start; /* time when read started */
184 int64_t next_pts; /* synthetic pts for cases where pkt.pts
186 int64_t pts; /* current pts */
188 int is_start; /* is 1 at the start and after a discontinuity */
189 int showed_multi_packet_warning;
193 typedef struct InputFile {
194 AVFormatContext *ctx;
195 int eof_reached; /* true if eof reached */
196 int ist_index; /* index of first stream in input_streams */
197 int buffer_size; /* current total buffer size */
199 int nb_streams; /* number of stream that ffmpeg is aware of; may be different
200 from ctx.nb_streams if new streams appear during av_read_frame() */
204 typedef struct OutputStream {
205 int file_index; /* file index */
206 int index; /* stream index in the output file */
207 int source_index; /* InputStream index */
208 AVStream *st; /* stream in the output file */
209 int encoding_needed; /* true if encoding needed for this stream */
211 /* input pts and corresponding output pts
213 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
214 struct InputStream *sync_ist; /* input stream to sync against */
215 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
216 AVBitStreamFilterContext *bitstream_filters;
222 AVFrame resample_frame; /* temporary frame for image resampling */
223 struct SwsContext *img_resample_ctx; /* for image resampling */
226 int resample_pix_fmt;
227 AVRational frame_rate;
231 float frame_aspect_ratio;
233 /* forced key frames */
234 int64_t *forced_kf_pts;
240 int audio_channels_map[SWR_CH_MAX]; ///< list of the channels id to pick from the source stream
241 int audio_channels_mapped; ///< number of channels in audio_channels_map
242 int resample_sample_fmt;
243 int resample_channels;
244 int resample_sample_rate;
245 float rematrix_volume;
246 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
249 struct SwrContext *swr;
252 AVFilterContext *output_video_filter;
253 AVFilterContext *input_video_filter;
254 AVFilterBufferRef *picref;
256 AVFilterGraph *graph;
261 int is_past_recording_time;
263 const char *attachment_filename;
264 int copy_initial_nonkeyframes;
270 /* init terminal so that we can grab keys */
271 static struct termios oldtty;
274 typedef struct OutputFile {
275 AVFormatContext *ctx;
277 int ost_index; /* index of the first stream in output_streams */
278 int64_t recording_time; /* desired length of the resulting file in microseconds */
279 int64_t start_time; /* start time in microseconds */
280 uint64_t limit_filesize;
283 static InputStream *input_streams = NULL;
284 static int nb_input_streams = 0;
285 static InputFile *input_files = NULL;
286 static int nb_input_files = 0;
288 static OutputStream *output_streams = NULL;
289 static int nb_output_streams = 0;
290 static OutputFile *output_files = NULL;
291 static int nb_output_files = 0;
293 typedef struct OptionsContext {
294 /* input/output options */
298 SpecifierOpt *codec_names;
300 SpecifierOpt *audio_channels;
301 int nb_audio_channels;
302 SpecifierOpt *audio_sample_rate;
303 int nb_audio_sample_rate;
304 SpecifierOpt *rematrix_volume;
305 int nb_rematrix_volume;
306 SpecifierOpt *frame_rates;
308 SpecifierOpt *frame_sizes;
310 SpecifierOpt *frame_pix_fmts;
311 int nb_frame_pix_fmts;
314 int64_t input_ts_offset;
317 SpecifierOpt *ts_scale;
319 SpecifierOpt *dump_attachment;
320 int nb_dump_attachment;
323 StreamMap *stream_maps;
325 AudioChannelMap *audio_channel_maps; ///< one info entry per -map_channel
326 int nb_audio_channel_maps; ///< number of (valid) -map_channel settings
327 /* first item specifies output metadata, second is input */
328 MetadataMap (*meta_data_maps)[2];
329 int nb_meta_data_maps;
330 int metadata_global_manual;
331 int metadata_streams_manual;
332 int metadata_chapters_manual;
333 const char **attachments;
336 int chapters_input_file;
338 int64_t recording_time;
339 uint64_t limit_filesize;
345 int subtitle_disable;
348 /* indexed by output file stream index */
352 SpecifierOpt *metadata;
354 SpecifierOpt *max_frames;
356 SpecifierOpt *bitstream_filters;
357 int nb_bitstream_filters;
358 SpecifierOpt *codec_tags;
360 SpecifierOpt *sample_fmts;
362 SpecifierOpt *qscale;
364 SpecifierOpt *forced_key_frames;
365 int nb_forced_key_frames;
366 SpecifierOpt *force_fps;
368 SpecifierOpt *frame_aspect_ratios;
369 int nb_frame_aspect_ratios;
370 SpecifierOpt *rc_overrides;
372 SpecifierOpt *intra_matrices;
373 int nb_intra_matrices;
374 SpecifierOpt *inter_matrices;
375 int nb_inter_matrices;
376 SpecifierOpt *top_field_first;
377 int nb_top_field_first;
378 SpecifierOpt *presets;
380 SpecifierOpt *copy_initial_nonkeyframes;
381 int nb_copy_initial_nonkeyframes;
383 SpecifierOpt *filters;
388 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
391 for (i = 0; i < o->nb_ ## name; i++) {\
392 char *spec = o->name[i].specifier;\
393 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
394 outvar = o->name[i].u.type;\
400 static void reset_options(OptionsContext *o, int is_input)
402 const OptionDef *po = options;
403 OptionsContext bak= *o;
405 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
407 void *dst = (uint8_t*)o + po->u.off;
409 if (po->flags & OPT_SPEC) {
410 SpecifierOpt **so = dst;
411 int i, *count = (int*)(so + 1);
412 for (i = 0; i < *count; i++) {
413 av_freep(&(*so)[i].specifier);
414 if (po->flags & OPT_STRING)
415 av_freep(&(*so)[i].u.str);
419 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
424 av_freep(&o->stream_maps);
425 av_freep(&o->audio_channel_maps);
426 av_freep(&o->meta_data_maps);
427 av_freep(&o->streamid_map);
429 memset(o, 0, sizeof(*o));
431 if(is_input) o->recording_time = bak.recording_time;
432 else o->recording_time = INT64_MAX;
433 o->mux_max_delay = 0.7;
434 o->limit_filesize = UINT64_MAX;
435 o->chapters_input_file = INT_MAX;
443 static int configure_video_filters(InputStream *ist, OutputStream *ost)
445 AVFilterContext *last_filter, *filter;
446 /** filter graph containing all filters including input & output */
447 AVCodecContext *codec = ost->st->codec;
448 AVCodecContext *icodec = ist->st->codec;
449 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
450 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
451 AVRational sample_aspect_ratio;
455 ost->graph = avfilter_graph_alloc();
457 if (ist->st->sample_aspect_ratio.num){
458 sample_aspect_ratio = ist->st->sample_aspect_ratio;
460 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
462 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
463 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
464 sample_aspect_ratio.num, sample_aspect_ratio.den);
466 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
467 "src", args, NULL, ost->graph);
470 #if FF_API_OLD_VSINK_API
471 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
472 "out", NULL, pix_fmts, ost->graph);
474 buffersink_params->pixel_fmts = pix_fmts;
475 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
476 "out", NULL, buffersink_params, ost->graph);
478 av_freep(&buffersink_params);
481 last_filter = ost->input_video_filter;
483 if (codec->width != icodec->width || codec->height != icodec->height) {
484 snprintf(args, 255, "%d:%d:flags=0x%X",
487 (unsigned)ost->sws_flags);
488 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
489 NULL, args, NULL, ost->graph)) < 0)
491 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
493 last_filter = filter;
496 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
497 ost->graph->scale_sws_opts = av_strdup(args);
500 AVFilterInOut *outputs = avfilter_inout_alloc();
501 AVFilterInOut *inputs = avfilter_inout_alloc();
503 outputs->name = av_strdup("in");
504 outputs->filter_ctx = last_filter;
505 outputs->pad_idx = 0;
506 outputs->next = NULL;
508 inputs->name = av_strdup("out");
509 inputs->filter_ctx = ost->output_video_filter;
513 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
515 av_freep(&ost->avfilter);
517 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
521 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
524 codec->width = ost->output_video_filter->inputs[0]->w;
525 codec->height = ost->output_video_filter->inputs[0]->h;
526 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
527 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
528 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
529 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
533 #endif /* CONFIG_AVFILTER */
535 static void term_exit(void)
537 av_log(NULL, AV_LOG_QUIET, "%s", "");
540 tcsetattr (0, TCSANOW, &oldtty);
544 static volatile int received_sigterm = 0;
546 static void sigterm_handler(int sig)
548 received_sigterm = sig;
549 received_nb_signals++;
553 static void term_init(void)
563 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
564 |INLCR|IGNCR|ICRNL|IXON);
565 tty.c_oflag |= OPOST;
566 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
567 tty.c_cflag &= ~(CSIZE|PARENB);
572 tcsetattr (0, TCSANOW, &tty);
573 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
576 avformat_network_deinit();
578 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
579 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
581 signal(SIGXCPU, sigterm_handler);
585 /* read a key without blocking */
586 static int read_key(void)
598 n = select(1, &rfds, NULL, NULL, &tv);
607 # if HAVE_PEEKNAMEDPIPE
609 static HANDLE input_handle;
612 input_handle = GetStdHandle(STD_INPUT_HANDLE);
613 is_pipe = !GetConsoleMode(input_handle, &dw);
616 if (stdin->_cnt > 0) {
621 /* When running under a GUI, you will end here. */
622 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
639 static int decode_interrupt_cb(void *ctx)
641 return received_nb_signals > 1;
644 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
646 void av_noreturn exit_program(int ret)
651 for(i=0;i<nb_output_files;i++) {
652 AVFormatContext *s = output_files[i].ctx;
653 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
655 avformat_free_context(s);
656 av_dict_free(&output_files[i].opts);
658 for(i=0;i<nb_input_files;i++) {
659 av_close_input_file(input_files[i].ctx);
661 for (i = 0; i < nb_input_streams; i++)
662 av_dict_free(&input_streams[i].opts);
666 av_free(vstats_filename);
668 av_freep(&input_streams);
669 av_freep(&input_files);
670 av_freep(&output_streams);
671 av_freep(&output_files);
676 allocated_audio_buf_size= allocated_audio_out_size= 0;
682 avformat_network_deinit();
684 av_freep(&input_tmp);
686 if (received_sigterm) {
687 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
688 (int) received_sigterm);
692 exit(ret); /* not all OS-es handle main() return value */
695 static void assert_avoptions(AVDictionary *m)
697 AVDictionaryEntry *t;
698 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
699 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
704 static void assert_codec_experimental(AVCodecContext *c, int encoder)
706 const char *codec_string = encoder ? "encoder" : "decoder";
708 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
709 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
710 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
711 "results.\nAdd '-strict experimental' if you want to use it.\n",
712 codec_string, c->codec->name);
713 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
714 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
715 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
716 codec_string, codec->name);
721 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
723 if(codec && codec->sample_fmts){
724 const enum AVSampleFormat *p= codec->sample_fmts;
726 if(*p == st->codec->sample_fmt)
730 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
731 av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
732 if(av_get_sample_fmt_name(st->codec->sample_fmt))
733 av_log(NULL, AV_LOG_WARNING,
734 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
735 av_get_sample_fmt_name(st->codec->sample_fmt),
737 av_get_sample_fmt_name(codec->sample_fmts[0]));
738 st->codec->sample_fmt = codec->sample_fmts[0];
743 static void choose_sample_rate(AVStream *st, AVCodec *codec)
745 if(codec && codec->supported_samplerates){
746 const int *p= codec->supported_samplerates;
748 int best_dist=INT_MAX;
750 int dist= abs(st->codec->sample_rate - *p);
751 if(dist < best_dist){
757 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
759 st->codec->sample_rate= best;
763 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
765 if(codec && codec->pix_fmts){
766 const enum PixelFormat *p= codec->pix_fmts;
767 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
768 if(st->codec->codec_id==CODEC_ID_MJPEG){
769 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
770 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
771 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};
774 for (; *p != PIX_FMT_NONE; p++) {
775 if(*p == st->codec->pix_fmt)
778 if (*p == PIX_FMT_NONE) {
779 if(st->codec->pix_fmt != PIX_FMT_NONE)
780 av_log(NULL, AV_LOG_WARNING,
781 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
782 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
784 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
785 st->codec->pix_fmt = codec->pix_fmts[0];
790 static double get_sync_ipts(const OutputStream *ost)
792 const InputStream *ist = ost->sync_ist;
793 OutputFile *of = &output_files[ost->file_index];
794 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
797 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc)
802 AVPacket new_pkt= *pkt;
803 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
804 &new_pkt.data, &new_pkt.size,
805 pkt->data, pkt->size,
806 pkt->flags & AV_PKT_FLAG_KEY);
809 new_pkt.destruct= av_destruct_packet;
811 av_log(NULL, AV_LOG_ERROR, "%s failed for stream %d, codec %s",
812 bsfc->filter->name, pkt->stream_index,
813 avctx->codec ? avctx->codec->name : "copy");
823 ret= av_interleaved_write_frame(s, pkt);
825 print_error("av_interleaved_write_frame()", ret);
830 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
832 int fill_char = 0x00;
833 if (sample_fmt == AV_SAMPLE_FMT_U8)
835 memset(buf, fill_char, size);
838 static void do_audio_out(AVFormatContext *s,
841 unsigned char *buf, int size)
844 int64_t audio_out_size, audio_buf_size;
845 int64_t allocated_for_size= size;
847 int size_out, frame_bytes, ret, resample_changed;
848 AVCodecContext *enc= ost->st->codec;
849 AVCodecContext *dec= ist->st->codec;
850 int osize = av_get_bytes_per_sample(enc->sample_fmt);
851 int isize = av_get_bytes_per_sample(dec->sample_fmt);
852 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
855 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
856 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
857 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
858 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
859 audio_buf_size*= osize*enc->channels;
861 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
862 if(coded_bps > 8*osize)
863 audio_out_size= audio_out_size * coded_bps / (8*osize);
864 audio_out_size += FF_MIN_BUFFER_SIZE;
866 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
867 av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n");
871 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
872 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
873 if (!audio_buf || !audio_out){
874 av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
878 if (enc->channels != dec->channels
879 || enc->sample_fmt != dec->sample_fmt)
880 ost->audio_resample = 1;
882 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
883 ost->resample_channels != dec->channels ||
884 ost->resample_sample_rate != dec->sample_rate;
886 if ((ost->audio_resample && !ost->swr) || resample_changed || ost->audio_channels_mapped) {
887 if (resample_changed) {
888 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",
889 ist->file_index, ist->st->index,
890 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
891 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
892 ost->resample_sample_fmt = dec->sample_fmt;
893 ost->resample_channels = dec->channels;
894 ost->resample_sample_rate = dec->sample_rate;
897 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
898 if (audio_sync_method <= 1 && !ost->audio_channels_mapped &&
899 ost->resample_sample_fmt == enc->sample_fmt &&
900 ost->resample_channels == enc->channels &&
901 ost->resample_sample_rate == enc->sample_rate) {
903 ost->audio_resample = 0;
905 ost->swr = swr_alloc_set_opts(ost->swr,
906 enc->channel_layout, enc->sample_fmt, enc->sample_rate,
907 dec->channel_layout, dec->sample_fmt, dec->sample_rate,
909 if (ost->audio_channels_mapped)
910 swr_set_channel_mapping(ost->swr, ost->audio_channels_map);
911 av_opt_set_double(ost->swr, "rmvol", ost->rematrix_volume, 0);
912 if (ost->audio_channels_mapped) {
913 av_opt_set_int(ost->swr, "icl", av_get_default_channel_layout(ost->audio_channels_mapped), 0);
914 av_opt_set_int(ost->swr, "uch", ost->audio_channels_mapped, 0);
916 av_opt_set_int(ost->swr, "ich", dec->channels, 0);
917 av_opt_set_int(ost->swr, "och", enc->channels, 0);
918 if(audio_sync_method>1) av_opt_set_int(ost->swr, "flags", SWR_FLAG_RESAMPLE, 0);
919 if(ost->swr && swr_init(ost->swr) < 0){
920 av_log(NULL, AV_LOG_FATAL, "swr_init() failed\n");
925 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
926 dec->channels, dec->sample_rate,
927 enc->channels, enc->sample_rate);
933 av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
935 if(audio_sync_method){
936 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
937 - av_fifo_size(ost->fifo)/(enc->channels * osize);
938 int idelta = delta * dec->sample_rate / enc->sample_rate;
939 int byte_delta = idelta * isize * dec->channels;
941 //FIXME resample delay
942 if(fabs(delta) > 50){
943 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
945 byte_delta= FFMAX(byte_delta, -size);
948 av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n",
949 -byte_delta / (isize * dec->channels));
954 input_tmp= av_realloc(input_tmp, byte_delta + size);
956 if(byte_delta > allocated_for_size - size){
957 allocated_for_size= byte_delta + (int64_t)size;
962 generate_silence(input_tmp, dec->sample_fmt, byte_delta);
963 memcpy(input_tmp + byte_delta, buf, size);
966 av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
968 }else if(audio_sync_method>1){
969 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
970 av_assert0(ost->audio_resample);
971 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
972 delta, comp, enc->sample_rate);
973 // 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));
974 swr_compensate(ost->swr, comp, enc->sample_rate);
978 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
979 - av_fifo_size(ost->fifo)/(enc->channels * osize); //FIXME wrong
981 if (ost->audio_resample) {
983 size_out = swr_convert(ost->swr, ( uint8_t*[]){buftmp}, audio_buf_size / (enc->channels * osize),
984 (const uint8_t*[]){buf }, size / (dec->channels * isize));
985 size_out = size_out * enc->channels * osize;
991 av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
993 /* now encode as many frames as possible */
994 if (enc->frame_size > 1) {
995 /* output resampled raw samples */
996 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
997 av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
1000 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
1002 frame_bytes = enc->frame_size * osize * enc->channels;
1004 while (av_fifo_size(ost->fifo) >= frame_bytes) {
1006 av_init_packet(&pkt);
1008 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
1010 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1012 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
1013 (short *)audio_buf);
1015 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1019 pkt.stream_index= ost->index;
1020 pkt.data= audio_out;
1022 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1023 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1024 pkt.flags |= AV_PKT_FLAG_KEY;
1025 write_frame(s, &pkt, enc, ost->bitstream_filters);
1027 ost->sync_opts += enc->frame_size;
1031 av_init_packet(&pkt);
1033 ost->sync_opts += size_out / (osize * enc->channels);
1035 /* output a pcm frame */
1036 /* determine the size of the coded buffer */
1039 size_out = size_out*coded_bps/8;
1041 if(size_out > audio_out_size){
1042 av_log(NULL, AV_LOG_FATAL, "Internal error, buffer size too small\n");
1046 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1047 ret = avcodec_encode_audio(enc, audio_out, size_out,
1050 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1054 pkt.stream_index= ost->index;
1055 pkt.data= audio_out;
1057 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1058 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1059 pkt.flags |= AV_PKT_FLAG_KEY;
1060 write_frame(s, &pkt, enc, ost->bitstream_filters);
1064 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1066 AVCodecContext *dec;
1067 AVPicture *picture2;
1068 AVPicture picture_tmp;
1071 dec = ist->st->codec;
1073 /* deinterlace : must be done before any resize */
1074 if (do_deinterlace) {
1077 /* create temporary picture */
1078 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1079 buf = av_malloc(size);
1083 picture2 = &picture_tmp;
1084 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1086 if(avpicture_deinterlace(picture2, picture,
1087 dec->pix_fmt, dec->width, dec->height) < 0) {
1088 /* if error, do not deinterlace */
1089 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1098 if (picture != picture2)
1099 *picture = *picture2;
1103 static void do_subtitle_out(AVFormatContext *s,
1109 static uint8_t *subtitle_out = NULL;
1110 int subtitle_out_max_size = 1024 * 1024;
1111 int subtitle_out_size, nb, i;
1112 AVCodecContext *enc;
1115 if (pts == AV_NOPTS_VALUE) {
1116 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1122 enc = ost->st->codec;
1124 if (!subtitle_out) {
1125 subtitle_out = av_malloc(subtitle_out_max_size);
1128 /* Note: DVB subtitle need one packet to draw them and one other
1129 packet to clear them */
1130 /* XXX: signal it in the codec context ? */
1131 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1136 for(i = 0; i < nb; i++) {
1137 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1138 // start_display_time is required to be 0
1139 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1140 sub->end_display_time -= sub->start_display_time;
1141 sub->start_display_time = 0;
1142 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1143 subtitle_out_max_size, sub);
1144 if (subtitle_out_size < 0) {
1145 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1149 av_init_packet(&pkt);
1150 pkt.stream_index = ost->index;
1151 pkt.data = subtitle_out;
1152 pkt.size = subtitle_out_size;
1153 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1154 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1155 /* XXX: the pts correction is handled here. Maybe handling
1156 it in the codec would be better */
1158 pkt.pts += 90 * sub->start_display_time;
1160 pkt.pts += 90 * sub->end_display_time;
1162 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1166 static int bit_buffer_size= 1024*256;
1167 static uint8_t *bit_buffer= NULL;
1169 static void do_video_resample(OutputStream *ost,
1171 AVFrame *in_picture,
1172 AVFrame **out_picture)
1175 *out_picture = in_picture;
1177 AVCodecContext *dec = ist->st->codec;
1178 AVCodecContext *enc = ost->st->codec;
1179 int resample_changed = ost->resample_width != dec->width ||
1180 ost->resample_height != dec->height ||
1181 ost->resample_pix_fmt != dec->pix_fmt;
1183 *out_picture = in_picture;
1184 if (resample_changed) {
1185 av_log(NULL, AV_LOG_INFO,
1186 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1187 ist->file_index, ist->st->index,
1188 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1189 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1190 ost->resample_width = dec->width;
1191 ost->resample_height = dec->height;
1192 ost->resample_pix_fmt = dec->pix_fmt;
1195 ost->video_resample = dec->width != enc->width ||
1196 dec->height != enc->height ||
1197 dec->pix_fmt != enc->pix_fmt;
1199 if (ost->video_resample) {
1200 *out_picture = &ost->resample_frame;
1201 if (!ost->img_resample_ctx || resample_changed) {
1202 /* initialize the destination picture */
1203 if (!ost->resample_frame.data[0]) {
1204 avcodec_get_frame_defaults(&ost->resample_frame);
1205 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1206 enc->width, enc->height)) {
1207 av_log(NULL, AV_LOG_FATAL, "Cannot allocate temp picture, check pix fmt\n");
1211 /* initialize a new scaler context */
1212 sws_freeContext(ost->img_resample_ctx);
1213 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1214 enc->width, enc->height, enc->pix_fmt,
1215 ost->sws_flags, NULL, NULL, NULL);
1216 if (ost->img_resample_ctx == NULL) {
1217 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1221 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1222 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1228 static void do_video_out(AVFormatContext *s,
1231 AVFrame *in_picture,
1232 int *frame_size, float quality)
1234 int nb_frames, i, ret, format_video_sync;
1235 AVFrame *final_picture;
1236 AVCodecContext *enc;
1238 double duration = 0;
1240 enc = ost->st->codec;
1242 if (ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE) {
1243 duration = FFMAX(av_q2d(ist->st->time_base), av_q2d(ist->st->codec->time_base));
1244 if(ist->st->avg_frame_rate.num)
1245 duration= FFMAX(duration, 1/av_q2d(ist->st->avg_frame_rate));
1247 duration /= av_q2d(enc->time_base);
1250 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1252 /* by default, we output a single frame */
1257 format_video_sync = video_sync_method;
1258 if (format_video_sync < 0)
1259 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? 0 : 2) : 1;
1261 if (format_video_sync) {
1262 double vdelta = sync_ipts - ost->sync_opts + duration;
1263 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1266 else if (format_video_sync == 2) {
1269 }else if(vdelta>0.6)
1270 ost->sync_opts= lrintf(sync_ipts);
1271 }else if (vdelta > 1.1)
1272 nb_frames = lrintf(vdelta);
1273 //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);
1274 if (nb_frames == 0){
1276 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1277 }else if (nb_frames > 1) {
1278 nb_frames_dup += nb_frames - 1;
1279 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames-1);
1282 ost->sync_opts= lrintf(sync_ipts);
1284 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1288 do_video_resample(ost, ist, in_picture, &final_picture);
1290 /* duplicates frame if needed */
1291 for(i=0;i<nb_frames;i++) {
1293 av_init_packet(&pkt);
1294 pkt.stream_index= ost->index;
1296 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1297 /* raw pictures are written as AVPicture structure to
1298 avoid any copies. We support temporarily the older
1300 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1301 enc->coded_frame->top_field_first = in_picture->top_field_first;
1302 pkt.data= (uint8_t *)final_picture;
1303 pkt.size= sizeof(AVPicture);
1304 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1305 pkt.flags |= AV_PKT_FLAG_KEY;
1307 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1309 AVFrame big_picture;
1311 big_picture= *final_picture;
1312 /* better than nothing: use input picture interlaced
1314 big_picture.interlaced_frame = in_picture->interlaced_frame;
1315 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1316 if (ost->top_field_first == -1)
1317 big_picture.top_field_first = in_picture->top_field_first;
1319 big_picture.top_field_first = !!ost->top_field_first;
1322 /* handles same_quant here. This is not correct because it may
1323 not be a global option */
1324 big_picture.quality = quality;
1325 if (!enc->me_threshold)
1326 big_picture.pict_type = 0;
1327 // big_picture.pts = AV_NOPTS_VALUE;
1328 big_picture.pts= ost->sync_opts;
1329 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1330 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1331 if (ost->forced_kf_index < ost->forced_kf_count &&
1332 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1333 big_picture.pict_type = AV_PICTURE_TYPE_I;
1334 ost->forced_kf_index++;
1336 ret = avcodec_encode_video(enc,
1337 bit_buffer, bit_buffer_size,
1340 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1345 pkt.data= bit_buffer;
1347 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1348 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1349 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1350 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1351 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1353 if(enc->coded_frame->key_frame)
1354 pkt.flags |= AV_PKT_FLAG_KEY;
1355 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1358 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1359 // enc->frame_number-1, ret, enc->pict_type);
1360 /* if two pass, output log */
1361 if (ost->logfile && enc->stats_out) {
1362 fprintf(ost->logfile, "%s", enc->stats_out);
1367 ost->frame_number++;
1371 static double psnr(double d)
1373 return -10.0*log(d)/log(10.0);
1376 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1379 AVCodecContext *enc;
1381 double ti1, bitrate, avg_bitrate;
1383 /* this is executed just the first time do_video_stats is called */
1385 vstats_file = fopen(vstats_filename, "w");
1392 enc = ost->st->codec;
1393 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1394 frame_number = ost->frame_number;
1395 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1396 if (enc->flags&CODEC_FLAG_PSNR)
1397 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1399 fprintf(vstats_file,"f_size= %6d ", frame_size);
1400 /* compute pts value */
1401 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1405 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1406 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1407 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1408 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1409 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1413 static void print_report(OutputFile *output_files,
1414 OutputStream *ost_table, int nb_ostreams,
1415 int is_last_report, int64_t timer_start, int64_t cur_time)
1419 AVFormatContext *oc;
1421 AVCodecContext *enc;
1422 int frame_number, vid, i;
1424 int64_t pts = INT64_MAX;
1425 static int64_t last_time = -1;
1426 static int qp_histogram[52];
1427 int hours, mins, secs, us;
1429 if (!print_stats && !is_last_report)
1432 if (!is_last_report) {
1433 if (last_time == -1) {
1434 last_time = cur_time;
1437 if ((cur_time - last_time) < 500000)
1439 last_time = cur_time;
1443 oc = output_files[0].ctx;
1445 total_size = avio_size(oc->pb);
1446 if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
1447 total_size= avio_tell(oc->pb);
1454 for(i=0;i<nb_ostreams;i++) {
1456 ost = &ost_table[i];
1457 enc = ost->st->codec;
1458 if (!ost->stream_copy && enc->coded_frame)
1459 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1460 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1461 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1463 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1464 float t = (cur_time-timer_start) / 1000000.0;
1466 frame_number = ost->frame_number;
1467 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1468 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1470 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1474 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1477 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1479 if (enc->flags&CODEC_FLAG_PSNR){
1481 double error, error_sum=0;
1482 double scale, scale_sum=0;
1483 char type[3]= {'Y','U','V'};
1484 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1487 error= enc->error[j];
1488 scale= enc->width*enc->height*255.0*255.0*frame_number;
1490 error= enc->coded_frame->error[j];
1491 scale= enc->width*enc->height*255.0*255.0;
1496 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1498 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1502 /* compute min output value */
1503 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1504 ost->st->time_base, AV_TIME_BASE_Q));
1507 secs = pts / AV_TIME_BASE;
1508 us = pts % AV_TIME_BASE;
1514 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1516 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1517 "size=%8.0fkB time=", total_size / 1024.0);
1518 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1519 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1520 (100 * us) / AV_TIME_BASE);
1521 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1522 "bitrate=%6.1fkbits/s", bitrate);
1524 if (nb_frames_dup || nb_frames_drop)
1525 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1526 nb_frames_dup, nb_frames_drop);
1528 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
1532 if (is_last_report) {
1533 int64_t raw= audio_size + video_size + extra_size;
1534 av_log(NULL, AV_LOG_INFO, "\n");
1535 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1539 100.0*(total_size - raw)/raw
1541 if(video_size + audio_size + extra_size == 0){
1542 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
1547 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1551 for (i = 0; i < nb_ostreams; i++) {
1552 OutputStream *ost = &ost_table[i];
1553 AVCodecContext *enc = ost->st->codec;
1554 AVFormatContext *os = output_files[ost->file_index].ctx;
1556 if (!ost->encoding_needed)
1559 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1561 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1567 av_init_packet(&pkt);
1568 pkt.stream_index= ost->index;
1570 switch (ost->st->codec->codec_type) {
1571 case AVMEDIA_TYPE_AUDIO:
1572 fifo_bytes = av_fifo_size(ost->fifo);
1574 /* encode any samples remaining in fifo */
1575 if (fifo_bytes > 0) {
1576 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1577 int fs_tmp = enc->frame_size;
1579 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1580 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1581 enc->frame_size = fifo_bytes / (osize * enc->channels);
1583 int frame_bytes = enc->frame_size*osize*enc->channels;
1584 if (allocated_audio_buf_size < frame_bytes)
1586 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1589 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1590 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1591 ost->st->time_base.num, enc->sample_rate);
1592 enc->frame_size = fs_tmp;
1595 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1598 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1602 pkt.flags |= AV_PKT_FLAG_KEY;
1604 case AVMEDIA_TYPE_VIDEO:
1605 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1607 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1611 if(enc->coded_frame && enc->coded_frame->key_frame)
1612 pkt.flags |= AV_PKT_FLAG_KEY;
1613 if (ost->logfile && enc->stats_out) {
1614 fprintf(ost->logfile, "%s", enc->stats_out);
1623 pkt.data = bit_buffer;
1625 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1626 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1627 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1633 * Check whether a packet from ist should be written into ost at this time
1635 static int check_output_constraints(InputStream *ist, OutputStream *ost)
1637 OutputFile *of = &output_files[ost->file_index];
1638 int ist_index = ist - input_streams;
1640 if (ost->source_index != ist_index)
1643 if (of->start_time && ist->pts < of->start_time)
1646 if (of->recording_time != INT64_MAX &&
1647 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1648 (AVRational){1, 1000000}) >= 0) {
1649 ost->is_past_recording_time = 1;
1656 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
1658 OutputFile *of = &output_files[ost->file_index];
1659 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1663 av_init_packet(&opkt);
1665 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
1666 !ost->copy_initial_nonkeyframes)
1669 /* force the input stream PTS */
1670 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1671 audio_size += pkt->size;
1672 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1673 video_size += pkt->size;
1677 opkt.stream_index = ost->index;
1678 if (pkt->pts != AV_NOPTS_VALUE)
1679 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1681 opkt.pts = AV_NOPTS_VALUE;
1683 if (pkt->dts == AV_NOPTS_VALUE)
1684 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1686 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1687 opkt.dts -= ost_tb_start_time;
1689 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1690 opkt.flags = pkt->flags;
1692 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1693 if( ost->st->codec->codec_id != CODEC_ID_H264
1694 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1695 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1697 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
1698 opkt.destruct = av_destruct_packet;
1700 opkt.data = pkt->data;
1701 opkt.size = pkt->size;
1703 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
1704 /* store AVPicture in AVPacket, as expected by the output format */
1705 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1706 opkt.data = (uint8_t *)&pict;
1707 opkt.size = sizeof(AVPicture);
1708 opkt.flags |= AV_PKT_FLAG_KEY;
1711 write_frame(of->ctx, &opkt, ost->st->codec, ost->bitstream_filters);
1712 ost->st->codec->frame_number++;
1713 ost->frame_number++;
1714 av_free_packet(&opkt);
1717 static void rate_emu_sleep(InputStream *ist)
1719 if (input_files[ist->file_index].rate_emu) {
1720 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1721 int64_t now = av_gettime() - ist->start;
1727 static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
1729 static unsigned int samples_size = 0;
1730 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1731 uint8_t *decoded_data_buf = NULL;
1732 int decoded_data_size = 0;
1735 if (pkt && samples_size < FFMAX(pkt->size * bps, AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1737 samples_size = FFMAX(pkt->size * bps, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1738 samples = av_malloc(samples_size);
1740 decoded_data_size = samples_size;
1742 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1746 *got_output = decoded_data_size > 0;
1748 /* Some bug in mpeg audio decoder gives */
1749 /* decoded_data_size < 0, it seems they are overflows */
1751 /* no audio frame */
1755 decoded_data_buf = (uint8_t *)samples;
1756 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1757 (ist->st->codec->sample_rate * ist->st->codec->channels);
1759 // preprocess audio (volume)
1760 if (audio_volume != 256) {
1761 switch (ist->st->codec->sample_fmt) {
1762 case AV_SAMPLE_FMT_U8:
1764 uint8_t *volp = samples;
1765 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1766 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
1767 *volp++ = av_clip_uint8(v);
1771 case AV_SAMPLE_FMT_S16:
1773 int16_t *volp = samples;
1774 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1775 int v = ((*volp) * audio_volume + 128) >> 8;
1776 *volp++ = av_clip_int16(v);
1780 case AV_SAMPLE_FMT_S32:
1782 int32_t *volp = samples;
1783 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1784 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
1785 *volp++ = av_clipl_int32(v);
1789 case AV_SAMPLE_FMT_FLT:
1791 float *volp = samples;
1792 float scale = audio_volume / 256.f;
1793 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1798 case AV_SAMPLE_FMT_DBL:
1800 double *volp = samples;
1801 double scale = audio_volume / 256.;
1802 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1808 av_log(NULL, AV_LOG_FATAL,
1809 "Audio volume adjustment on sample format %s is not supported.\n",
1810 av_get_sample_fmt_name(ist->st->codec->sample_fmt));
1815 rate_emu_sleep(ist);
1817 for (i = 0; i < nb_output_streams; i++) {
1818 OutputStream *ost = &output_streams[i];
1820 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1822 do_audio_out(output_files[ost->file_index].ctx, ost, ist,
1823 decoded_data_buf, decoded_data_size);
1828 static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *pkt_pts, int64_t *pkt_dts)
1830 AVFrame *decoded_frame, *filtered_frame = NULL;
1831 void *buffer_to_free = NULL;
1835 int frame_available = 1;
1838 if (!(decoded_frame = avcodec_alloc_frame()))
1839 return AVERROR(ENOMEM);
1840 pkt->pts = *pkt_pts;
1841 pkt->dts = *pkt_dts;
1842 *pkt_pts = AV_NOPTS_VALUE;
1844 if (*pkt_dts != AV_NOPTS_VALUE && pkt->duration) {
1845 *pkt_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
1846 } else if(*pkt_dts != AV_NOPTS_VALUE && ist->st->codec->time_base.num != 0) {
1847 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1848 *pkt_dts += ((int64_t)AV_TIME_BASE *
1849 ist->st->codec->time_base.num * ticks) /
1850 ist->st->codec->time_base.den;
1852 *pkt_dts = AV_NOPTS_VALUE;
1854 ret = avcodec_decode_video2(ist->st->codec,
1855 decoded_frame, got_output, pkt);
1859 quality = same_quant ? decoded_frame->quality : 0;
1861 /* no picture yet */
1862 av_freep(&decoded_frame);
1866 if(decoded_frame->best_effort_timestamp != AV_NOPTS_VALUE)
1867 ist->next_pts = ist->pts = decoded_frame->best_effort_timestamp;
1870 ist->next_pts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
1871 else if (ist->st->codec->time_base.num != 0) {
1872 int ticks = ist->st->parser ? ist->st->parser->repeat_pict + 1 :
1873 ist->st->codec->ticks_per_frame;
1874 ist->next_pts += ((int64_t)AV_TIME_BASE *
1875 ist->st->codec->time_base.num * ticks) /
1876 ist->st->codec->time_base.den;
1880 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
1883 for(i=0;i<nb_output_streams;i++) {
1884 OutputStream *ost = ost = &output_streams[i];
1885 if(check_output_constraints(ist, ost)){
1886 if (!decoded_frame->sample_aspect_ratio.num)
1887 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
1888 decoded_frame->pts = ist->pts;
1890 av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame, AV_VSRC_BUF_FLAG_OVERWRITE);
1895 rate_emu_sleep(ist);
1897 for (i = 0; i < nb_output_streams; i++) {
1898 OutputStream *ost = &output_streams[i];
1901 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1905 if (ost->input_video_filter) {
1906 frame_available = avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1908 while (frame_available) {
1909 if (ost->output_video_filter) {
1910 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1911 if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1913 if (!filtered_frame && !(filtered_frame = avcodec_alloc_frame())) {
1914 ret = AVERROR(ENOMEM);
1917 *filtered_frame= *decoded_frame; //for me_threshold
1919 avfilter_fill_frame_from_video_buffer_ref(filtered_frame, ost->picref);
1920 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1923 if (ost->picref->video && !ost->frame_aspect_ratio)
1924 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1926 filtered_frame = decoded_frame;
1929 do_video_out(output_files[ost->file_index].ctx, ost, ist, filtered_frame, &frame_size,
1930 same_quant ? quality : ost->st->codec->global_quality);
1931 if (vstats_filename && frame_size)
1932 do_video_stats(output_files[ost->file_index].ctx, ost, frame_size);
1935 frame_available = ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1936 avfilter_unref_buffer(ost->picref);
1938 av_freep(&filtered_frame);
1943 av_free(buffer_to_free);
1944 av_freep(&decoded_frame);
1948 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
1950 AVSubtitle subtitle;
1951 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
1952 &subtitle, got_output, pkt);
1958 rate_emu_sleep(ist);
1960 for (i = 0; i < nb_output_streams; i++) {
1961 OutputStream *ost = &output_streams[i];
1963 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1966 do_subtitle_out(output_files[ost->file_index].ctx, ost, ist, &subtitle, pkt->pts);
1969 avsubtitle_free(&subtitle);
1973 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1974 static int output_packet(InputStream *ist,
1975 OutputStream *ost_table, int nb_ostreams,
1976 const AVPacket *pkt)
1980 int64_t pkt_dts = AV_NOPTS_VALUE;
1981 int64_t pkt_pts = AV_NOPTS_VALUE;
1985 if (ist->next_pts == AV_NOPTS_VALUE)
1986 ist->next_pts = ist->pts;
1990 av_init_packet(&avpkt);
1998 if(pkt->dts != AV_NOPTS_VALUE){
1999 if(ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2000 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2001 pkt_dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2003 if(pkt->pts != AV_NOPTS_VALUE)
2004 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2006 //while we have more to decode or while the decoder did output something on EOF
2007 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2010 ist->pts = ist->next_pts;
2012 if (avpkt.size && avpkt.size != pkt->size) {
2013 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2014 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2015 ist->showed_multi_packet_warning = 1;
2018 switch(ist->st->codec->codec_type) {
2019 case AVMEDIA_TYPE_AUDIO:
2020 ret = transcode_audio (ist, &avpkt, &got_output);
2022 case AVMEDIA_TYPE_VIDEO:
2023 ret = transcode_video (ist, &avpkt, &got_output, &pkt_pts, &pkt_dts);
2025 case AVMEDIA_TYPE_SUBTITLE:
2026 ret = transcode_subtitles(ist, &avpkt, &got_output);
2034 // touch data and size only if not EOF
2036 if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2046 /* handle stream copy */
2047 if (!ist->decoding_needed) {
2048 rate_emu_sleep(ist);
2049 ist->pts = ist->next_pts;
2050 switch (ist->st->codec->codec_type) {
2051 case AVMEDIA_TYPE_AUDIO:
2052 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2053 ist->st->codec->sample_rate;
2055 case AVMEDIA_TYPE_VIDEO:
2056 if (ist->st->codec->time_base.num != 0) {
2057 int ticks = ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2058 ist->next_pts += ((int64_t)AV_TIME_BASE *
2059 ist->st->codec->time_base.num * ticks) /
2060 ist->st->codec->time_base.den;
2065 for (i = 0; pkt && i < nb_ostreams; i++) {
2066 OutputStream *ost = &ost_table[i];
2068 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2071 do_streamcopy(ist, ost, pkt);
2077 static void print_sdp(OutputFile *output_files, int n)
2081 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
2085 for (i = 0; i < n; i++)
2086 avc[i] = output_files[i].ctx;
2088 av_sdp_create(avc, n, sdp, sizeof(sdp));
2089 printf("SDP:\n%s\n", sdp);
2094 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
2095 char *error, int error_len)
2097 InputStream *ist = &input_streams[ist_index];
2098 if (ist->decoding_needed) {
2099 AVCodec *codec = ist->dec;
2101 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2102 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2103 return AVERROR(EINVAL);
2105 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2106 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2107 ist->file_index, ist->st->index);
2108 return AVERROR(EINVAL);
2110 assert_codec_experimental(ist->st->codec, 0);
2111 assert_avoptions(ist->opts);
2114 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;
2115 ist->next_pts = AV_NOPTS_VALUE;
2121 static int transcode_init(OutputFile *output_files, int nb_output_files,
2122 InputFile *input_files, int nb_input_files)
2124 int ret = 0, i, j, k;
2125 AVFormatContext *oc;
2126 AVCodecContext *codec, *icodec;
2132 /* init framerate emulation */
2133 for (i = 0; i < nb_input_files; i++) {
2134 InputFile *ifile = &input_files[i];
2135 if (ifile->rate_emu)
2136 for (j = 0; j < ifile->nb_streams; j++)
2137 input_streams[j + ifile->ist_index].start = av_gettime();
2140 /* output stream init */
2141 for (i = 0; i < nb_output_files; i++) {
2142 oc = output_files[i].ctx;
2143 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2144 av_dump_format(oc, i, oc->filename, 1);
2145 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2146 return AVERROR(EINVAL);
2150 /* for each output stream, we compute the right encoding parameters */
2151 for (i = 0; i < nb_output_streams; i++) {
2152 ost = &output_streams[i];
2153 oc = output_files[ost->file_index].ctx;
2154 ist = &input_streams[ost->source_index];
2156 if (ost->attachment_filename)
2159 codec = ost->st->codec;
2160 icodec = ist->st->codec;
2162 ost->st->disposition = ist->st->disposition;
2163 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2164 codec->chroma_sample_location = icodec->chroma_sample_location;
2166 if (ost->stream_copy) {
2167 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2169 if (extra_size > INT_MAX) {
2170 return AVERROR(EINVAL);
2173 /* if stream_copy is selected, no need to decode or encode */
2174 codec->codec_id = icodec->codec_id;
2175 codec->codec_type = icodec->codec_type;
2177 if (!codec->codec_tag) {
2178 if (!oc->oformat->codec_tag ||
2179 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2180 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2181 codec->codec_tag = icodec->codec_tag;
2184 codec->bit_rate = icodec->bit_rate;
2185 codec->rc_max_rate = icodec->rc_max_rate;
2186 codec->rc_buffer_size = icodec->rc_buffer_size;
2187 codec->extradata = av_mallocz(extra_size);
2188 if (!codec->extradata) {
2189 return AVERROR(ENOMEM);
2191 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2192 codec->extradata_size= icodec->extradata_size;
2194 codec->time_base = ist->st->time_base;
2195 if(!strcmp(oc->oformat->name, "avi")) {
2196 if ( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
2197 && av_q2d(ist->st->time_base) < 1.0/500
2199 codec->time_base = icodec->time_base;
2200 codec->time_base.num *= icodec->ticks_per_frame;
2201 codec->time_base.den *= 2;
2203 } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)) {
2204 if( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
2205 && av_q2d(ist->st->time_base) < 1.0/500
2207 codec->time_base = icodec->time_base;
2208 codec->time_base.num *= icodec->ticks_per_frame;
2211 av_reduce(&codec->time_base.num, &codec->time_base.den,
2212 codec->time_base.num, codec->time_base.den, INT_MAX);
2214 switch(codec->codec_type) {
2215 case AVMEDIA_TYPE_AUDIO:
2216 if(audio_volume != 256) {
2217 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2220 codec->channel_layout = icodec->channel_layout;
2221 codec->sample_rate = icodec->sample_rate;
2222 codec->channels = icodec->channels;
2223 codec->frame_size = icodec->frame_size;
2224 codec->audio_service_type = icodec->audio_service_type;
2225 codec->block_align = icodec->block_align;
2227 case AVMEDIA_TYPE_VIDEO:
2228 codec->pix_fmt = icodec->pix_fmt;
2229 codec->width = icodec->width;
2230 codec->height = icodec->height;
2231 codec->has_b_frames = icodec->has_b_frames;
2232 if (!codec->sample_aspect_ratio.num) {
2233 codec->sample_aspect_ratio =
2234 ost->st->sample_aspect_ratio =
2235 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2236 ist->st->codec->sample_aspect_ratio.num ?
2237 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2239 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
2241 case AVMEDIA_TYPE_SUBTITLE:
2242 codec->width = icodec->width;
2243 codec->height = icodec->height;
2245 case AVMEDIA_TYPE_DATA:
2246 case AVMEDIA_TYPE_ATTACHMENT:
2253 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2255 ist->decoding_needed = 1;
2256 ost->encoding_needed = 1;
2258 switch(codec->codec_type) {
2259 case AVMEDIA_TYPE_AUDIO:
2260 ost->fifo = av_fifo_alloc(1024);
2262 return AVERROR(ENOMEM);
2264 if (!codec->sample_rate)
2265 codec->sample_rate = icodec->sample_rate;
2266 choose_sample_rate(ost->st, ost->enc);
2267 codec->time_base = (AVRational){1, codec->sample_rate};
2269 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2270 codec->sample_fmt = icodec->sample_fmt;
2271 choose_sample_fmt(ost->st, ost->enc);
2273 if (ost->audio_channels_mapped) {
2274 /* the requested output channel is set to the number of
2275 * -map_channel only if no -ac are specified */
2276 if (!codec->channels) {
2277 codec->channels = ost->audio_channels_mapped;
2278 codec->channel_layout = av_get_default_channel_layout(codec->channels);
2279 if (!codec->channel_layout) {
2280 av_log(NULL, AV_LOG_FATAL, "Unable to find an appropriate channel layout for requested number of channel\n");
2284 /* fill unused channel mapping with -1 (which means a muted
2285 * channel in case the number of output channels is bigger
2286 * than the number of mapped channel) */
2287 for (j = ost->audio_channels_mapped; j < FF_ARRAY_ELEMS(ost->audio_channels_map); j++)
2288 ost->audio_channels_map[j] = -1;
2289 } else if (!codec->channels) {
2290 codec->channels = icodec->channels;
2291 codec->channel_layout = icodec->channel_layout;
2293 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2294 codec->channel_layout = 0;
2296 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2297 ost->audio_resample |= codec->sample_fmt != icodec->sample_fmt
2298 || codec->channel_layout != icodec->channel_layout;
2299 icodec->request_channels = codec->channels;
2300 ost->resample_sample_fmt = icodec->sample_fmt;
2301 ost->resample_sample_rate = icodec->sample_rate;
2302 ost->resample_channels = icodec->channels;
2304 case AVMEDIA_TYPE_VIDEO:
2305 if (codec->pix_fmt == PIX_FMT_NONE)
2306 codec->pix_fmt = icodec->pix_fmt;
2307 choose_pixel_fmt(ost->st, ost->enc);
2309 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2310 av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2314 if (!codec->width || !codec->height) {
2315 codec->width = icodec->width;
2316 codec->height = icodec->height;
2319 ost->video_resample = codec->width != icodec->width ||
2320 codec->height != icodec->height ||
2321 codec->pix_fmt != icodec->pix_fmt;
2322 if (ost->video_resample) {
2323 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2326 ost->resample_height = icodec->height;
2327 ost->resample_width = icodec->width;
2328 ost->resample_pix_fmt = icodec->pix_fmt;
2330 if (!ost->frame_rate.num)
2331 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2332 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2333 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2334 ost->frame_rate = ost->enc->supported_framerates[idx];
2336 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2337 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2338 && (video_sync_method==1 || (video_sync_method<0 && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
2339 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2340 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2342 for (j = 0; j < ost->forced_kf_count; j++)
2343 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
2348 if (configure_video_filters(ist, ost)) {
2349 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2354 case AVMEDIA_TYPE_SUBTITLE:
2361 if (codec->codec_id != CODEC_ID_H264 &&
2362 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2363 char logfilename[1024];
2366 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2367 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2369 if (codec->flags & CODEC_FLAG_PASS2) {
2371 size_t logbuffer_size;
2372 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2373 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2377 codec->stats_in = logbuffer;
2379 if (codec->flags & CODEC_FLAG_PASS1) {
2380 f = fopen(logfilename, "wb");
2382 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2383 logfilename, strerror(errno));
2390 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2391 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size (1664)*/
2392 int size = codec->width * codec->height;
2393 bit_buffer_size = FFMAX(bit_buffer_size, 7*size + 10000);
2398 bit_buffer = av_malloc(bit_buffer_size);
2400 av_log(NULL, AV_LOG_ERROR, "Cannot allocate %d bytes output buffer\n",
2402 return AVERROR(ENOMEM);
2405 /* open each encoder */
2406 for (i = 0; i < nb_output_streams; i++) {
2407 ost = &output_streams[i];
2408 if (ost->encoding_needed) {
2409 AVCodec *codec = ost->enc;
2410 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2412 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
2413 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2414 ret = AVERROR(EINVAL);
2417 if (dec->subtitle_header) {
2418 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2419 if (!ost->st->codec->subtitle_header) {
2420 ret = AVERROR(ENOMEM);
2423 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2424 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2426 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2427 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2428 ost->file_index, ost->index);
2429 ret = AVERROR(EINVAL);
2432 assert_codec_experimental(ost->st->codec, 1);
2433 assert_avoptions(ost->opts);
2434 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2435 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2436 " It takes bits/s as argument, not kbits/s\n");
2437 extra_size += ost->st->codec->extradata_size;
2439 if (ost->st->codec->me_threshold)
2440 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2444 /* init input streams */
2445 for (i = 0; i < nb_input_streams; i++)
2446 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2449 /* discard unused programs */
2450 for (i = 0; i < nb_input_files; i++) {
2451 InputFile *ifile = &input_files[i];
2452 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2453 AVProgram *p = ifile->ctx->programs[j];
2454 int discard = AVDISCARD_ALL;
2456 for (k = 0; k < p->nb_stream_indexes; k++)
2457 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2458 discard = AVDISCARD_DEFAULT;
2461 p->discard = discard;
2465 /* open files and write file headers */
2466 for (i = 0; i < nb_output_files; i++) {
2467 oc = output_files[i].ctx;
2468 oc->interrupt_callback = int_cb;
2469 if (avformat_write_header(oc, &output_files[i].opts) < 0) {
2470 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2471 ret = AVERROR(EINVAL);
2474 // assert_avoptions(output_files[i].opts);
2475 if (strcmp(oc->oformat->name, "rtp")) {
2481 /* dump the file output parameters - cannot be done before in case
2483 for (i = 0; i < nb_output_files; i++) {
2484 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2487 /* dump the stream mapping */
2488 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2489 for (i = 0; i < nb_output_streams; i++) {
2490 ost = &output_streams[i];
2492 if (ost->attachment_filename) {
2493 /* an attached file */
2494 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
2495 ost->attachment_filename, ost->file_index, ost->index);
2498 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
2499 input_streams[ost->source_index].file_index,
2500 input_streams[ost->source_index].st->index,
2503 if (ost->audio_channels_mapped) {
2504 av_log(NULL, AV_LOG_INFO, " [ch:");
2505 for (j = 0; j < ost->audio_channels_mapped; j++)
2506 if (ost->audio_channels_map[j] == -1)
2507 av_log(NULL, AV_LOG_INFO, " M");
2509 av_log(NULL, AV_LOG_INFO, " %d", ost->audio_channels_map[j]);
2510 av_log(NULL, AV_LOG_INFO, "]");
2512 if (ost->sync_ist != &input_streams[ost->source_index])
2513 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2514 ost->sync_ist->file_index,
2515 ost->sync_ist->st->index);
2516 if (ost->stream_copy)
2517 av_log(NULL, AV_LOG_INFO, " (copy)");
2519 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2520 input_streams[ost->source_index].dec->name : "?",
2521 ost->enc ? ost->enc->name : "?");
2522 av_log(NULL, AV_LOG_INFO, "\n");
2526 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2531 print_sdp(output_files, nb_output_files);
2538 * The following code is the main loop of the file converter
2540 static int transcode(OutputFile *output_files, int nb_output_files,
2541 InputFile *input_files, int nb_input_files)
2544 AVFormatContext *is, *os;
2548 int no_packet_count=0;
2549 int64_t timer_start;
2552 if (!(no_packet = av_mallocz(nb_input_files)))
2555 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2560 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
2563 timer_start = av_gettime();
2565 for(; received_sigterm == 0;) {
2566 int file_index, ist_index;
2570 int64_t cur_time= av_gettime();
2572 ipts_min= INT64_MAX;
2574 /* if 'q' pressed, exits */
2576 static int64_t last_time;
2577 if (received_nb_signals)
2579 /* read_key() returns 0 on EOF */
2580 if(cur_time - last_time >= 100000 && !run_as_daemon){
2582 last_time = cur_time;
2587 if (key == '+') av_log_set_level(av_log_get_level()+10);
2588 if (key == '-') av_log_set_level(av_log_get_level()-10);
2589 if (key == 's') qp_hist ^= 1;
2592 do_hex_dump = do_pkt_dump = 0;
2593 } else if(do_pkt_dump){
2597 av_log_set_level(AV_LOG_DEBUG);
2600 if (key == 'c' || key == 'C'){
2601 char buf[4096], target[64], command[256], arg[256] = {0};
2604 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2606 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
2611 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
2612 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
2613 target, time, command, arg);
2614 for (i = 0; i < nb_output_streams; i++) {
2615 ost = &output_streams[i];
2618 ret = avfilter_graph_send_command(ost->graph, target, command, arg, buf, sizeof(buf),
2619 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
2620 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
2622 ret = avfilter_graph_queue_command(ost->graph, target, command, arg, 0, time);
2627 av_log(NULL, AV_LOG_ERROR,
2628 "Parse error, at least 3 arguments were expected, "
2629 "only %d given in string '%s'\n", n, buf);
2633 if (key == 'd' || key == 'D'){
2636 debug = input_streams[0].st->codec->debug<<1;
2637 if(!debug) debug = 1;
2638 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2641 if(scanf("%d", &debug)!=1)
2642 fprintf(stderr,"error parsing debug value\n");
2643 for(i=0;i<nb_input_streams;i++) {
2644 input_streams[i].st->codec->debug = debug;
2646 for(i=0;i<nb_output_streams;i++) {
2647 ost = &output_streams[i];
2648 ost->st->codec->debug = debug;
2650 if(debug) av_log_set_level(AV_LOG_DEBUG);
2651 fprintf(stderr,"debug=%d\n", debug);
2654 fprintf(stderr, "key function\n"
2655 "? show this help\n"
2656 "+ increase verbosity\n"
2657 "- decrease verbosity\n"
2658 "c Send command to filtergraph\n"
2659 "D cycle through available debug modes\n"
2660 "h dump packets/hex press to cycle through the 3 states\n"
2662 "s Show QP histogram\n"
2667 /* select the stream that we must read now by looking at the
2668 smallest output pts */
2670 for (i = 0; i < nb_output_streams; i++) {
2674 ost = &output_streams[i];
2675 of = &output_files[ost->file_index];
2676 os = output_files[ost->file_index].ctx;
2677 ist = &input_streams[ost->source_index];
2678 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2679 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2681 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2683 if (!input_files[ist->file_index].eof_reached){
2684 if(ipts < ipts_min) {
2686 if(input_sync ) file_index = ist->file_index;
2688 if(opts < opts_min) {
2690 if(!input_sync) file_index = ist->file_index;
2693 if (ost->frame_number >= ost->max_frames) {
2695 for (j = 0; j < of->ctx->nb_streams; j++)
2696 output_streams[of->ost_index + j].is_past_recording_time = 1;
2700 /* if none, if is finished */
2701 if (file_index < 0) {
2702 if(no_packet_count){
2704 memset(no_packet, 0, nb_input_files);
2711 /* read a frame from it and output it in the fifo */
2712 is = input_files[file_index].ctx;
2713 ret= av_read_frame(is, &pkt);
2714 if(ret == AVERROR(EAGAIN)){
2715 no_packet[file_index]=1;
2720 input_files[file_index].eof_reached = 1;
2728 memset(no_packet, 0, nb_input_files);
2731 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2732 is->streams[pkt.stream_index]);
2734 /* the following test is needed in case new streams appear
2735 dynamically in stream : we ignore them */
2736 if (pkt.stream_index >= input_files[file_index].nb_streams)
2737 goto discard_packet;
2738 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2739 ist = &input_streams[ist_index];
2741 goto discard_packet;
2743 if (pkt.dts != AV_NOPTS_VALUE)
2744 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2745 if (pkt.pts != AV_NOPTS_VALUE)
2746 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2748 if(pkt.pts != AV_NOPTS_VALUE)
2749 pkt.pts *= ist->ts_scale;
2750 if(pkt.dts != AV_NOPTS_VALUE)
2751 pkt.dts *= ist->ts_scale;
2753 // 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);
2754 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2755 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2756 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2757 int64_t delta= pkt_dts - ist->next_pts;
2758 if((delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
2759 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
2760 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
2761 pkt_dts+1<ist->pts)&& !copy_ts){
2762 input_files[ist->file_index].ts_offset -= delta;
2763 av_log(NULL, AV_LOG_DEBUG, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2764 delta, input_files[ist->file_index].ts_offset);
2765 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2766 if(pkt.pts != AV_NOPTS_VALUE)
2767 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2771 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2772 if (output_packet(ist, output_streams, nb_output_streams, &pkt) < 0) {
2774 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
2775 ist->file_index, ist->st->index);
2778 av_free_packet(&pkt);
2783 av_free_packet(&pkt);
2785 /* dump report by using the output first video and audio streams */
2786 print_report(output_files, output_streams, nb_output_streams, 0, timer_start, cur_time);
2789 /* at the end of stream, we must flush the decoder buffers */
2790 for (i = 0; i < nb_input_streams; i++) {
2791 ist = &input_streams[i];
2792 if (ist->decoding_needed) {
2793 output_packet(ist, output_streams, nb_output_streams, NULL);
2796 flush_encoders(output_streams, nb_output_streams);
2800 /* write the trailer if needed and close file */
2801 for(i=0;i<nb_output_files;i++) {
2802 os = output_files[i].ctx;
2803 av_write_trailer(os);
2806 /* dump report by using the first video and audio streams */
2807 print_report(output_files, output_streams, nb_output_streams, 1, timer_start, av_gettime());
2809 /* close each encoder */
2810 for (i = 0; i < nb_output_streams; i++) {
2811 ost = &output_streams[i];
2812 if (ost->encoding_needed) {
2813 av_freep(&ost->st->codec->stats_in);
2814 avcodec_close(ost->st->codec);
2817 avfilter_graph_free(&ost->graph);
2821 /* close each decoder */
2822 for (i = 0; i < nb_input_streams; i++) {
2823 ist = &input_streams[i];
2824 if (ist->decoding_needed) {
2825 avcodec_close(ist->st->codec);
2833 av_freep(&bit_buffer);
2834 av_freep(&no_packet);
2836 if (output_streams) {
2837 for (i = 0; i < nb_output_streams; i++) {
2838 ost = &output_streams[i];
2840 if (ost->stream_copy)
2841 av_freep(&ost->st->codec->extradata);
2843 fclose(ost->logfile);
2844 ost->logfile = NULL;
2846 av_fifo_free(ost->fifo); /* works even if fifo is not
2847 initialized but set to zero */
2848 av_freep(&ost->st->codec->subtitle_header);
2849 av_free(ost->resample_frame.data[0]);
2850 av_free(ost->forced_kf_pts);
2851 if (ost->video_resample)
2852 sws_freeContext(ost->img_resample_ctx);
2853 swr_free(&ost->swr);
2854 av_dict_free(&ost->opts);
2861 static int opt_frame_crop(const char *opt, const char *arg)
2863 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
2864 return AVERROR(EINVAL);
2867 static int opt_pad(const char *opt, const char *arg)
2869 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
2873 static double parse_frame_aspect_ratio(const char *arg)
2880 p = strchr(arg, ':');
2882 x = strtol(arg, &end, 10);
2884 y = strtol(end+1, &end, 10);
2886 ar = (double)x / (double)y;
2888 ar = strtod(arg, NULL);
2891 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
2897 static int opt_video_channel(const char *opt, const char *arg)
2899 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
2900 return opt_default("channel", arg);
2903 static int opt_video_standard(const char *opt, const char *arg)
2905 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
2906 return opt_default("standard", arg);
2909 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2911 audio_codec_name = arg;
2912 return parse_option(o, "codec:a", arg, options);
2915 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2917 video_codec_name = arg;
2918 return parse_option(o, "codec:v", arg, options);
2921 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2923 subtitle_codec_name = arg;
2924 return parse_option(o, "codec:s", arg, options);
2927 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2929 return parse_option(o, "codec:d", arg, options);
2932 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2934 StreamMap *m = NULL;
2935 int i, negative = 0, file_idx;
2936 int sync_file_idx = -1, sync_stream_idx;
2944 map = av_strdup(arg);
2946 /* parse sync stream first, just pick first matching stream */
2947 if (sync = strchr(map, ',')) {
2949 sync_file_idx = strtol(sync + 1, &sync, 0);
2950 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2951 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
2956 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2957 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2958 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2959 sync_stream_idx = i;
2962 if (i == input_files[sync_file_idx].nb_streams) {
2963 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
2964 "match any streams.\n", arg);
2970 file_idx = strtol(map, &p, 0);
2971 if (file_idx >= nb_input_files || file_idx < 0) {
2972 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
2976 /* disable some already defined maps */
2977 for (i = 0; i < o->nb_stream_maps; i++) {
2978 m = &o->stream_maps[i];
2979 if (file_idx == m->file_index &&
2980 check_stream_specifier(input_files[m->file_index].ctx,
2981 input_files[m->file_index].ctx->streams[m->stream_index],
2982 *p == ':' ? p + 1 : p) > 0)
2986 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2987 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2988 *p == ':' ? p + 1 : p) <= 0)
2990 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2991 &o->nb_stream_maps, o->nb_stream_maps + 1);
2992 m = &o->stream_maps[o->nb_stream_maps - 1];
2994 m->file_index = file_idx;
2995 m->stream_index = i;
2997 if (sync_file_idx >= 0) {
2998 m->sync_file_index = sync_file_idx;
2999 m->sync_stream_index = sync_stream_idx;
3001 m->sync_file_index = file_idx;
3002 m->sync_stream_index = i;
3007 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3015 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3017 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3018 &o->nb_attachments, o->nb_attachments + 1);
3019 o->attachments[o->nb_attachments - 1] = arg;
3023 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
3029 o->audio_channel_maps =
3030 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
3031 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
3032 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
3034 /* muted channel syntax */
3035 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
3036 if ((n == 1 || n == 3) && m->channel_idx == -1) {
3037 m->file_idx = m->stream_idx = -1;
3039 m->ofile_idx = m->ostream_idx = -1;
3044 n = sscanf(arg, "%d.%d.%d:%d.%d",
3045 &m->file_idx, &m->stream_idx, &m->channel_idx,
3046 &m->ofile_idx, &m->ostream_idx);
3048 if (n != 3 && n != 5) {
3049 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
3050 "[file.stream.channel|-1][:syncfile:syncstream]\n");
3054 if (n != 5) // only file.stream.channel specified
3055 m->ofile_idx = m->ostream_idx = -1;
3058 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
3059 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
3063 if (m->stream_idx < 0 ||
3064 m->stream_idx >= input_files[m->file_idx].nb_streams) {
3065 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
3066 m->file_idx, m->stream_idx);
3069 st = input_files[m->file_idx].ctx->streams[m->stream_idx];
3070 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
3071 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
3072 m->file_idx, m->stream_idx);
3075 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
3076 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
3077 m->file_idx, m->stream_idx, m->channel_idx);
3083 static void parse_meta_type(char *arg, char *type, int *index)
3093 if (*(++arg) == ':')
3094 *index = strtol(++arg, NULL, 0);
3097 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
3104 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
3106 MetadataMap *m, *m1;
3109 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
3110 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
3112 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
3113 m->file = strtol(arg, &p, 0);
3114 parse_meta_type(*p ? p + 1 : p, &m->type, &m->index);
3116 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
3117 if (p = strchr(opt, ':'))
3118 parse_meta_type(p + 1, &m1->type, &m1->index);
3122 if (m->type == 'g' || m1->type == 'g')
3123 o->metadata_global_manual = 1;
3124 if (m->type == 's' || m1->type == 's')
3125 o->metadata_streams_manual = 1;
3126 if (m->type == 'c' || m1->type == 'c')
3127 o->metadata_chapters_manual = 1;
3132 static int opt_map_meta_data(OptionsContext *o, const char *opt, const char *arg)
3134 av_log(NULL, AV_LOG_WARNING, "-map_meta_data is deprecated and will be removed soon. "
3135 "Use -map_metadata instead.\n");
3136 return opt_map_metadata(o, opt, arg);
3139 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
3142 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
3143 struct tm time = *gmtime((time_t*)&recording_timestamp);
3144 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
3145 parse_option(o, "metadata", buf, options);
3147 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
3148 "tag instead.\n", opt);
3152 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
3154 const char *codec_string = encoder ? "encoder" : "decoder";
3158 avcodec_find_encoder_by_name(name) :
3159 avcodec_find_decoder_by_name(name);
3161 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
3164 if(codec->type != type) {
3165 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
3171 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
3173 char *codec_name = NULL;
3175 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
3177 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
3178 st->codec->codec_id = codec->id;
3181 return avcodec_find_decoder(st->codec->codec_id);
3185 * Add all the streams from the given input file to the global
3186 * list of input streams.
3188 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
3190 int i, rfps, rfps_base;
3191 char *next, *codec_tag = NULL;
3193 for (i = 0; i < ic->nb_streams; i++) {
3194 AVStream *st = ic->streams[i];
3195 AVCodecContext *dec = st->codec;
3198 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3199 ist = &input_streams[nb_input_streams - 1];
3201 ist->file_index = nb_input_files;
3203 ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), ic, st);
3205 ist->ts_scale = 1.0;
3206 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
3208 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
3210 uint32_t tag = strtol(codec_tag, &next, 0);
3212 tag = AV_RL32(codec_tag);
3213 st->codec->codec_tag = tag;
3216 ist->dec = choose_decoder(o, ic, st);
3218 switch (dec->codec_type) {
3219 case AVMEDIA_TYPE_AUDIO:
3221 ist->dec = avcodec_find_decoder(dec->codec_id);
3222 if(o->audio_disable)
3223 st->discard= AVDISCARD_ALL;
3225 case AVMEDIA_TYPE_VIDEO:
3227 ist->dec = avcodec_find_decoder(dec->codec_id);
3228 rfps = ic->streams[i]->r_frame_rate.num;
3229 rfps_base = ic->streams[i]->r_frame_rate.den;
3231 dec->flags |= CODEC_FLAG_EMU_EDGE;
3234 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3236 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",
3237 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3238 (float)rfps / rfps_base, rfps, rfps_base);
3241 if (o->video_disable)
3242 st->discard= AVDISCARD_ALL;
3243 else if(video_discard)
3244 st->discard= video_discard;
3246 case AVMEDIA_TYPE_DATA:
3248 case AVMEDIA_TYPE_SUBTITLE:
3250 ist->dec = avcodec_find_decoder(dec->codec_id);
3251 if(o->subtitle_disable)
3252 st->discard = AVDISCARD_ALL;
3254 case AVMEDIA_TYPE_ATTACHMENT:
3255 case AVMEDIA_TYPE_UNKNOWN:
3263 static void assert_file_overwrite(const char *filename)
3265 if ((!file_overwrite || no_file_overwrite) &&
3266 (strchr(filename, ':') == NULL || filename[1] == ':' ||
3267 av_strstart(filename, "file:", NULL))) {
3268 if (avio_check(filename, 0) == 0) {
3269 if (!using_stdin && (!no_file_overwrite || file_overwrite)) {
3270 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3273 if (!read_yesno()) {
3274 av_log(0, AV_LOG_FATAL, "Not overwriting - exiting\n");
3280 av_log(0, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
3287 static void dump_attachment(AVStream *st, const char *filename)
3290 AVIOContext *out = NULL;
3291 AVDictionaryEntry *e;
3293 if (!st->codec->extradata_size) {
3294 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
3295 nb_input_files - 1, st->index);
3298 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
3299 filename = e->value;
3301 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
3302 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
3306 assert_file_overwrite(filename);
3308 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
3309 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
3314 avio_write(out, st->codec->extradata, st->codec->extradata_size);
3319 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
3321 AVFormatContext *ic;
3322 AVInputFormat *file_iformat = NULL;
3326 AVDictionary **opts;
3327 int orig_nb_streams; // number of streams before avformat_find_stream_info
3330 if (!(file_iformat = av_find_input_format(o->format))) {
3331 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
3336 if (!strcmp(filename, "-"))
3339 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3340 !strcmp(filename, "/dev/stdin");
3342 /* get default parameters from command line */
3343 ic = avformat_alloc_context();
3345 print_error(filename, AVERROR(ENOMEM));
3348 if (o->nb_audio_sample_rate) {
3349 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
3350 av_dict_set(&format_opts, "sample_rate", buf, 0);
3352 if (o->nb_audio_channels) {
3353 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
3354 av_dict_set(&format_opts, "channels", buf, 0);
3356 if (o->nb_frame_rates) {
3357 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
3359 if (o->nb_frame_sizes) {
3360 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
3362 if (o->nb_frame_pix_fmts)
3363 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
3365 ic->video_codec_id = video_codec_name ?
3366 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
3367 ic->audio_codec_id = audio_codec_name ?
3368 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
3369 ic->subtitle_codec_id= subtitle_codec_name ?
3370 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
3371 ic->flags |= AVFMT_FLAG_NONBLOCK;
3372 ic->interrupt_callback = int_cb;
3375 av_log(NULL, AV_LOG_WARNING, "-loop_input is deprecated, use -loop 1\n");
3376 ic->loop_input = loop_input;
3379 /* open the input file with generic libav function */
3380 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3382 print_error(filename, err);
3385 assert_avoptions(format_opts);
3387 /* apply forced codec ids */
3388 for (i = 0; i < ic->nb_streams; i++)
3389 choose_decoder(o, ic, ic->streams[i]);
3391 /* Set AVCodecContext options for avformat_find_stream_info */
3392 opts = setup_find_stream_info_opts(ic, codec_opts);
3393 orig_nb_streams = ic->nb_streams;
3395 /* If not enough info to get the stream parameters, we decode the
3396 first frames to get it. (used in mpeg case for example) */
3397 ret = avformat_find_stream_info(ic, opts);
3399 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
3400 av_close_input_file(ic);
3404 timestamp = o->start_time;
3405 /* add the stream start time */
3406 if (ic->start_time != AV_NOPTS_VALUE)
3407 timestamp += ic->start_time;
3409 /* if seeking requested, we execute it */
3410 if (o->start_time != 0) {
3411 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3413 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
3414 filename, (double)timestamp / AV_TIME_BASE);
3418 /* update the current parameters so that they match the one of the input stream */
3419 add_input_streams(o, ic);
3421 /* dump the file content */
3422 av_dump_format(ic, nb_input_files, filename, 0);
3424 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3425 input_files[nb_input_files - 1].ctx = ic;
3426 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3427 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3428 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3429 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
3431 for (i = 0; i < o->nb_dump_attachment; i++) {
3434 for (j = 0; j < ic->nb_streams; j++) {
3435 AVStream *st = ic->streams[j];
3437 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
3438 dump_attachment(st, o->dump_attachment[i].u.str);
3442 for (i = 0; i < orig_nb_streams; i++)
3443 av_dict_free(&opts[i]);
3446 reset_options(o, 1);
3450 static void parse_forced_key_frames(char *kf, OutputStream *ost)
3455 for (p = kf; *p; p++)
3458 ost->forced_kf_count = n;
3459 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3460 if (!ost->forced_kf_pts) {
3461 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3464 for (i = 0; i < n; i++) {
3465 p = i ? strchr(p, ',') + 1 : kf;
3466 ost->forced_kf_pts[i] = parse_time_or_die("force_key_frames", p, 1);
3470 static uint8_t *get_line(AVIOContext *s)
3476 if (avio_open_dyn_buf(&line) < 0) {
3477 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
3481 while ((c = avio_r8(s)) && c != '\n')
3484 avio_close_dyn_buf(line, &buf);
3489 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
3492 char filename[1000];
3493 const char *base[3] = { getenv("AVCONV_DATADIR"),
3498 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
3502 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
3503 i != 1 ? "" : "/.avconv", codec_name, preset_name);
3504 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3507 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
3508 i != 1 ? "" : "/.avconv", preset_name);
3509 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3515 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
3517 char *codec_name = NULL;
3519 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
3521 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
3522 NULL, ost->st->codec->codec_type);
3523 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
3524 } else if (!strcmp(codec_name, "copy"))
3525 ost->stream_copy = 1;
3527 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
3528 ost->st->codec->codec_id = ost->enc->id;
3532 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3535 AVStream *st = avformat_new_stream(oc, NULL);
3536 int idx = oc->nb_streams - 1, ret = 0;
3537 char *bsf = NULL, *next, *codec_tag = NULL;
3538 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3540 char *buf = NULL, *arg = NULL, *preset = NULL;
3541 AVIOContext *s = NULL;
3544 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3548 if (oc->nb_streams - 1 < o->nb_streamid_map)
3549 st->id = o->streamid_map[oc->nb_streams - 1];
3551 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3552 nb_output_streams + 1);
3553 ost = &output_streams[nb_output_streams - 1];
3554 ost->file_index = nb_output_files;
3557 st->codec->codec_type = type;
3558 choose_encoder(o, oc, ost);
3560 ost->opts = filter_codec_opts(codec_opts, ost->enc, oc, st);
3563 avcodec_get_context_defaults3(st->codec, ost->enc);
3564 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3566 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
3567 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
3570 if (!buf[0] || buf[0] == '#') {
3574 if (!(arg = strchr(buf, '='))) {
3575 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
3579 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
3581 } while (!s->eof_reached);
3585 av_log(NULL, AV_LOG_FATAL,
3586 "Preset %s specified for stream %d:%d, but could not be opened.\n",
3587 preset, ost->file_index, ost->index);
3591 ost->max_frames = INT64_MAX;
3592 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
3594 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3596 if (next = strchr(bsf, ','))
3598 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3599 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3603 bsfc_prev->next = bsfc;
3605 ost->bitstream_filters = bsfc;
3611 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3613 uint32_t tag = strtol(codec_tag, &next, 0);
3615 tag = AV_RL32(codec_tag);
3616 st->codec->codec_tag = tag;
3619 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3620 if (qscale >= 0 || same_quant) {
3621 st->codec->flags |= CODEC_FLAG_QSCALE;
3622 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3625 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
3626 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3628 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3632 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3635 const char *p = str;
3642 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3649 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3653 AVCodecContext *video_enc;
3655 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3657 video_enc = st->codec;
3659 if (!ost->stream_copy) {
3660 const char *p = NULL;
3661 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3662 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3663 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3666 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3667 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3668 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3672 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3673 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3674 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3678 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3679 if (frame_aspect_ratio)
3680 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3682 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3683 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3684 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3685 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3688 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3691 video_enc->gop_size = 0;
3692 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3694 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3695 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
3698 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3700 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3702 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3703 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
3706 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
3709 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
3712 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3714 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
3717 /* FIXME realloc failure */
3718 video_enc->rc_override=
3719 av_realloc(video_enc->rc_override,
3720 sizeof(RcOverride)*(i+1));
3721 video_enc->rc_override[i].start_frame= start;
3722 video_enc->rc_override[i].end_frame = end;
3724 video_enc->rc_override[i].qscale= q;
3725 video_enc->rc_override[i].quality_factor= 1.0;
3728 video_enc->rc_override[i].qscale= 0;
3729 video_enc->rc_override[i].quality_factor= -q/100.0;
3734 video_enc->rc_override_count=i;
3735 if (!video_enc->rc_initial_buffer_occupancy)
3736 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3737 video_enc->intra_dc_precision= intra_dc_precision - 8;
3740 video_enc->flags|= CODEC_FLAG_PSNR;
3745 video_enc->flags |= CODEC_FLAG_PASS1;
3748 video_enc->flags |= CODEC_FLAG_PASS2;
3752 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
3753 if (forced_key_frames)
3754 parse_forced_key_frames(forced_key_frames, ost);
3756 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
3758 ost->top_field_first = -1;
3759 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
3761 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
3764 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
3766 ost->avfilter = av_strdup(filters);
3773 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3778 AVCodecContext *audio_enc;
3780 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3783 audio_enc = st->codec;
3784 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3786 if (!ost->stream_copy) {
3787 char *sample_fmt = NULL;
3789 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3791 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
3793 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
3794 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
3798 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
3800 ost->rematrix_volume=1.0;
3801 MATCH_PER_STREAM_OPT(rematrix_volume, f, ost->rematrix_volume, oc, st);
3804 /* check for channel mapping for this audio stream */
3805 for (n = 0; n < o->nb_audio_channel_maps; n++) {
3806 AudioChannelMap *map = &o->audio_channel_maps[n];
3807 InputStream *ist = &input_streams[ost->source_index];
3808 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
3809 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
3810 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
3811 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
3812 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
3814 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
3815 ost->file_index, ost->st->index);
3822 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3826 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3827 if (!ost->stream_copy) {
3828 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
3835 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
3837 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
3838 ost->stream_copy = 1;
3842 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3846 AVCodecContext *subtitle_enc;
3848 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3850 subtitle_enc = st->codec;
3852 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3857 /* arg format is "output-stream-index:streamid-value". */
3858 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
3864 av_strlcpy(idx_str, arg, sizeof(idx_str));
3865 p = strchr(idx_str, ':');
3867 av_log(NULL, AV_LOG_FATAL,
3868 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3873 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3874 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
3875 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3879 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3881 AVFormatContext *is = ifile->ctx;
3882 AVFormatContext *os = ofile->ctx;
3885 for (i = 0; i < is->nb_chapters; i++) {
3886 AVChapter *in_ch = is->chapters[i], *out_ch;
3887 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3888 AV_TIME_BASE_Q, in_ch->time_base);
3889 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3890 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3893 if (in_ch->end < ts_off)
3895 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3898 out_ch = av_mallocz(sizeof(AVChapter));
3900 return AVERROR(ENOMEM);
3902 out_ch->id = in_ch->id;
3903 out_ch->time_base = in_ch->time_base;
3904 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3905 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3908 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3911 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
3913 return AVERROR(ENOMEM);
3914 os->chapters[os->nb_chapters - 1] = out_ch;
3919 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3922 AVFormatContext *ic = avformat_alloc_context();
3924 ic->interrupt_callback = int_cb;
3925 err = avformat_open_input(&ic, filename, NULL, NULL);
3928 /* copy stream format */
3929 for(i=0;i<ic->nb_streams;i++) {
3933 AVCodecContext *avctx;
3935 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3936 ost = new_output_stream(o, s, codec->type);
3940 // FIXME: a more elegant solution is needed
3941 memcpy(st, ic->streams[i], sizeof(AVStream));
3942 st->info = av_malloc(sizeof(*st->info));
3943 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
3945 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3947 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
3948 choose_sample_fmt(st, codec);
3949 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
3950 choose_pixel_fmt(st, codec);
3953 av_close_input_file(ic);
3957 static void opt_output_file(void *optctx, const char *filename)
3959 OptionsContext *o = optctx;
3960 AVFormatContext *oc;
3962 AVOutputFormat *file_oformat;
3966 if (!strcmp(filename, "-"))
3969 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
3971 print_error(filename, err);
3974 file_oformat= oc->oformat;
3975 oc->interrupt_callback = int_cb;
3977 if (!strcmp(file_oformat->name, "ffm") &&
3978 av_strstart(filename, "http:", NULL)) {
3980 /* special case for files sent to ffserver: we get the stream
3981 parameters from ffserver */
3982 int err = read_ffserver_streams(o, oc, filename);
3984 print_error(filename, err);
3987 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
3988 ost = &output_streams[j];
3989 for (i = 0; i < nb_input_streams; i++) {
3990 ist = &input_streams[i];
3991 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
3993 ost->source_index= i;
3999 av_log(NULL, AV_LOG_FATAL, "Missing %s stream which is required by this ffm\n", av_get_media_type_string(ost->st->codec->codec_type));
4003 } else if (!o->nb_stream_maps) {
4004 /* pick the "best" stream of each type */
4005 #define NEW_STREAM(type, index)\
4007 ost = new_ ## type ## _stream(o, oc);\
4008 ost->source_index = index;\
4009 ost->sync_ist = &input_streams[index];\
4010 input_streams[index].discard = 0;\
4013 /* video: highest resolution */
4014 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
4015 int area = 0, idx = -1;
4016 for (i = 0; i < nb_input_streams; i++) {
4017 ist = &input_streams[i];
4018 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
4019 ist->st->codec->width * ist->st->codec->height > area) {
4020 area = ist->st->codec->width * ist->st->codec->height;
4024 NEW_STREAM(video, idx);
4027 /* audio: most channels */
4028 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
4029 int channels = 0, idx = -1;
4030 for (i = 0; i < nb_input_streams; i++) {
4031 ist = &input_streams[i];
4032 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
4033 ist->st->codec->channels > channels) {
4034 channels = ist->st->codec->channels;
4038 NEW_STREAM(audio, idx);
4041 /* subtitles: pick first */
4042 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
4043 for (i = 0; i < nb_input_streams; i++)
4044 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
4045 NEW_STREAM(subtitle, i);
4049 /* do something with data? */
4051 for (i = 0; i < o->nb_stream_maps; i++) {
4052 StreamMap *map = &o->stream_maps[i];
4057 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
4058 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
4060 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
4062 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
4065 switch (ist->st->codec->codec_type) {
4066 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
4067 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
4068 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
4069 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
4070 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
4072 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
4073 map->file_index, map->stream_index);
4077 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
4078 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
4079 map->sync_stream_index];
4084 /* handle attached files */
4085 for (i = 0; i < o->nb_attachments; i++) {
4087 uint8_t *attachment;
4091 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
4092 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
4096 if ((len = avio_size(pb)) <= 0) {
4097 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
4101 if (!(attachment = av_malloc(len))) {
4102 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
4106 avio_read(pb, attachment, len);
4108 ost = new_attachment_stream(o, oc);
4109 ost->stream_copy = 0;
4110 ost->source_index = -1;
4111 ost->attachment_filename = o->attachments[i];
4112 ost->st->codec->extradata = attachment;
4113 ost->st->codec->extradata_size = len;
4115 p = strrchr(o->attachments[i], '/');
4116 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
4120 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
4121 output_files[nb_output_files - 1].ctx = oc;
4122 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
4123 output_files[nb_output_files - 1].recording_time = o->recording_time;
4124 output_files[nb_output_files - 1].start_time = o->start_time;
4125 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
4126 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
4128 /* check filename in case of an image number is expected */
4129 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
4130 if (!av_filename_number_test(oc->filename)) {
4131 print_error(oc->filename, AVERROR(EINVAL));
4136 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
4137 /* test if it already exists to avoid loosing precious files */
4138 assert_file_overwrite(filename);
4141 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
4142 &oc->interrupt_callback,
4143 &output_files[nb_output_files - 1].opts)) < 0) {
4144 print_error(filename, err);
4149 if (o->mux_preload) {
4151 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
4152 av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
4154 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
4156 if (loop_output >= 0) {
4157 av_log(NULL, AV_LOG_WARNING, "-loop_output is deprecated, use -loop\n");
4158 oc->loop_output = loop_output;
4162 if (o->chapters_input_file >= nb_input_files) {
4163 if (o->chapters_input_file == INT_MAX) {
4164 /* copy chapters from the first input file that has them*/
4165 o->chapters_input_file = -1;
4166 for (i = 0; i < nb_input_files; i++)
4167 if (input_files[i].ctx->nb_chapters) {
4168 o->chapters_input_file = i;
4172 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
4173 o->chapters_input_file);
4177 if (o->chapters_input_file >= 0)
4178 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
4179 !o->metadata_chapters_manual);
4182 for (i = 0; i < o->nb_meta_data_maps; i++) {
4183 AVFormatContext *files[2];
4184 AVDictionary **meta[2];
4187 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
4188 if ((index) < 0 || (index) >= (nb_elems)) {\
4189 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps\n",\
4194 int in_file_index = o->meta_data_maps[i][1].file;
4195 if (in_file_index < 0)
4197 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
4200 files[1] = input_files[in_file_index].ctx;
4202 for (j = 0; j < 2; j++) {
4203 MetadataMap *map = &o->meta_data_maps[i][j];
4205 switch (map->type) {
4207 meta[j] = &files[j]->metadata;
4210 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
4211 meta[j] = &files[j]->streams[map->index]->metadata;
4214 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
4215 meta[j] = &files[j]->chapters[map->index]->metadata;
4218 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
4219 meta[j] = &files[j]->programs[map->index]->metadata;
4226 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
4229 /* copy global metadata by default */
4230 if (!o->metadata_global_manual && nb_input_files){
4231 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
4232 AV_DICT_DONT_OVERWRITE);
4233 if(o->recording_time != INT64_MAX)
4234 av_dict_set(&oc->metadata, "duration", NULL, 0);
4236 if (!o->metadata_streams_manual)
4237 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
4239 if (output_streams[i].source_index < 0) /* this is true e.g. for attached files */
4241 ist = &input_streams[output_streams[i].source_index];
4242 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
4245 /* process manually set metadata */
4246 for (i = 0; i < o->nb_metadata; i++) {
4251 val = strchr(o->metadata[i].u.str, '=');
4253 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
4254 o->metadata[i].u.str);
4259 parse_meta_type(o->metadata[i].specifier, &type, &index);
4265 if (index < 0 || index >= oc->nb_streams) {
4266 av_log(NULL, AV_LOG_FATAL, "Invalid stream index %d in metadata specifier.\n", index);
4269 m = &oc->streams[index]->metadata;
4272 if (index < 0 || index >= oc->nb_chapters) {
4273 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
4276 m = &oc->chapters[index]->metadata;
4279 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
4283 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
4286 reset_options(o, 0);
4289 /* same option as mencoder */
4290 static int opt_pass(const char *opt, const char *arg)
4292 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
4296 static int64_t getutime(void)
4299 struct rusage rusage;
4301 getrusage(RUSAGE_SELF, &rusage);
4302 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4303 #elif HAVE_GETPROCESSTIMES
4305 FILETIME c, e, k, u;
4306 proc = GetCurrentProcess();
4307 GetProcessTimes(proc, &c, &e, &k, &u);
4308 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4310 return av_gettime();
4314 static int64_t getmaxrss(void)
4316 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4317 struct rusage rusage;
4318 getrusage(RUSAGE_SELF, &rusage);
4319 return (int64_t)rusage.ru_maxrss * 1024;
4320 #elif HAVE_GETPROCESSMEMORYINFO
4322 PROCESS_MEMORY_COUNTERS memcounters;
4323 proc = GetCurrentProcess();
4324 memcounters.cb = sizeof(memcounters);
4325 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4326 return memcounters.PeakPagefileUsage;
4332 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
4334 return parse_option(o, "q:a", arg, options);
4337 static void show_usage(void)
4339 printf("Hyper fast Audio and Video encoder\n");
4340 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
4344 static int opt_help(const char *opt, const char *arg)
4346 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
4347 av_log_set_callback(log_callback_help);
4349 show_help_options(options, "Main options:\n",
4350 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4351 show_help_options(options, "\nAdvanced options:\n",
4352 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4354 show_help_options(options, "\nVideo options:\n",
4355 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4357 show_help_options(options, "\nAdvanced Video options:\n",
4358 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4359 OPT_VIDEO | OPT_EXPERT);
4360 show_help_options(options, "\nAudio options:\n",
4361 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4363 show_help_options(options, "\nAdvanced Audio options:\n",
4364 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4365 OPT_AUDIO | OPT_EXPERT);
4366 show_help_options(options, "\nSubtitle options:\n",
4367 OPT_SUBTITLE | OPT_GRAB,
4369 show_help_options(options, "\nAudio/Video grab options:\n",
4373 show_help_children(avcodec_get_class(), flags);
4374 show_help_children(avformat_get_class(), flags);
4375 show_help_children(sws_get_class(), flags);
4380 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
4382 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4383 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4385 if(!strncmp(arg, "pal-", 4)) {
4388 } else if(!strncmp(arg, "ntsc-", 5)) {
4391 } else if(!strncmp(arg, "film-", 5)) {
4395 /* Try to determine PAL/NTSC by peeking in the input files */
4396 if(nb_input_files) {
4398 for (j = 0; j < nb_input_files; j++) {
4399 for (i = 0; i < input_files[j].nb_streams; i++) {
4400 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4401 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4403 fr = c->time_base.den * 1000 / c->time_base.num;
4407 } else if((fr == 29970) || (fr == 23976)) {
4416 if (norm != UNKNOWN)
4417 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4420 if(norm == UNKNOWN) {
4421 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4422 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4423 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
4427 if(!strcmp(arg, "vcd")) {
4428 opt_video_codec(o, "c:v", "mpeg1video");
4429 opt_audio_codec(o, "c:a", "mp2");
4430 parse_option(o, "f", "vcd", options);
4432 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
4433 parse_option(o, "r", frame_rates[norm], options);
4434 opt_default("g", norm == PAL ? "15" : "18");
4436 opt_default("b:v", "1150000");
4437 opt_default("maxrate", "1150000");
4438 opt_default("minrate", "1150000");
4439 opt_default("bufsize", "327680"); // 40*1024*8;
4441 opt_default("b:a", "224000");
4442 parse_option(o, "ar", "44100", options);
4443 parse_option(o, "ac", "2", options);
4445 opt_default("packetsize", "2324");
4446 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4448 /* We have to offset the PTS, so that it is consistent with the SCR.
4449 SCR starts at 36000, but the first two packs contain only padding
4450 and the first pack from the other stream, respectively, may also have
4451 been written before.
4452 So the real data starts at SCR 36000+3*1200. */
4453 o->mux_preload = (36000+3*1200) / 90000.0; //0.44
4454 } else if(!strcmp(arg, "svcd")) {
4456 opt_video_codec(o, "c:v", "mpeg2video");
4457 opt_audio_codec(o, "c:a", "mp2");
4458 parse_option(o, "f", "svcd", options);
4460 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
4461 parse_option(o, "r", frame_rates[norm], options);
4462 parse_option(o, "pix_fmt", "yuv420p", options);
4463 opt_default("g", norm == PAL ? "15" : "18");
4465 opt_default("b:v", "2040000");
4466 opt_default("maxrate", "2516000");
4467 opt_default("minrate", "0"); //1145000;
4468 opt_default("bufsize", "1835008"); //224*1024*8;
4469 opt_default("flags", "+scan_offset");
4472 opt_default("b:a", "224000");
4473 parse_option(o, "ar", "44100", options);
4475 opt_default("packetsize", "2324");
4477 } else if(!strcmp(arg, "dvd")) {
4479 opt_video_codec(o, "c:v", "mpeg2video");
4480 opt_audio_codec(o, "c:a", "ac3");
4481 parse_option(o, "f", "dvd", options);
4483 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4484 parse_option(o, "r", frame_rates[norm], options);
4485 parse_option(o, "pix_fmt", "yuv420p", options);
4486 opt_default("g", norm == PAL ? "15" : "18");
4488 opt_default("b:v", "6000000");
4489 opt_default("maxrate", "9000000");
4490 opt_default("minrate", "0"); //1500000;
4491 opt_default("bufsize", "1835008"); //224*1024*8;
4493 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4494 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4496 opt_default("b:a", "448000");
4497 parse_option(o, "ar", "48000", options);
4499 } else if(!strncmp(arg, "dv", 2)) {
4501 parse_option(o, "f", "dv", options);
4503 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4504 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4505 norm == PAL ? "yuv420p" : "yuv411p", options);
4506 parse_option(o, "r", frame_rates[norm], options);
4508 parse_option(o, "ar", "48000", options);
4509 parse_option(o, "ac", "2", options);
4512 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
4513 return AVERROR(EINVAL);
4518 static int opt_vstats_file(const char *opt, const char *arg)
4520 av_free (vstats_filename);
4521 vstats_filename=av_strdup (arg);
4525 static int opt_vstats(const char *opt, const char *arg)
4528 time_t today2 = time(NULL);
4529 struct tm *today = localtime(&today2);
4531 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4533 return opt_vstats_file(opt, filename);
4536 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4538 return parse_option(o, "frames:v", arg, options);
4541 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4543 return parse_option(o, "frames:a", arg, options);
4546 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4548 return parse_option(o, "frames:d", arg, options);
4551 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
4554 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4555 const char *codec_name = *opt == 'v' ? video_codec_name :
4556 *opt == 'a' ? audio_codec_name :
4557 subtitle_codec_name;
4559 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4560 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
4561 av_log(0, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
4563 av_log(0, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
4568 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4569 if(line[0] == '#' && !e)
4571 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4573 av_log(0, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
4576 if(!strcmp(tmp, "acodec")){
4577 opt_audio_codec(o, tmp, tmp2);
4578 }else if(!strcmp(tmp, "vcodec")){
4579 opt_video_codec(o, tmp, tmp2);
4580 }else if(!strcmp(tmp, "scodec")){
4581 opt_subtitle_codec(o, tmp, tmp2);
4582 }else if(!strcmp(tmp, "dcodec")){
4583 opt_data_codec(o, tmp, tmp2);
4584 }else if(opt_default(tmp, tmp2) < 0){
4585 av_log(0, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4595 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
4599 static int opt_passlogfile(const char *opt, const char *arg)
4601 pass_logfilename_prefix = arg;
4602 #if CONFIG_LIBX264_ENCODER
4603 return opt_default("passlogfile", arg);
4609 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
4611 char *s= av_malloc(strlen(opt)+2);
4612 snprintf(s, strlen(opt)+2, "%s:%c", opt+1, *opt);
4613 return parse_option(o, s, arg, options);
4616 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
4618 if(!strcmp(opt, "b")){
4619 av_log(0,AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
4620 return parse_option(o, av_strdup("b:v"), arg, options);
4622 return opt_default(opt, arg);
4625 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4627 return parse_option(o, "filter:v", arg, options);
4630 #define OFFSET(x) offsetof(OptionsContext, x)
4631 static const OptionDef options[] = {
4633 #include "cmdutils_common_opts.h"
4634 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4635 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4636 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4637 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
4638 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4639 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4640 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
4641 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4642 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_channel}, "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
4643 { "map_meta_data", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4644 "outfile[,metadata]:infile[,metadata]" },
4645 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4646 "outfile[,metadata]:infile[,metadata]" },
4647 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4648 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4649 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4650 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4651 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4652 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4653 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4654 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4655 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4656 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4657 "add timings for benchmarking" },
4658 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4659 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4660 "dump each input packet" },
4661 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4662 "when dumping packets, also dump the payload" },
4663 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4664 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "deprecated, use -loop" },
4665 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "deprecated, use -loop", "" },
4666 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4667 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4668 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4669 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4670 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4671 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4672 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4673 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4674 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4675 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
4676 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4677 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4678 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4679 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4681 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4683 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
4684 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
4685 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
4688 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4689 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4690 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4691 { "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" },
4692 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4693 { "bits_per_raw_sample", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&frame_bits_per_raw_sample}, "set the number of bits per raw sample", "number" },
4694 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4695 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4696 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4697 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4698 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4699 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4700 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4701 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4702 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4703 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4704 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4705 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4706 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4707 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4708 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4709 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4710 "use same quantizer as source (implies VBR)" },
4711 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4712 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4713 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4714 "deinterlace pictures" },
4715 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4716 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4717 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4719 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
4721 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
4722 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
4723 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
4724 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4725 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
4726 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4727 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
4728 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4729 { "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" },
4730 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
4733 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4734 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
4735 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
4736 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
4737 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
4738 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4739 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
4740 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4741 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
4742 { "rmvol", HAS_ARG | OPT_AUDIO | OPT_FLOAT | OPT_SPEC, {.off = OFFSET(rematrix_volume)}, "rematrix volume (as factor)", "volume" },
4744 /* subtitle options */
4745 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
4746 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4747 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
4750 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
4751 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
4752 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4755 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4756 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4758 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4759 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
4760 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
4762 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4763 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4764 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4765 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4766 /* data codec support */
4767 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4769 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4773 int main(int argc, char **argv)
4775 OptionsContext o = { 0 };
4778 reset_options(&o, 0);
4780 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4781 parse_loglevel(argc, argv, options);
4783 if(argc>1 && !strcmp(argv[1], "-d")){
4785 av_log_set_callback(log_callback_null);
4790 avcodec_register_all();
4792 avdevice_register_all();
4795 avfilter_register_all();
4798 avformat_network_init();
4805 parse_options(&o, argc, argv, options, opt_output_file);
4807 if(nb_output_files <= 0 && nb_input_files == 0) {
4809 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4813 /* file converter / grab */
4814 if (nb_output_files <= 0) {
4815 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
4819 if (nb_input_files == 0) {
4820 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
4825 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4827 ti = getutime() - ti;
4829 int maxrss = getmaxrss() / 1024;
4830 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);