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 do_benchmark = 0;
135 static int do_hex_dump = 0;
136 static int do_pkt_dump = 0;
137 static int do_psnr = 0;
138 static int do_pass = 0;
139 static const char *pass_logfilename_prefix;
140 static int video_sync_method= -1;
141 static int audio_sync_method= 0;
142 static float audio_drift_threshold= 0.1;
143 static int copy_ts= 0;
144 static int copy_tb= 0;
145 static int opt_shortest = 0;
146 static char *vstats_filename;
147 static FILE *vstats_file;
149 static int audio_volume = 256;
151 static int exit_on_error = 0;
152 static int using_stdin = 0;
153 static int run_as_daemon = 0;
154 static volatile int received_nb_signals = 0;
155 static int64_t video_size = 0;
156 static int64_t audio_size = 0;
157 static int64_t extra_size = 0;
158 static int nb_frames_dup = 0;
159 static int nb_frames_drop = 0;
160 static int input_sync;
162 static float dts_delta_threshold = 10;
164 static int print_stats = 1;
166 static uint8_t *audio_buf;
167 static uint8_t *audio_out;
168 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
170 static void *samples;
171 static uint8_t *input_tmp= NULL;
173 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
175 typedef struct InputStream {
178 int discard; /* true if stream data should be discarded */
179 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
182 int64_t start; /* time when read started */
183 int64_t next_pts; /* synthetic pts for cases where pkt.pts
185 int64_t pts; /* current pts */
187 int is_start; /* is 1 at the start and after a discontinuity */
188 int showed_multi_packet_warning;
192 typedef struct InputFile {
193 AVFormatContext *ctx;
194 int eof_reached; /* true if eof reached */
195 int ist_index; /* index of first stream in input_streams */
196 int buffer_size; /* current total buffer size */
198 int nb_streams; /* number of stream that ffmpeg is aware of; may be different
199 from ctx.nb_streams if new streams appear during av_read_frame() */
203 typedef struct OutputStream {
204 int file_index; /* file index */
205 int index; /* stream index in the output file */
206 int source_index; /* InputStream index */
207 AVStream *st; /* stream in the output file */
208 int encoding_needed; /* true if encoding needed for this stream */
210 /* input pts and corresponding output pts
212 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
213 struct InputStream *sync_ist; /* input stream to sync against */
214 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
215 AVBitStreamFilterContext *bitstream_filters;
221 AVFrame resample_frame; /* temporary frame for image resampling */
222 struct SwsContext *img_resample_ctx; /* for image resampling */
225 int resample_pix_fmt;
226 AVRational frame_rate;
230 float frame_aspect_ratio;
232 /* forced key frames */
233 int64_t *forced_kf_pts;
239 int audio_channels_map[SWR_CH_MAX]; ///< list of the channels id to pick from the source stream
240 int audio_channels_mapped; ///< number of channels in audio_channels_map
241 int resample_sample_fmt;
242 int resample_channels;
243 int resample_sample_rate;
244 float rematrix_volume;
245 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
248 struct SwrContext *swr;
251 AVFilterContext *output_video_filter;
252 AVFilterContext *input_video_filter;
253 AVFilterBufferRef *picref;
255 AVFilterGraph *graph;
260 int is_past_recording_time;
262 const char *attachment_filename;
263 int copy_initial_nonkeyframes;
269 /* init terminal so that we can grab keys */
270 static struct termios oldtty;
273 typedef struct OutputFile {
274 AVFormatContext *ctx;
276 int ost_index; /* index of the first stream in output_streams */
277 int64_t recording_time; /* desired length of the resulting file in microseconds */
278 int64_t start_time; /* start time in microseconds */
279 uint64_t limit_filesize;
282 static InputStream *input_streams = NULL;
283 static int nb_input_streams = 0;
284 static InputFile *input_files = NULL;
285 static int nb_input_files = 0;
287 static OutputStream *output_streams = NULL;
288 static int nb_output_streams = 0;
289 static OutputFile *output_files = NULL;
290 static int nb_output_files = 0;
292 typedef struct OptionsContext {
293 /* input/output options */
297 SpecifierOpt *codec_names;
299 SpecifierOpt *audio_channels;
300 int nb_audio_channels;
301 SpecifierOpt *audio_sample_rate;
302 int nb_audio_sample_rate;
303 SpecifierOpt *rematrix_volume;
304 int nb_rematrix_volume;
305 SpecifierOpt *frame_rates;
307 SpecifierOpt *frame_sizes;
309 SpecifierOpt *frame_pix_fmts;
310 int nb_frame_pix_fmts;
313 int64_t input_ts_offset;
316 SpecifierOpt *ts_scale;
318 SpecifierOpt *dump_attachment;
319 int nb_dump_attachment;
322 StreamMap *stream_maps;
324 AudioChannelMap *audio_channel_maps; ///< one info entry per -map_channel
325 int nb_audio_channel_maps; ///< number of (valid) -map_channel settings
326 /* first item specifies output metadata, second is input */
327 MetadataMap (*meta_data_maps)[2];
328 int nb_meta_data_maps;
329 int metadata_global_manual;
330 int metadata_streams_manual;
331 int metadata_chapters_manual;
332 const char **attachments;
335 int chapters_input_file;
337 int64_t recording_time;
338 uint64_t limit_filesize;
344 int subtitle_disable;
347 /* indexed by output file stream index */
351 SpecifierOpt *metadata;
353 SpecifierOpt *max_frames;
355 SpecifierOpt *bitstream_filters;
356 int nb_bitstream_filters;
357 SpecifierOpt *codec_tags;
359 SpecifierOpt *sample_fmts;
361 SpecifierOpt *qscale;
363 SpecifierOpt *forced_key_frames;
364 int nb_forced_key_frames;
365 SpecifierOpt *force_fps;
367 SpecifierOpt *frame_aspect_ratios;
368 int nb_frame_aspect_ratios;
369 SpecifierOpt *rc_overrides;
371 SpecifierOpt *intra_matrices;
372 int nb_intra_matrices;
373 SpecifierOpt *inter_matrices;
374 int nb_inter_matrices;
375 SpecifierOpt *top_field_first;
376 int nb_top_field_first;
377 SpecifierOpt *presets;
379 SpecifierOpt *copy_initial_nonkeyframes;
380 int nb_copy_initial_nonkeyframes;
382 SpecifierOpt *filters;
387 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
390 for (i = 0; i < o->nb_ ## name; i++) {\
391 char *spec = o->name[i].specifier;\
392 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
393 outvar = o->name[i].u.type;\
399 static void reset_options(OptionsContext *o, int is_input)
401 const OptionDef *po = options;
402 OptionsContext bak= *o;
404 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
406 void *dst = (uint8_t*)o + po->u.off;
408 if (po->flags & OPT_SPEC) {
409 SpecifierOpt **so = dst;
410 int i, *count = (int*)(so + 1);
411 for (i = 0; i < *count; i++) {
412 av_freep(&(*so)[i].specifier);
413 if (po->flags & OPT_STRING)
414 av_freep(&(*so)[i].u.str);
418 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
423 av_freep(&o->stream_maps);
424 av_freep(&o->audio_channel_maps);
425 av_freep(&o->meta_data_maps);
426 av_freep(&o->streamid_map);
428 memset(o, 0, sizeof(*o));
430 if(is_input) o->recording_time = bak.recording_time;
431 else o->recording_time = INT64_MAX;
432 o->mux_max_delay = 0.7;
433 o->limit_filesize = UINT64_MAX;
434 o->chapters_input_file = INT_MAX;
442 static int configure_video_filters(InputStream *ist, OutputStream *ost)
444 AVFilterContext *last_filter, *filter;
445 /** filter graph containing all filters including input & output */
446 AVCodecContext *codec = ost->st->codec;
447 AVCodecContext *icodec = ist->st->codec;
448 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
449 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
450 AVRational sample_aspect_ratio;
454 ost->graph = avfilter_graph_alloc();
456 if (ist->st->sample_aspect_ratio.num){
457 sample_aspect_ratio = ist->st->sample_aspect_ratio;
459 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
461 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
462 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
463 sample_aspect_ratio.num, sample_aspect_ratio.den);
465 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
466 "src", args, NULL, ost->graph);
469 #if FF_API_OLD_VSINK_API
470 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
471 "out", NULL, pix_fmts, ost->graph);
473 buffersink_params->pixel_fmts = pix_fmts;
474 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
475 "out", NULL, buffersink_params, ost->graph);
477 av_freep(&buffersink_params);
480 last_filter = ost->input_video_filter;
482 if (codec->width != icodec->width || codec->height != icodec->height) {
483 snprintf(args, 255, "%d:%d:flags=0x%X",
486 (unsigned)ost->sws_flags);
487 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
488 NULL, args, NULL, ost->graph)) < 0)
490 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
492 last_filter = filter;
495 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
496 ost->graph->scale_sws_opts = av_strdup(args);
499 AVFilterInOut *outputs = avfilter_inout_alloc();
500 AVFilterInOut *inputs = avfilter_inout_alloc();
502 outputs->name = av_strdup("in");
503 outputs->filter_ctx = last_filter;
504 outputs->pad_idx = 0;
505 outputs->next = NULL;
507 inputs->name = av_strdup("out");
508 inputs->filter_ctx = ost->output_video_filter;
512 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
514 av_freep(&ost->avfilter);
516 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
520 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
523 codec->width = ost->output_video_filter->inputs[0]->w;
524 codec->height = ost->output_video_filter->inputs[0]->h;
525 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
526 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
527 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
528 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
532 #endif /* CONFIG_AVFILTER */
534 static void term_exit(void)
536 av_log(NULL, AV_LOG_QUIET, "%s", "");
539 tcsetattr (0, TCSANOW, &oldtty);
543 static volatile int received_sigterm = 0;
545 static void sigterm_handler(int sig)
547 received_sigterm = sig;
548 received_nb_signals++;
552 static void term_init(void)
562 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
563 |INLCR|IGNCR|ICRNL|IXON);
564 tty.c_oflag |= OPOST;
565 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
566 tty.c_cflag &= ~(CSIZE|PARENB);
571 tcsetattr (0, TCSANOW, &tty);
572 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
575 avformat_network_deinit();
577 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
578 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
580 signal(SIGXCPU, sigterm_handler);
584 /* read a key without blocking */
585 static int read_key(void)
597 n = select(1, &rfds, NULL, NULL, &tv);
606 # if HAVE_PEEKNAMEDPIPE
608 static HANDLE input_handle;
611 input_handle = GetStdHandle(STD_INPUT_HANDLE);
612 is_pipe = !GetConsoleMode(input_handle, &dw);
615 if (stdin->_cnt > 0) {
620 /* When running under a GUI, you will end here. */
621 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
638 static int decode_interrupt_cb(void *ctx)
640 return received_nb_signals > 1;
643 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
645 void av_noreturn exit_program(int ret)
650 for(i=0;i<nb_output_files;i++) {
651 AVFormatContext *s = output_files[i].ctx;
652 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
654 avformat_free_context(s);
655 av_dict_free(&output_files[i].opts);
657 for(i=0;i<nb_input_files;i++) {
658 av_close_input_file(input_files[i].ctx);
660 for (i = 0; i < nb_input_streams; i++)
661 av_dict_free(&input_streams[i].opts);
665 av_free(vstats_filename);
667 av_freep(&input_streams);
668 av_freep(&input_files);
669 av_freep(&output_streams);
670 av_freep(&output_files);
675 allocated_audio_buf_size= allocated_audio_out_size= 0;
681 avformat_network_deinit();
683 av_freep(&input_tmp);
685 if (received_sigterm) {
686 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
687 (int) received_sigterm);
691 exit(ret); /* not all OS-es handle main() return value */
694 static void assert_avoptions(AVDictionary *m)
696 AVDictionaryEntry *t;
697 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
698 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
703 static void assert_codec_experimental(AVCodecContext *c, int encoder)
705 const char *codec_string = encoder ? "encoder" : "decoder";
707 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
708 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
709 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
710 "results.\nAdd '-strict experimental' if you want to use it.\n",
711 codec_string, c->codec->name);
712 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
713 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
714 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
715 codec_string, codec->name);
720 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
722 if(codec && codec->sample_fmts){
723 const enum AVSampleFormat *p= codec->sample_fmts;
725 if(*p == st->codec->sample_fmt)
729 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
730 av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
731 if(av_get_sample_fmt_name(st->codec->sample_fmt))
732 av_log(NULL, AV_LOG_WARNING,
733 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
734 av_get_sample_fmt_name(st->codec->sample_fmt),
736 av_get_sample_fmt_name(codec->sample_fmts[0]));
737 st->codec->sample_fmt = codec->sample_fmts[0];
742 static void choose_sample_rate(AVStream *st, AVCodec *codec)
744 if(codec && codec->supported_samplerates){
745 const int *p= codec->supported_samplerates;
747 int best_dist=INT_MAX;
749 int dist= abs(st->codec->sample_rate - *p);
750 if(dist < best_dist){
756 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
758 st->codec->sample_rate= best;
762 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
764 if(codec && codec->pix_fmts){
765 const enum PixelFormat *p= codec->pix_fmts;
766 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
767 if(st->codec->codec_id==CODEC_ID_MJPEG){
768 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
769 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
770 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};
773 for (; *p != PIX_FMT_NONE; p++) {
774 if(*p == st->codec->pix_fmt)
777 if (*p == PIX_FMT_NONE) {
778 if(st->codec->pix_fmt != PIX_FMT_NONE)
779 av_log(NULL, AV_LOG_WARNING,
780 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
781 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
783 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
784 st->codec->pix_fmt = codec->pix_fmts[0];
789 static double get_sync_ipts(const OutputStream *ost)
791 const InputStream *ist = ost->sync_ist;
792 OutputFile *of = &output_files[ost->file_index];
793 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
796 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc)
801 AVPacket new_pkt= *pkt;
802 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
803 &new_pkt.data, &new_pkt.size,
804 pkt->data, pkt->size,
805 pkt->flags & AV_PKT_FLAG_KEY);
808 new_pkt.destruct= av_destruct_packet;
810 av_log(NULL, AV_LOG_ERROR, "%s failed for stream %d, codec %s",
811 bsfc->filter->name, pkt->stream_index,
812 avctx->codec ? avctx->codec->name : "copy");
822 ret= av_interleaved_write_frame(s, pkt);
824 print_error("av_interleaved_write_frame()", ret);
829 static void do_audio_out(AVFormatContext *s,
832 unsigned char *buf, int size)
835 int64_t audio_out_size, audio_buf_size;
836 int64_t allocated_for_size= size;
838 int size_out, frame_bytes, ret, resample_changed;
839 AVCodecContext *enc= ost->st->codec;
840 AVCodecContext *dec= ist->st->codec;
841 int osize = av_get_bytes_per_sample(enc->sample_fmt);
842 int isize = av_get_bytes_per_sample(dec->sample_fmt);
843 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
846 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
847 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
848 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
849 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
850 audio_buf_size*= osize*enc->channels;
852 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
853 if(coded_bps > 8*osize)
854 audio_out_size= audio_out_size * coded_bps / (8*osize);
855 audio_out_size += FF_MIN_BUFFER_SIZE;
857 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
858 av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n");
862 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
863 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
864 if (!audio_buf || !audio_out){
865 av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
869 if (enc->channels != dec->channels
870 || enc->sample_fmt != dec->sample_fmt)
871 ost->audio_resample = 1;
873 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
874 ost->resample_channels != dec->channels ||
875 ost->resample_sample_rate != dec->sample_rate;
877 if ((ost->audio_resample && !ost->swr) || resample_changed || ost->audio_channels_mapped) {
878 if (resample_changed) {
879 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",
880 ist->file_index, ist->st->index,
881 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
882 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
883 ost->resample_sample_fmt = dec->sample_fmt;
884 ost->resample_channels = dec->channels;
885 ost->resample_sample_rate = dec->sample_rate;
888 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
889 if (audio_sync_method <= 1 && !ost->audio_channels_mapped &&
890 ost->resample_sample_fmt == enc->sample_fmt &&
891 ost->resample_channels == enc->channels &&
892 ost->resample_sample_rate == enc->sample_rate) {
894 ost->audio_resample = 0;
896 ost->swr = swr_alloc_set_opts(ost->swr,
897 enc->channel_layout, enc->sample_fmt, enc->sample_rate,
898 dec->channel_layout, dec->sample_fmt, dec->sample_rate,
900 if (ost->audio_channels_mapped)
901 swr_set_channel_mapping(ost->swr, ost->audio_channels_map);
902 av_opt_set_double(ost->swr, "rmvol", ost->rematrix_volume, 0);
903 if (ost->audio_channels_mapped) {
904 av_opt_set_int(ost->swr, "icl", av_get_default_channel_layout(ost->audio_channels_mapped), 0);
905 av_opt_set_int(ost->swr, "uch", ost->audio_channels_mapped, 0);
907 av_opt_set_int(ost->swr, "ich", dec->channels, 0);
908 av_opt_set_int(ost->swr, "och", enc->channels, 0);
909 if(audio_sync_method>1) av_opt_set_int(ost->swr, "flags", SWR_FLAG_RESAMPLE, 0);
910 if(ost->swr && swr_init(ost->swr) < 0){
911 av_log(NULL, AV_LOG_FATAL, "swr_init() failed\n");
916 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
917 dec->channels, dec->sample_rate,
918 enc->channels, enc->sample_rate);
924 av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
926 if(audio_sync_method){
927 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
928 - av_fifo_size(ost->fifo)/(enc->channels * 2);
929 double idelta= delta*dec->sample_rate / enc->sample_rate;
930 int byte_delta= ((int)idelta)*2*dec->channels;
932 //FIXME resample delay
933 if(fabs(delta) > 50){
934 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
936 byte_delta= FFMAX(byte_delta, -size);
939 av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n", (int)-delta);
944 input_tmp= av_realloc(input_tmp, byte_delta + size);
946 if(byte_delta > allocated_for_size - size){
947 allocated_for_size= byte_delta + (int64_t)size;
952 memset(input_tmp, 0, byte_delta);
953 memcpy(input_tmp + byte_delta, buf, size);
956 av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", (int)delta);
958 }else if(audio_sync_method>1){
959 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
960 av_assert0(ost->audio_resample);
961 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
962 delta, comp, enc->sample_rate);
963 // 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));
964 swr_compensate(ost->swr, comp, enc->sample_rate);
968 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
969 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
971 if (ost->audio_resample) {
973 size_out = swr_convert(ost->swr, ( uint8_t*[]){buftmp}, audio_buf_size / (enc->channels * osize),
974 (const uint8_t*[]){buf }, size / (dec->channels * isize));
975 size_out = size_out * enc->channels * osize;
981 av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
983 /* now encode as many frames as possible */
984 if (enc->frame_size > 1) {
985 /* output resampled raw samples */
986 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
987 av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
990 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
992 frame_bytes = enc->frame_size * osize * enc->channels;
994 while (av_fifo_size(ost->fifo) >= frame_bytes) {
996 av_init_packet(&pkt);
998 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
1000 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1002 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
1003 (short *)audio_buf);
1005 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1009 pkt.stream_index= ost->index;
1010 pkt.data= audio_out;
1012 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1013 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1014 pkt.flags |= AV_PKT_FLAG_KEY;
1015 write_frame(s, &pkt, enc, ost->bitstream_filters);
1017 ost->sync_opts += enc->frame_size;
1021 av_init_packet(&pkt);
1023 ost->sync_opts += size_out / (osize * enc->channels);
1025 /* output a pcm frame */
1026 /* determine the size of the coded buffer */
1029 size_out = size_out*coded_bps/8;
1031 if(size_out > audio_out_size){
1032 av_log(NULL, AV_LOG_FATAL, "Internal error, buffer size too small\n");
1036 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1037 ret = avcodec_encode_audio(enc, audio_out, size_out,
1040 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1044 pkt.stream_index= ost->index;
1045 pkt.data= audio_out;
1047 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1048 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1049 pkt.flags |= AV_PKT_FLAG_KEY;
1050 write_frame(s, &pkt, enc, ost->bitstream_filters);
1054 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1056 AVCodecContext *dec;
1057 AVPicture *picture2;
1058 AVPicture picture_tmp;
1061 dec = ist->st->codec;
1063 /* deinterlace : must be done before any resize */
1064 if (do_deinterlace) {
1067 /* create temporary picture */
1068 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1069 buf = av_malloc(size);
1073 picture2 = &picture_tmp;
1074 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1076 if(avpicture_deinterlace(picture2, picture,
1077 dec->pix_fmt, dec->width, dec->height) < 0) {
1078 /* if error, do not deinterlace */
1079 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1088 if (picture != picture2)
1089 *picture = *picture2;
1093 static void do_subtitle_out(AVFormatContext *s,
1099 static uint8_t *subtitle_out = NULL;
1100 int subtitle_out_max_size = 1024 * 1024;
1101 int subtitle_out_size, nb, i;
1102 AVCodecContext *enc;
1105 if (pts == AV_NOPTS_VALUE) {
1106 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1112 enc = ost->st->codec;
1114 if (!subtitle_out) {
1115 subtitle_out = av_malloc(subtitle_out_max_size);
1118 /* Note: DVB subtitle need one packet to draw them and one other
1119 packet to clear them */
1120 /* XXX: signal it in the codec context ? */
1121 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1126 for(i = 0; i < nb; i++) {
1127 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1128 // start_display_time is required to be 0
1129 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1130 sub->end_display_time -= sub->start_display_time;
1131 sub->start_display_time = 0;
1132 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1133 subtitle_out_max_size, sub);
1134 if (subtitle_out_size < 0) {
1135 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1139 av_init_packet(&pkt);
1140 pkt.stream_index = ost->index;
1141 pkt.data = subtitle_out;
1142 pkt.size = subtitle_out_size;
1143 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1144 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1145 /* XXX: the pts correction is handled here. Maybe handling
1146 it in the codec would be better */
1148 pkt.pts += 90 * sub->start_display_time;
1150 pkt.pts += 90 * sub->end_display_time;
1152 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1156 static int bit_buffer_size= 1024*256;
1157 static uint8_t *bit_buffer= NULL;
1159 static void do_video_resample(OutputStream *ost,
1161 AVFrame *in_picture,
1162 AVFrame **out_picture)
1165 *out_picture = in_picture;
1167 AVCodecContext *dec = ist->st->codec;
1168 AVCodecContext *enc = ost->st->codec;
1169 int resample_changed = ost->resample_width != dec->width ||
1170 ost->resample_height != dec->height ||
1171 ost->resample_pix_fmt != dec->pix_fmt;
1173 *out_picture = in_picture;
1174 if (resample_changed) {
1175 av_log(NULL, AV_LOG_INFO,
1176 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1177 ist->file_index, ist->st->index,
1178 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1179 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1180 ost->resample_width = dec->width;
1181 ost->resample_height = dec->height;
1182 ost->resample_pix_fmt = dec->pix_fmt;
1185 ost->video_resample = dec->width != enc->width ||
1186 dec->height != enc->height ||
1187 dec->pix_fmt != enc->pix_fmt;
1189 if (ost->video_resample) {
1190 *out_picture = &ost->resample_frame;
1191 if (!ost->img_resample_ctx || resample_changed) {
1192 /* initialize the destination picture */
1193 if (!ost->resample_frame.data[0]) {
1194 avcodec_get_frame_defaults(&ost->resample_frame);
1195 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1196 enc->width, enc->height)) {
1197 av_log(NULL, AV_LOG_FATAL, "Cannot allocate temp picture, check pix fmt\n");
1201 /* initialize a new scaler context */
1202 sws_freeContext(ost->img_resample_ctx);
1203 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1204 enc->width, enc->height, enc->pix_fmt,
1205 ost->sws_flags, NULL, NULL, NULL);
1206 if (ost->img_resample_ctx == NULL) {
1207 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1211 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1212 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1218 static void do_video_out(AVFormatContext *s,
1221 AVFrame *in_picture,
1222 int *frame_size, float quality)
1224 int nb_frames, i, ret, format_video_sync;
1225 AVFrame *final_picture;
1226 AVCodecContext *enc;
1228 double duration = 0;
1230 enc = ost->st->codec;
1232 if (ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE) {
1233 duration = FFMAX(av_q2d(ist->st->time_base), av_q2d(ist->st->codec->time_base));
1234 if(ist->st->avg_frame_rate.num)
1235 duration= FFMAX(duration, 1/av_q2d(ist->st->avg_frame_rate));
1237 duration /= av_q2d(enc->time_base);
1240 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1242 /* by default, we output a single frame */
1247 format_video_sync = video_sync_method;
1248 if (format_video_sync < 0)
1249 format_video_sync = (s->oformat->flags & AVFMT_NOTIMESTAMPS) ? 0 :
1250 (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1252 if (format_video_sync) {
1253 double vdelta = sync_ipts - ost->sync_opts + duration;
1254 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1257 else if (format_video_sync == 2) {
1260 }else if(vdelta>0.6)
1261 ost->sync_opts= lrintf(sync_ipts);
1262 }else if (vdelta > 1.1)
1263 nb_frames = lrintf(vdelta);
1264 //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);
1265 if (nb_frames == 0){
1267 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1268 }else if (nb_frames > 1) {
1269 nb_frames_dup += nb_frames - 1;
1270 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames-1);
1273 ost->sync_opts= lrintf(sync_ipts);
1275 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1279 do_video_resample(ost, ist, in_picture, &final_picture);
1281 /* duplicates frame if needed */
1282 for(i=0;i<nb_frames;i++) {
1284 av_init_packet(&pkt);
1285 pkt.stream_index= ost->index;
1287 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1288 /* raw pictures are written as AVPicture structure to
1289 avoid any copies. We support temporarily the older
1291 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1292 enc->coded_frame->top_field_first = in_picture->top_field_first;
1293 pkt.data= (uint8_t *)final_picture;
1294 pkt.size= sizeof(AVPicture);
1295 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1296 pkt.flags |= AV_PKT_FLAG_KEY;
1298 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1300 AVFrame big_picture;
1302 big_picture= *final_picture;
1303 /* better than nothing: use input picture interlaced
1305 big_picture.interlaced_frame = in_picture->interlaced_frame;
1306 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1307 if (ost->top_field_first == -1)
1308 big_picture.top_field_first = in_picture->top_field_first;
1310 big_picture.top_field_first = !!ost->top_field_first;
1313 /* handles same_quant here. This is not correct because it may
1314 not be a global option */
1315 big_picture.quality = quality;
1316 if (!enc->me_threshold)
1317 big_picture.pict_type = 0;
1318 // big_picture.pts = AV_NOPTS_VALUE;
1319 big_picture.pts= ost->sync_opts;
1320 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1321 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1322 if (ost->forced_kf_index < ost->forced_kf_count &&
1323 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1324 big_picture.pict_type = AV_PICTURE_TYPE_I;
1325 ost->forced_kf_index++;
1327 ret = avcodec_encode_video(enc,
1328 bit_buffer, bit_buffer_size,
1331 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1336 pkt.data= bit_buffer;
1338 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1339 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1340 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1341 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1342 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1344 if(enc->coded_frame->key_frame)
1345 pkt.flags |= AV_PKT_FLAG_KEY;
1346 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1349 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1350 // enc->frame_number-1, ret, enc->pict_type);
1351 /* if two pass, output log */
1352 if (ost->logfile && enc->stats_out) {
1353 fprintf(ost->logfile, "%s", enc->stats_out);
1358 ost->frame_number++;
1362 static double psnr(double d)
1364 return -10.0*log(d)/log(10.0);
1367 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1370 AVCodecContext *enc;
1372 double ti1, bitrate, avg_bitrate;
1374 /* this is executed just the first time do_video_stats is called */
1376 vstats_file = fopen(vstats_filename, "w");
1383 enc = ost->st->codec;
1384 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1385 frame_number = ost->frame_number;
1386 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1387 if (enc->flags&CODEC_FLAG_PSNR)
1388 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1390 fprintf(vstats_file,"f_size= %6d ", frame_size);
1391 /* compute pts value */
1392 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1396 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1397 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1398 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1399 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1400 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1404 static void print_report(OutputFile *output_files,
1405 OutputStream *ost_table, int nb_ostreams,
1406 int is_last_report, int64_t timer_start, int64_t cur_time)
1410 AVFormatContext *oc;
1412 AVCodecContext *enc;
1413 int frame_number, vid, i;
1415 int64_t pts = INT64_MAX;
1416 static int64_t last_time = -1;
1417 static int qp_histogram[52];
1418 int hours, mins, secs, us;
1420 if (!print_stats && !is_last_report)
1423 if (!is_last_report) {
1424 if (last_time == -1) {
1425 last_time = cur_time;
1428 if ((cur_time - last_time) < 500000)
1430 last_time = cur_time;
1434 oc = output_files[0].ctx;
1436 total_size = avio_size(oc->pb);
1437 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1438 total_size= avio_tell(oc->pb);
1442 for(i=0;i<nb_ostreams;i++) {
1444 ost = &ost_table[i];
1445 enc = ost->st->codec;
1446 if (!ost->stream_copy && enc->coded_frame)
1447 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1448 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1449 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1451 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1452 float t = (cur_time-timer_start) / 1000000.0;
1454 frame_number = ost->frame_number;
1455 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1456 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1458 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1462 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1465 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1467 if (enc->flags&CODEC_FLAG_PSNR){
1469 double error, error_sum=0;
1470 double scale, scale_sum=0;
1471 char type[3]= {'Y','U','V'};
1472 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1475 error= enc->error[j];
1476 scale= enc->width*enc->height*255.0*255.0*frame_number;
1478 error= enc->coded_frame->error[j];
1479 scale= enc->width*enc->height*255.0*255.0;
1484 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1486 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1490 /* compute min output value */
1491 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1492 ost->st->time_base, AV_TIME_BASE_Q));
1495 secs = pts / AV_TIME_BASE;
1496 us = pts % AV_TIME_BASE;
1502 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1504 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1505 "size=%8.0fkB time=", total_size / 1024.0);
1506 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1507 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1508 (100 * us) / AV_TIME_BASE);
1509 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1510 "bitrate=%6.1fkbits/s", bitrate);
1512 if (nb_frames_dup || nb_frames_drop)
1513 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1514 nb_frames_dup, nb_frames_drop);
1516 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
1520 if (is_last_report) {
1521 int64_t raw= audio_size + video_size + extra_size;
1522 av_log(NULL, AV_LOG_INFO, "\n");
1523 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1527 100.0*(total_size - raw)/raw
1532 static void generate_silence(uint8_t *buf, enum AVSampleFormat sample_fmt, size_t size)
1534 int fill_char = 0x00;
1535 if (sample_fmt == AV_SAMPLE_FMT_U8)
1537 memset(buf, fill_char, size);
1540 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1544 for (i = 0; i < nb_ostreams; i++) {
1545 OutputStream *ost = &ost_table[i];
1546 AVCodecContext *enc = ost->st->codec;
1547 AVFormatContext *os = output_files[ost->file_index].ctx;
1549 if (!ost->encoding_needed)
1552 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1554 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1560 av_init_packet(&pkt);
1561 pkt.stream_index= ost->index;
1563 switch (ost->st->codec->codec_type) {
1564 case AVMEDIA_TYPE_AUDIO:
1565 fifo_bytes = av_fifo_size(ost->fifo);
1567 /* encode any samples remaining in fifo */
1568 if (fifo_bytes > 0) {
1569 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1570 int fs_tmp = enc->frame_size;
1572 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1573 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1574 enc->frame_size = fifo_bytes / (osize * enc->channels);
1576 int frame_bytes = enc->frame_size*osize*enc->channels;
1577 if (allocated_audio_buf_size < frame_bytes)
1579 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1582 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1583 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1584 ost->st->time_base.num, enc->sample_rate);
1585 enc->frame_size = fs_tmp;
1588 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1591 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1595 pkt.flags |= AV_PKT_FLAG_KEY;
1597 case AVMEDIA_TYPE_VIDEO:
1598 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1600 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1604 if(enc->coded_frame && enc->coded_frame->key_frame)
1605 pkt.flags |= AV_PKT_FLAG_KEY;
1606 if (ost->logfile && enc->stats_out) {
1607 fprintf(ost->logfile, "%s", enc->stats_out);
1616 pkt.data = bit_buffer;
1618 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1619 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1620 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1626 * Check whether a packet from ist should be written into ost at this time
1628 static int check_output_constraints(InputStream *ist, OutputStream *ost)
1630 OutputFile *of = &output_files[ost->file_index];
1631 int ist_index = ist - input_streams;
1633 if (ost->source_index != ist_index)
1636 if (of->start_time && ist->pts < of->start_time)
1639 if (of->recording_time != INT64_MAX &&
1640 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1641 (AVRational){1, 1000000}) >= 0) {
1642 ost->is_past_recording_time = 1;
1649 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
1651 OutputFile *of = &output_files[ost->file_index];
1652 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1656 av_init_packet(&opkt);
1658 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
1659 !ost->copy_initial_nonkeyframes)
1662 /* force the input stream PTS */
1663 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1664 audio_size += pkt->size;
1665 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1666 video_size += pkt->size;
1670 opkt.stream_index = ost->index;
1671 if (pkt->pts != AV_NOPTS_VALUE)
1672 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1674 opkt.pts = AV_NOPTS_VALUE;
1676 if (pkt->dts == AV_NOPTS_VALUE)
1677 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1679 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1680 opkt.dts -= ost_tb_start_time;
1682 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1683 opkt.flags = pkt->flags;
1685 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1686 if( ost->st->codec->codec_id != CODEC_ID_H264
1687 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1688 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1690 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
1691 opkt.destruct = av_destruct_packet;
1693 opkt.data = pkt->data;
1694 opkt.size = pkt->size;
1696 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
1697 /* store AVPicture in AVPacket, as expected by the output format */
1698 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1699 opkt.data = (uint8_t *)&pict;
1700 opkt.size = sizeof(AVPicture);
1701 opkt.flags |= AV_PKT_FLAG_KEY;
1704 write_frame(of->ctx, &opkt, ost->st->codec, ost->bitstream_filters);
1705 ost->st->codec->frame_number++;
1706 ost->frame_number++;
1707 av_free_packet(&opkt);
1710 static void rate_emu_sleep(InputStream *ist)
1712 if (input_files[ist->file_index].rate_emu) {
1713 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1714 int64_t now = av_gettime() - ist->start;
1720 static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
1722 static unsigned int samples_size = 0;
1723 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1724 uint8_t *decoded_data_buf = NULL;
1725 int decoded_data_size = 0;
1728 if (pkt && samples_size < FFMAX(pkt->size * bps, AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1730 samples_size = FFMAX(pkt->size * bps, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1731 samples = av_malloc(samples_size);
1733 decoded_data_size = samples_size;
1735 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1739 *got_output = decoded_data_size > 0;
1741 /* Some bug in mpeg audio decoder gives */
1742 /* decoded_data_size < 0, it seems they are overflows */
1744 /* no audio frame */
1748 decoded_data_buf = (uint8_t *)samples;
1749 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1750 (ist->st->codec->sample_rate * ist->st->codec->channels);
1752 // preprocess audio (volume)
1753 if (audio_volume != 256) {
1754 switch (ist->st->codec->sample_fmt) {
1755 case AV_SAMPLE_FMT_U8:
1757 uint8_t *volp = samples;
1758 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1759 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
1760 *volp++ = av_clip_uint8(v);
1764 case AV_SAMPLE_FMT_S16:
1766 int16_t *volp = samples;
1767 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1768 int v = ((*volp) * audio_volume + 128) >> 8;
1769 *volp++ = av_clip_int16(v);
1773 case AV_SAMPLE_FMT_S32:
1775 int32_t *volp = samples;
1776 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1777 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
1778 *volp++ = av_clipl_int32(v);
1782 case AV_SAMPLE_FMT_FLT:
1784 float *volp = samples;
1785 float scale = audio_volume / 256.f;
1786 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1791 case AV_SAMPLE_FMT_DBL:
1793 double *volp = samples;
1794 double scale = audio_volume / 256.;
1795 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1801 av_log(NULL, AV_LOG_FATAL,
1802 "Audio volume adjustment on sample format %s is not supported.\n",
1803 av_get_sample_fmt_name(ist->st->codec->sample_fmt));
1808 rate_emu_sleep(ist);
1810 for (i = 0; i < nb_output_streams; i++) {
1811 OutputStream *ost = &output_streams[i];
1813 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1815 do_audio_out(output_files[ost->file_index].ctx, ost, ist,
1816 decoded_data_buf, decoded_data_size);
1821 static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *pkt_pts, int64_t *pkt_dts)
1823 AVFrame *decoded_frame, *filtered_frame = NULL;
1824 void *buffer_to_free = NULL;
1828 int frame_available = 1;
1831 if (!(decoded_frame = avcodec_alloc_frame()))
1832 return AVERROR(ENOMEM);
1833 pkt->pts = *pkt_pts;
1834 pkt->dts = *pkt_dts;
1835 *pkt_pts = AV_NOPTS_VALUE;
1837 if(*pkt_dts != AV_NOPTS_VALUE && ist->st->codec->time_base.num != 0) {
1838 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1839 *pkt_dts += ((int64_t)AV_TIME_BASE *
1840 ist->st->codec->time_base.num * ticks) /
1841 ist->st->codec->time_base.den;
1843 *pkt_dts = AV_NOPTS_VALUE;
1845 ret = avcodec_decode_video2(ist->st->codec,
1846 decoded_frame, got_output, pkt);
1850 quality = same_quant ? decoded_frame->quality : 0;
1852 /* no picture yet */
1853 av_freep(&decoded_frame);
1857 if(decoded_frame->best_effort_timestamp != AV_NOPTS_VALUE)
1858 ist->next_pts = ist->pts = decoded_frame->best_effort_timestamp;
1860 if (ist->st->codec->time_base.num != 0) {
1861 int ticks = ist->st->parser ? ist->st->parser->repeat_pict + 1 :
1862 ist->st->codec->ticks_per_frame;
1863 ist->next_pts += ((int64_t)AV_TIME_BASE *
1864 ist->st->codec->time_base.num * ticks) /
1865 ist->st->codec->time_base.den;
1869 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
1872 for(i=0;i<nb_output_streams;i++) {
1873 OutputStream *ost = ost = &output_streams[i];
1874 if(check_output_constraints(ist, ost)){
1875 if (!decoded_frame->sample_aspect_ratio.num)
1876 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
1877 decoded_frame->pts = ist->pts;
1879 av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame, AV_VSRC_BUF_FLAG_OVERWRITE);
1884 rate_emu_sleep(ist);
1886 for (i = 0; i < nb_output_streams; i++) {
1887 OutputStream *ost = &output_streams[i];
1890 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1894 if (ost->input_video_filter) {
1895 frame_available = avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1897 while (frame_available) {
1898 if (ost->output_video_filter) {
1899 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1900 if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1902 if (!filtered_frame && !(filtered_frame = avcodec_alloc_frame())) {
1903 ret = AVERROR(ENOMEM);
1906 *filtered_frame= *decoded_frame; //for me_threshold
1908 avfilter_fill_frame_from_video_buffer_ref(filtered_frame, ost->picref);
1909 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1912 if (ost->picref->video && !ost->frame_aspect_ratio)
1913 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1915 filtered_frame = decoded_frame;
1918 do_video_out(output_files[ost->file_index].ctx, ost, ist, filtered_frame, &frame_size,
1919 same_quant ? quality : ost->st->codec->global_quality);
1920 if (vstats_filename && frame_size)
1921 do_video_stats(output_files[ost->file_index].ctx, ost, frame_size);
1924 frame_available = ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1925 avfilter_unref_buffer(ost->picref);
1927 av_freep(&filtered_frame);
1932 av_free(buffer_to_free);
1933 av_freep(&decoded_frame);
1937 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
1939 AVSubtitle subtitle;
1940 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
1941 &subtitle, got_output, pkt);
1947 rate_emu_sleep(ist);
1949 for (i = 0; i < nb_output_streams; i++) {
1950 OutputStream *ost = &output_streams[i];
1952 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1955 do_subtitle_out(output_files[ost->file_index].ctx, ost, ist, &subtitle, pkt->pts);
1958 avsubtitle_free(&subtitle);
1962 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1963 static int output_packet(InputStream *ist,
1964 OutputStream *ost_table, int nb_ostreams,
1965 const AVPacket *pkt)
1969 int64_t pkt_dts = AV_NOPTS_VALUE;
1970 int64_t pkt_pts = AV_NOPTS_VALUE;
1974 if (ist->next_pts == AV_NOPTS_VALUE)
1975 ist->next_pts = ist->pts;
1979 av_init_packet(&avpkt);
1987 if(pkt->dts != AV_NOPTS_VALUE){
1988 if(ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
1989 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1990 pkt_dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1992 if(pkt->pts != AV_NOPTS_VALUE)
1993 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1995 //while we have more to decode or while the decoder did output something on EOF
1996 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
1999 ist->pts = ist->next_pts;
2001 if (avpkt.size && avpkt.size != pkt->size) {
2002 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2003 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2004 ist->showed_multi_packet_warning = 1;
2007 switch(ist->st->codec->codec_type) {
2008 case AVMEDIA_TYPE_AUDIO:
2009 ret = transcode_audio (ist, &avpkt, &got_output);
2011 case AVMEDIA_TYPE_VIDEO:
2012 ret = transcode_video (ist, &avpkt, &got_output, &pkt_pts, &pkt_dts);
2014 case AVMEDIA_TYPE_SUBTITLE:
2015 ret = transcode_subtitles(ist, &avpkt, &got_output);
2023 // touch data and size only if not EOF
2025 if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2035 /* handle stream copy */
2036 if (!ist->decoding_needed) {
2037 rate_emu_sleep(ist);
2038 switch (ist->st->codec->codec_type) {
2039 case AVMEDIA_TYPE_AUDIO:
2040 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2041 ist->st->codec->sample_rate;
2043 case AVMEDIA_TYPE_VIDEO:
2044 if (ist->st->codec->time_base.num != 0) {
2045 int ticks = ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2046 ist->next_pts += ((int64_t)AV_TIME_BASE *
2047 ist->st->codec->time_base.num * ticks) /
2048 ist->st->codec->time_base.den;
2053 for (i = 0; pkt && i < nb_ostreams; i++) {
2054 OutputStream *ost = &ost_table[i];
2056 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2059 do_streamcopy(ist, ost, pkt);
2065 static void print_sdp(OutputFile *output_files, int n)
2069 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
2073 for (i = 0; i < n; i++)
2074 avc[i] = output_files[i].ctx;
2076 av_sdp_create(avc, n, sdp, sizeof(sdp));
2077 printf("SDP:\n%s\n", sdp);
2082 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
2083 char *error, int error_len)
2085 InputStream *ist = &input_streams[ist_index];
2086 if (ist->decoding_needed) {
2087 AVCodec *codec = ist->dec;
2089 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2090 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2091 return AVERROR(EINVAL);
2093 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2094 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2095 ist->file_index, ist->st->index);
2096 return AVERROR(EINVAL);
2098 assert_codec_experimental(ist->st->codec, 0);
2099 assert_avoptions(ist->opts);
2102 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;
2103 ist->next_pts = AV_NOPTS_VALUE;
2109 static int transcode_init(OutputFile *output_files, int nb_output_files,
2110 InputFile *input_files, int nb_input_files)
2112 int ret = 0, i, j, k;
2113 AVFormatContext *oc;
2114 AVCodecContext *codec, *icodec;
2120 /* init framerate emulation */
2121 for (i = 0; i < nb_input_files; i++) {
2122 InputFile *ifile = &input_files[i];
2123 if (ifile->rate_emu)
2124 for (j = 0; j < ifile->nb_streams; j++)
2125 input_streams[j + ifile->ist_index].start = av_gettime();
2128 /* output stream init */
2129 for (i = 0; i < nb_output_files; i++) {
2130 oc = output_files[i].ctx;
2131 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2132 av_dump_format(oc, i, oc->filename, 1);
2133 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2134 return AVERROR(EINVAL);
2138 /* for each output stream, we compute the right encoding parameters */
2139 for (i = 0; i < nb_output_streams; i++) {
2140 ost = &output_streams[i];
2141 oc = output_files[ost->file_index].ctx;
2142 ist = &input_streams[ost->source_index];
2144 if (ost->attachment_filename)
2147 codec = ost->st->codec;
2148 icodec = ist->st->codec;
2150 ost->st->disposition = ist->st->disposition;
2151 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2152 codec->chroma_sample_location = icodec->chroma_sample_location;
2154 if (ost->stream_copy) {
2155 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2157 if (extra_size > INT_MAX) {
2158 return AVERROR(EINVAL);
2161 /* if stream_copy is selected, no need to decode or encode */
2162 codec->codec_id = icodec->codec_id;
2163 codec->codec_type = icodec->codec_type;
2165 if (!codec->codec_tag) {
2166 if (!oc->oformat->codec_tag ||
2167 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2168 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2169 codec->codec_tag = icodec->codec_tag;
2172 codec->bit_rate = icodec->bit_rate;
2173 codec->rc_max_rate = icodec->rc_max_rate;
2174 codec->rc_buffer_size = icodec->rc_buffer_size;
2175 codec->extradata = av_mallocz(extra_size);
2176 if (!codec->extradata) {
2177 return AVERROR(ENOMEM);
2179 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2180 codec->extradata_size= icodec->extradata_size;
2182 codec->time_base = ist->st->time_base;
2183 if(!strcmp(oc->oformat->name, "avi")) {
2185 av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base) &&
2186 av_q2d(ist->st->time_base) < 1.0/500){
2187 codec->time_base = icodec->time_base;
2188 codec->time_base.num *= icodec->ticks_per_frame;
2189 codec->time_base.den *= 2;
2191 } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)) {
2192 if(!copy_tb && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/500){
2193 codec->time_base = icodec->time_base;
2194 codec->time_base.num *= icodec->ticks_per_frame;
2197 av_reduce(&codec->time_base.num, &codec->time_base.den,
2198 codec->time_base.num, codec->time_base.den, INT_MAX);
2200 switch(codec->codec_type) {
2201 case AVMEDIA_TYPE_AUDIO:
2202 if(audio_volume != 256) {
2203 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2206 codec->channel_layout = icodec->channel_layout;
2207 codec->sample_rate = icodec->sample_rate;
2208 codec->channels = icodec->channels;
2209 codec->frame_size = icodec->frame_size;
2210 codec->audio_service_type = icodec->audio_service_type;
2211 codec->block_align = icodec->block_align;
2213 case AVMEDIA_TYPE_VIDEO:
2214 codec->pix_fmt = icodec->pix_fmt;
2215 codec->width = icodec->width;
2216 codec->height = icodec->height;
2217 codec->has_b_frames = icodec->has_b_frames;
2218 if (!codec->sample_aspect_ratio.num) {
2219 codec->sample_aspect_ratio =
2220 ost->st->sample_aspect_ratio =
2221 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2222 ist->st->codec->sample_aspect_ratio.num ?
2223 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2225 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
2227 case AVMEDIA_TYPE_SUBTITLE:
2228 codec->width = icodec->width;
2229 codec->height = icodec->height;
2231 case AVMEDIA_TYPE_DATA:
2232 case AVMEDIA_TYPE_ATTACHMENT:
2239 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2241 ist->decoding_needed = 1;
2242 ost->encoding_needed = 1;
2244 switch(codec->codec_type) {
2245 case AVMEDIA_TYPE_AUDIO:
2246 ost->fifo = av_fifo_alloc(1024);
2248 return AVERROR(ENOMEM);
2250 if (!codec->sample_rate)
2251 codec->sample_rate = icodec->sample_rate;
2252 choose_sample_rate(ost->st, ost->enc);
2253 codec->time_base = (AVRational){1, codec->sample_rate};
2255 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2256 codec->sample_fmt = icodec->sample_fmt;
2257 choose_sample_fmt(ost->st, ost->enc);
2259 if (ost->audio_channels_mapped) {
2260 /* the requested output channel is set to the number of
2261 * -map_channel only if no -ac are specified */
2262 if (!codec->channels) {
2263 codec->channels = ost->audio_channels_mapped;
2264 codec->channel_layout = av_get_default_channel_layout(codec->channels);
2265 if (!codec->channel_layout) {
2266 av_log(NULL, AV_LOG_FATAL, "Unable to find an appropriate channel layout for requested number of channel\n");
2270 /* fill unused channel mapping with -1 (which means a muted
2271 * channel in case the number of output channels is bigger
2272 * than the number of mapped channel) */
2273 for (j = ost->audio_channels_mapped; j < FF_ARRAY_ELEMS(ost->audio_channels_map); j++)
2274 ost->audio_channels_map[j] = -1;
2275 } else if (!codec->channels) {
2276 codec->channels = icodec->channels;
2277 codec->channel_layout = icodec->channel_layout;
2279 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2280 codec->channel_layout = 0;
2282 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2283 ost->audio_resample |= codec->sample_fmt != icodec->sample_fmt
2284 || codec->channel_layout != icodec->channel_layout;
2285 icodec->request_channels = codec->channels;
2286 ost->resample_sample_fmt = icodec->sample_fmt;
2287 ost->resample_sample_rate = icodec->sample_rate;
2288 ost->resample_channels = icodec->channels;
2290 case AVMEDIA_TYPE_VIDEO:
2291 if (codec->pix_fmt == PIX_FMT_NONE)
2292 codec->pix_fmt = icodec->pix_fmt;
2293 choose_pixel_fmt(ost->st, ost->enc);
2295 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2296 av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2300 if (!codec->width || !codec->height) {
2301 codec->width = icodec->width;
2302 codec->height = icodec->height;
2305 ost->video_resample = codec->width != icodec->width ||
2306 codec->height != icodec->height ||
2307 codec->pix_fmt != icodec->pix_fmt;
2308 if (ost->video_resample) {
2309 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2312 ost->resample_height = icodec->height;
2313 ost->resample_width = icodec->width;
2314 ost->resample_pix_fmt = icodec->pix_fmt;
2316 if (!ost->frame_rate.num)
2317 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2318 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2319 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2320 ost->frame_rate = ost->enc->supported_framerates[idx];
2322 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2323 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2324 && (video_sync_method==1 || (video_sync_method<0 && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
2325 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2326 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2328 for (j = 0; j < ost->forced_kf_count; j++)
2329 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
2334 if (configure_video_filters(ist, ost)) {
2335 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2340 case AVMEDIA_TYPE_SUBTITLE:
2347 if (codec->codec_id != CODEC_ID_H264 &&
2348 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2349 char logfilename[1024];
2352 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2353 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2355 if (codec->flags & CODEC_FLAG_PASS2) {
2357 size_t logbuffer_size;
2358 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2359 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2363 codec->stats_in = logbuffer;
2365 if (codec->flags & CODEC_FLAG_PASS1) {
2366 f = fopen(logfilename, "wb");
2368 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2369 logfilename, strerror(errno));
2376 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2377 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size (1664)*/
2378 int size = codec->width * codec->height;
2379 bit_buffer_size = FFMAX(bit_buffer_size, 7*size + 10000);
2384 bit_buffer = av_malloc(bit_buffer_size);
2386 av_log(NULL, AV_LOG_ERROR, "Cannot allocate %d bytes output buffer\n",
2388 return AVERROR(ENOMEM);
2391 /* open each encoder */
2392 for (i = 0; i < nb_output_streams; i++) {
2393 ost = &output_streams[i];
2394 if (ost->encoding_needed) {
2395 AVCodec *codec = ost->enc;
2396 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2398 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
2399 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2400 ret = AVERROR(EINVAL);
2403 if (dec->subtitle_header) {
2404 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2405 if (!ost->st->codec->subtitle_header) {
2406 ret = AVERROR(ENOMEM);
2409 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2410 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2412 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2413 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2414 ost->file_index, ost->index);
2415 ret = AVERROR(EINVAL);
2418 assert_codec_experimental(ost->st->codec, 1);
2419 assert_avoptions(ost->opts);
2420 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2421 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2422 " It takes bits/s as argument, not kbits/s\n");
2423 extra_size += ost->st->codec->extradata_size;
2425 if (ost->st->codec->me_threshold)
2426 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2430 /* init input streams */
2431 for (i = 0; i < nb_input_streams; i++)
2432 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2435 /* discard unused programs */
2436 for (i = 0; i < nb_input_files; i++) {
2437 InputFile *ifile = &input_files[i];
2438 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2439 AVProgram *p = ifile->ctx->programs[j];
2440 int discard = AVDISCARD_ALL;
2442 for (k = 0; k < p->nb_stream_indexes; k++)
2443 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2444 discard = AVDISCARD_DEFAULT;
2447 p->discard = discard;
2451 /* open files and write file headers */
2452 for (i = 0; i < nb_output_files; i++) {
2453 oc = output_files[i].ctx;
2454 oc->interrupt_callback = int_cb;
2455 if (avformat_write_header(oc, &output_files[i].opts) < 0) {
2456 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2457 ret = AVERROR(EINVAL);
2460 // assert_avoptions(output_files[i].opts);
2461 if (strcmp(oc->oformat->name, "rtp")) {
2467 /* dump the file output parameters - cannot be done before in case
2469 for (i = 0; i < nb_output_files; i++) {
2470 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2473 /* dump the stream mapping */
2474 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2475 for (i = 0; i < nb_output_streams; i++) {
2476 ost = &output_streams[i];
2478 if (ost->attachment_filename) {
2479 /* an attached file */
2480 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
2481 ost->attachment_filename, ost->file_index, ost->index);
2484 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
2485 input_streams[ost->source_index].file_index,
2486 input_streams[ost->source_index].st->index,
2489 if (ost->audio_channels_mapped) {
2490 av_log(NULL, AV_LOG_INFO, " [ch:");
2491 for (j = 0; j < ost->audio_channels_mapped; j++)
2492 if (ost->audio_channels_map[j] == -1)
2493 av_log(NULL, AV_LOG_INFO, " M");
2495 av_log(NULL, AV_LOG_INFO, " %d", ost->audio_channels_map[j]);
2496 av_log(NULL, AV_LOG_INFO, "]");
2498 if (ost->sync_ist != &input_streams[ost->source_index])
2499 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2500 ost->sync_ist->file_index,
2501 ost->sync_ist->st->index);
2502 if (ost->stream_copy)
2503 av_log(NULL, AV_LOG_INFO, " (copy)");
2505 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2506 input_streams[ost->source_index].dec->name : "?",
2507 ost->enc ? ost->enc->name : "?");
2508 av_log(NULL, AV_LOG_INFO, "\n");
2512 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2517 print_sdp(output_files, nb_output_files);
2524 * The following code is the main loop of the file converter
2526 static int transcode(OutputFile *output_files, int nb_output_files,
2527 InputFile *input_files, int nb_input_files)
2530 AVFormatContext *is, *os;
2534 int no_packet_count=0;
2535 int64_t timer_start;
2538 if (!(no_packet = av_mallocz(nb_input_files)))
2541 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2546 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
2549 timer_start = av_gettime();
2551 for(; received_sigterm == 0;) {
2552 int file_index, ist_index;
2556 int64_t cur_time= av_gettime();
2558 ipts_min= INT64_MAX;
2560 /* if 'q' pressed, exits */
2562 static int64_t last_time;
2563 if (received_nb_signals)
2565 /* read_key() returns 0 on EOF */
2566 if(cur_time - last_time >= 100000 && !run_as_daemon){
2568 last_time = cur_time;
2573 if (key == '+') av_log_set_level(av_log_get_level()+10);
2574 if (key == '-') av_log_set_level(av_log_get_level()-10);
2575 if (key == 's') qp_hist ^= 1;
2578 do_hex_dump = do_pkt_dump = 0;
2579 } else if(do_pkt_dump){
2583 av_log_set_level(AV_LOG_DEBUG);
2586 if (key == 'c' || key == 'C'){
2587 char buf[4096], target[64], command[256], arg[256] = {0};
2590 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2592 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
2597 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
2598 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
2599 target, time, command, arg);
2600 for (i = 0; i < nb_output_streams; i++) {
2601 ost = &output_streams[i];
2604 ret = avfilter_graph_send_command(ost->graph, target, command, arg, buf, sizeof(buf),
2605 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
2606 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
2608 ret = avfilter_graph_queue_command(ost->graph, target, command, arg, 0, time);
2613 av_log(NULL, AV_LOG_ERROR,
2614 "Parse error, at least 3 arguments were expected, "
2615 "only %d given in string '%s'\n", n, buf);
2619 if (key == 'd' || key == 'D'){
2622 debug = input_streams[0].st->codec->debug<<1;
2623 if(!debug) debug = 1;
2624 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2627 if(scanf("%d", &debug)!=1)
2628 fprintf(stderr,"error parsing debug value\n");
2629 for(i=0;i<nb_input_streams;i++) {
2630 input_streams[i].st->codec->debug = debug;
2632 for(i=0;i<nb_output_streams;i++) {
2633 ost = &output_streams[i];
2634 ost->st->codec->debug = debug;
2636 if(debug) av_log_set_level(AV_LOG_DEBUG);
2637 fprintf(stderr,"debug=%d\n", debug);
2640 fprintf(stderr, "key function\n"
2641 "? show this help\n"
2642 "+ increase verbosity\n"
2643 "- decrease verbosity\n"
2644 "c Send command to filtergraph\n"
2645 "D cycle through available debug modes\n"
2646 "h dump packets/hex press to cycle through the 3 states\n"
2648 "s Show QP histogram\n"
2653 /* select the stream that we must read now by looking at the
2654 smallest output pts */
2656 for (i = 0; i < nb_output_streams; i++) {
2660 ost = &output_streams[i];
2661 of = &output_files[ost->file_index];
2662 os = output_files[ost->file_index].ctx;
2663 ist = &input_streams[ost->source_index];
2664 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2665 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2667 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2669 if (!input_files[ist->file_index].eof_reached){
2670 if(ipts < ipts_min) {
2672 if(input_sync ) file_index = ist->file_index;
2674 if(opts < opts_min) {
2676 if(!input_sync) file_index = ist->file_index;
2679 if (ost->frame_number >= ost->max_frames) {
2681 for (j = 0; j < of->ctx->nb_streams; j++)
2682 output_streams[of->ost_index + j].is_past_recording_time = 1;
2686 /* if none, if is finished */
2687 if (file_index < 0) {
2688 if(no_packet_count){
2690 memset(no_packet, 0, nb_input_files);
2697 /* read a frame from it and output it in the fifo */
2698 is = input_files[file_index].ctx;
2699 ret= av_read_frame(is, &pkt);
2700 if(ret == AVERROR(EAGAIN)){
2701 no_packet[file_index]=1;
2706 input_files[file_index].eof_reached = 1;
2714 memset(no_packet, 0, nb_input_files);
2717 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2718 is->streams[pkt.stream_index]);
2720 /* the following test is needed in case new streams appear
2721 dynamically in stream : we ignore them */
2722 if (pkt.stream_index >= input_files[file_index].nb_streams)
2723 goto discard_packet;
2724 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2725 ist = &input_streams[ist_index];
2727 goto discard_packet;
2729 if (pkt.dts != AV_NOPTS_VALUE)
2730 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2731 if (pkt.pts != AV_NOPTS_VALUE)
2732 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2734 if(pkt.pts != AV_NOPTS_VALUE)
2735 pkt.pts *= ist->ts_scale;
2736 if(pkt.dts != AV_NOPTS_VALUE)
2737 pkt.dts *= ist->ts_scale;
2739 // 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);
2740 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2741 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2742 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2743 int64_t delta= pkt_dts - ist->next_pts;
2744 if((delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
2745 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
2746 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
2747 pkt_dts+1<ist->pts)&& !copy_ts){
2748 input_files[ist->file_index].ts_offset -= delta;
2749 av_log(NULL, AV_LOG_DEBUG, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2750 delta, input_files[ist->file_index].ts_offset);
2751 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2752 if(pkt.pts != AV_NOPTS_VALUE)
2753 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2757 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2758 if (output_packet(ist, output_streams, nb_output_streams, &pkt) < 0) {
2760 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
2761 ist->file_index, ist->st->index);
2764 av_free_packet(&pkt);
2769 av_free_packet(&pkt);
2771 /* dump report by using the output first video and audio streams */
2772 print_report(output_files, output_streams, nb_output_streams, 0, timer_start, cur_time);
2775 /* at the end of stream, we must flush the decoder buffers */
2776 for (i = 0; i < nb_input_streams; i++) {
2777 ist = &input_streams[i];
2778 if (ist->decoding_needed) {
2779 output_packet(ist, output_streams, nb_output_streams, NULL);
2782 flush_encoders(output_streams, nb_output_streams);
2786 /* write the trailer if needed and close file */
2787 for(i=0;i<nb_output_files;i++) {
2788 os = output_files[i].ctx;
2789 av_write_trailer(os);
2792 /* dump report by using the first video and audio streams */
2793 print_report(output_files, output_streams, nb_output_streams, 1, timer_start, av_gettime());
2795 /* close each encoder */
2796 for (i = 0; i < nb_output_streams; i++) {
2797 ost = &output_streams[i];
2798 if (ost->encoding_needed) {
2799 av_freep(&ost->st->codec->stats_in);
2800 avcodec_close(ost->st->codec);
2803 avfilter_graph_free(&ost->graph);
2807 /* close each decoder */
2808 for (i = 0; i < nb_input_streams; i++) {
2809 ist = &input_streams[i];
2810 if (ist->decoding_needed) {
2811 avcodec_close(ist->st->codec);
2819 av_freep(&bit_buffer);
2820 av_freep(&no_packet);
2822 if (output_streams) {
2823 for (i = 0; i < nb_output_streams; i++) {
2824 ost = &output_streams[i];
2826 if (ost->stream_copy)
2827 av_freep(&ost->st->codec->extradata);
2829 fclose(ost->logfile);
2830 ost->logfile = NULL;
2832 av_fifo_free(ost->fifo); /* works even if fifo is not
2833 initialized but set to zero */
2834 av_freep(&ost->st->codec->subtitle_header);
2835 av_free(ost->resample_frame.data[0]);
2836 av_free(ost->forced_kf_pts);
2837 if (ost->video_resample)
2838 sws_freeContext(ost->img_resample_ctx);
2839 swr_free(&ost->swr);
2840 av_dict_free(&ost->opts);
2847 static int opt_frame_crop(const char *opt, const char *arg)
2849 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
2850 return AVERROR(EINVAL);
2853 static int opt_pad(const char *opt, const char *arg)
2855 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
2859 static double parse_frame_aspect_ratio(const char *arg)
2866 p = strchr(arg, ':');
2868 x = strtol(arg, &end, 10);
2870 y = strtol(end+1, &end, 10);
2872 ar = (double)x / (double)y;
2874 ar = strtod(arg, NULL);
2877 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
2883 static int opt_video_channel(const char *opt, const char *arg)
2885 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
2886 return opt_default("channel", arg);
2889 static int opt_video_standard(const char *opt, const char *arg)
2891 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
2892 return opt_default("standard", arg);
2895 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2897 audio_codec_name = arg;
2898 return parse_option(o, "codec:a", arg, options);
2901 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2903 video_codec_name = arg;
2904 return parse_option(o, "codec:v", arg, options);
2907 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2909 subtitle_codec_name = arg;
2910 return parse_option(o, "codec:s", arg, options);
2913 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2915 return parse_option(o, "codec:d", arg, options);
2918 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2920 StreamMap *m = NULL;
2921 int i, negative = 0, file_idx;
2922 int sync_file_idx = -1, sync_stream_idx;
2930 map = av_strdup(arg);
2932 /* parse sync stream first, just pick first matching stream */
2933 if (sync = strchr(map, ',')) {
2935 sync_file_idx = strtol(sync + 1, &sync, 0);
2936 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2937 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
2942 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2943 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2944 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2945 sync_stream_idx = i;
2948 if (i == input_files[sync_file_idx].nb_streams) {
2949 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
2950 "match any streams.\n", arg);
2956 file_idx = strtol(map, &p, 0);
2957 if (file_idx >= nb_input_files || file_idx < 0) {
2958 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
2962 /* disable some already defined maps */
2963 for (i = 0; i < o->nb_stream_maps; i++) {
2964 m = &o->stream_maps[i];
2965 if (file_idx == m->file_index &&
2966 check_stream_specifier(input_files[m->file_index].ctx,
2967 input_files[m->file_index].ctx->streams[m->stream_index],
2968 *p == ':' ? p + 1 : p) > 0)
2972 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2973 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2974 *p == ':' ? p + 1 : p) <= 0)
2976 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2977 &o->nb_stream_maps, o->nb_stream_maps + 1);
2978 m = &o->stream_maps[o->nb_stream_maps - 1];
2980 m->file_index = file_idx;
2981 m->stream_index = i;
2983 if (sync_file_idx >= 0) {
2984 m->sync_file_index = sync_file_idx;
2985 m->sync_stream_index = sync_stream_idx;
2987 m->sync_file_index = file_idx;
2988 m->sync_stream_index = i;
2993 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3001 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3003 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3004 &o->nb_attachments, o->nb_attachments + 1);
3005 o->attachments[o->nb_attachments - 1] = arg;
3009 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
3015 o->audio_channel_maps =
3016 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
3017 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
3018 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
3020 /* muted channel syntax */
3021 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
3022 if ((n == 1 || n == 3) && m->channel_idx == -1) {
3023 m->file_idx = m->stream_idx = -1;
3025 m->ofile_idx = m->ostream_idx = -1;
3030 n = sscanf(arg, "%d.%d.%d:%d.%d",
3031 &m->file_idx, &m->stream_idx, &m->channel_idx,
3032 &m->ofile_idx, &m->ostream_idx);
3034 if (n != 3 && n != 5) {
3035 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
3036 "[file.stream.channel|-1][:syncfile:syncstream]\n");
3040 if (n != 5) // only file.stream.channel specified
3041 m->ofile_idx = m->ostream_idx = -1;
3044 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
3045 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
3049 if (m->stream_idx < 0 ||
3050 m->stream_idx >= input_files[m->file_idx].nb_streams) {
3051 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
3052 m->file_idx, m->stream_idx);
3055 st = input_files[m->file_idx].ctx->streams[m->stream_idx];
3056 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
3057 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
3058 m->file_idx, m->stream_idx);
3061 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
3062 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
3063 m->file_idx, m->stream_idx, m->channel_idx);
3069 static void parse_meta_type(char *arg, char *type, int *index)
3079 if (*(++arg) == ':')
3080 *index = strtol(++arg, NULL, 0);
3083 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
3090 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
3092 MetadataMap *m, *m1;
3095 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
3096 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
3098 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
3099 m->file = strtol(arg, &p, 0);
3100 parse_meta_type(*p ? p + 1 : p, &m->type, &m->index);
3102 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
3103 if (p = strchr(opt, ':'))
3104 parse_meta_type(p + 1, &m1->type, &m1->index);
3108 if (m->type == 'g' || m1->type == 'g')
3109 o->metadata_global_manual = 1;
3110 if (m->type == 's' || m1->type == 's')
3111 o->metadata_streams_manual = 1;
3112 if (m->type == 'c' || m1->type == 'c')
3113 o->metadata_chapters_manual = 1;
3118 static int opt_map_meta_data(OptionsContext *o, const char *opt, const char *arg)
3120 av_log(NULL, AV_LOG_WARNING, "-map_meta_data is deprecated and will be removed soon. "
3121 "Use -map_metadata instead.\n");
3122 return opt_map_metadata(o, opt, arg);
3125 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
3128 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
3129 struct tm time = *gmtime((time_t*)&recording_timestamp);
3130 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
3131 parse_option(o, "metadata", buf, options);
3133 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
3134 "tag instead.\n", opt);
3138 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
3140 const char *codec_string = encoder ? "encoder" : "decoder";
3144 avcodec_find_encoder_by_name(name) :
3145 avcodec_find_decoder_by_name(name);
3147 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
3150 if(codec->type != type) {
3151 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
3157 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
3159 char *codec_name = NULL;
3161 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
3163 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
3164 st->codec->codec_id = codec->id;
3167 return avcodec_find_decoder(st->codec->codec_id);
3171 * Add all the streams from the given input file to the global
3172 * list of input streams.
3174 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
3176 int i, rfps, rfps_base;
3177 char *next, *codec_tag = NULL;
3179 for (i = 0; i < ic->nb_streams; i++) {
3180 AVStream *st = ic->streams[i];
3181 AVCodecContext *dec = st->codec;
3184 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3185 ist = &input_streams[nb_input_streams - 1];
3187 ist->file_index = nb_input_files;
3189 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
3191 ist->ts_scale = 1.0;
3192 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
3194 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
3196 uint32_t tag = strtol(codec_tag, &next, 0);
3198 tag = AV_RL32(codec_tag);
3199 st->codec->codec_tag = tag;
3202 ist->dec = choose_decoder(o, ic, st);
3204 switch (dec->codec_type) {
3205 case AVMEDIA_TYPE_AUDIO:
3207 ist->dec = avcodec_find_decoder(dec->codec_id);
3208 if(o->audio_disable)
3209 st->discard= AVDISCARD_ALL;
3211 case AVMEDIA_TYPE_VIDEO:
3213 ist->dec = avcodec_find_decoder(dec->codec_id);
3214 rfps = ic->streams[i]->r_frame_rate.num;
3215 rfps_base = ic->streams[i]->r_frame_rate.den;
3217 dec->flags |= CODEC_FLAG_EMU_EDGE;
3220 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3222 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",
3223 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3224 (float)rfps / rfps_base, rfps, rfps_base);
3227 if (o->video_disable)
3228 st->discard= AVDISCARD_ALL;
3229 else if(video_discard)
3230 st->discard= video_discard;
3232 case AVMEDIA_TYPE_DATA:
3234 case AVMEDIA_TYPE_SUBTITLE:
3236 ist->dec = avcodec_find_decoder(dec->codec_id);
3237 if(o->subtitle_disable)
3238 st->discard = AVDISCARD_ALL;
3240 case AVMEDIA_TYPE_ATTACHMENT:
3241 case AVMEDIA_TYPE_UNKNOWN:
3249 static void assert_file_overwrite(const char *filename)
3251 if (!file_overwrite &&
3252 (strchr(filename, ':') == NULL || filename[1] == ':' ||
3253 av_strstart(filename, "file:", NULL))) {
3254 if (avio_check(filename, 0) == 0) {
3256 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3259 if (!read_yesno()) {
3260 av_log(0, AV_LOG_FATAL, "Not overwriting - exiting\n");
3266 av_log(0, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
3273 static void dump_attachment(AVStream *st, const char *filename)
3276 AVIOContext *out = NULL;
3277 AVDictionaryEntry *e;
3279 if (!st->codec->extradata_size) {
3280 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
3281 nb_input_files - 1, st->index);
3284 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
3285 filename = e->value;
3287 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
3288 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
3292 assert_file_overwrite(filename);
3294 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
3295 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
3300 avio_write(out, st->codec->extradata, st->codec->extradata_size);
3305 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
3307 AVFormatContext *ic;
3308 AVInputFormat *file_iformat = NULL;
3312 AVDictionary **opts;
3313 int orig_nb_streams; // number of streams before avformat_find_stream_info
3316 if (!(file_iformat = av_find_input_format(o->format))) {
3317 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
3322 if (!strcmp(filename, "-"))
3325 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3326 !strcmp(filename, "/dev/stdin");
3328 /* get default parameters from command line */
3329 ic = avformat_alloc_context();
3331 print_error(filename, AVERROR(ENOMEM));
3334 if (o->nb_audio_sample_rate) {
3335 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
3336 av_dict_set(&format_opts, "sample_rate", buf, 0);
3338 if (o->nb_audio_channels) {
3339 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
3340 av_dict_set(&format_opts, "channels", buf, 0);
3342 if (o->nb_frame_rates) {
3343 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
3345 if (o->nb_frame_sizes) {
3346 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
3348 if (o->nb_frame_pix_fmts)
3349 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
3351 ic->video_codec_id = video_codec_name ?
3352 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
3353 ic->audio_codec_id = audio_codec_name ?
3354 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
3355 ic->subtitle_codec_id= subtitle_codec_name ?
3356 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
3357 ic->flags |= AVFMT_FLAG_NONBLOCK;
3358 ic->interrupt_callback = int_cb;
3361 av_log(NULL, AV_LOG_WARNING, "-loop_input is deprecated, use -loop 1\n");
3362 ic->loop_input = loop_input;
3365 /* open the input file with generic libav function */
3366 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3368 print_error(filename, err);
3371 assert_avoptions(format_opts);
3373 /* apply forced codec ids */
3374 for (i = 0; i < ic->nb_streams; i++)
3375 choose_decoder(o, ic, ic->streams[i]);
3377 /* Set AVCodecContext options for avformat_find_stream_info */
3378 opts = setup_find_stream_info_opts(ic, codec_opts);
3379 orig_nb_streams = ic->nb_streams;
3381 /* If not enough info to get the stream parameters, we decode the
3382 first frames to get it. (used in mpeg case for example) */
3383 ret = avformat_find_stream_info(ic, opts);
3385 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
3386 av_close_input_file(ic);
3390 timestamp = o->start_time;
3391 /* add the stream start time */
3392 if (ic->start_time != AV_NOPTS_VALUE)
3393 timestamp += ic->start_time;
3395 /* if seeking requested, we execute it */
3396 if (o->start_time != 0) {
3397 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3399 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
3400 filename, (double)timestamp / AV_TIME_BASE);
3404 /* update the current parameters so that they match the one of the input stream */
3405 add_input_streams(o, ic);
3407 /* dump the file content */
3408 av_dump_format(ic, nb_input_files, filename, 0);
3410 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3411 input_files[nb_input_files - 1].ctx = ic;
3412 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3413 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3414 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3415 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
3417 for (i = 0; i < o->nb_dump_attachment; i++) {
3420 for (j = 0; j < ic->nb_streams; j++) {
3421 AVStream *st = ic->streams[j];
3423 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
3424 dump_attachment(st, o->dump_attachment[i].u.str);
3428 for (i = 0; i < orig_nb_streams; i++)
3429 av_dict_free(&opts[i]);
3432 reset_options(o, 1);
3436 static void parse_forced_key_frames(char *kf, OutputStream *ost)
3441 for (p = kf; *p; p++)
3444 ost->forced_kf_count = n;
3445 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3446 if (!ost->forced_kf_pts) {
3447 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3450 for (i = 0; i < n; i++) {
3451 p = i ? strchr(p, ',') + 1 : kf;
3452 ost->forced_kf_pts[i] = parse_time_or_die("force_key_frames", p, 1);
3456 static uint8_t *get_line(AVIOContext *s)
3462 if (avio_open_dyn_buf(&line) < 0) {
3463 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
3467 while ((c = avio_r8(s)) && c != '\n')
3470 avio_close_dyn_buf(line, &buf);
3475 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
3478 char filename[1000];
3479 const char *base[3] = { getenv("AVCONV_DATADIR"),
3484 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
3488 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
3489 i != 1 ? "" : "/.avconv", codec_name, preset_name);
3490 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3493 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
3494 i != 1 ? "" : "/.avconv", preset_name);
3495 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3501 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
3503 char *codec_name = NULL;
3505 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
3507 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
3508 NULL, ost->st->codec->codec_type);
3509 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
3510 } else if (!strcmp(codec_name, "copy"))
3511 ost->stream_copy = 1;
3513 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
3514 ost->st->codec->codec_id = ost->enc->id;
3518 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3521 AVStream *st = avformat_new_stream(oc, NULL);
3522 int idx = oc->nb_streams - 1, ret = 0;
3523 char *bsf = NULL, *next, *codec_tag = NULL;
3524 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3526 char *buf = NULL, *arg = NULL, *preset = NULL;
3527 AVIOContext *s = NULL;
3530 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3534 if (oc->nb_streams - 1 < o->nb_streamid_map)
3535 st->id = o->streamid_map[oc->nb_streams - 1];
3537 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3538 nb_output_streams + 1);
3539 ost = &output_streams[nb_output_streams - 1];
3540 ost->file_index = nb_output_files;
3543 st->codec->codec_type = type;
3544 choose_encoder(o, oc, ost);
3546 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3549 avcodec_get_context_defaults3(st->codec, ost->enc);
3550 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3552 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
3553 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
3556 if (!buf[0] || buf[0] == '#') {
3560 if (!(arg = strchr(buf, '='))) {
3561 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
3565 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
3567 } while (!s->eof_reached);
3571 av_log(NULL, AV_LOG_FATAL,
3572 "Preset %s specified for stream %d:%d, but could not be opened.\n",
3573 preset, ost->file_index, ost->index);
3577 ost->max_frames = INT64_MAX;
3578 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
3580 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3582 if (next = strchr(bsf, ','))
3584 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3585 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3589 bsfc_prev->next = bsfc;
3591 ost->bitstream_filters = bsfc;
3597 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3599 uint32_t tag = strtol(codec_tag, &next, 0);
3601 tag = AV_RL32(codec_tag);
3602 st->codec->codec_tag = tag;
3605 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3606 if (qscale >= 0 || same_quant) {
3607 st->codec->flags |= CODEC_FLAG_QSCALE;
3608 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3611 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
3612 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3614 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3618 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3621 const char *p = str;
3628 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3635 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3639 AVCodecContext *video_enc;
3641 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3643 video_enc = st->codec;
3645 if (!ost->stream_copy) {
3646 const char *p = NULL;
3647 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3648 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3649 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3652 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3653 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3654 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3658 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3659 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3660 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3664 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3665 if (frame_aspect_ratio)
3666 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3668 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3669 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3670 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3671 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3674 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3677 video_enc->gop_size = 0;
3678 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3680 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3681 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
3684 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3686 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3688 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3689 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
3692 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
3695 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
3698 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3700 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
3703 /* FIXME realloc failure */
3704 video_enc->rc_override=
3705 av_realloc(video_enc->rc_override,
3706 sizeof(RcOverride)*(i+1));
3707 video_enc->rc_override[i].start_frame= start;
3708 video_enc->rc_override[i].end_frame = end;
3710 video_enc->rc_override[i].qscale= q;
3711 video_enc->rc_override[i].quality_factor= 1.0;
3714 video_enc->rc_override[i].qscale= 0;
3715 video_enc->rc_override[i].quality_factor= -q/100.0;
3720 video_enc->rc_override_count=i;
3721 if (!video_enc->rc_initial_buffer_occupancy)
3722 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3723 video_enc->intra_dc_precision= intra_dc_precision - 8;
3726 video_enc->flags|= CODEC_FLAG_PSNR;
3731 video_enc->flags |= CODEC_FLAG_PASS1;
3734 video_enc->flags |= CODEC_FLAG_PASS2;
3738 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
3739 if (forced_key_frames)
3740 parse_forced_key_frames(forced_key_frames, ost);
3742 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
3744 ost->top_field_first = -1;
3745 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
3747 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
3750 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
3752 ost->avfilter = av_strdup(filters);
3759 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3764 AVCodecContext *audio_enc;
3766 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3769 audio_enc = st->codec;
3770 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3772 if (!ost->stream_copy) {
3773 char *sample_fmt = NULL;
3775 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3777 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
3779 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
3780 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
3784 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
3786 ost->rematrix_volume=1.0;
3787 MATCH_PER_STREAM_OPT(rematrix_volume, f, ost->rematrix_volume, oc, st);
3790 /* check for channel mapping for this audio stream */
3791 for (n = 0; n < o->nb_audio_channel_maps; n++) {
3792 AudioChannelMap *map = &o->audio_channel_maps[n];
3793 InputStream *ist = &input_streams[ost->source_index];
3794 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
3795 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
3796 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
3797 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
3798 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
3800 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
3801 ost->file_index, ost->st->index);
3808 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3812 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3813 if (!ost->stream_copy) {
3814 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
3821 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
3823 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
3824 ost->stream_copy = 1;
3828 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3832 AVCodecContext *subtitle_enc;
3834 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3836 subtitle_enc = st->codec;
3838 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3843 /* arg format is "output-stream-index:streamid-value". */
3844 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
3850 av_strlcpy(idx_str, arg, sizeof(idx_str));
3851 p = strchr(idx_str, ':');
3853 av_log(NULL, AV_LOG_FATAL,
3854 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3859 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3860 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
3861 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3865 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3867 AVFormatContext *is = ifile->ctx;
3868 AVFormatContext *os = ofile->ctx;
3871 for (i = 0; i < is->nb_chapters; i++) {
3872 AVChapter *in_ch = is->chapters[i], *out_ch;
3873 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3874 AV_TIME_BASE_Q, in_ch->time_base);
3875 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3876 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3879 if (in_ch->end < ts_off)
3881 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3884 out_ch = av_mallocz(sizeof(AVChapter));
3886 return AVERROR(ENOMEM);
3888 out_ch->id = in_ch->id;
3889 out_ch->time_base = in_ch->time_base;
3890 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3891 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3894 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3897 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
3899 return AVERROR(ENOMEM);
3900 os->chapters[os->nb_chapters - 1] = out_ch;
3905 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3908 AVFormatContext *ic = avformat_alloc_context();
3910 ic->interrupt_callback = int_cb;
3911 err = avformat_open_input(&ic, filename, NULL, NULL);
3914 /* copy stream format */
3915 for(i=0;i<ic->nb_streams;i++) {
3919 AVCodecContext *avctx;
3921 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3922 ost = new_output_stream(o, s, codec->type);
3926 // FIXME: a more elegant solution is needed
3927 memcpy(st, ic->streams[i], sizeof(AVStream));
3928 st->info = av_malloc(sizeof(*st->info));
3929 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
3931 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3933 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
3934 choose_sample_fmt(st, codec);
3935 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
3936 choose_pixel_fmt(st, codec);
3939 av_close_input_file(ic);
3943 static void opt_output_file(void *optctx, const char *filename)
3945 OptionsContext *o = optctx;
3946 AVFormatContext *oc;
3948 AVOutputFormat *file_oformat;
3952 if (!strcmp(filename, "-"))
3955 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
3957 print_error(filename, err);
3960 file_oformat= oc->oformat;
3961 oc->interrupt_callback = int_cb;
3963 if (!strcmp(file_oformat->name, "ffm") &&
3964 av_strstart(filename, "http:", NULL)) {
3966 /* special case for files sent to ffserver: we get the stream
3967 parameters from ffserver */
3968 int err = read_ffserver_streams(o, oc, filename);
3970 print_error(filename, err);
3973 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
3974 ost = &output_streams[j];
3975 for (i = 0; i < nb_input_streams; i++) {
3976 ist = &input_streams[i];
3977 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
3979 ost->source_index= i;
3985 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));
3989 } else if (!o->nb_stream_maps) {
3990 /* pick the "best" stream of each type */
3991 #define NEW_STREAM(type, index)\
3993 ost = new_ ## type ## _stream(o, oc);\
3994 ost->source_index = index;\
3995 ost->sync_ist = &input_streams[index];\
3996 input_streams[index].discard = 0;\
3999 /* video: highest resolution */
4000 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
4001 int area = 0, idx = -1;
4002 for (i = 0; i < nb_input_streams; i++) {
4003 ist = &input_streams[i];
4004 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
4005 ist->st->codec->width * ist->st->codec->height > area) {
4006 area = ist->st->codec->width * ist->st->codec->height;
4010 NEW_STREAM(video, idx);
4013 /* audio: most channels */
4014 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
4015 int channels = 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_AUDIO &&
4019 ist->st->codec->channels > channels) {
4020 channels = ist->st->codec->channels;
4024 NEW_STREAM(audio, idx);
4027 /* subtitles: pick first */
4028 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
4029 for (i = 0; i < nb_input_streams; i++)
4030 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
4031 NEW_STREAM(subtitle, i);
4035 /* do something with data? */
4037 for (i = 0; i < o->nb_stream_maps; i++) {
4038 StreamMap *map = &o->stream_maps[i];
4043 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
4044 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
4046 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
4048 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
4051 switch (ist->st->codec->codec_type) {
4052 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
4053 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
4054 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
4055 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
4056 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
4058 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
4059 map->file_index, map->stream_index);
4063 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
4064 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
4065 map->sync_stream_index];
4070 /* handle attached files */
4071 for (i = 0; i < o->nb_attachments; i++) {
4073 uint8_t *attachment;
4077 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
4078 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
4082 if ((len = avio_size(pb)) <= 0) {
4083 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
4087 if (!(attachment = av_malloc(len))) {
4088 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
4092 avio_read(pb, attachment, len);
4094 ost = new_attachment_stream(o, oc);
4095 ost->stream_copy = 0;
4096 ost->source_index = -1;
4097 ost->attachment_filename = o->attachments[i];
4098 ost->st->codec->extradata = attachment;
4099 ost->st->codec->extradata_size = len;
4101 p = strrchr(o->attachments[i], '/');
4102 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
4106 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
4107 output_files[nb_output_files - 1].ctx = oc;
4108 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
4109 output_files[nb_output_files - 1].recording_time = o->recording_time;
4110 output_files[nb_output_files - 1].start_time = o->start_time;
4111 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
4112 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
4114 /* check filename in case of an image number is expected */
4115 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
4116 if (!av_filename_number_test(oc->filename)) {
4117 print_error(oc->filename, AVERROR(EINVAL));
4122 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
4123 /* test if it already exists to avoid loosing precious files */
4124 assert_file_overwrite(filename);
4127 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
4128 &oc->interrupt_callback,
4129 &output_files[nb_output_files - 1].opts)) < 0) {
4130 print_error(filename, err);
4135 if (o->mux_preload) {
4137 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
4138 av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
4140 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
4142 if (loop_output >= 0) {
4143 av_log(NULL, AV_LOG_WARNING, "-loop_output is deprecated, use -loop\n");
4144 oc->loop_output = loop_output;
4148 if (o->chapters_input_file >= nb_input_files) {
4149 if (o->chapters_input_file == INT_MAX) {
4150 /* copy chapters from the first input file that has them*/
4151 o->chapters_input_file = -1;
4152 for (i = 0; i < nb_input_files; i++)
4153 if (input_files[i].ctx->nb_chapters) {
4154 o->chapters_input_file = i;
4158 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
4159 o->chapters_input_file);
4163 if (o->chapters_input_file >= 0)
4164 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
4165 !o->metadata_chapters_manual);
4168 for (i = 0; i < o->nb_meta_data_maps; i++) {
4169 AVFormatContext *files[2];
4170 AVDictionary **meta[2];
4173 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
4174 if ((index) < 0 || (index) >= (nb_elems)) {\
4175 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps\n",\
4180 int in_file_index = o->meta_data_maps[i][1].file;
4181 if (in_file_index < 0)
4183 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
4186 files[1] = input_files[in_file_index].ctx;
4188 for (j = 0; j < 2; j++) {
4189 MetadataMap *map = &o->meta_data_maps[i][j];
4191 switch (map->type) {
4193 meta[j] = &files[j]->metadata;
4196 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
4197 meta[j] = &files[j]->streams[map->index]->metadata;
4200 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
4201 meta[j] = &files[j]->chapters[map->index]->metadata;
4204 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
4205 meta[j] = &files[j]->programs[map->index]->metadata;
4212 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
4215 /* copy global metadata by default */
4216 if (!o->metadata_global_manual && nb_input_files){
4217 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
4218 AV_DICT_DONT_OVERWRITE);
4219 if(o->recording_time != INT64_MAX)
4220 av_dict_set(&oc->metadata, "duration", NULL, 0);
4222 if (!o->metadata_streams_manual)
4223 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
4225 if (output_streams[i].source_index < 0) /* this is true e.g. for attached files */
4227 ist = &input_streams[output_streams[i].source_index];
4228 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
4231 /* process manually set metadata */
4232 for (i = 0; i < o->nb_metadata; i++) {
4237 val = strchr(o->metadata[i].u.str, '=');
4239 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
4240 o->metadata[i].u.str);
4245 parse_meta_type(o->metadata[i].specifier, &type, &index);
4251 if (index < 0 || index >= oc->nb_streams) {
4252 av_log(NULL, AV_LOG_FATAL, "Invalid stream index %d in metadata specifier.\n", index);
4255 m = &oc->streams[index]->metadata;
4258 if (index < 0 || index >= oc->nb_chapters) {
4259 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
4262 m = &oc->chapters[index]->metadata;
4265 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
4269 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
4272 reset_options(o, 0);
4275 /* same option as mencoder */
4276 static int opt_pass(const char *opt, const char *arg)
4278 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
4282 static int64_t getutime(void)
4285 struct rusage rusage;
4287 getrusage(RUSAGE_SELF, &rusage);
4288 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4289 #elif HAVE_GETPROCESSTIMES
4291 FILETIME c, e, k, u;
4292 proc = GetCurrentProcess();
4293 GetProcessTimes(proc, &c, &e, &k, &u);
4294 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4296 return av_gettime();
4300 static int64_t getmaxrss(void)
4302 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4303 struct rusage rusage;
4304 getrusage(RUSAGE_SELF, &rusage);
4305 return (int64_t)rusage.ru_maxrss * 1024;
4306 #elif HAVE_GETPROCESSMEMORYINFO
4308 PROCESS_MEMORY_COUNTERS memcounters;
4309 proc = GetCurrentProcess();
4310 memcounters.cb = sizeof(memcounters);
4311 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4312 return memcounters.PeakPagefileUsage;
4318 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
4320 return parse_option(o, "q:a", arg, options);
4323 static void show_usage(void)
4325 printf("Hyper fast Audio and Video encoder\n");
4326 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
4330 static int opt_help(const char *opt, const char *arg)
4332 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
4333 av_log_set_callback(log_callback_help);
4335 show_help_options(options, "Main options:\n",
4336 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4337 show_help_options(options, "\nAdvanced options:\n",
4338 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4340 show_help_options(options, "\nVideo options:\n",
4341 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4343 show_help_options(options, "\nAdvanced Video options:\n",
4344 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4345 OPT_VIDEO | OPT_EXPERT);
4346 show_help_options(options, "\nAudio options:\n",
4347 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4349 show_help_options(options, "\nAdvanced Audio options:\n",
4350 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4351 OPT_AUDIO | OPT_EXPERT);
4352 show_help_options(options, "\nSubtitle options:\n",
4353 OPT_SUBTITLE | OPT_GRAB,
4355 show_help_options(options, "\nAudio/Video grab options:\n",
4359 show_help_children(avcodec_get_class(), flags);
4360 show_help_children(avformat_get_class(), flags);
4361 show_help_children(sws_get_class(), flags);
4366 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
4368 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4369 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4371 if(!strncmp(arg, "pal-", 4)) {
4374 } else if(!strncmp(arg, "ntsc-", 5)) {
4377 } else if(!strncmp(arg, "film-", 5)) {
4381 /* Try to determine PAL/NTSC by peeking in the input files */
4382 if(nb_input_files) {
4384 for (j = 0; j < nb_input_files; j++) {
4385 for (i = 0; i < input_files[j].nb_streams; i++) {
4386 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4387 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4389 fr = c->time_base.den * 1000 / c->time_base.num;
4393 } else if((fr == 29970) || (fr == 23976)) {
4402 if (norm != UNKNOWN)
4403 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4406 if(norm == UNKNOWN) {
4407 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4408 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4409 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
4413 if(!strcmp(arg, "vcd")) {
4414 opt_video_codec(o, "c:v", "mpeg1video");
4415 opt_audio_codec(o, "c:a", "mp2");
4416 parse_option(o, "f", "vcd", options);
4418 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
4419 parse_option(o, "r", frame_rates[norm], options);
4420 opt_default("g", norm == PAL ? "15" : "18");
4422 opt_default("b", "1150000");
4423 opt_default("maxrate", "1150000");
4424 opt_default("minrate", "1150000");
4425 opt_default("bufsize", "327680"); // 40*1024*8;
4427 opt_default("b:a", "224000");
4428 parse_option(o, "ar", "44100", options);
4429 parse_option(o, "ac", "2", options);
4431 opt_default("packetsize", "2324");
4432 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4434 /* We have to offset the PTS, so that it is consistent with the SCR.
4435 SCR starts at 36000, but the first two packs contain only padding
4436 and the first pack from the other stream, respectively, may also have
4437 been written before.
4438 So the real data starts at SCR 36000+3*1200. */
4439 o->mux_preload = (36000+3*1200) / 90000.0; //0.44
4440 } else if(!strcmp(arg, "svcd")) {
4442 opt_video_codec(o, "c:v", "mpeg2video");
4443 opt_audio_codec(o, "c:a", "mp2");
4444 parse_option(o, "f", "svcd", options);
4446 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
4447 parse_option(o, "r", frame_rates[norm], options);
4448 parse_option(o, "pix_fmt", "yuv420p", options);
4449 opt_default("g", norm == PAL ? "15" : "18");
4451 opt_default("b", "2040000");
4452 opt_default("maxrate", "2516000");
4453 opt_default("minrate", "0"); //1145000;
4454 opt_default("bufsize", "1835008"); //224*1024*8;
4455 opt_default("flags", "+scan_offset");
4458 opt_default("b:a", "224000");
4459 parse_option(o, "ar", "44100", options);
4461 opt_default("packetsize", "2324");
4463 } else if(!strcmp(arg, "dvd")) {
4465 opt_video_codec(o, "c:v", "mpeg2video");
4466 opt_audio_codec(o, "c:a", "ac3");
4467 parse_option(o, "f", "dvd", options);
4469 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4470 parse_option(o, "r", frame_rates[norm], options);
4471 parse_option(o, "pix_fmt", "yuv420p", options);
4472 opt_default("g", norm == PAL ? "15" : "18");
4474 opt_default("b", "6000000");
4475 opt_default("maxrate", "9000000");
4476 opt_default("minrate", "0"); //1500000;
4477 opt_default("bufsize", "1835008"); //224*1024*8;
4479 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4480 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4482 opt_default("b:a", "448000");
4483 parse_option(o, "ar", "48000", options);
4485 } else if(!strncmp(arg, "dv", 2)) {
4487 parse_option(o, "f", "dv", options);
4489 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4490 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4491 norm == PAL ? "yuv420p" : "yuv411p", options);
4492 parse_option(o, "r", frame_rates[norm], options);
4494 parse_option(o, "ar", "48000", options);
4495 parse_option(o, "ac", "2", options);
4498 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
4499 return AVERROR(EINVAL);
4504 static int opt_vstats_file(const char *opt, const char *arg)
4506 av_free (vstats_filename);
4507 vstats_filename=av_strdup (arg);
4511 static int opt_vstats(const char *opt, const char *arg)
4514 time_t today2 = time(NULL);
4515 struct tm *today = localtime(&today2);
4517 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4519 return opt_vstats_file(opt, filename);
4522 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4524 return parse_option(o, "frames:v", arg, options);
4527 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4529 return parse_option(o, "frames:a", arg, options);
4532 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4534 return parse_option(o, "frames:d", arg, options);
4537 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
4540 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4541 const char *codec_name = *opt == 'v' ? video_codec_name :
4542 *opt == 'a' ? audio_codec_name :
4543 subtitle_codec_name;
4545 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4546 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
4547 av_log(0, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
4549 av_log(0, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
4554 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4555 if(line[0] == '#' && !e)
4557 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4559 av_log(0, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
4562 if(!strcmp(tmp, "acodec")){
4563 opt_audio_codec(o, tmp, tmp2);
4564 }else if(!strcmp(tmp, "vcodec")){
4565 opt_video_codec(o, tmp, tmp2);
4566 }else if(!strcmp(tmp, "scodec")){
4567 opt_subtitle_codec(o, tmp, tmp2);
4568 }else if(!strcmp(tmp, "dcodec")){
4569 opt_data_codec(o, tmp, tmp2);
4570 }else if(opt_default(tmp, tmp2) < 0){
4571 av_log(0, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4581 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
4585 static int opt_passlogfile(const char *opt, const char *arg)
4587 pass_logfilename_prefix = arg;
4588 #if CONFIG_LIBX264_ENCODER
4589 return opt_default("passlogfile", arg);
4595 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
4597 char *s= av_malloc(strlen(opt)+2);
4598 snprintf(s, strlen(opt)+2, "%s:%c", opt+1, *opt);
4599 return parse_option(o, s, arg, options);
4602 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
4604 if(!strcmp(opt, "b")){
4605 av_log(0,AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
4606 return parse_option(o, av_strdup("b:v"), arg, options);
4608 return opt_default(opt, arg);
4611 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4613 return parse_option(o, "filter:v", arg, options);
4616 #define OFFSET(x) offsetof(OptionsContext, x)
4617 static const OptionDef options[] = {
4619 #include "cmdutils_common_opts.h"
4620 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4621 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4622 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4623 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4624 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4625 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
4626 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4627 { "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]" },
4628 { "map_meta_data", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4629 "outfile[,metadata]:infile[,metadata]" },
4630 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4631 "outfile[,metadata]:infile[,metadata]" },
4632 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4633 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4634 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4635 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4636 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4637 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4638 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4639 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4640 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4641 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4642 "add timings for benchmarking" },
4643 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4644 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4645 "dump each input packet" },
4646 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4647 "when dumping packets, also dump the payload" },
4648 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4649 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "deprecated, use -loop" },
4650 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "deprecated, use -loop", "" },
4651 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4652 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4653 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4654 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4655 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4656 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4657 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4658 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4659 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4660 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
4661 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4662 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4663 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4664 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4666 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4668 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
4669 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
4670 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
4673 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4674 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4675 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4676 { "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" },
4677 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4678 { "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" },
4679 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4680 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4681 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4682 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4683 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4684 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4685 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4686 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4687 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4688 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4689 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4690 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4691 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4692 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4693 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4694 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4695 "use same quantizer as source (implies VBR)" },
4696 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4697 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4698 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4699 "deinterlace pictures" },
4700 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4701 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4702 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4704 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
4706 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
4707 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
4708 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
4709 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4710 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
4711 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4712 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
4713 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4714 { "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" },
4715 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
4718 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4719 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
4720 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
4721 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
4722 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
4723 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4724 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
4725 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4726 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
4727 { "rmvol", HAS_ARG | OPT_AUDIO | OPT_FLOAT | OPT_SPEC, {.off = OFFSET(rematrix_volume)}, "rematrix volume (as factor)", "volume" },
4729 /* subtitle options */
4730 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
4731 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4732 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
4735 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
4736 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
4737 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4740 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4741 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4743 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4744 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
4745 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
4747 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4748 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4749 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4750 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4751 /* data codec support */
4752 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4754 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4758 int main(int argc, char **argv)
4760 OptionsContext o = { 0 };
4763 reset_options(&o, 0);
4765 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4766 parse_loglevel(argc, argv, options);
4768 if(argc>1 && !strcmp(argv[1], "-d")){
4770 av_log_set_callback(log_callback_null);
4775 avcodec_register_all();
4777 avdevice_register_all();
4780 avfilter_register_all();
4783 avformat_network_init();
4790 parse_options(&o, argc, argv, options, opt_output_file);
4792 if(nb_output_files <= 0 && nb_input_files == 0) {
4794 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4798 /* file converter / grab */
4799 if (nb_output_files <= 0) {
4800 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
4804 if (nb_input_files == 0) {
4805 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
4810 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4812 ti = getutime() - ti;
4814 int maxrss = getmaxrss() / 1024;
4815 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);