3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/dict.h"
43 #include "libavutil/mathematics.h"
44 #include "libavutil/pixdesc.h"
45 #include "libavutil/avstring.h"
46 #include "libavutil/libm.h"
47 #include "libavformat/os_support.h"
48 #include "libswresample/swresample.h"
50 #include "libavformat/ffm.h" // not public API
53 # include "libavfilter/avcodec.h"
54 # include "libavfilter/avfilter.h"
55 # include "libavfilter/avfiltergraph.h"
56 # include "libavfilter/buffersink.h"
57 # include "libavfilter/vsrc_buffer.h"
60 #if HAVE_SYS_RESOURCE_H
61 #include <sys/types.h>
63 #include <sys/resource.h>
64 #elif HAVE_GETPROCESSTIMES
67 #if HAVE_GETPROCESSMEMORYINFO
73 #include <sys/select.h>
78 #include <sys/ioctl.h>
88 #include "libavutil/avassert.h"
90 const char program_name[] = "ffmpeg";
91 const int program_birth_year = 2000;
93 /* select an input stream for an output stream */
94 typedef struct StreamMap {
95 int disabled; /** 1 is this mapping is disabled by a negative map */
99 int sync_stream_index;
103 int file_idx, stream_idx, channel_idx; // input
104 int ofile_idx, ostream_idx; // output
108 * select an input file for an output file
110 typedef struct MetadataMap {
111 int file; ///< file index
112 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
113 int index; ///< stream/chapter/program number
116 static const OptionDef options[];
118 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
120 static int frame_bits_per_raw_sample = 0;
121 static int video_discard = 0;
122 static int same_quant = 0;
123 static int do_deinterlace = 0;
124 static int intra_dc_precision = 8;
125 static int loop_input = 0;
126 static int loop_output = AVFMT_NOOUTPUTLOOP;
127 static int qp_hist = 0;
128 static int intra_only = 0;
129 static const char *video_codec_name = NULL;
130 static const char *audio_codec_name = NULL;
131 static const char *subtitle_codec_name = NULL;
133 static int file_overwrite = 0;
134 static int no_file_overwrite = 0;
135 static int do_benchmark = 0;
136 static int do_hex_dump = 0;
137 static int do_pkt_dump = 0;
138 static int do_psnr = 0;
139 static int do_pass = 0;
140 static const char *pass_logfilename_prefix;
141 static int video_sync_method= -1;
142 static int audio_sync_method= 0;
143 static float audio_drift_threshold= 0.1;
144 static int copy_ts= 0;
145 static int copy_tb= -1;
146 static int opt_shortest = 0;
147 static char *vstats_filename;
148 static FILE *vstats_file;
150 static int audio_volume = 256;
152 static int exit_on_error = 0;
153 static int using_stdin = 0;
154 static int run_as_daemon = 0;
155 static volatile int received_nb_signals = 0;
156 static int64_t video_size = 0;
157 static int64_t audio_size = 0;
158 static int64_t extra_size = 0;
159 static int nb_frames_dup = 0;
160 static int nb_frames_drop = 0;
161 static int input_sync;
163 static float dts_delta_threshold = 10;
165 static int print_stats = 1;
167 static uint8_t *audio_buf;
168 static uint8_t *audio_out;
169 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
171 static void *samples;
172 static uint8_t *input_tmp= NULL;
174 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
176 typedef struct InputStream {
179 int discard; /* true if stream data should be discarded */
180 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
183 int64_t start; /* time when read started */
184 int64_t next_pts; /* synthetic pts for cases where pkt.pts
186 int64_t pts; /* current pts */
188 int is_start; /* is 1 at the start and after a discontinuity */
189 int showed_multi_packet_warning;
193 typedef struct InputFile {
194 AVFormatContext *ctx;
195 int eof_reached; /* true if eof reached */
196 int ist_index; /* index of first stream in input_streams */
197 int buffer_size; /* current total buffer size */
199 int nb_streams; /* number of stream that ffmpeg is aware of; may be different
200 from ctx.nb_streams if new streams appear during av_read_frame() */
204 typedef struct OutputStream {
205 int file_index; /* file index */
206 int index; /* stream index in the output file */
207 int source_index; /* InputStream index */
208 AVStream *st; /* stream in the output file */
209 int encoding_needed; /* true if encoding needed for this stream */
211 /* input pts and corresponding output pts
213 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
214 struct InputStream *sync_ist; /* input stream to sync against */
215 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
216 AVBitStreamFilterContext *bitstream_filters;
222 AVFrame resample_frame; /* temporary frame for image resampling */
223 struct SwsContext *img_resample_ctx; /* for image resampling */
226 int resample_pix_fmt;
227 AVRational frame_rate;
231 float frame_aspect_ratio;
233 /* forced key frames */
234 int64_t *forced_kf_pts;
240 int audio_channels_map[SWR_CH_MAX]; ///< list of the channels id to pick from the source stream
241 int audio_channels_mapped; ///< number of channels in audio_channels_map
242 int resample_sample_fmt;
243 int resample_channels;
244 int resample_sample_rate;
245 float rematrix_volume;
246 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
249 struct SwrContext *swr;
252 AVFilterContext *output_video_filter;
253 AVFilterContext *input_video_filter;
254 AVFilterBufferRef *picref;
256 AVFilterGraph *graph;
261 int is_past_recording_time;
263 const char *attachment_filename;
264 int copy_initial_nonkeyframes;
270 /* init terminal so that we can grab keys */
271 static struct termios oldtty;
274 typedef struct OutputFile {
275 AVFormatContext *ctx;
277 int ost_index; /* index of the first stream in output_streams */
278 int64_t recording_time; /* desired length of the resulting file in microseconds */
279 int64_t start_time; /* start time in microseconds */
280 uint64_t limit_filesize;
283 static InputStream *input_streams = NULL;
284 static int nb_input_streams = 0;
285 static InputFile *input_files = NULL;
286 static int nb_input_files = 0;
288 static OutputStream *output_streams = NULL;
289 static int nb_output_streams = 0;
290 static OutputFile *output_files = NULL;
291 static int nb_output_files = 0;
293 typedef struct OptionsContext {
294 /* input/output options */
298 SpecifierOpt *codec_names;
300 SpecifierOpt *audio_channels;
301 int nb_audio_channels;
302 SpecifierOpt *audio_sample_rate;
303 int nb_audio_sample_rate;
304 SpecifierOpt *rematrix_volume;
305 int nb_rematrix_volume;
306 SpecifierOpt *frame_rates;
308 SpecifierOpt *frame_sizes;
310 SpecifierOpt *frame_pix_fmts;
311 int nb_frame_pix_fmts;
314 int64_t input_ts_offset;
317 SpecifierOpt *ts_scale;
319 SpecifierOpt *dump_attachment;
320 int nb_dump_attachment;
323 StreamMap *stream_maps;
325 AudioChannelMap *audio_channel_maps; ///< one info entry per -map_channel
326 int nb_audio_channel_maps; ///< number of (valid) -map_channel settings
327 /* first item specifies output metadata, second is input */
328 MetadataMap (*meta_data_maps)[2];
329 int nb_meta_data_maps;
330 int metadata_global_manual;
331 int metadata_streams_manual;
332 int metadata_chapters_manual;
333 const char **attachments;
336 int chapters_input_file;
338 int64_t recording_time;
339 uint64_t limit_filesize;
345 int subtitle_disable;
348 /* indexed by output file stream index */
352 SpecifierOpt *metadata;
354 SpecifierOpt *max_frames;
356 SpecifierOpt *bitstream_filters;
357 int nb_bitstream_filters;
358 SpecifierOpt *codec_tags;
360 SpecifierOpt *sample_fmts;
362 SpecifierOpt *qscale;
364 SpecifierOpt *forced_key_frames;
365 int nb_forced_key_frames;
366 SpecifierOpt *force_fps;
368 SpecifierOpt *frame_aspect_ratios;
369 int nb_frame_aspect_ratios;
370 SpecifierOpt *rc_overrides;
372 SpecifierOpt *intra_matrices;
373 int nb_intra_matrices;
374 SpecifierOpt *inter_matrices;
375 int nb_inter_matrices;
376 SpecifierOpt *top_field_first;
377 int nb_top_field_first;
378 SpecifierOpt *presets;
380 SpecifierOpt *copy_initial_nonkeyframes;
381 int nb_copy_initial_nonkeyframes;
383 SpecifierOpt *filters;
388 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
391 for (i = 0; i < o->nb_ ## name; i++) {\
392 char *spec = o->name[i].specifier;\
393 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
394 outvar = o->name[i].u.type;\
400 static void reset_options(OptionsContext *o, int is_input)
402 const OptionDef *po = options;
403 OptionsContext bak= *o;
405 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
407 void *dst = (uint8_t*)o + po->u.off;
409 if (po->flags & OPT_SPEC) {
410 SpecifierOpt **so = dst;
411 int i, *count = (int*)(so + 1);
412 for (i = 0; i < *count; i++) {
413 av_freep(&(*so)[i].specifier);
414 if (po->flags & OPT_STRING)
415 av_freep(&(*so)[i].u.str);
419 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
424 av_freep(&o->stream_maps);
425 av_freep(&o->audio_channel_maps);
426 av_freep(&o->meta_data_maps);
427 av_freep(&o->streamid_map);
429 memset(o, 0, sizeof(*o));
431 if(is_input) o->recording_time = bak.recording_time;
432 else o->recording_time = INT64_MAX;
433 o->mux_max_delay = 0.7;
434 o->limit_filesize = UINT64_MAX;
435 o->chapters_input_file = INT_MAX;
443 static int configure_video_filters(InputStream *ist, OutputStream *ost)
445 AVFilterContext *last_filter, *filter;
446 /** filter graph containing all filters including input & output */
447 AVCodecContext *codec = ost->st->codec;
448 AVCodecContext *icodec = ist->st->codec;
449 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
450 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
451 AVRational sample_aspect_ratio;
455 ost->graph = avfilter_graph_alloc();
457 if (ist->st->sample_aspect_ratio.num){
458 sample_aspect_ratio = ist->st->sample_aspect_ratio;
460 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
462 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
463 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
464 sample_aspect_ratio.num, sample_aspect_ratio.den);
466 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
467 "src", args, NULL, ost->graph);
470 #if FF_API_OLD_VSINK_API
471 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
472 "out", NULL, pix_fmts, ost->graph);
474 buffersink_params->pixel_fmts = pix_fmts;
475 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
476 "out", NULL, buffersink_params, ost->graph);
478 av_freep(&buffersink_params);
481 last_filter = ost->input_video_filter;
483 if (codec->width != icodec->width || codec->height != icodec->height) {
484 snprintf(args, 255, "%d:%d:flags=0x%X",
487 (unsigned)ost->sws_flags);
488 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
489 NULL, args, NULL, ost->graph)) < 0)
491 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
493 last_filter = filter;
496 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
497 ost->graph->scale_sws_opts = av_strdup(args);
500 AVFilterInOut *outputs = avfilter_inout_alloc();
501 AVFilterInOut *inputs = avfilter_inout_alloc();
503 outputs->name = av_strdup("in");
504 outputs->filter_ctx = last_filter;
505 outputs->pad_idx = 0;
506 outputs->next = NULL;
508 inputs->name = av_strdup("out");
509 inputs->filter_ctx = ost->output_video_filter;
513 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
515 av_freep(&ost->avfilter);
517 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
521 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
524 codec->width = ost->output_video_filter->inputs[0]->w;
525 codec->height = ost->output_video_filter->inputs[0]->h;
526 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
527 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
528 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
529 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
533 #endif /* CONFIG_AVFILTER */
535 static void term_exit(void)
537 av_log(NULL, AV_LOG_QUIET, "%s", "");
540 tcsetattr (0, TCSANOW, &oldtty);
544 static volatile int received_sigterm = 0;
546 static void sigterm_handler(int sig)
548 received_sigterm = sig;
549 received_nb_signals++;
553 static void term_init(void)
563 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
564 |INLCR|IGNCR|ICRNL|IXON);
565 tty.c_oflag |= OPOST;
566 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
567 tty.c_cflag &= ~(CSIZE|PARENB);
572 tcsetattr (0, TCSANOW, &tty);
573 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
576 avformat_network_deinit();
578 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
579 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
581 signal(SIGXCPU, sigterm_handler);
585 /* read a key without blocking */
586 static int read_key(void)
598 n = select(1, &rfds, NULL, NULL, &tv);
607 # if HAVE_PEEKNAMEDPIPE
609 static HANDLE input_handle;
612 input_handle = GetStdHandle(STD_INPUT_HANDLE);
613 is_pipe = !GetConsoleMode(input_handle, &dw);
616 if (stdin->_cnt > 0) {
621 /* When running under a GUI, you will end here. */
622 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
639 static int decode_interrupt_cb(void *ctx)
641 return received_nb_signals > 1;
644 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
646 void av_noreturn exit_program(int ret)
651 for(i=0;i<nb_output_files;i++) {
652 AVFormatContext *s = output_files[i].ctx;
653 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
655 avformat_free_context(s);
656 av_dict_free(&output_files[i].opts);
658 for(i=0;i<nb_input_files;i++) {
659 av_close_input_file(input_files[i].ctx);
661 for (i = 0; i < nb_input_streams; i++)
662 av_dict_free(&input_streams[i].opts);
666 av_free(vstats_filename);
668 av_freep(&input_streams);
669 av_freep(&input_files);
670 av_freep(&output_streams);
671 av_freep(&output_files);
676 allocated_audio_buf_size= allocated_audio_out_size= 0;
682 avformat_network_deinit();
684 av_freep(&input_tmp);
686 if (received_sigterm) {
687 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
688 (int) received_sigterm);
692 exit(ret); /* not all OS-es handle main() return value */
695 static void assert_avoptions(AVDictionary *m)
697 AVDictionaryEntry *t;
698 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
699 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
704 static void assert_codec_experimental(AVCodecContext *c, int encoder)
706 const char *codec_string = encoder ? "encoder" : "decoder";
708 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
709 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
710 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
711 "results.\nAdd '-strict experimental' if you want to use it.\n",
712 codec_string, c->codec->name);
713 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
714 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
715 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
716 codec_string, codec->name);
721 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
723 if(codec && codec->sample_fmts){
724 const enum AVSampleFormat *p= codec->sample_fmts;
726 if(*p == st->codec->sample_fmt)
730 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
731 av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
732 if(av_get_sample_fmt_name(st->codec->sample_fmt))
733 av_log(NULL, AV_LOG_WARNING,
734 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
735 av_get_sample_fmt_name(st->codec->sample_fmt),
737 av_get_sample_fmt_name(codec->sample_fmts[0]));
738 st->codec->sample_fmt = codec->sample_fmts[0];
743 static void choose_sample_rate(AVStream *st, AVCodec *codec)
745 if(codec && codec->supported_samplerates){
746 const int *p= codec->supported_samplerates;
748 int best_dist=INT_MAX;
750 int dist= abs(st->codec->sample_rate - *p);
751 if(dist < best_dist){
757 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
759 st->codec->sample_rate= best;
763 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
765 if(codec && codec->pix_fmts){
766 const enum PixelFormat *p= codec->pix_fmts;
767 int has_alpha= av_pix_fmt_descriptors[st->codec->pix_fmt].nb_components % 2 == 0;
768 enum PixelFormat best= PIX_FMT_NONE;
769 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
770 if(st->codec->codec_id==CODEC_ID_MJPEG){
771 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
772 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
773 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};
776 for (; *p != PIX_FMT_NONE; p++) {
777 best= avcodec_find_best_pix_fmt2(best, *p, st->codec->pix_fmt, has_alpha, NULL);
778 if(*p == st->codec->pix_fmt)
781 if (*p == PIX_FMT_NONE) {
782 if(st->codec->pix_fmt != PIX_FMT_NONE)
783 av_log(NULL, AV_LOG_WARNING,
784 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
785 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
787 av_pix_fmt_descriptors[best].name);
788 st->codec->pix_fmt = best;
793 static double get_sync_ipts(const OutputStream *ost)
795 const InputStream *ist = ost->sync_ist;
796 OutputFile *of = &output_files[ost->file_index];
797 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
800 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc)
805 AVPacket new_pkt= *pkt;
806 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
807 &new_pkt.data, &new_pkt.size,
808 pkt->data, pkt->size,
809 pkt->flags & AV_PKT_FLAG_KEY);
812 new_pkt.destruct= av_destruct_packet;
814 av_log(NULL, AV_LOG_ERROR, "%s failed for stream %d, codec %s",
815 bsfc->filter->name, pkt->stream_index,
816 avctx->codec ? avctx->codec->name : "copy");
826 ret= av_interleaved_write_frame(s, pkt);
828 print_error("av_interleaved_write_frame()", ret);
833 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
835 int fill_char = 0x00;
836 if (sample_fmt == AV_SAMPLE_FMT_U8)
838 memset(buf, fill_char, size);
841 static void do_audio_out(AVFormatContext *s,
844 unsigned char *buf, int size)
847 int64_t audio_out_size, audio_buf_size;
848 int64_t allocated_for_size= size;
850 int size_out, frame_bytes, ret, resample_changed;
851 AVCodecContext *enc= ost->st->codec;
852 AVCodecContext *dec= ist->st->codec;
853 int osize = av_get_bytes_per_sample(enc->sample_fmt);
854 int isize = av_get_bytes_per_sample(dec->sample_fmt);
855 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
858 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
859 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
860 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
861 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
862 audio_buf_size*= osize*enc->channels;
864 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
865 if(coded_bps > 8*osize)
866 audio_out_size= audio_out_size * coded_bps / (8*osize);
867 audio_out_size += FF_MIN_BUFFER_SIZE;
869 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
870 av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n");
874 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
875 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
876 if (!audio_buf || !audio_out){
877 av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
881 if (enc->channels != dec->channels
882 || enc->sample_fmt != dec->sample_fmt
883 || enc->sample_rate!= dec->sample_rate
885 ost->audio_resample = 1;
887 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
888 ost->resample_channels != dec->channels ||
889 ost->resample_sample_rate != dec->sample_rate;
891 if ((ost->audio_resample && !ost->swr) || resample_changed || ost->audio_channels_mapped) {
892 if (resample_changed) {
893 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",
894 ist->file_index, ist->st->index,
895 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
896 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
897 ost->resample_sample_fmt = dec->sample_fmt;
898 ost->resample_channels = dec->channels;
899 ost->resample_sample_rate = dec->sample_rate;
902 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
903 if (audio_sync_method <= 1 && !ost->audio_channels_mapped &&
904 ost->resample_sample_fmt == enc->sample_fmt &&
905 ost->resample_channels == enc->channels &&
906 ost->resample_sample_rate == enc->sample_rate) {
908 ost->audio_resample = 0;
910 ost->swr = swr_alloc_set_opts(ost->swr,
911 enc->channel_layout, enc->sample_fmt, enc->sample_rate,
912 dec->channel_layout, dec->sample_fmt, dec->sample_rate,
914 if (ost->audio_channels_mapped)
915 swr_set_channel_mapping(ost->swr, ost->audio_channels_map);
916 av_opt_set_double(ost->swr, "rmvol", ost->rematrix_volume, 0);
917 if (ost->audio_channels_mapped) {
918 av_opt_set_int(ost->swr, "icl", av_get_default_channel_layout(ost->audio_channels_mapped), 0);
919 av_opt_set_int(ost->swr, "uch", ost->audio_channels_mapped, 0);
921 av_opt_set_int(ost->swr, "ich", dec->channels, 0);
922 av_opt_set_int(ost->swr, "och", enc->channels, 0);
923 if(audio_sync_method>1) av_opt_set_int(ost->swr, "flags", SWR_FLAG_RESAMPLE, 0);
924 if(ost->swr && swr_init(ost->swr) < 0){
925 av_log(NULL, AV_LOG_FATAL, "swr_init() failed\n");
930 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
931 dec->channels, dec->sample_rate,
932 enc->channels, enc->sample_rate);
938 av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
940 if(audio_sync_method){
941 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
942 - av_fifo_size(ost->fifo)/(enc->channels * osize);
943 int idelta = delta * dec->sample_rate / enc->sample_rate;
944 int byte_delta = idelta * isize * dec->channels;
946 //FIXME resample delay
947 if(fabs(delta) > 50){
948 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
950 byte_delta= FFMAX(byte_delta, -size);
953 av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n",
954 -byte_delta / (isize * dec->channels));
959 input_tmp= av_realloc(input_tmp, byte_delta + size);
961 if(byte_delta > allocated_for_size - size){
962 allocated_for_size= byte_delta + (int64_t)size;
967 generate_silence(input_tmp, dec->sample_fmt, byte_delta);
968 memcpy(input_tmp + byte_delta, buf, size);
971 av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
973 }else if(audio_sync_method>1){
974 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
975 av_assert0(ost->audio_resample);
976 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
977 delta, comp, enc->sample_rate);
978 // 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));
979 swr_compensate(ost->swr, comp, enc->sample_rate);
983 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
984 - av_fifo_size(ost->fifo)/(enc->channels * osize); //FIXME wrong
986 if (ost->audio_resample) {
988 size_out = swr_convert(ost->swr, ( uint8_t*[]){buftmp}, audio_buf_size / (enc->channels * osize),
989 (const uint8_t*[]){buf }, size / (dec->channels * isize));
990 size_out = size_out * enc->channels * osize;
996 av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
998 /* now encode as many frames as possible */
999 if (enc->frame_size > 1) {
1000 /* output resampled raw samples */
1001 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
1002 av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
1005 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
1007 frame_bytes = enc->frame_size * osize * enc->channels;
1009 while (av_fifo_size(ost->fifo) >= frame_bytes) {
1011 av_init_packet(&pkt);
1013 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
1015 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1017 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
1018 (short *)audio_buf);
1020 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1024 pkt.stream_index= ost->index;
1025 pkt.data= audio_out;
1027 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1028 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1029 pkt.flags |= AV_PKT_FLAG_KEY;
1030 write_frame(s, &pkt, enc, ost->bitstream_filters);
1032 ost->sync_opts += enc->frame_size;
1036 av_init_packet(&pkt);
1038 ost->sync_opts += size_out / (osize * enc->channels);
1040 /* output a pcm frame */
1041 /* determine the size of the coded buffer */
1044 size_out = size_out*coded_bps/8;
1046 if(size_out > audio_out_size){
1047 av_log(NULL, AV_LOG_FATAL, "Internal error, buffer size too small\n");
1051 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1052 ret = avcodec_encode_audio(enc, audio_out, size_out,
1055 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1059 pkt.stream_index= ost->index;
1060 pkt.data= audio_out;
1062 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1063 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1064 pkt.flags |= AV_PKT_FLAG_KEY;
1065 write_frame(s, &pkt, enc, ost->bitstream_filters);
1069 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1071 AVCodecContext *dec;
1072 AVPicture *picture2;
1073 AVPicture picture_tmp;
1076 dec = ist->st->codec;
1078 /* deinterlace : must be done before any resize */
1079 if (do_deinterlace) {
1082 /* create temporary picture */
1083 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1084 buf = av_malloc(size);
1088 picture2 = &picture_tmp;
1089 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1091 if(avpicture_deinterlace(picture2, picture,
1092 dec->pix_fmt, dec->width, dec->height) < 0) {
1093 /* if error, do not deinterlace */
1094 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1103 if (picture != picture2)
1104 *picture = *picture2;
1108 static void do_subtitle_out(AVFormatContext *s,
1114 static uint8_t *subtitle_out = NULL;
1115 int subtitle_out_max_size = 1024 * 1024;
1116 int subtitle_out_size, nb, i;
1117 AVCodecContext *enc;
1120 if (pts == AV_NOPTS_VALUE) {
1121 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1127 enc = ost->st->codec;
1129 if (!subtitle_out) {
1130 subtitle_out = av_malloc(subtitle_out_max_size);
1133 /* Note: DVB subtitle need one packet to draw them and one other
1134 packet to clear them */
1135 /* XXX: signal it in the codec context ? */
1136 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1141 for(i = 0; i < nb; i++) {
1142 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1143 // start_display_time is required to be 0
1144 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1145 sub->end_display_time -= sub->start_display_time;
1146 sub->start_display_time = 0;
1147 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1148 subtitle_out_max_size, sub);
1149 if (subtitle_out_size < 0) {
1150 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1154 av_init_packet(&pkt);
1155 pkt.stream_index = ost->index;
1156 pkt.data = subtitle_out;
1157 pkt.size = subtitle_out_size;
1158 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1159 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1160 /* XXX: the pts correction is handled here. Maybe handling
1161 it in the codec would be better */
1163 pkt.pts += 90 * sub->start_display_time;
1165 pkt.pts += 90 * sub->end_display_time;
1167 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1171 static int bit_buffer_size= 1024*256;
1172 static uint8_t *bit_buffer= NULL;
1174 static void do_video_resample(OutputStream *ost,
1176 AVFrame *in_picture,
1177 AVFrame **out_picture)
1180 *out_picture = in_picture;
1182 AVCodecContext *dec = ist->st->codec;
1183 AVCodecContext *enc = ost->st->codec;
1184 int resample_changed = ost->resample_width != dec->width ||
1185 ost->resample_height != dec->height ||
1186 ost->resample_pix_fmt != dec->pix_fmt;
1188 *out_picture = in_picture;
1189 if (resample_changed) {
1190 av_log(NULL, AV_LOG_INFO,
1191 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1192 ist->file_index, ist->st->index,
1193 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1194 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1195 ost->resample_width = dec->width;
1196 ost->resample_height = dec->height;
1197 ost->resample_pix_fmt = dec->pix_fmt;
1200 ost->video_resample = dec->width != enc->width ||
1201 dec->height != enc->height ||
1202 dec->pix_fmt != enc->pix_fmt;
1204 if (ost->video_resample) {
1205 *out_picture = &ost->resample_frame;
1206 if (!ost->img_resample_ctx || resample_changed) {
1207 /* initialize the destination picture */
1208 if (!ost->resample_frame.data[0]) {
1209 avcodec_get_frame_defaults(&ost->resample_frame);
1210 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1211 enc->width, enc->height)) {
1212 av_log(NULL, AV_LOG_FATAL, "Cannot allocate temp picture, check pix fmt\n");
1216 /* initialize a new scaler context */
1217 sws_freeContext(ost->img_resample_ctx);
1218 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1219 enc->width, enc->height, enc->pix_fmt,
1220 ost->sws_flags, NULL, NULL, NULL);
1221 if (ost->img_resample_ctx == NULL) {
1222 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1226 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1227 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1233 static void do_video_out(AVFormatContext *s,
1236 AVFrame *in_picture,
1237 int *frame_size, float quality)
1239 int nb_frames, i, ret, format_video_sync;
1240 AVFrame *final_picture;
1241 AVCodecContext *enc;
1243 double duration = 0;
1245 enc = ost->st->codec;
1247 if (ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE) {
1248 duration = FFMAX(av_q2d(ist->st->time_base), av_q2d(ist->st->codec->time_base));
1249 if(ist->st->avg_frame_rate.num)
1250 duration= FFMAX(duration, 1/av_q2d(ist->st->avg_frame_rate));
1252 duration /= av_q2d(enc->time_base);
1255 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1257 /* by default, we output a single frame */
1262 format_video_sync = video_sync_method;
1263 if (format_video_sync < 0)
1264 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? 0 : 2) : 1;
1266 if (format_video_sync) {
1267 double vdelta = sync_ipts - ost->sync_opts + duration;
1268 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1271 else if (format_video_sync == 2) {
1274 }else if(vdelta>0.6)
1275 ost->sync_opts= lrintf(sync_ipts);
1276 }else if (vdelta > 1.1)
1277 nb_frames = lrintf(vdelta);
1278 //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);
1279 if (nb_frames == 0){
1281 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1282 }else if (nb_frames > 1) {
1283 nb_frames_dup += nb_frames - 1;
1284 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames-1);
1287 ost->sync_opts= lrintf(sync_ipts);
1289 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1293 do_video_resample(ost, ist, in_picture, &final_picture);
1295 /* duplicates frame if needed */
1296 for(i=0;i<nb_frames;i++) {
1298 av_init_packet(&pkt);
1299 pkt.stream_index= ost->index;
1301 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1302 enc->codec->id == CODEC_ID_RAWVIDEO) {
1303 /* raw pictures are written as AVPicture structure to
1304 avoid any copies. We support temporarily the older
1306 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1307 enc->coded_frame->top_field_first = in_picture->top_field_first;
1308 pkt.data= (uint8_t *)final_picture;
1309 pkt.size= sizeof(AVPicture);
1310 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1311 pkt.flags |= AV_PKT_FLAG_KEY;
1313 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1315 AVFrame big_picture;
1317 big_picture= *final_picture;
1318 /* better than nothing: use input picture interlaced
1320 big_picture.interlaced_frame = in_picture->interlaced_frame;
1321 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1322 if (ost->top_field_first == -1)
1323 big_picture.top_field_first = in_picture->top_field_first;
1325 big_picture.top_field_first = !!ost->top_field_first;
1328 /* handles same_quant here. This is not correct because it may
1329 not be a global option */
1330 big_picture.quality = quality;
1331 if (!enc->me_threshold)
1332 big_picture.pict_type = 0;
1333 // big_picture.pts = AV_NOPTS_VALUE;
1334 big_picture.pts= ost->sync_opts;
1335 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1336 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1337 if (ost->forced_kf_index < ost->forced_kf_count &&
1338 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1339 big_picture.pict_type = AV_PICTURE_TYPE_I;
1340 ost->forced_kf_index++;
1342 ret = avcodec_encode_video(enc,
1343 bit_buffer, bit_buffer_size,
1346 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1351 pkt.data= bit_buffer;
1353 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1354 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1355 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1356 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1357 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1359 if(enc->coded_frame->key_frame)
1360 pkt.flags |= AV_PKT_FLAG_KEY;
1361 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1364 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1365 // enc->frame_number-1, ret, enc->pict_type);
1366 /* if two pass, output log */
1367 if (ost->logfile && enc->stats_out) {
1368 fprintf(ost->logfile, "%s", enc->stats_out);
1373 ost->frame_number++;
1377 static double psnr(double d)
1379 return -10.0*log(d)/log(10.0);
1382 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1385 AVCodecContext *enc;
1387 double ti1, bitrate, avg_bitrate;
1389 /* this is executed just the first time do_video_stats is called */
1391 vstats_file = fopen(vstats_filename, "w");
1398 enc = ost->st->codec;
1399 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1400 frame_number = ost->frame_number;
1401 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1402 if (enc->flags&CODEC_FLAG_PSNR)
1403 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1405 fprintf(vstats_file,"f_size= %6d ", frame_size);
1406 /* compute pts value */
1407 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1411 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1412 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1413 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1414 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1415 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1419 static void print_report(OutputFile *output_files,
1420 OutputStream *ost_table, int nb_ostreams,
1421 int is_last_report, int64_t timer_start, int64_t cur_time)
1425 AVFormatContext *oc;
1427 AVCodecContext *enc;
1428 int frame_number, vid, i;
1430 int64_t pts = INT64_MAX;
1431 static int64_t last_time = -1;
1432 static int qp_histogram[52];
1433 int hours, mins, secs, us;
1435 if (!print_stats && !is_last_report)
1438 if (!is_last_report) {
1439 if (last_time == -1) {
1440 last_time = cur_time;
1443 if ((cur_time - last_time) < 500000)
1445 last_time = cur_time;
1449 oc = output_files[0].ctx;
1451 total_size = avio_size(oc->pb);
1452 if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
1453 total_size= avio_tell(oc->pb);
1460 for(i=0;i<nb_ostreams;i++) {
1462 ost = &ost_table[i];
1463 enc = ost->st->codec;
1464 if (!ost->stream_copy && enc->coded_frame)
1465 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1466 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1467 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1469 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1470 float t = (cur_time-timer_start) / 1000000.0;
1472 frame_number = ost->frame_number;
1473 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1474 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1476 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1480 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1483 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1485 if (enc->flags&CODEC_FLAG_PSNR){
1487 double error, error_sum=0;
1488 double scale, scale_sum=0;
1489 char type[3]= {'Y','U','V'};
1490 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1493 error= enc->error[j];
1494 scale= enc->width*enc->height*255.0*255.0*frame_number;
1496 error= enc->coded_frame->error[j];
1497 scale= enc->width*enc->height*255.0*255.0;
1502 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1504 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1508 /* compute min output value */
1509 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1510 ost->st->time_base, AV_TIME_BASE_Q));
1513 secs = pts / AV_TIME_BASE;
1514 us = pts % AV_TIME_BASE;
1520 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1522 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1523 "size=%8.0fkB time=", total_size / 1024.0);
1524 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1525 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1526 (100 * us) / AV_TIME_BASE);
1527 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1528 "bitrate=%6.1fkbits/s", bitrate);
1530 if (nb_frames_dup || nb_frames_drop)
1531 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1532 nb_frames_dup, nb_frames_drop);
1534 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
1538 if (is_last_report) {
1539 int64_t raw= audio_size + video_size + extra_size;
1540 av_log(NULL, AV_LOG_INFO, "\n");
1541 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1545 100.0*(total_size - raw)/raw
1547 if(video_size + audio_size + extra_size == 0){
1548 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
1553 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1557 for (i = 0; i < nb_ostreams; i++) {
1558 OutputStream *ost = &ost_table[i];
1559 AVCodecContext *enc = ost->st->codec;
1560 AVFormatContext *os = output_files[ost->file_index].ctx;
1562 if (!ost->encoding_needed)
1565 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1567 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
1573 av_init_packet(&pkt);
1574 pkt.stream_index= ost->index;
1576 switch (ost->st->codec->codec_type) {
1577 case AVMEDIA_TYPE_AUDIO:
1578 fifo_bytes = av_fifo_size(ost->fifo);
1580 /* encode any samples remaining in fifo */
1581 if (fifo_bytes > 0) {
1582 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1583 int fs_tmp = enc->frame_size;
1585 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1586 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1587 enc->frame_size = fifo_bytes / (osize * enc->channels);
1589 int frame_bytes = enc->frame_size*osize*enc->channels;
1590 if (allocated_audio_buf_size < frame_bytes)
1592 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1595 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1596 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1597 ost->st->time_base.num, enc->sample_rate);
1598 enc->frame_size = fs_tmp;
1601 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1604 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1608 pkt.flags |= AV_PKT_FLAG_KEY;
1610 case AVMEDIA_TYPE_VIDEO:
1611 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1613 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1617 if(enc->coded_frame && enc->coded_frame->key_frame)
1618 pkt.flags |= AV_PKT_FLAG_KEY;
1619 if (ost->logfile && enc->stats_out) {
1620 fprintf(ost->logfile, "%s", enc->stats_out);
1629 pkt.data = bit_buffer;
1631 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1632 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1633 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1639 * Check whether a packet from ist should be written into ost at this time
1641 static int check_output_constraints(InputStream *ist, OutputStream *ost)
1643 OutputFile *of = &output_files[ost->file_index];
1644 int ist_index = ist - input_streams;
1646 if (ost->source_index != ist_index)
1649 if (of->start_time && ist->pts < of->start_time)
1652 if (of->recording_time != INT64_MAX &&
1653 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1654 (AVRational){1, 1000000}) >= 0) {
1655 ost->is_past_recording_time = 1;
1662 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
1664 OutputFile *of = &output_files[ost->file_index];
1665 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1669 av_init_packet(&opkt);
1671 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
1672 !ost->copy_initial_nonkeyframes)
1675 /* force the input stream PTS */
1676 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1677 audio_size += pkt->size;
1678 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1679 video_size += pkt->size;
1683 opkt.stream_index = ost->index;
1684 if (pkt->pts != AV_NOPTS_VALUE)
1685 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1687 opkt.pts = AV_NOPTS_VALUE;
1689 if (pkt->dts == AV_NOPTS_VALUE)
1690 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1692 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1693 opkt.dts -= ost_tb_start_time;
1695 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1696 opkt.flags = pkt->flags;
1698 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1699 if( ost->st->codec->codec_id != CODEC_ID_H264
1700 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1701 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1703 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
1704 opkt.destruct = av_destruct_packet;
1706 opkt.data = pkt->data;
1707 opkt.size = pkt->size;
1709 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
1710 /* store AVPicture in AVPacket, as expected by the output format */
1711 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1712 opkt.data = (uint8_t *)&pict;
1713 opkt.size = sizeof(AVPicture);
1714 opkt.flags |= AV_PKT_FLAG_KEY;
1717 write_frame(of->ctx, &opkt, ost->st->codec, ost->bitstream_filters);
1718 ost->st->codec->frame_number++;
1719 ost->frame_number++;
1720 av_free_packet(&opkt);
1723 static void rate_emu_sleep(InputStream *ist)
1725 if (input_files[ist->file_index].rate_emu) {
1726 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1727 int64_t now = av_gettime() - ist->start;
1733 static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
1735 static unsigned int samples_size = 0;
1736 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1737 uint8_t *decoded_data_buf = NULL;
1738 int decoded_data_size = 0;
1741 if (pkt && samples_size < FFMAX(pkt->size * bps, AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1743 samples_size = FFMAX(pkt->size * bps, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1744 samples = av_malloc(samples_size);
1746 decoded_data_size = samples_size;
1748 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1752 *got_output = decoded_data_size > 0;
1754 /* Some bug in mpeg audio decoder gives */
1755 /* decoded_data_size < 0, it seems they are overflows */
1757 /* no audio frame */
1761 decoded_data_buf = (uint8_t *)samples;
1762 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1763 (ist->st->codec->sample_rate * ist->st->codec->channels);
1765 // preprocess audio (volume)
1766 if (audio_volume != 256) {
1767 switch (ist->st->codec->sample_fmt) {
1768 case AV_SAMPLE_FMT_U8:
1770 uint8_t *volp = samples;
1771 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1772 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
1773 *volp++ = av_clip_uint8(v);
1777 case AV_SAMPLE_FMT_S16:
1779 int16_t *volp = samples;
1780 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1781 int v = ((*volp) * audio_volume + 128) >> 8;
1782 *volp++ = av_clip_int16(v);
1786 case AV_SAMPLE_FMT_S32:
1788 int32_t *volp = samples;
1789 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1790 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
1791 *volp++ = av_clipl_int32(v);
1795 case AV_SAMPLE_FMT_FLT:
1797 float *volp = samples;
1798 float scale = audio_volume / 256.f;
1799 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1804 case AV_SAMPLE_FMT_DBL:
1806 double *volp = samples;
1807 double scale = audio_volume / 256.;
1808 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1814 av_log(NULL, AV_LOG_FATAL,
1815 "Audio volume adjustment on sample format %s is not supported.\n",
1816 av_get_sample_fmt_name(ist->st->codec->sample_fmt));
1821 rate_emu_sleep(ist);
1823 for (i = 0; i < nb_output_streams; i++) {
1824 OutputStream *ost = &output_streams[i];
1826 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1828 do_audio_out(output_files[ost->file_index].ctx, ost, ist,
1829 decoded_data_buf, decoded_data_size);
1834 static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *pkt_pts, int64_t *pkt_dts)
1836 AVFrame *decoded_frame, *filtered_frame = NULL;
1837 void *buffer_to_free = NULL;
1841 int frame_available = 1;
1845 if (!(decoded_frame = avcodec_alloc_frame()))
1846 return AVERROR(ENOMEM);
1847 pkt->pts = *pkt_pts;
1848 pkt->dts = *pkt_dts;
1849 *pkt_pts = AV_NOPTS_VALUE;
1851 if (pkt->duration) {
1852 duration = av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
1853 } else if(ist->st->codec->time_base.num != 0) {
1854 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1855 duration = ((int64_t)AV_TIME_BASE *
1856 ist->st->codec->time_base.num * ticks) /
1857 ist->st->codec->time_base.den;
1860 if(*pkt_dts != AV_NOPTS_VALUE && duration) {
1861 *pkt_dts += duration;
1863 *pkt_dts = AV_NOPTS_VALUE;
1865 ret = avcodec_decode_video2(ist->st->codec,
1866 decoded_frame, got_output, pkt);
1870 quality = same_quant ? decoded_frame->quality : 0;
1872 /* no picture yet */
1873 av_freep(&decoded_frame);
1877 if(decoded_frame->best_effort_timestamp != AV_NOPTS_VALUE)
1878 ist->next_pts = ist->pts = decoded_frame->best_effort_timestamp;
1880 ist->next_pts += duration;
1883 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
1886 for(i=0;i<nb_output_streams;i++) {
1887 OutputStream *ost = ost = &output_streams[i];
1888 if(check_output_constraints(ist, ost)){
1889 if (!decoded_frame->sample_aspect_ratio.num)
1890 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
1891 decoded_frame->pts = ist->pts;
1893 av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame, AV_VSRC_BUF_FLAG_OVERWRITE);
1898 rate_emu_sleep(ist);
1900 for (i = 0; i < nb_output_streams; i++) {
1901 OutputStream *ost = &output_streams[i];
1904 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1908 if (ost->input_video_filter) {
1909 frame_available = avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1911 while (frame_available) {
1912 if (ost->output_video_filter) {
1913 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1914 if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1916 if (!filtered_frame && !(filtered_frame = avcodec_alloc_frame())) {
1917 ret = AVERROR(ENOMEM);
1920 *filtered_frame= *decoded_frame; //for me_threshold
1922 avfilter_fill_frame_from_video_buffer_ref(filtered_frame, ost->picref);
1923 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1926 if (ost->picref->video && !ost->frame_aspect_ratio)
1927 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1929 filtered_frame = decoded_frame;
1932 do_video_out(output_files[ost->file_index].ctx, ost, ist, filtered_frame, &frame_size,
1933 same_quant ? quality : ost->st->codec->global_quality);
1934 if (vstats_filename && frame_size)
1935 do_video_stats(output_files[ost->file_index].ctx, ost, frame_size);
1938 frame_available = ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1939 avfilter_unref_buffer(ost->picref);
1941 av_freep(&filtered_frame);
1946 av_free(buffer_to_free);
1947 av_freep(&decoded_frame);
1951 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
1953 AVSubtitle subtitle;
1954 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
1955 &subtitle, got_output, pkt);
1961 rate_emu_sleep(ist);
1963 for (i = 0; i < nb_output_streams; i++) {
1964 OutputStream *ost = &output_streams[i];
1966 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1969 do_subtitle_out(output_files[ost->file_index].ctx, ost, ist, &subtitle, pkt->pts);
1972 avsubtitle_free(&subtitle);
1976 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1977 static int output_packet(InputStream *ist,
1978 OutputStream *ost_table, int nb_ostreams,
1979 const AVPacket *pkt)
1983 int64_t pkt_dts = AV_NOPTS_VALUE;
1984 int64_t pkt_pts = AV_NOPTS_VALUE;
1988 if (ist->next_pts == AV_NOPTS_VALUE)
1989 ist->next_pts = ist->pts;
1993 av_init_packet(&avpkt);
2001 if(pkt->dts != AV_NOPTS_VALUE){
2002 if(ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2003 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2004 pkt_dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2006 if(pkt->pts != AV_NOPTS_VALUE)
2007 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2009 //while we have more to decode or while the decoder did output something on EOF
2010 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2013 ist->pts = ist->next_pts;
2015 if (avpkt.size && avpkt.size != pkt->size) {
2016 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2017 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2018 ist->showed_multi_packet_warning = 1;
2021 switch(ist->st->codec->codec_type) {
2022 case AVMEDIA_TYPE_AUDIO:
2023 ret = transcode_audio (ist, &avpkt, &got_output);
2025 case AVMEDIA_TYPE_VIDEO:
2026 ret = transcode_video (ist, &avpkt, &got_output, &pkt_pts, &pkt_dts);
2028 case AVMEDIA_TYPE_SUBTITLE:
2029 ret = transcode_subtitles(ist, &avpkt, &got_output);
2037 // touch data and size only if not EOF
2039 if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2049 /* handle stream copy */
2050 if (!ist->decoding_needed) {
2051 rate_emu_sleep(ist);
2052 ist->pts = ist->next_pts;
2053 switch (ist->st->codec->codec_type) {
2054 case AVMEDIA_TYPE_AUDIO:
2055 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2056 ist->st->codec->sample_rate;
2058 case AVMEDIA_TYPE_VIDEO:
2059 if (pkt->duration) {
2060 ist->next_pts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2061 } else if(ist->st->codec->time_base.num != 0) {
2062 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2063 ist->next_pts += ((int64_t)AV_TIME_BASE *
2064 ist->st->codec->time_base.num * ticks) /
2065 ist->st->codec->time_base.den;
2070 for (i = 0; pkt && i < nb_ostreams; i++) {
2071 OutputStream *ost = &ost_table[i];
2073 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2076 do_streamcopy(ist, ost, pkt);
2082 static void print_sdp(OutputFile *output_files, int n)
2086 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
2090 for (i = 0; i < n; i++)
2091 avc[i] = output_files[i].ctx;
2093 av_sdp_create(avc, n, sdp, sizeof(sdp));
2094 printf("SDP:\n%s\n", sdp);
2099 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
2100 char *error, int error_len)
2102 InputStream *ist = &input_streams[ist_index];
2103 if (ist->decoding_needed) {
2104 AVCodec *codec = ist->dec;
2106 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2107 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2108 return AVERROR(EINVAL);
2110 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2111 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2112 ist->file_index, ist->st->index);
2113 return AVERROR(EINVAL);
2115 assert_codec_experimental(ist->st->codec, 0);
2116 assert_avoptions(ist->opts);
2119 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;
2120 ist->next_pts = AV_NOPTS_VALUE;
2126 static int transcode_init(OutputFile *output_files, int nb_output_files,
2127 InputFile *input_files, int nb_input_files)
2129 int ret = 0, i, j, k;
2130 AVFormatContext *oc;
2131 AVCodecContext *codec, *icodec;
2137 /* init framerate emulation */
2138 for (i = 0; i < nb_input_files; i++) {
2139 InputFile *ifile = &input_files[i];
2140 if (ifile->rate_emu)
2141 for (j = 0; j < ifile->nb_streams; j++)
2142 input_streams[j + ifile->ist_index].start = av_gettime();
2145 /* output stream init */
2146 for (i = 0; i < nb_output_files; i++) {
2147 oc = output_files[i].ctx;
2148 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2149 av_dump_format(oc, i, oc->filename, 1);
2150 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2151 return AVERROR(EINVAL);
2155 /* for each output stream, we compute the right encoding parameters */
2156 for (i = 0; i < nb_output_streams; i++) {
2157 ost = &output_streams[i];
2158 oc = output_files[ost->file_index].ctx;
2159 ist = &input_streams[ost->source_index];
2161 if (ost->attachment_filename)
2164 codec = ost->st->codec;
2165 icodec = ist->st->codec;
2167 ost->st->disposition = ist->st->disposition;
2168 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2169 codec->chroma_sample_location = icodec->chroma_sample_location;
2171 if (ost->stream_copy) {
2172 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2174 if (extra_size > INT_MAX) {
2175 return AVERROR(EINVAL);
2178 /* if stream_copy is selected, no need to decode or encode */
2179 codec->codec_id = icodec->codec_id;
2180 codec->codec_type = icodec->codec_type;
2182 if (!codec->codec_tag) {
2183 if (!oc->oformat->codec_tag ||
2184 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2185 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2186 codec->codec_tag = icodec->codec_tag;
2189 codec->bit_rate = icodec->bit_rate;
2190 codec->rc_max_rate = icodec->rc_max_rate;
2191 codec->rc_buffer_size = icodec->rc_buffer_size;
2192 codec->extradata = av_mallocz(extra_size);
2193 if (!codec->extradata) {
2194 return AVERROR(ENOMEM);
2196 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2197 codec->extradata_size= icodec->extradata_size;
2199 codec->time_base = ist->st->time_base;
2200 if(!strcmp(oc->oformat->name, "avi")) {
2201 if ( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
2202 && av_q2d(ist->st->time_base) < 1.0/500
2204 codec->time_base = icodec->time_base;
2205 codec->time_base.num *= icodec->ticks_per_frame;
2206 codec->time_base.den *= 2;
2208 } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
2209 && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
2210 && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
2212 if( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
2213 && av_q2d(ist->st->time_base) < 1.0/500
2215 codec->time_base = icodec->time_base;
2216 codec->time_base.num *= icodec->ticks_per_frame;
2219 av_reduce(&codec->time_base.num, &codec->time_base.den,
2220 codec->time_base.num, codec->time_base.den, INT_MAX);
2222 switch(codec->codec_type) {
2223 case AVMEDIA_TYPE_AUDIO:
2224 if(audio_volume != 256) {
2225 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2228 codec->channel_layout = icodec->channel_layout;
2229 codec->sample_rate = icodec->sample_rate;
2230 codec->channels = icodec->channels;
2231 codec->frame_size = icodec->frame_size;
2232 codec->audio_service_type = icodec->audio_service_type;
2233 codec->block_align = icodec->block_align;
2235 case AVMEDIA_TYPE_VIDEO:
2236 codec->pix_fmt = icodec->pix_fmt;
2237 codec->width = icodec->width;
2238 codec->height = icodec->height;
2239 codec->has_b_frames = icodec->has_b_frames;
2240 if (!codec->sample_aspect_ratio.num) {
2241 codec->sample_aspect_ratio =
2242 ost->st->sample_aspect_ratio =
2243 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2244 ist->st->codec->sample_aspect_ratio.num ?
2245 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2247 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
2249 case AVMEDIA_TYPE_SUBTITLE:
2250 codec->width = icodec->width;
2251 codec->height = icodec->height;
2253 case AVMEDIA_TYPE_DATA:
2254 case AVMEDIA_TYPE_ATTACHMENT:
2261 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2263 ist->decoding_needed = 1;
2264 ost->encoding_needed = 1;
2266 switch(codec->codec_type) {
2267 case AVMEDIA_TYPE_AUDIO:
2268 ost->fifo = av_fifo_alloc(1024);
2270 return AVERROR(ENOMEM);
2272 if (!codec->sample_rate)
2273 codec->sample_rate = icodec->sample_rate;
2274 choose_sample_rate(ost->st, ost->enc);
2275 codec->time_base = (AVRational){1, codec->sample_rate};
2277 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2278 codec->sample_fmt = icodec->sample_fmt;
2279 choose_sample_fmt(ost->st, ost->enc);
2281 if (ost->audio_channels_mapped) {
2282 /* the requested output channel is set to the number of
2283 * -map_channel only if no -ac are specified */
2284 if (!codec->channels) {
2285 codec->channels = ost->audio_channels_mapped;
2286 codec->channel_layout = av_get_default_channel_layout(codec->channels);
2287 if (!codec->channel_layout) {
2288 av_log(NULL, AV_LOG_FATAL, "Unable to find an appropriate channel layout for requested number of channel\n");
2292 /* fill unused channel mapping with -1 (which means a muted
2293 * channel in case the number of output channels is bigger
2294 * than the number of mapped channel) */
2295 for (j = ost->audio_channels_mapped; j < FF_ARRAY_ELEMS(ost->audio_channels_map); j++)
2296 ost->audio_channels_map[j] = -1;
2297 } else if (!codec->channels) {
2298 codec->channels = icodec->channels;
2299 codec->channel_layout = icodec->channel_layout;
2301 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2302 codec->channel_layout = 0;
2304 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2305 ost->audio_resample |= codec->sample_fmt != icodec->sample_fmt
2306 || codec->channel_layout != icodec->channel_layout;
2307 icodec->request_channels = codec->channels;
2308 ost->resample_sample_fmt = icodec->sample_fmt;
2309 ost->resample_sample_rate = icodec->sample_rate;
2310 ost->resample_channels = icodec->channels;
2312 case AVMEDIA_TYPE_VIDEO:
2313 if (codec->pix_fmt == PIX_FMT_NONE)
2314 codec->pix_fmt = icodec->pix_fmt;
2315 choose_pixel_fmt(ost->st, ost->enc);
2317 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2318 av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2322 if (!codec->width || !codec->height) {
2323 codec->width = icodec->width;
2324 codec->height = icodec->height;
2327 ost->video_resample = codec->width != icodec->width ||
2328 codec->height != icodec->height ||
2329 codec->pix_fmt != icodec->pix_fmt;
2330 if (ost->video_resample) {
2331 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2334 ost->resample_height = icodec->height;
2335 ost->resample_width = icodec->width;
2336 ost->resample_pix_fmt = icodec->pix_fmt;
2338 if (!ost->frame_rate.num)
2339 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2340 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2341 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2342 ost->frame_rate = ost->enc->supported_framerates[idx];
2344 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2345 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2346 && (video_sync_method==1 || (video_sync_method<0 && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
2347 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2348 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2350 for (j = 0; j < ost->forced_kf_count; j++)
2351 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
2356 if (configure_video_filters(ist, ost)) {
2357 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2362 case AVMEDIA_TYPE_SUBTITLE:
2369 if (codec->codec_id != CODEC_ID_H264 &&
2370 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2371 char logfilename[1024];
2374 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2375 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2377 if (codec->flags & CODEC_FLAG_PASS2) {
2379 size_t logbuffer_size;
2380 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2381 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2385 codec->stats_in = logbuffer;
2387 if (codec->flags & CODEC_FLAG_PASS1) {
2388 f = fopen(logfilename, "wb");
2390 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2391 logfilename, strerror(errno));
2398 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2399 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size (1664)*/
2400 int size = codec->width * codec->height;
2401 bit_buffer_size = FFMAX(bit_buffer_size, 7*size + 10000);
2406 bit_buffer = av_malloc(bit_buffer_size);
2408 av_log(NULL, AV_LOG_ERROR, "Cannot allocate %d bytes output buffer\n",
2410 return AVERROR(ENOMEM);
2413 /* open each encoder */
2414 for (i = 0; i < nb_output_streams; i++) {
2415 ost = &output_streams[i];
2416 if (ost->encoding_needed) {
2417 AVCodec *codec = ost->enc;
2418 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2420 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
2421 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2422 ret = AVERROR(EINVAL);
2425 if (dec->subtitle_header) {
2426 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2427 if (!ost->st->codec->subtitle_header) {
2428 ret = AVERROR(ENOMEM);
2431 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2432 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2434 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2435 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2436 ost->file_index, ost->index);
2437 ret = AVERROR(EINVAL);
2440 assert_codec_experimental(ost->st->codec, 1);
2441 assert_avoptions(ost->opts);
2442 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2443 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2444 " It takes bits/s as argument, not kbits/s\n");
2445 extra_size += ost->st->codec->extradata_size;
2447 if (ost->st->codec->me_threshold)
2448 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2452 /* init input streams */
2453 for (i = 0; i < nb_input_streams; i++)
2454 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2457 /* discard unused programs */
2458 for (i = 0; i < nb_input_files; i++) {
2459 InputFile *ifile = &input_files[i];
2460 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2461 AVProgram *p = ifile->ctx->programs[j];
2462 int discard = AVDISCARD_ALL;
2464 for (k = 0; k < p->nb_stream_indexes; k++)
2465 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2466 discard = AVDISCARD_DEFAULT;
2469 p->discard = discard;
2473 /* open files and write file headers */
2474 for (i = 0; i < nb_output_files; i++) {
2475 oc = output_files[i].ctx;
2476 oc->interrupt_callback = int_cb;
2477 if (avformat_write_header(oc, &output_files[i].opts) < 0) {
2478 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2479 ret = AVERROR(EINVAL);
2482 // assert_avoptions(output_files[i].opts);
2483 if (strcmp(oc->oformat->name, "rtp")) {
2489 /* dump the file output parameters - cannot be done before in case
2491 for (i = 0; i < nb_output_files; i++) {
2492 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2495 /* dump the stream mapping */
2496 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2497 for (i = 0; i < nb_output_streams; i++) {
2498 ost = &output_streams[i];
2500 if (ost->attachment_filename) {
2501 /* an attached file */
2502 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
2503 ost->attachment_filename, ost->file_index, ost->index);
2506 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
2507 input_streams[ost->source_index].file_index,
2508 input_streams[ost->source_index].st->index,
2511 if (ost->audio_channels_mapped) {
2512 av_log(NULL, AV_LOG_INFO, " [ch:");
2513 for (j = 0; j < ost->audio_channels_mapped; j++)
2514 if (ost->audio_channels_map[j] == -1)
2515 av_log(NULL, AV_LOG_INFO, " M");
2517 av_log(NULL, AV_LOG_INFO, " %d", ost->audio_channels_map[j]);
2518 av_log(NULL, AV_LOG_INFO, "]");
2520 if (ost->sync_ist != &input_streams[ost->source_index])
2521 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2522 ost->sync_ist->file_index,
2523 ost->sync_ist->st->index);
2524 if (ost->stream_copy)
2525 av_log(NULL, AV_LOG_INFO, " (copy)");
2527 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2528 input_streams[ost->source_index].dec->name : "?",
2529 ost->enc ? ost->enc->name : "?");
2530 av_log(NULL, AV_LOG_INFO, "\n");
2534 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2539 print_sdp(output_files, nb_output_files);
2546 * The following code is the main loop of the file converter
2548 static int transcode(OutputFile *output_files, int nb_output_files,
2549 InputFile *input_files, int nb_input_files)
2552 AVFormatContext *is, *os;
2556 int no_packet_count=0;
2557 int64_t timer_start;
2560 if (!(no_packet = av_mallocz(nb_input_files)))
2563 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2568 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
2571 timer_start = av_gettime();
2573 for(; received_sigterm == 0;) {
2574 int file_index, ist_index;
2578 int64_t cur_time= av_gettime();
2580 ipts_min= INT64_MAX;
2582 /* if 'q' pressed, exits */
2584 static int64_t last_time;
2585 if (received_nb_signals)
2587 /* read_key() returns 0 on EOF */
2588 if(cur_time - last_time >= 100000 && !run_as_daemon){
2590 last_time = cur_time;
2595 if (key == '+') av_log_set_level(av_log_get_level()+10);
2596 if (key == '-') av_log_set_level(av_log_get_level()-10);
2597 if (key == 's') qp_hist ^= 1;
2600 do_hex_dump = do_pkt_dump = 0;
2601 } else if(do_pkt_dump){
2605 av_log_set_level(AV_LOG_DEBUG);
2608 if (key == 'c' || key == 'C'){
2609 char buf[4096], target[64], command[256], arg[256] = {0};
2612 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2614 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
2619 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
2620 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
2621 target, time, command, arg);
2622 for (i = 0; i < nb_output_streams; i++) {
2623 ost = &output_streams[i];
2626 ret = avfilter_graph_send_command(ost->graph, target, command, arg, buf, sizeof(buf),
2627 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
2628 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
2630 ret = avfilter_graph_queue_command(ost->graph, target, command, arg, 0, time);
2635 av_log(NULL, AV_LOG_ERROR,
2636 "Parse error, at least 3 arguments were expected, "
2637 "only %d given in string '%s'\n", n, buf);
2641 if (key == 'd' || key == 'D'){
2644 debug = input_streams[0].st->codec->debug<<1;
2645 if(!debug) debug = 1;
2646 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2649 if(scanf("%d", &debug)!=1)
2650 fprintf(stderr,"error parsing debug value\n");
2651 for(i=0;i<nb_input_streams;i++) {
2652 input_streams[i].st->codec->debug = debug;
2654 for(i=0;i<nb_output_streams;i++) {
2655 ost = &output_streams[i];
2656 ost->st->codec->debug = debug;
2658 if(debug) av_log_set_level(AV_LOG_DEBUG);
2659 fprintf(stderr,"debug=%d\n", debug);
2662 fprintf(stderr, "key function\n"
2663 "? show this help\n"
2664 "+ increase verbosity\n"
2665 "- decrease verbosity\n"
2666 "c Send command to filtergraph\n"
2667 "D cycle through available debug modes\n"
2668 "h dump packets/hex press to cycle through the 3 states\n"
2670 "s Show QP histogram\n"
2675 /* select the stream that we must read now by looking at the
2676 smallest output pts */
2678 for (i = 0; i < nb_output_streams; i++) {
2682 ost = &output_streams[i];
2683 of = &output_files[ost->file_index];
2684 os = output_files[ost->file_index].ctx;
2685 ist = &input_streams[ost->source_index];
2686 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2687 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2689 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2691 if (!input_files[ist->file_index].eof_reached){
2692 if(ipts < ipts_min) {
2694 if(input_sync ) file_index = ist->file_index;
2696 if(opts < opts_min) {
2698 if(!input_sync) file_index = ist->file_index;
2701 if (ost->frame_number >= ost->max_frames) {
2703 for (j = 0; j < of->ctx->nb_streams; j++)
2704 output_streams[of->ost_index + j].is_past_recording_time = 1;
2708 /* if none, if is finished */
2709 if (file_index < 0) {
2710 if(no_packet_count){
2712 memset(no_packet, 0, nb_input_files);
2719 /* read a frame from it and output it in the fifo */
2720 is = input_files[file_index].ctx;
2721 ret= av_read_frame(is, &pkt);
2722 if(ret == AVERROR(EAGAIN)){
2723 no_packet[file_index]=1;
2728 input_files[file_index].eof_reached = 1;
2736 memset(no_packet, 0, nb_input_files);
2739 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2740 is->streams[pkt.stream_index]);
2742 /* the following test is needed in case new streams appear
2743 dynamically in stream : we ignore them */
2744 if (pkt.stream_index >= input_files[file_index].nb_streams)
2745 goto discard_packet;
2746 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2747 ist = &input_streams[ist_index];
2749 goto discard_packet;
2751 if (pkt.dts != AV_NOPTS_VALUE)
2752 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2753 if (pkt.pts != AV_NOPTS_VALUE)
2754 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2756 if(pkt.pts != AV_NOPTS_VALUE)
2757 pkt.pts *= ist->ts_scale;
2758 if(pkt.dts != AV_NOPTS_VALUE)
2759 pkt.dts *= ist->ts_scale;
2761 // 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);
2762 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2763 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2764 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2765 int64_t delta= pkt_dts - ist->next_pts;
2766 if((delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
2767 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
2768 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
2769 pkt_dts+1<ist->pts)&& !copy_ts){
2770 input_files[ist->file_index].ts_offset -= delta;
2771 av_log(NULL, AV_LOG_DEBUG, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2772 delta, input_files[ist->file_index].ts_offset);
2773 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2774 if(pkt.pts != AV_NOPTS_VALUE)
2775 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2779 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2780 if (output_packet(ist, output_streams, nb_output_streams, &pkt) < 0) {
2782 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
2783 ist->file_index, ist->st->index);
2786 av_free_packet(&pkt);
2791 av_free_packet(&pkt);
2793 /* dump report by using the output first video and audio streams */
2794 print_report(output_files, output_streams, nb_output_streams, 0, timer_start, cur_time);
2797 /* at the end of stream, we must flush the decoder buffers */
2798 for (i = 0; i < nb_input_streams; i++) {
2799 ist = &input_streams[i];
2800 if (ist->decoding_needed) {
2801 output_packet(ist, output_streams, nb_output_streams, NULL);
2804 flush_encoders(output_streams, nb_output_streams);
2808 /* write the trailer if needed and close file */
2809 for(i=0;i<nb_output_files;i++) {
2810 os = output_files[i].ctx;
2811 av_write_trailer(os);
2814 /* dump report by using the first video and audio streams */
2815 print_report(output_files, output_streams, nb_output_streams, 1, timer_start, av_gettime());
2817 /* close each encoder */
2818 for (i = 0; i < nb_output_streams; i++) {
2819 ost = &output_streams[i];
2820 if (ost->encoding_needed) {
2821 av_freep(&ost->st->codec->stats_in);
2822 avcodec_close(ost->st->codec);
2825 avfilter_graph_free(&ost->graph);
2829 /* close each decoder */
2830 for (i = 0; i < nb_input_streams; i++) {
2831 ist = &input_streams[i];
2832 if (ist->decoding_needed) {
2833 avcodec_close(ist->st->codec);
2841 av_freep(&bit_buffer);
2842 av_freep(&no_packet);
2844 if (output_streams) {
2845 for (i = 0; i < nb_output_streams; i++) {
2846 ost = &output_streams[i];
2848 if (ost->stream_copy)
2849 av_freep(&ost->st->codec->extradata);
2851 fclose(ost->logfile);
2852 ost->logfile = NULL;
2854 av_fifo_free(ost->fifo); /* works even if fifo is not
2855 initialized but set to zero */
2856 av_freep(&ost->st->codec->subtitle_header);
2857 av_free(ost->resample_frame.data[0]);
2858 av_free(ost->forced_kf_pts);
2859 if (ost->video_resample)
2860 sws_freeContext(ost->img_resample_ctx);
2861 swr_free(&ost->swr);
2862 av_dict_free(&ost->opts);
2869 static int opt_frame_crop(const char *opt, const char *arg)
2871 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
2872 return AVERROR(EINVAL);
2875 static int opt_pad(const char *opt, const char *arg)
2877 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
2881 static double parse_frame_aspect_ratio(const char *arg)
2888 p = strchr(arg, ':');
2890 x = strtol(arg, &end, 10);
2892 y = strtol(end+1, &end, 10);
2894 ar = (double)x / (double)y;
2896 ar = strtod(arg, NULL);
2899 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
2905 static int opt_video_channel(const char *opt, const char *arg)
2907 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
2908 return opt_default("channel", arg);
2911 static int opt_video_standard(const char *opt, const char *arg)
2913 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
2914 return opt_default("standard", arg);
2917 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2919 audio_codec_name = arg;
2920 return parse_option(o, "codec:a", arg, options);
2923 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2925 video_codec_name = arg;
2926 return parse_option(o, "codec:v", arg, options);
2929 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2931 subtitle_codec_name = arg;
2932 return parse_option(o, "codec:s", arg, options);
2935 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2937 return parse_option(o, "codec:d", arg, options);
2940 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2942 StreamMap *m = NULL;
2943 int i, negative = 0, file_idx;
2944 int sync_file_idx = -1, sync_stream_idx;
2952 map = av_strdup(arg);
2954 /* parse sync stream first, just pick first matching stream */
2955 if (sync = strchr(map, ',')) {
2957 sync_file_idx = strtol(sync + 1, &sync, 0);
2958 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2959 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
2964 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2965 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2966 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2967 sync_stream_idx = i;
2970 if (i == input_files[sync_file_idx].nb_streams) {
2971 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
2972 "match any streams.\n", arg);
2978 file_idx = strtol(map, &p, 0);
2979 if (file_idx >= nb_input_files || file_idx < 0) {
2980 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
2984 /* disable some already defined maps */
2985 for (i = 0; i < o->nb_stream_maps; i++) {
2986 m = &o->stream_maps[i];
2987 if (file_idx == m->file_index &&
2988 check_stream_specifier(input_files[m->file_index].ctx,
2989 input_files[m->file_index].ctx->streams[m->stream_index],
2990 *p == ':' ? p + 1 : p) > 0)
2994 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2995 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2996 *p == ':' ? p + 1 : p) <= 0)
2998 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2999 &o->nb_stream_maps, o->nb_stream_maps + 1);
3000 m = &o->stream_maps[o->nb_stream_maps - 1];
3002 m->file_index = file_idx;
3003 m->stream_index = i;
3005 if (sync_file_idx >= 0) {
3006 m->sync_file_index = sync_file_idx;
3007 m->sync_stream_index = sync_stream_idx;
3009 m->sync_file_index = file_idx;
3010 m->sync_stream_index = i;
3015 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3023 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3025 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3026 &o->nb_attachments, o->nb_attachments + 1);
3027 o->attachments[o->nb_attachments - 1] = arg;
3031 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
3037 o->audio_channel_maps =
3038 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
3039 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
3040 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
3042 /* muted channel syntax */
3043 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
3044 if ((n == 1 || n == 3) && m->channel_idx == -1) {
3045 m->file_idx = m->stream_idx = -1;
3047 m->ofile_idx = m->ostream_idx = -1;
3052 n = sscanf(arg, "%d.%d.%d:%d.%d",
3053 &m->file_idx, &m->stream_idx, &m->channel_idx,
3054 &m->ofile_idx, &m->ostream_idx);
3056 if (n != 3 && n != 5) {
3057 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
3058 "[file.stream.channel|-1][:syncfile:syncstream]\n");
3062 if (n != 5) // only file.stream.channel specified
3063 m->ofile_idx = m->ostream_idx = -1;
3066 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
3067 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
3071 if (m->stream_idx < 0 ||
3072 m->stream_idx >= input_files[m->file_idx].nb_streams) {
3073 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
3074 m->file_idx, m->stream_idx);
3077 st = input_files[m->file_idx].ctx->streams[m->stream_idx];
3078 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
3079 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
3080 m->file_idx, m->stream_idx);
3083 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
3084 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
3085 m->file_idx, m->stream_idx, m->channel_idx);
3091 static void parse_meta_type(char *arg, char *type, int *index)
3101 if (*(++arg) == ':')
3102 *index = strtol(++arg, NULL, 0);
3105 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
3112 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
3114 MetadataMap *m, *m1;
3117 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
3118 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
3120 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
3121 m->file = strtol(arg, &p, 0);
3122 parse_meta_type(*p ? p + 1 : p, &m->type, &m->index);
3124 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
3125 if (p = strchr(opt, ':'))
3126 parse_meta_type(p + 1, &m1->type, &m1->index);
3130 if (m->type == 'g' || m1->type == 'g')
3131 o->metadata_global_manual = 1;
3132 if (m->type == 's' || m1->type == 's')
3133 o->metadata_streams_manual = 1;
3134 if (m->type == 'c' || m1->type == 'c')
3135 o->metadata_chapters_manual = 1;
3140 static int opt_map_meta_data(OptionsContext *o, const char *opt, const char *arg)
3142 av_log(NULL, AV_LOG_WARNING, "-map_meta_data is deprecated and will be removed soon. "
3143 "Use -map_metadata instead.\n");
3144 return opt_map_metadata(o, opt, arg);
3147 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
3150 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
3151 struct tm time = *gmtime((time_t*)&recording_timestamp);
3152 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
3153 parse_option(o, "metadata", buf, options);
3155 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
3156 "tag instead.\n", opt);
3160 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
3162 const char *codec_string = encoder ? "encoder" : "decoder";
3166 avcodec_find_encoder_by_name(name) :
3167 avcodec_find_decoder_by_name(name);
3169 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
3172 if(codec->type != type) {
3173 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
3179 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
3181 char *codec_name = NULL;
3183 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
3185 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
3186 st->codec->codec_id = codec->id;
3189 return avcodec_find_decoder(st->codec->codec_id);
3193 * Add all the streams from the given input file to the global
3194 * list of input streams.
3196 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
3198 int i, rfps, rfps_base;
3199 char *next, *codec_tag = NULL;
3201 for (i = 0; i < ic->nb_streams; i++) {
3202 AVStream *st = ic->streams[i];
3203 AVCodecContext *dec = st->codec;
3206 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3207 ist = &input_streams[nb_input_streams - 1];
3209 ist->file_index = nb_input_files;
3211 ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), ic, st);
3213 ist->ts_scale = 1.0;
3214 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
3216 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
3218 uint32_t tag = strtol(codec_tag, &next, 0);
3220 tag = AV_RL32(codec_tag);
3221 st->codec->codec_tag = tag;
3224 ist->dec = choose_decoder(o, ic, st);
3226 switch (dec->codec_type) {
3227 case AVMEDIA_TYPE_AUDIO:
3229 ist->dec = avcodec_find_decoder(dec->codec_id);
3230 if(o->audio_disable)
3231 st->discard= AVDISCARD_ALL;
3233 case AVMEDIA_TYPE_VIDEO:
3235 ist->dec = avcodec_find_decoder(dec->codec_id);
3236 rfps = ic->streams[i]->r_frame_rate.num;
3237 rfps_base = ic->streams[i]->r_frame_rate.den;
3239 dec->flags |= CODEC_FLAG_EMU_EDGE;
3242 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3244 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",
3245 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3246 (float)rfps / rfps_base, rfps, rfps_base);
3249 if (o->video_disable)
3250 st->discard= AVDISCARD_ALL;
3251 else if(video_discard)
3252 st->discard= video_discard;
3254 case AVMEDIA_TYPE_DATA:
3255 if (o->data_disable)
3256 st->discard= AVDISCARD_ALL;
3258 case AVMEDIA_TYPE_SUBTITLE:
3260 ist->dec = avcodec_find_decoder(dec->codec_id);
3261 if(o->subtitle_disable)
3262 st->discard = AVDISCARD_ALL;
3264 case AVMEDIA_TYPE_ATTACHMENT:
3265 case AVMEDIA_TYPE_UNKNOWN:
3273 static void assert_file_overwrite(const char *filename)
3275 if ((!file_overwrite || no_file_overwrite) &&
3276 (strchr(filename, ':') == NULL || filename[1] == ':' ||
3277 av_strstart(filename, "file:", NULL))) {
3278 if (avio_check(filename, 0) == 0) {
3279 if (!using_stdin && (!no_file_overwrite || file_overwrite)) {
3280 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3283 if (!read_yesno()) {
3284 av_log(0, AV_LOG_FATAL, "Not overwriting - exiting\n");
3290 av_log(0, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
3297 static void dump_attachment(AVStream *st, const char *filename)
3300 AVIOContext *out = NULL;
3301 AVDictionaryEntry *e;
3303 if (!st->codec->extradata_size) {
3304 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
3305 nb_input_files - 1, st->index);
3308 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
3309 filename = e->value;
3311 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
3312 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
3316 assert_file_overwrite(filename);
3318 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
3319 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
3324 avio_write(out, st->codec->extradata, st->codec->extradata_size);
3329 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
3331 AVFormatContext *ic;
3332 AVInputFormat *file_iformat = NULL;
3336 AVDictionary **opts;
3337 int orig_nb_streams; // number of streams before avformat_find_stream_info
3340 if (!(file_iformat = av_find_input_format(o->format))) {
3341 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
3346 if (!strcmp(filename, "-"))
3349 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3350 !strcmp(filename, "/dev/stdin");
3352 /* get default parameters from command line */
3353 ic = avformat_alloc_context();
3355 print_error(filename, AVERROR(ENOMEM));
3358 if (o->nb_audio_sample_rate) {
3359 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
3360 av_dict_set(&format_opts, "sample_rate", buf, 0);
3362 if (o->nb_audio_channels) {
3363 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
3364 av_dict_set(&format_opts, "channels", buf, 0);
3366 if (o->nb_frame_rates) {
3367 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
3369 if (o->nb_frame_sizes) {
3370 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
3372 if (o->nb_frame_pix_fmts)
3373 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
3375 ic->video_codec_id = video_codec_name ?
3376 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
3377 ic->audio_codec_id = audio_codec_name ?
3378 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
3379 ic->subtitle_codec_id= subtitle_codec_name ?
3380 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
3381 ic->flags |= AVFMT_FLAG_NONBLOCK;
3382 ic->interrupt_callback = int_cb;
3385 av_log(NULL, AV_LOG_WARNING, "-loop_input is deprecated, use -loop 1\n");
3386 ic->loop_input = loop_input;
3389 /* open the input file with generic libav function */
3390 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3392 print_error(filename, err);
3395 assert_avoptions(format_opts);
3397 /* apply forced codec ids */
3398 for (i = 0; i < ic->nb_streams; i++)
3399 choose_decoder(o, ic, ic->streams[i]);
3401 /* Set AVCodecContext options for avformat_find_stream_info */
3402 opts = setup_find_stream_info_opts(ic, codec_opts);
3403 orig_nb_streams = ic->nb_streams;
3405 /* If not enough info to get the stream parameters, we decode the
3406 first frames to get it. (used in mpeg case for example) */
3407 ret = avformat_find_stream_info(ic, opts);
3409 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
3410 av_close_input_file(ic);
3414 timestamp = o->start_time;
3415 /* add the stream start time */
3416 if (ic->start_time != AV_NOPTS_VALUE)
3417 timestamp += ic->start_time;
3419 /* if seeking requested, we execute it */
3420 if (o->start_time != 0) {
3421 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3423 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
3424 filename, (double)timestamp / AV_TIME_BASE);
3428 /* update the current parameters so that they match the one of the input stream */
3429 add_input_streams(o, ic);
3431 /* dump the file content */
3432 av_dump_format(ic, nb_input_files, filename, 0);
3434 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3435 input_files[nb_input_files - 1].ctx = ic;
3436 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3437 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3438 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3439 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
3441 for (i = 0; i < o->nb_dump_attachment; i++) {
3444 for (j = 0; j < ic->nb_streams; j++) {
3445 AVStream *st = ic->streams[j];
3447 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
3448 dump_attachment(st, o->dump_attachment[i].u.str);
3452 for (i = 0; i < orig_nb_streams; i++)
3453 av_dict_free(&opts[i]);
3456 reset_options(o, 1);
3460 static void parse_forced_key_frames(char *kf, OutputStream *ost)
3465 for (p = kf; *p; p++)
3468 ost->forced_kf_count = n;
3469 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3470 if (!ost->forced_kf_pts) {
3471 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3474 for (i = 0; i < n; i++) {
3475 p = i ? strchr(p, ',') + 1 : kf;
3476 ost->forced_kf_pts[i] = parse_time_or_die("force_key_frames", p, 1);
3480 static uint8_t *get_line(AVIOContext *s)
3486 if (avio_open_dyn_buf(&line) < 0) {
3487 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
3491 while ((c = avio_r8(s)) && c != '\n')
3494 avio_close_dyn_buf(line, &buf);
3499 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
3502 char filename[1000];
3503 const char *base[3] = { getenv("AVCONV_DATADIR"),
3508 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
3512 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
3513 i != 1 ? "" : "/.avconv", codec_name, preset_name);
3514 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3517 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
3518 i != 1 ? "" : "/.avconv", preset_name);
3519 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3525 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
3527 char *codec_name = NULL;
3529 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
3531 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
3532 NULL, ost->st->codec->codec_type);
3533 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
3534 } else if (!strcmp(codec_name, "copy"))
3535 ost->stream_copy = 1;
3537 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
3538 ost->st->codec->codec_id = ost->enc->id;
3542 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3545 AVStream *st = avformat_new_stream(oc, NULL);
3546 int idx = oc->nb_streams - 1, ret = 0;
3547 char *bsf = NULL, *next, *codec_tag = NULL;
3548 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3550 char *buf = NULL, *arg = NULL, *preset = NULL;
3551 AVIOContext *s = NULL;
3554 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3558 if (oc->nb_streams - 1 < o->nb_streamid_map)
3559 st->id = o->streamid_map[oc->nb_streams - 1];
3561 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3562 nb_output_streams + 1);
3563 ost = &output_streams[nb_output_streams - 1];
3564 ost->file_index = nb_output_files;
3567 st->codec->codec_type = type;
3568 choose_encoder(o, oc, ost);
3570 ost->opts = filter_codec_opts(codec_opts, ost->enc, oc, st);
3573 avcodec_get_context_defaults3(st->codec, ost->enc);
3574 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3576 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
3577 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
3580 if (!buf[0] || buf[0] == '#') {
3584 if (!(arg = strchr(buf, '='))) {
3585 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
3589 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
3591 } while (!s->eof_reached);
3595 av_log(NULL, AV_LOG_FATAL,
3596 "Preset %s specified for stream %d:%d, but could not be opened.\n",
3597 preset, ost->file_index, ost->index);
3601 ost->max_frames = INT64_MAX;
3602 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
3604 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3606 if (next = strchr(bsf, ','))
3608 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3609 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3613 bsfc_prev->next = bsfc;
3615 ost->bitstream_filters = bsfc;
3621 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3623 uint32_t tag = strtol(codec_tag, &next, 0);
3625 tag = AV_RL32(codec_tag);
3626 st->codec->codec_tag = tag;
3629 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3630 if (qscale >= 0 || same_quant) {
3631 st->codec->flags |= CODEC_FLAG_QSCALE;
3632 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3635 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
3636 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3638 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3642 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3645 const char *p = str;
3652 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3659 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3663 AVCodecContext *video_enc;
3665 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3667 video_enc = st->codec;
3669 if (!ost->stream_copy) {
3670 const char *p = NULL;
3671 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3672 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3673 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3676 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3677 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3678 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3682 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3683 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3684 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3688 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3689 if (frame_aspect_ratio)
3690 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3692 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3693 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3694 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3695 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3698 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3701 video_enc->gop_size = 0;
3702 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3704 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3705 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
3708 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3710 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3712 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3713 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
3716 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
3719 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
3722 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3724 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
3727 /* FIXME realloc failure */
3728 video_enc->rc_override=
3729 av_realloc(video_enc->rc_override,
3730 sizeof(RcOverride)*(i+1));
3731 video_enc->rc_override[i].start_frame= start;
3732 video_enc->rc_override[i].end_frame = end;
3734 video_enc->rc_override[i].qscale= q;
3735 video_enc->rc_override[i].quality_factor= 1.0;
3738 video_enc->rc_override[i].qscale= 0;
3739 video_enc->rc_override[i].quality_factor= -q/100.0;
3744 video_enc->rc_override_count=i;
3745 if (!video_enc->rc_initial_buffer_occupancy)
3746 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3747 video_enc->intra_dc_precision= intra_dc_precision - 8;
3750 video_enc->flags|= CODEC_FLAG_PSNR;
3755 video_enc->flags |= CODEC_FLAG_PASS1;
3758 video_enc->flags |= CODEC_FLAG_PASS2;
3762 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
3763 if (forced_key_frames)
3764 parse_forced_key_frames(forced_key_frames, ost);
3766 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
3768 ost->top_field_first = -1;
3769 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
3771 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
3774 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
3776 ost->avfilter = av_strdup(filters);
3783 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3788 AVCodecContext *audio_enc;
3790 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3793 audio_enc = st->codec;
3794 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3796 if (!ost->stream_copy) {
3797 char *sample_fmt = NULL;
3799 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3801 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
3803 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
3804 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
3808 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
3810 ost->rematrix_volume=1.0;
3811 MATCH_PER_STREAM_OPT(rematrix_volume, f, ost->rematrix_volume, oc, st);
3814 /* check for channel mapping for this audio stream */
3815 for (n = 0; n < o->nb_audio_channel_maps; n++) {
3816 AudioChannelMap *map = &o->audio_channel_maps[n];
3817 InputStream *ist = &input_streams[ost->source_index];
3818 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
3819 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
3820 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
3821 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
3822 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
3824 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
3825 ost->file_index, ost->st->index);
3832 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3836 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3837 if (!ost->stream_copy) {
3838 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
3845 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
3847 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
3848 ost->stream_copy = 1;
3852 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3856 AVCodecContext *subtitle_enc;
3858 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3860 subtitle_enc = st->codec;
3862 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3867 /* arg format is "output-stream-index:streamid-value". */
3868 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
3874 av_strlcpy(idx_str, arg, sizeof(idx_str));
3875 p = strchr(idx_str, ':');
3877 av_log(NULL, AV_LOG_FATAL,
3878 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3883 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3884 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
3885 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3889 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3891 AVFormatContext *is = ifile->ctx;
3892 AVFormatContext *os = ofile->ctx;
3895 for (i = 0; i < is->nb_chapters; i++) {
3896 AVChapter *in_ch = is->chapters[i], *out_ch;
3897 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3898 AV_TIME_BASE_Q, in_ch->time_base);
3899 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3900 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3903 if (in_ch->end < ts_off)
3905 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3908 out_ch = av_mallocz(sizeof(AVChapter));
3910 return AVERROR(ENOMEM);
3912 out_ch->id = in_ch->id;
3913 out_ch->time_base = in_ch->time_base;
3914 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3915 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3918 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3921 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
3923 return AVERROR(ENOMEM);
3924 os->chapters[os->nb_chapters - 1] = out_ch;
3929 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3932 AVFormatContext *ic = avformat_alloc_context();
3934 ic->interrupt_callback = int_cb;
3935 err = avformat_open_input(&ic, filename, NULL, NULL);
3938 /* copy stream format */
3939 for(i=0;i<ic->nb_streams;i++) {
3943 AVCodecContext *avctx;
3945 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3946 ost = new_output_stream(o, s, codec->type);
3950 // FIXME: a more elegant solution is needed
3951 memcpy(st, ic->streams[i], sizeof(AVStream));
3952 st->info = av_malloc(sizeof(*st->info));
3953 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
3955 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3957 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
3958 choose_sample_fmt(st, codec);
3959 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
3960 choose_pixel_fmt(st, codec);
3963 av_close_input_file(ic);
3967 static void opt_output_file(void *optctx, const char *filename)
3969 OptionsContext *o = optctx;
3970 AVFormatContext *oc;
3972 AVOutputFormat *file_oformat;
3976 if (!strcmp(filename, "-"))
3979 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
3981 print_error(filename, err);
3984 file_oformat= oc->oformat;
3985 oc->interrupt_callback = int_cb;
3987 if (!strcmp(file_oformat->name, "ffm") &&
3988 av_strstart(filename, "http:", NULL)) {
3990 /* special case for files sent to ffserver: we get the stream
3991 parameters from ffserver */
3992 int err = read_ffserver_streams(o, oc, filename);
3994 print_error(filename, err);
3997 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
3998 ost = &output_streams[j];
3999 for (i = 0; i < nb_input_streams; i++) {
4000 ist = &input_streams[i];
4001 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
4003 ost->source_index= i;
4009 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));
4013 } else if (!o->nb_stream_maps) {
4014 /* pick the "best" stream of each type */
4015 #define NEW_STREAM(type, index)\
4017 ost = new_ ## type ## _stream(o, oc);\
4018 ost->source_index = index;\
4019 ost->sync_ist = &input_streams[index];\
4020 input_streams[index].discard = 0;\
4023 /* video: highest resolution */
4024 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
4025 int area = 0, idx = -1;
4026 for (i = 0; i < nb_input_streams; i++) {
4027 ist = &input_streams[i];
4028 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
4029 ist->st->codec->width * ist->st->codec->height > area) {
4030 area = ist->st->codec->width * ist->st->codec->height;
4034 NEW_STREAM(video, idx);
4037 /* audio: most channels */
4038 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
4039 int channels = 0, idx = -1;
4040 for (i = 0; i < nb_input_streams; i++) {
4041 ist = &input_streams[i];
4042 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
4043 ist->st->codec->channels > channels) {
4044 channels = ist->st->codec->channels;
4048 NEW_STREAM(audio, idx);
4051 /* subtitles: pick first */
4052 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
4053 for (i = 0; i < nb_input_streams; i++)
4054 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
4055 NEW_STREAM(subtitle, i);
4059 /* do something with data? */
4061 for (i = 0; i < o->nb_stream_maps; i++) {
4062 StreamMap *map = &o->stream_maps[i];
4067 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
4068 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
4070 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
4072 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
4074 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
4077 switch (ist->st->codec->codec_type) {
4078 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
4079 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
4080 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
4081 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
4082 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
4084 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
4085 map->file_index, map->stream_index);
4089 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
4090 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
4091 map->sync_stream_index];
4096 /* handle attached files */
4097 for (i = 0; i < o->nb_attachments; i++) {
4099 uint8_t *attachment;
4103 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
4104 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
4108 if ((len = avio_size(pb)) <= 0) {
4109 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
4113 if (!(attachment = av_malloc(len))) {
4114 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
4118 avio_read(pb, attachment, len);
4120 ost = new_attachment_stream(o, oc);
4121 ost->stream_copy = 0;
4122 ost->source_index = -1;
4123 ost->attachment_filename = o->attachments[i];
4124 ost->st->codec->extradata = attachment;
4125 ost->st->codec->extradata_size = len;
4127 p = strrchr(o->attachments[i], '/');
4128 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
4132 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
4133 output_files[nb_output_files - 1].ctx = oc;
4134 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
4135 output_files[nb_output_files - 1].recording_time = o->recording_time;
4136 output_files[nb_output_files - 1].start_time = o->start_time;
4137 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
4138 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
4140 /* check filename in case of an image number is expected */
4141 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
4142 if (!av_filename_number_test(oc->filename)) {
4143 print_error(oc->filename, AVERROR(EINVAL));
4148 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
4149 /* test if it already exists to avoid loosing precious files */
4150 assert_file_overwrite(filename);
4153 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
4154 &oc->interrupt_callback,
4155 &output_files[nb_output_files - 1].opts)) < 0) {
4156 print_error(filename, err);
4161 if (o->mux_preload) {
4163 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
4164 av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
4166 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
4168 if (loop_output >= 0) {
4169 av_log(NULL, AV_LOG_WARNING, "-loop_output is deprecated, use -loop\n");
4170 oc->loop_output = loop_output;
4174 if (o->chapters_input_file >= nb_input_files) {
4175 if (o->chapters_input_file == INT_MAX) {
4176 /* copy chapters from the first input file that has them*/
4177 o->chapters_input_file = -1;
4178 for (i = 0; i < nb_input_files; i++)
4179 if (input_files[i].ctx->nb_chapters) {
4180 o->chapters_input_file = i;
4184 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
4185 o->chapters_input_file);
4189 if (o->chapters_input_file >= 0)
4190 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
4191 !o->metadata_chapters_manual);
4194 for (i = 0; i < o->nb_meta_data_maps; i++) {
4195 AVFormatContext *files[2];
4196 AVDictionary **meta[2];
4199 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
4200 if ((index) < 0 || (index) >= (nb_elems)) {\
4201 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps\n",\
4206 int in_file_index = o->meta_data_maps[i][1].file;
4207 if (in_file_index < 0)
4209 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
4212 files[1] = input_files[in_file_index].ctx;
4214 for (j = 0; j < 2; j++) {
4215 MetadataMap *map = &o->meta_data_maps[i][j];
4217 switch (map->type) {
4219 meta[j] = &files[j]->metadata;
4222 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
4223 meta[j] = &files[j]->streams[map->index]->metadata;
4226 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
4227 meta[j] = &files[j]->chapters[map->index]->metadata;
4230 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
4231 meta[j] = &files[j]->programs[map->index]->metadata;
4238 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
4241 /* copy global metadata by default */
4242 if (!o->metadata_global_manual && nb_input_files){
4243 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
4244 AV_DICT_DONT_OVERWRITE);
4245 if(o->recording_time != INT64_MAX)
4246 av_dict_set(&oc->metadata, "duration", NULL, 0);
4248 if (!o->metadata_streams_manual)
4249 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
4251 if (output_streams[i].source_index < 0) /* this is true e.g. for attached files */
4253 ist = &input_streams[output_streams[i].source_index];
4254 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
4257 /* process manually set metadata */
4258 for (i = 0; i < o->nb_metadata; i++) {
4263 val = strchr(o->metadata[i].u.str, '=');
4265 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
4266 o->metadata[i].u.str);
4271 parse_meta_type(o->metadata[i].specifier, &type, &index);
4277 if (index < 0 || index >= oc->nb_streams) {
4278 av_log(NULL, AV_LOG_FATAL, "Invalid stream index %d in metadata specifier.\n", index);
4281 m = &oc->streams[index]->metadata;
4284 if (index < 0 || index >= oc->nb_chapters) {
4285 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
4288 m = &oc->chapters[index]->metadata;
4291 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
4295 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
4298 reset_options(o, 0);
4301 /* same option as mencoder */
4302 static int opt_pass(const char *opt, const char *arg)
4304 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
4308 static int64_t getutime(void)
4311 struct rusage rusage;
4313 getrusage(RUSAGE_SELF, &rusage);
4314 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4315 #elif HAVE_GETPROCESSTIMES
4317 FILETIME c, e, k, u;
4318 proc = GetCurrentProcess();
4319 GetProcessTimes(proc, &c, &e, &k, &u);
4320 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4322 return av_gettime();
4326 static int64_t getmaxrss(void)
4328 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4329 struct rusage rusage;
4330 getrusage(RUSAGE_SELF, &rusage);
4331 return (int64_t)rusage.ru_maxrss * 1024;
4332 #elif HAVE_GETPROCESSMEMORYINFO
4334 PROCESS_MEMORY_COUNTERS memcounters;
4335 proc = GetCurrentProcess();
4336 memcounters.cb = sizeof(memcounters);
4337 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4338 return memcounters.PeakPagefileUsage;
4344 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
4346 return parse_option(o, "q:a", arg, options);
4349 static void show_usage(void)
4351 printf("Hyper fast Audio and Video encoder\n");
4352 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
4356 static int opt_help(const char *opt, const char *arg)
4358 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
4359 av_log_set_callback(log_callback_help);
4361 show_help_options(options, "Main options:\n",
4362 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4363 show_help_options(options, "\nAdvanced options:\n",
4364 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4366 show_help_options(options, "\nVideo options:\n",
4367 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4369 show_help_options(options, "\nAdvanced Video options:\n",
4370 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4371 OPT_VIDEO | OPT_EXPERT);
4372 show_help_options(options, "\nAudio options:\n",
4373 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4375 show_help_options(options, "\nAdvanced Audio options:\n",
4376 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4377 OPT_AUDIO | OPT_EXPERT);
4378 show_help_options(options, "\nSubtitle options:\n",
4379 OPT_SUBTITLE | OPT_GRAB,
4381 show_help_options(options, "\nAudio/Video grab options:\n",
4385 show_help_children(avcodec_get_class(), flags);
4386 show_help_children(avformat_get_class(), flags);
4387 show_help_children(sws_get_class(), flags);
4392 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
4394 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4395 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4397 if(!strncmp(arg, "pal-", 4)) {
4400 } else if(!strncmp(arg, "ntsc-", 5)) {
4403 } else if(!strncmp(arg, "film-", 5)) {
4407 /* Try to determine PAL/NTSC by peeking in the input files */
4408 if(nb_input_files) {
4410 for (j = 0; j < nb_input_files; j++) {
4411 for (i = 0; i < input_files[j].nb_streams; i++) {
4412 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4413 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4415 fr = c->time_base.den * 1000 / c->time_base.num;
4419 } else if((fr == 29970) || (fr == 23976)) {
4428 if (norm != UNKNOWN)
4429 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4432 if(norm == UNKNOWN) {
4433 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4434 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4435 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
4439 if(!strcmp(arg, "vcd")) {
4440 opt_video_codec(o, "c:v", "mpeg1video");
4441 opt_audio_codec(o, "c:a", "mp2");
4442 parse_option(o, "f", "vcd", options);
4444 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
4445 parse_option(o, "r", frame_rates[norm], options);
4446 opt_default("g", norm == PAL ? "15" : "18");
4448 opt_default("b:v", "1150000");
4449 opt_default("maxrate", "1150000");
4450 opt_default("minrate", "1150000");
4451 opt_default("bufsize", "327680"); // 40*1024*8;
4453 opt_default("b:a", "224000");
4454 parse_option(o, "ar", "44100", options);
4455 parse_option(o, "ac", "2", options);
4457 opt_default("packetsize", "2324");
4458 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4460 /* We have to offset the PTS, so that it is consistent with the SCR.
4461 SCR starts at 36000, but the first two packs contain only padding
4462 and the first pack from the other stream, respectively, may also have
4463 been written before.
4464 So the real data starts at SCR 36000+3*1200. */
4465 o->mux_preload = (36000+3*1200) / 90000.0; //0.44
4466 } else if(!strcmp(arg, "svcd")) {
4468 opt_video_codec(o, "c:v", "mpeg2video");
4469 opt_audio_codec(o, "c:a", "mp2");
4470 parse_option(o, "f", "svcd", options);
4472 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
4473 parse_option(o, "r", frame_rates[norm], options);
4474 parse_option(o, "pix_fmt", "yuv420p", options);
4475 opt_default("g", norm == PAL ? "15" : "18");
4477 opt_default("b:v", "2040000");
4478 opt_default("maxrate", "2516000");
4479 opt_default("minrate", "0"); //1145000;
4480 opt_default("bufsize", "1835008"); //224*1024*8;
4481 opt_default("flags", "+scan_offset");
4484 opt_default("b:a", "224000");
4485 parse_option(o, "ar", "44100", options);
4487 opt_default("packetsize", "2324");
4489 } else if(!strcmp(arg, "dvd")) {
4491 opt_video_codec(o, "c:v", "mpeg2video");
4492 opt_audio_codec(o, "c:a", "ac3");
4493 parse_option(o, "f", "dvd", options);
4495 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4496 parse_option(o, "r", frame_rates[norm], options);
4497 parse_option(o, "pix_fmt", "yuv420p", options);
4498 opt_default("g", norm == PAL ? "15" : "18");
4500 opt_default("b:v", "6000000");
4501 opt_default("maxrate", "9000000");
4502 opt_default("minrate", "0"); //1500000;
4503 opt_default("bufsize", "1835008"); //224*1024*8;
4505 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4506 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4508 opt_default("b:a", "448000");
4509 parse_option(o, "ar", "48000", options);
4511 } else if(!strncmp(arg, "dv", 2)) {
4513 parse_option(o, "f", "dv", options);
4515 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4516 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4517 norm == PAL ? "yuv420p" : "yuv411p", options);
4518 parse_option(o, "r", frame_rates[norm], options);
4520 parse_option(o, "ar", "48000", options);
4521 parse_option(o, "ac", "2", options);
4524 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
4525 return AVERROR(EINVAL);
4530 static int opt_vstats_file(const char *opt, const char *arg)
4532 av_free (vstats_filename);
4533 vstats_filename=av_strdup (arg);
4537 static int opt_vstats(const char *opt, const char *arg)
4540 time_t today2 = time(NULL);
4541 struct tm *today = localtime(&today2);
4543 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4545 return opt_vstats_file(opt, filename);
4548 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4550 return parse_option(o, "frames:v", arg, options);
4553 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4555 return parse_option(o, "frames:a", arg, options);
4558 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4560 return parse_option(o, "frames:d", arg, options);
4563 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
4566 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4567 const char *codec_name = *opt == 'v' ? video_codec_name :
4568 *opt == 'a' ? audio_codec_name :
4569 subtitle_codec_name;
4571 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4572 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
4573 av_log(0, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
4575 av_log(0, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
4580 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4581 if(line[0] == '#' && !e)
4583 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4585 av_log(0, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
4588 if(!strcmp(tmp, "acodec")){
4589 opt_audio_codec(o, tmp, tmp2);
4590 }else if(!strcmp(tmp, "vcodec")){
4591 opt_video_codec(o, tmp, tmp2);
4592 }else if(!strcmp(tmp, "scodec")){
4593 opt_subtitle_codec(o, tmp, tmp2);
4594 }else if(!strcmp(tmp, "dcodec")){
4595 opt_data_codec(o, tmp, tmp2);
4596 }else if(opt_default(tmp, tmp2) < 0){
4597 av_log(0, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4607 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
4611 static int opt_passlogfile(const char *opt, const char *arg)
4613 pass_logfilename_prefix = arg;
4614 #if CONFIG_LIBX264_ENCODER
4615 return opt_default("passlogfile", arg);
4621 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
4623 char *s= av_malloc(strlen(opt)+2);
4624 snprintf(s, strlen(opt)+2, "%s:%c", opt+1, *opt);
4625 return parse_option(o, s, arg, options);
4628 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
4630 if(!strcmp(opt, "b")){
4631 av_log(0,AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
4632 return parse_option(o, av_strdup("b:v"), arg, options);
4634 return opt_default(opt, arg);
4637 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4639 return parse_option(o, "filter:v", arg, options);
4642 #define OFFSET(x) offsetof(OptionsContext, x)
4643 static const OptionDef options[] = {
4645 #include "cmdutils_common_opts.h"
4646 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4647 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4648 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4649 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
4650 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4651 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4652 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
4653 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4654 { "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]" },
4655 { "map_meta_data", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4656 "outfile[,metadata]:infile[,metadata]" },
4657 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4658 "outfile[,metadata]:infile[,metadata]" },
4659 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4660 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4661 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4662 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4663 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4664 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4665 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4666 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4667 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4668 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4669 "add timings for benchmarking" },
4670 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4671 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4672 "dump each input packet" },
4673 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4674 "when dumping packets, also dump the payload" },
4675 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4676 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "deprecated, use -loop" },
4677 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "deprecated, use -loop", "" },
4678 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4679 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4680 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4681 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4682 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4683 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying", "source" },
4684 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4685 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4686 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4687 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
4688 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4689 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4690 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4691 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4693 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4695 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
4696 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
4697 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
4700 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4701 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4702 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4703 { "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" },
4704 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4705 { "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" },
4706 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4707 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4708 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4709 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4710 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4711 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4712 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4713 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4714 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4715 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4716 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4717 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4718 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4719 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4720 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4721 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4722 "use same quantizer as source (implies VBR)" },
4723 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4724 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4725 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4726 "deinterlace pictures" },
4727 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4728 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4729 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4731 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
4733 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
4734 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
4735 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
4736 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4737 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
4738 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4739 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
4740 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4741 { "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" },
4742 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
4745 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4746 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
4747 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
4748 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
4749 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
4750 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4751 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
4752 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4753 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
4754 { "rmvol", HAS_ARG | OPT_AUDIO | OPT_FLOAT | OPT_SPEC, {.off = OFFSET(rematrix_volume)}, "rematrix volume (as factor)", "volume" },
4756 /* subtitle options */
4757 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
4758 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4759 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
4762 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
4763 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
4764 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4767 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4768 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4770 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4771 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
4772 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
4774 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4775 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4776 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4777 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4778 /* data codec support */
4779 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4780 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
4782 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4786 int main(int argc, char **argv)
4788 OptionsContext o = { 0 };
4791 reset_options(&o, 0);
4793 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4794 parse_loglevel(argc, argv, options);
4796 if(argc>1 && !strcmp(argv[1], "-d")){
4798 av_log_set_callback(log_callback_null);
4803 avcodec_register_all();
4805 avdevice_register_all();
4808 avfilter_register_all();
4811 avformat_network_init();
4818 parse_options(&o, argc, argv, options, opt_output_file);
4820 if(nb_output_files <= 0 && nb_input_files == 0) {
4822 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4826 /* file converter / grab */
4827 if (nb_output_files <= 0) {
4828 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
4832 if (nb_input_files == 0) {
4833 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
4838 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4840 ti = getutime() - ti;
4842 int maxrss = getmaxrss() / 1024;
4843 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);