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"
49 #include "libavformat/ffm.h" // not public API
52 # include "libavfilter/avcodec.h"
53 # include "libavfilter/avfilter.h"
54 # include "libavfilter/avfiltergraph.h"
55 # include "libavfilter/buffersink.h"
56 # include "libavfilter/vsrc_buffer.h"
59 #if HAVE_SYS_RESOURCE_H
60 #include <sys/types.h>
62 #include <sys/resource.h>
63 #elif HAVE_GETPROCESSTIMES
66 #if HAVE_GETPROCESSMEMORYINFO
72 #include <sys/select.h>
77 #include <sys/ioctl.h>
87 #include "libavutil/avassert.h"
89 const char program_name[] = "ffmpeg";
90 const int program_birth_year = 2000;
92 /* select an input stream for an output stream */
93 typedef struct StreamMap {
94 int disabled; /** 1 is this mapping is disabled by a negative map */
98 int sync_stream_index;
102 * select an input file for an output file
104 typedef struct MetadataMap {
105 int file; ///< file index
106 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
107 int index; ///< stream/chapter/program number
110 static const OptionDef options[];
112 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
114 /* indexed by output file stream index */
115 static int *streamid_map = NULL;
116 static int nb_streamid_map = 0;
118 static int frame_width = 0;
119 static int frame_height = 0;
120 static float frame_aspect_ratio = 0;
121 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
122 static int frame_bits_per_raw_sample = 0;
123 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
124 static AVRational frame_rate;
125 static float video_qscale = 0;
126 static uint16_t *intra_matrix = NULL;
127 static uint16_t *inter_matrix = NULL;
128 static const char *video_rc_override_string=NULL;
129 static int video_discard = 0;
130 static char *video_codec_name = NULL;
131 static int same_quant = 0;
132 static int do_deinterlace = 0;
133 static int top_field_first = -1;
134 static int me_threshold = 0;
135 static int intra_dc_precision = 8;
136 static int loop_input = 0;
137 static int loop_output = AVFMT_NOOUTPUTLOOP;
138 static int qp_hist = 0;
140 static char *vfilters = NULL;
143 static int intra_only = 0;
144 static int audio_sample_rate = 0;
145 #define QSCALE_NONE -99999
146 static float audio_qscale = QSCALE_NONE;
147 static char *audio_codec_name = NULL;
148 static char *subtitle_codec_name = NULL;
150 static char *data_codec_name = NULL;
152 static int file_overwrite = 0;
153 static int do_benchmark = 0;
154 static int do_hex_dump = 0;
155 static int do_pkt_dump = 0;
156 static int do_psnr = 0;
157 static int do_pass = 0;
158 static const char *pass_logfilename_prefix;
159 static int video_sync_method= -1;
160 static int audio_sync_method= 0;
161 static float audio_drift_threshold= 0.1;
162 static int copy_ts= 0;
163 static int copy_tb= 0;
164 static int opt_shortest = 0;
165 static char *vstats_filename;
166 static FILE *vstats_file;
167 static int opt_programid = 0;
168 static int copy_initial_nonkeyframes = 0;
170 static int audio_volume = 256;
172 static int exit_on_error = 0;
173 static int using_stdin = 0;
174 static int verbose = 1;
175 static int run_as_daemon = 0;
176 static int thread_count= 1;
177 static int q_pressed = 0;
178 static int64_t video_size = 0;
179 static int64_t audio_size = 0;
180 static int64_t extra_size = 0;
181 static int nb_frames_dup = 0;
182 static int nb_frames_drop = 0;
183 static int input_sync;
184 static int force_fps = 0;
185 static char *forced_key_frames = NULL;
187 static float dts_delta_threshold = 10;
189 static uint8_t *audio_buf;
190 static uint8_t *audio_out;
191 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
193 static short *samples;
194 static uint8_t *input_tmp= NULL;
196 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
198 typedef struct InputStream {
201 int discard; /* true if stream data should be discarded */
202 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
205 int64_t start; /* time when read started */
206 int64_t next_pts; /* synthetic pts for cases where pkt.pts
208 int64_t pts; /* current pts */
210 int is_start; /* is 1 at the start and after a discontinuity */
211 int showed_multi_packet_warning;
215 typedef struct InputFile {
216 AVFormatContext *ctx;
217 int eof_reached; /* true if eof reached */
218 int ist_index; /* index of first stream in ist_table */
219 int buffer_size; /* current total buffer size */
221 int nb_streams; /* number of stream that avconv is aware of; may be different
222 from ctx.nb_streams if new streams appear during av_read_frame() */
226 typedef struct OutputStream {
227 int file_index; /* file index */
228 int index; /* stream index in the output file */
229 int source_index; /* InputStream index */
230 AVStream *st; /* stream in the output file */
231 int encoding_needed; /* true if encoding needed for this stream */
233 /* input pts and corresponding output pts
235 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
236 struct InputStream *sync_ist; /* input stream to sync against */
237 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
238 AVBitStreamFilterContext *bitstream_filters;
244 AVFrame resample_frame; /* temporary frame for image resampling */
245 struct SwsContext *img_resample_ctx; /* for image resampling */
248 int resample_pix_fmt;
249 AVRational frame_rate;
251 float frame_aspect_ratio;
253 /* forced key frames */
254 int64_t *forced_kf_pts;
260 ReSampleContext *resample; /* for audio resampling */
261 int resample_sample_fmt;
262 int resample_channels;
263 int resample_sample_rate;
265 AVAudioConvert *reformat_ctx;
266 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
270 AVFilterContext *output_video_filter;
271 AVFilterContext *input_video_filter;
272 AVFilterBufferRef *picref;
274 AVFilterGraph *graph;
279 int is_past_recording_time;
285 /* init terminal so that we can grab keys */
286 static struct termios oldtty;
289 typedef struct OutputFile {
290 AVFormatContext *ctx;
292 int ost_index; /* index of the first stream in output_streams */
293 int64_t recording_time; /* desired length of the resulting file in microseconds */
294 int64_t start_time; /* start time in microseconds */
295 uint64_t limit_filesize;
298 static InputStream *input_streams = NULL;
299 static int nb_input_streams = 0;
300 static InputFile *input_files = NULL;
301 static int nb_input_files = 0;
303 static OutputStream *output_streams = NULL;
304 static int nb_output_streams = 0;
305 static OutputFile *output_files = NULL;
306 static int nb_output_files = 0;
308 typedef struct OptionsContext {
309 /* input/output options */
313 SpecifierOpt *codec_names;
315 SpecifierOpt *audio_channels;
316 int nb_audio_channels;
319 int64_t input_ts_offset;
322 SpecifierOpt *ts_scale;
326 StreamMap *stream_maps;
328 /* first item specifies output metadata, second is input */
329 MetadataMap (*meta_data_maps)[2];
330 int nb_meta_data_maps;
331 int metadata_global_manual;
332 int metadata_streams_manual;
333 int metadata_chapters_manual;
335 int chapters_input_file;
337 int64_t recording_time;
338 uint64_t limit_filesize;
344 int subtitle_disable;
347 SpecifierOpt *metadata;
349 SpecifierOpt *max_frames;
351 SpecifierOpt *bitstream_filters;
352 int nb_bitstream_filters;
353 SpecifierOpt *codec_tags;
357 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
360 for (i = 0; i < o->nb_ ## name; i++) {\
361 char *spec = o->name[i].specifier;\
362 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
363 outvar = o->name[i].u.type;\
369 static void reset_options(OptionsContext *o, int is_input)
371 const OptionDef *po = options;
372 OptionsContext bak= *o;
374 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
376 void *dst = (uint8_t*)o + po->u.off;
378 if (po->flags & OPT_SPEC) {
379 SpecifierOpt **so = dst;
380 int i, *count = (int*)(so + 1);
381 for (i = 0; i < *count; i++) {
382 av_freep(&(*so)[i].specifier);
383 if (po->flags & OPT_STRING)
384 av_freep(&(*so)[i].u.str);
388 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
393 av_freep(&o->stream_maps);
394 av_freep(&o->meta_data_maps);
396 memset(o, 0, sizeof(*o));
398 if(is_input) o->recording_time = bak.recording_time;
399 else o->recording_time = INT64_MAX;
400 o->mux_preload = 0.5;
401 o->mux_max_delay = 0.7;
402 o->limit_filesize = UINT64_MAX;
403 o->chapters_input_file = INT_MAX;
411 static int configure_video_filters(InputStream *ist, OutputStream *ost)
413 AVFilterContext *last_filter, *filter;
414 /** filter graph containing all filters including input & output */
415 AVCodecContext *codec = ost->st->codec;
416 AVCodecContext *icodec = ist->st->codec;
417 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
418 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
419 AVRational sample_aspect_ratio;
423 ost->graph = avfilter_graph_alloc();
425 if (ist->st->sample_aspect_ratio.num){
426 sample_aspect_ratio = ist->st->sample_aspect_ratio;
428 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
430 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
431 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
432 sample_aspect_ratio.num, sample_aspect_ratio.den);
434 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
435 "src", args, NULL, ost->graph);
438 #if FF_API_OLD_VSINK_API
439 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
440 "out", NULL, pix_fmts, ost->graph);
442 buffersink_params->pixel_fmts = pix_fmts;
443 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
444 "out", NULL, buffersink_params, ost->graph);
446 av_freep(&buffersink_params);
449 last_filter = ost->input_video_filter;
451 if (codec->width != icodec->width || codec->height != icodec->height) {
452 snprintf(args, 255, "%d:%d:flags=0x%X",
456 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
457 NULL, args, NULL, ost->graph)) < 0)
459 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
461 last_filter = filter;
464 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
465 ost->graph->scale_sws_opts = av_strdup(args);
468 AVFilterInOut *outputs = avfilter_inout_alloc();
469 AVFilterInOut *inputs = avfilter_inout_alloc();
471 outputs->name = av_strdup("in");
472 outputs->filter_ctx = last_filter;
473 outputs->pad_idx = 0;
474 outputs->next = NULL;
476 inputs->name = av_strdup("out");
477 inputs->filter_ctx = ost->output_video_filter;
481 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
483 av_freep(&ost->avfilter);
485 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
489 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
492 codec->width = ost->output_video_filter->inputs[0]->w;
493 codec->height = ost->output_video_filter->inputs[0]->h;
494 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
495 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
496 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
497 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
501 #endif /* CONFIG_AVFILTER */
503 static void term_exit(void)
505 av_log(NULL, AV_LOG_QUIET, "%s", "");
508 tcsetattr (0, TCSANOW, &oldtty);
512 static volatile int received_sigterm = 0;
515 sigterm_handler(int sig)
517 received_sigterm = sig;
522 static void term_init(void)
532 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
533 |INLCR|IGNCR|ICRNL|IXON);
534 tty.c_oflag |= OPOST;
535 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
536 tty.c_cflag &= ~(CSIZE|PARENB);
541 tcsetattr (0, TCSANOW, &tty);
542 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
546 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
547 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
549 signal(SIGXCPU, sigterm_handler);
553 /* read a key without blocking */
554 static int read_key(void)
569 n = select(1, &rfds, NULL, NULL, &tv);
578 # if HAVE_PEEKNAMEDPIPE
580 static HANDLE input_handle;
583 input_handle = GetStdHandle(STD_INPUT_HANDLE);
584 is_pipe = !GetConsoleMode(input_handle, &dw);
587 if (stdin->_cnt > 0) {
592 /* When running under a GUI, you will end here. */
593 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
610 static int decode_interrupt_cb(void)
612 q_pressed += read_key() == 'q';
613 return q_pressed > 1;
616 void exit_program(int ret)
621 for(i=0;i<nb_output_files;i++) {
622 AVFormatContext *s = output_files[i].ctx;
623 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
625 avformat_free_context(s);
626 av_dict_free(&output_files[i].opts);
628 for(i=0;i<nb_input_files;i++) {
629 av_close_input_file(input_files[i].ctx);
631 for (i = 0; i < nb_input_streams; i++)
632 av_dict_free(&input_streams[i].opts);
634 av_free(intra_matrix);
635 av_free(inter_matrix);
639 av_free(vstats_filename);
641 av_freep(&input_streams);
642 av_freep(&input_files);
643 av_freep(&output_streams);
644 av_freep(&output_files);
649 allocated_audio_buf_size= allocated_audio_out_size= 0;
656 av_freep(&input_tmp);
658 if (received_sigterm) {
660 "Received signal %d: terminating.\n",
661 (int) received_sigterm);
665 exit(ret); /* not all OS-es handle main() return value */
668 static void assert_avoptions(AVDictionary *m)
670 AVDictionaryEntry *t;
671 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
672 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
677 static void assert_codec_experimental(AVCodecContext *c, int encoder)
679 const char *codec_string = encoder ? "encoder" : "decoder";
681 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
682 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
683 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
684 "results.\nAdd '-strict experimental' if you want to use it.\n",
685 codec_string, c->codec->name);
686 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
687 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
688 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
689 codec_string, codec->name);
694 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
696 if(codec && codec->sample_fmts){
697 const enum AVSampleFormat *p= codec->sample_fmts;
699 if(*p == st->codec->sample_fmt)
703 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
704 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
705 if(av_get_sample_fmt_name(st->codec->sample_fmt))
706 av_log(NULL, AV_LOG_WARNING,
707 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
708 av_get_sample_fmt_name(st->codec->sample_fmt),
710 av_get_sample_fmt_name(codec->sample_fmts[0]));
711 st->codec->sample_fmt = codec->sample_fmts[0];
716 static void choose_sample_rate(AVStream *st, AVCodec *codec)
718 if(codec && codec->supported_samplerates){
719 const int *p= codec->supported_samplerates;
721 int best_dist=INT_MAX;
723 int dist= abs(st->codec->sample_rate - *p);
724 if(dist < best_dist){
730 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
732 st->codec->sample_rate= best;
736 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
738 if(codec && codec->pix_fmts){
739 const enum PixelFormat *p= codec->pix_fmts;
740 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
741 if(st->codec->codec_id==CODEC_ID_MJPEG){
742 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
743 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
744 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};
748 if(*p == st->codec->pix_fmt)
752 if(st->codec->pix_fmt != PIX_FMT_NONE)
753 av_log(NULL, AV_LOG_WARNING,
754 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
755 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
757 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
758 st->codec->pix_fmt = codec->pix_fmts[0];
764 get_sync_ipts(const OutputStream *ost)
766 const InputStream *ist = ost->sync_ist;
767 OutputFile *of = &output_files[ost->file_index];
768 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
771 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
775 AVPacket new_pkt= *pkt;
776 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
777 &new_pkt.data, &new_pkt.size,
778 pkt->data, pkt->size,
779 pkt->flags & AV_PKT_FLAG_KEY);
782 new_pkt.destruct= av_destruct_packet;
784 fprintf(stderr, "%s failed for stream %d, codec %s",
785 bsfc->filter->name, pkt->stream_index,
786 avctx->codec ? avctx->codec->name : "copy");
796 ret= av_interleaved_write_frame(s, pkt);
798 print_error("av_interleaved_write_frame()", ret);
803 static void do_audio_out(AVFormatContext *s,
806 unsigned char *buf, int size)
809 int64_t audio_out_size, audio_buf_size;
810 int64_t allocated_for_size= size;
812 int size_out, frame_bytes, ret, resample_changed;
813 AVCodecContext *enc= ost->st->codec;
814 AVCodecContext *dec= ist->st->codec;
815 int osize = av_get_bytes_per_sample(enc->sample_fmt);
816 int isize = av_get_bytes_per_sample(dec->sample_fmt);
817 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
820 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
821 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
822 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
823 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
824 audio_buf_size*= osize*enc->channels;
826 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
827 if(coded_bps > 8*osize)
828 audio_out_size= audio_out_size * coded_bps / (8*osize);
829 audio_out_size += FF_MIN_BUFFER_SIZE;
831 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
832 fprintf(stderr, "Buffer sizes too large\n");
836 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
837 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
838 if (!audio_buf || !audio_out){
839 fprintf(stderr, "Out of memory in do_audio_out\n");
843 if (enc->channels != dec->channels)
844 ost->audio_resample = 1;
846 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
847 ost->resample_channels != dec->channels ||
848 ost->resample_sample_rate != dec->sample_rate;
850 if ((ost->audio_resample && !ost->resample) || resample_changed) {
851 if (resample_changed) {
852 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",
853 ist->file_index, ist->st->index,
854 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
855 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
856 ost->resample_sample_fmt = dec->sample_fmt;
857 ost->resample_channels = dec->channels;
858 ost->resample_sample_rate = dec->sample_rate;
860 audio_resample_close(ost->resample);
862 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
863 if (audio_sync_method <= 1 &&
864 ost->resample_sample_fmt == enc->sample_fmt &&
865 ost->resample_channels == enc->channels &&
866 ost->resample_sample_rate == enc->sample_rate) {
867 ost->resample = NULL;
868 ost->audio_resample = 0;
870 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
871 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
872 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
873 enc->sample_rate, dec->sample_rate,
874 enc->sample_fmt, dec->sample_fmt,
876 if (!ost->resample) {
877 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
878 dec->channels, dec->sample_rate,
879 enc->channels, enc->sample_rate);
885 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
886 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
887 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
888 if (ost->reformat_ctx)
889 av_audio_convert_free(ost->reformat_ctx);
890 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
891 dec->sample_fmt, 1, NULL, 0);
892 if (!ost->reformat_ctx) {
893 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
894 av_get_sample_fmt_name(dec->sample_fmt),
895 av_get_sample_fmt_name(enc->sample_fmt));
898 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
901 if(audio_sync_method){
902 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
903 - av_fifo_size(ost->fifo)/(enc->channels * 2);
904 double idelta= delta*dec->sample_rate / enc->sample_rate;
905 int byte_delta= ((int)idelta)*2*dec->channels;
907 //FIXME resample delay
908 if(fabs(delta) > 50){
909 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
911 byte_delta= FFMAX(byte_delta, -size);
915 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
920 input_tmp= av_realloc(input_tmp, byte_delta + size);
922 if(byte_delta > allocated_for_size - size){
923 allocated_for_size= byte_delta + (int64_t)size;
928 memset(input_tmp, 0, byte_delta);
929 memcpy(input_tmp + byte_delta, buf, size);
933 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
935 }else if(audio_sync_method>1){
936 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
937 av_assert0(ost->audio_resample);
939 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
940 // 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));
941 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
945 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
946 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
948 if (ost->audio_resample) {
950 size_out = audio_resample(ost->resample,
951 (short *)buftmp, (short *)buf,
952 size / (dec->channels * isize));
953 size_out = size_out * enc->channels * osize;
959 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
960 const void *ibuf[6]= {buftmp};
961 void *obuf[6]= {audio_buf};
962 int istride[6]= {isize};
963 int ostride[6]= {osize};
964 int len= size_out/istride[0];
965 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
966 printf("av_audio_convert() failed\n");
972 size_out = len*osize;
975 /* now encode as many frames as possible */
976 if (enc->frame_size > 1) {
977 /* output resampled raw samples */
978 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
979 fprintf(stderr, "av_fifo_realloc2() failed\n");
982 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
984 frame_bytes = enc->frame_size * osize * enc->channels;
986 while (av_fifo_size(ost->fifo) >= frame_bytes) {
988 av_init_packet(&pkt);
990 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
992 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
994 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
997 fprintf(stderr, "Audio encoding failed\n");
1001 pkt.stream_index= ost->index;
1002 pkt.data= audio_out;
1004 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1005 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1006 pkt.flags |= AV_PKT_FLAG_KEY;
1007 write_frame(s, &pkt, enc, ost->bitstream_filters);
1009 ost->sync_opts += enc->frame_size;
1013 av_init_packet(&pkt);
1015 ost->sync_opts += size_out / (osize * enc->channels);
1017 /* output a pcm frame */
1018 /* determine the size of the coded buffer */
1021 size_out = size_out*coded_bps/8;
1023 if(size_out > audio_out_size){
1024 fprintf(stderr, "Internal error, buffer size too small\n");
1028 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1029 ret = avcodec_encode_audio(enc, audio_out, size_out,
1032 fprintf(stderr, "Audio encoding failed\n");
1036 pkt.stream_index= ost->index;
1037 pkt.data= audio_out;
1039 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1040 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1041 pkt.flags |= AV_PKT_FLAG_KEY;
1042 write_frame(s, &pkt, enc, ost->bitstream_filters);
1046 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1048 AVCodecContext *dec;
1049 AVPicture *picture2;
1050 AVPicture picture_tmp;
1053 dec = ist->st->codec;
1055 /* deinterlace : must be done before any resize */
1056 if (do_deinterlace) {
1059 /* create temporary picture */
1060 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1061 buf = av_malloc(size);
1065 picture2 = &picture_tmp;
1066 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1068 if(avpicture_deinterlace(picture2, picture,
1069 dec->pix_fmt, dec->width, dec->height) < 0) {
1070 /* if error, do not deinterlace */
1071 fprintf(stderr, "Deinterlacing failed\n");
1080 if (picture != picture2)
1081 *picture = *picture2;
1085 static void do_subtitle_out(AVFormatContext *s,
1091 static uint8_t *subtitle_out = NULL;
1092 int subtitle_out_max_size = 1024 * 1024;
1093 int subtitle_out_size, nb, i;
1094 AVCodecContext *enc;
1097 if (pts == AV_NOPTS_VALUE) {
1098 fprintf(stderr, "Subtitle packets must have a pts\n");
1104 enc = ost->st->codec;
1106 if (!subtitle_out) {
1107 subtitle_out = av_malloc(subtitle_out_max_size);
1110 /* Note: DVB subtitle need one packet to draw them and one other
1111 packet to clear them */
1112 /* XXX: signal it in the codec context ? */
1113 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1118 for(i = 0; i < nb; i++) {
1119 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1120 // start_display_time is required to be 0
1121 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1122 sub->end_display_time -= sub->start_display_time;
1123 sub->start_display_time = 0;
1124 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1125 subtitle_out_max_size, sub);
1126 if (subtitle_out_size < 0) {
1127 fprintf(stderr, "Subtitle encoding failed\n");
1131 av_init_packet(&pkt);
1132 pkt.stream_index = ost->index;
1133 pkt.data = subtitle_out;
1134 pkt.size = subtitle_out_size;
1135 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1136 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1137 /* XXX: the pts correction is handled here. Maybe handling
1138 it in the codec would be better */
1140 pkt.pts += 90 * sub->start_display_time;
1142 pkt.pts += 90 * sub->end_display_time;
1144 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1148 static int bit_buffer_size= 1024*256;
1149 static uint8_t *bit_buffer= NULL;
1151 static void do_video_resample(OutputStream *ost,
1153 AVFrame *in_picture,
1154 AVFrame **out_picture)
1157 *out_picture = in_picture;
1159 AVCodecContext *dec = ist->st->codec;
1160 AVCodecContext *enc = ost->st->codec;
1161 int resample_changed = ost->resample_width != dec->width ||
1162 ost->resample_height != dec->height ||
1163 ost->resample_pix_fmt != dec->pix_fmt;
1165 *out_picture = in_picture;
1166 if (resample_changed) {
1167 av_log(NULL, AV_LOG_INFO,
1168 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1169 ist->file_index, ist->st->index,
1170 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1171 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1172 ost->resample_width = dec->width;
1173 ost->resample_height = dec->height;
1174 ost->resample_pix_fmt = dec->pix_fmt;
1177 ost->video_resample = dec->width != enc->width ||
1178 dec->height != enc->height ||
1179 dec->pix_fmt != enc->pix_fmt;
1181 if (ost->video_resample) {
1182 *out_picture = &ost->resample_frame;
1183 if (!ost->img_resample_ctx || resample_changed) {
1184 /* initialize the destination picture */
1185 if (!ost->resample_frame.data[0]) {
1186 avcodec_get_frame_defaults(&ost->resample_frame);
1187 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1188 enc->width, enc->height)) {
1189 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1193 /* initialize a new scaler context */
1194 sws_freeContext(ost->img_resample_ctx);
1195 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1196 enc->width, enc->height, enc->pix_fmt,
1197 ost->sws_flags, NULL, NULL, NULL);
1198 if (ost->img_resample_ctx == NULL) {
1199 fprintf(stderr, "Cannot get resampling context\n");
1203 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1204 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1210 static void do_video_out(AVFormatContext *s,
1213 AVFrame *in_picture,
1214 int *frame_size, float quality)
1216 int nb_frames, i, ret, format_video_sync;
1217 AVFrame *final_picture;
1218 AVCodecContext *enc;
1221 enc = ost->st->codec;
1223 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1225 /* by default, we output a single frame */
1230 format_video_sync = video_sync_method;
1231 if (format_video_sync < 0)
1232 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1234 if (format_video_sync) {
1235 double vdelta = sync_ipts - ost->sync_opts;
1236 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1239 else if (format_video_sync == 2) {
1242 }else if(vdelta>0.6)
1243 ost->sync_opts= lrintf(sync_ipts);
1244 }else if (vdelta > 1.1)
1245 nb_frames = lrintf(vdelta);
1246 //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);
1247 if (nb_frames == 0){
1250 fprintf(stderr, "*** drop!\n");
1251 }else if (nb_frames > 1) {
1252 nb_frames_dup += nb_frames - 1;
1254 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1257 ost->sync_opts= lrintf(sync_ipts);
1259 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1263 do_video_resample(ost, ist, in_picture, &final_picture);
1265 /* duplicates frame if needed */
1266 for(i=0;i<nb_frames;i++) {
1268 av_init_packet(&pkt);
1269 pkt.stream_index= ost->index;
1271 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1272 /* raw pictures are written as AVPicture structure to
1273 avoid any copies. We support temporarily the older
1275 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1276 enc->coded_frame->top_field_first = in_picture->top_field_first;
1277 pkt.data= (uint8_t *)final_picture;
1278 pkt.size= sizeof(AVPicture);
1279 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1280 pkt.flags |= AV_PKT_FLAG_KEY;
1282 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1284 AVFrame big_picture;
1286 big_picture= *final_picture;
1287 /* better than nothing: use input picture interlaced
1289 big_picture.interlaced_frame = in_picture->interlaced_frame;
1290 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1291 if(top_field_first == -1)
1292 big_picture.top_field_first = in_picture->top_field_first;
1294 big_picture.top_field_first = top_field_first;
1297 /* handles same_quant here. This is not correct because it may
1298 not be a global option */
1299 big_picture.quality = quality;
1301 big_picture.pict_type = 0;
1302 // big_picture.pts = AV_NOPTS_VALUE;
1303 big_picture.pts= ost->sync_opts;
1304 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1305 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1306 if (ost->forced_kf_index < ost->forced_kf_count &&
1307 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1308 big_picture.pict_type = AV_PICTURE_TYPE_I;
1309 ost->forced_kf_index++;
1311 ret = avcodec_encode_video(enc,
1312 bit_buffer, bit_buffer_size,
1315 fprintf(stderr, "Video encoding failed\n");
1320 pkt.data= bit_buffer;
1322 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1323 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1324 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1325 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1326 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1328 if(enc->coded_frame->key_frame)
1329 pkt.flags |= AV_PKT_FLAG_KEY;
1330 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1333 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1334 // enc->frame_number-1, ret, enc->pict_type);
1335 /* if two pass, output log */
1336 if (ost->logfile && enc->stats_out) {
1337 fprintf(ost->logfile, "%s", enc->stats_out);
1342 ost->frame_number++;
1346 static double psnr(double d){
1347 return -10.0*log(d)/log(10.0);
1350 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1353 AVCodecContext *enc;
1355 double ti1, bitrate, avg_bitrate;
1357 /* this is executed just the first time do_video_stats is called */
1359 vstats_file = fopen(vstats_filename, "w");
1366 enc = ost->st->codec;
1367 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1368 frame_number = ost->frame_number;
1369 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1370 if (enc->flags&CODEC_FLAG_PSNR)
1371 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1373 fprintf(vstats_file,"f_size= %6d ", frame_size);
1374 /* compute pts value */
1375 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1379 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1380 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1381 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1382 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1383 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1387 static void print_report(OutputFile *output_files,
1388 OutputStream *ost_table, int nb_ostreams,
1389 int is_last_report, int64_t timer_start)
1393 AVFormatContext *oc;
1395 AVCodecContext *enc;
1396 int frame_number, vid, i;
1398 int64_t pts = INT64_MAX;
1399 static int64_t last_time = -1;
1400 static int qp_histogram[52];
1402 if (!is_last_report) {
1404 /* display the report every 0.5 seconds */
1405 cur_time = av_gettime();
1406 if (last_time == -1) {
1407 last_time = cur_time;
1410 if ((cur_time - last_time) < 500000)
1412 last_time = cur_time;
1416 oc = output_files[0].ctx;
1418 total_size = avio_size(oc->pb);
1419 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1420 total_size= avio_tell(oc->pb);
1424 for(i=0;i<nb_ostreams;i++) {
1426 ost = &ost_table[i];
1427 enc = ost->st->codec;
1428 if (!ost->st->stream_copy && enc->coded_frame)
1429 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1430 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1431 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1433 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1434 float t = (av_gettime()-timer_start) / 1000000.0;
1436 frame_number = ost->frame_number;
1437 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1438 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1440 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1444 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1447 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1449 if (enc->flags&CODEC_FLAG_PSNR){
1451 double error, error_sum=0;
1452 double scale, scale_sum=0;
1453 char type[3]= {'Y','U','V'};
1454 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1457 error= enc->error[j];
1458 scale= enc->width*enc->height*255.0*255.0*frame_number;
1460 error= enc->coded_frame->error[j];
1461 scale= enc->width*enc->height*255.0*255.0;
1466 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1468 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1472 /* compute min output value */
1473 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1474 ost->st->time_base, AV_TIME_BASE_Q));
1477 if (verbose > 0 || is_last_report) {
1478 int hours, mins, secs, us;
1479 secs = pts / AV_TIME_BASE;
1480 us = pts % AV_TIME_BASE;
1486 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1488 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1489 "size=%8.0fkB time=", total_size / 1024.0);
1490 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1491 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1492 (100 * us) / AV_TIME_BASE);
1493 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1494 "bitrate=%6.1fkbits/s", bitrate);
1496 if (nb_frames_dup || nb_frames_drop)
1497 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1498 nb_frames_dup, nb_frames_drop);
1501 fprintf(stderr, "%s \r", buf);
1506 if (is_last_report && verbose >= 0){
1507 int64_t raw= audio_size + video_size + extra_size;
1508 fprintf(stderr, "\n");
1509 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1513 100.0*(total_size - raw)/raw
1518 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1520 int fill_char = 0x00;
1521 if (sample_fmt == AV_SAMPLE_FMT_U8)
1523 memset(buf, fill_char, size);
1526 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1530 for (i = 0; i < nb_ostreams; i++) {
1531 OutputStream *ost = &ost_table[i];
1532 AVCodecContext *enc = ost->st->codec;
1533 AVFormatContext *os = output_files[ost->file_index].ctx;
1535 if (!ost->encoding_needed)
1538 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1540 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1546 av_init_packet(&pkt);
1547 pkt.stream_index= ost->index;
1549 switch (ost->st->codec->codec_type) {
1550 case AVMEDIA_TYPE_AUDIO:
1551 fifo_bytes = av_fifo_size(ost->fifo);
1553 /* encode any samples remaining in fifo */
1554 if (fifo_bytes > 0) {
1555 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1556 int fs_tmp = enc->frame_size;
1558 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1559 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1560 enc->frame_size = fifo_bytes / (osize * enc->channels);
1562 int frame_bytes = enc->frame_size*osize*enc->channels;
1563 if (allocated_audio_buf_size < frame_bytes)
1565 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1568 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1569 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1570 ost->st->time_base.num, enc->sample_rate);
1571 enc->frame_size = fs_tmp;
1574 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1577 fprintf(stderr, "Audio encoding failed\n");
1581 pkt.flags |= AV_PKT_FLAG_KEY;
1583 case AVMEDIA_TYPE_VIDEO:
1584 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1586 fprintf(stderr, "Video encoding failed\n");
1590 if(enc->coded_frame && enc->coded_frame->key_frame)
1591 pkt.flags |= AV_PKT_FLAG_KEY;
1592 if (ost->logfile && enc->stats_out) {
1593 fprintf(ost->logfile, "%s", enc->stats_out);
1602 pkt.data = bit_buffer;
1604 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1605 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1606 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1611 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1612 static int output_packet(InputStream *ist, int ist_index,
1613 OutputStream *ost_table, int nb_ostreams,
1614 const AVPacket *pkt)
1616 AVFormatContext *os;
1621 void *buffer_to_free = NULL;
1622 static unsigned int samples_size= 0;
1623 AVSubtitle subtitle, *subtitle_to_free;
1624 int64_t pkt_pts = AV_NOPTS_VALUE;
1626 int frame_available;
1631 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1633 if(ist->next_pts == AV_NOPTS_VALUE)
1634 ist->next_pts= ist->pts;
1638 av_init_packet(&avpkt);
1646 if(pkt->dts != AV_NOPTS_VALUE)
1647 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1648 if(pkt->pts != AV_NOPTS_VALUE)
1649 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1651 //while we have more to decode or while the decoder did output something on EOF
1652 while (avpkt.size > 0 || (!pkt && got_output)) {
1653 uint8_t *data_buf, *decoded_data_buf;
1654 int data_size, decoded_data_size;
1656 ist->pts= ist->next_pts;
1658 if(avpkt.size && avpkt.size != pkt->size &&
1659 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1660 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1661 ist->showed_multi_packet_warning=1;
1664 /* decode the packet if needed */
1665 decoded_data_buf = NULL; /* fail safe */
1666 decoded_data_size= 0;
1667 data_buf = avpkt.data;
1668 data_size = avpkt.size;
1669 subtitle_to_free = NULL;
1670 if (ist->decoding_needed) {
1671 switch(ist->st->codec->codec_type) {
1672 case AVMEDIA_TYPE_AUDIO:{
1673 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1674 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1676 samples= av_malloc(samples_size);
1678 decoded_data_size= samples_size;
1679 /* XXX: could avoid copy if PCM 16 bits with same
1680 endianness as CPU */
1681 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1688 got_output = decoded_data_size > 0;
1689 /* Some bug in mpeg audio decoder gives */
1690 /* decoded_data_size < 0, it seems they are overflows */
1692 /* no audio frame */
1695 decoded_data_buf = (uint8_t *)samples;
1696 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1697 (ist->st->codec->sample_rate * ist->st->codec->channels);
1699 case AVMEDIA_TYPE_VIDEO:
1700 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1701 /* XXX: allocate picture correctly */
1702 avcodec_get_frame_defaults(&picture);
1703 avpkt.pts = pkt_pts;
1704 avpkt.dts = ist->pts;
1705 pkt_pts = AV_NOPTS_VALUE;
1707 ret = avcodec_decode_video2(ist->st->codec,
1708 &picture, &got_output, &avpkt);
1709 quality = same_quant ? picture.quality : 0;
1713 /* no picture yet */
1714 goto discard_packet;
1716 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1717 if (ist->st->codec->time_base.num != 0) {
1718 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1719 ist->next_pts += ((int64_t)AV_TIME_BASE *
1720 ist->st->codec->time_base.num * ticks) /
1721 ist->st->codec->time_base.den;
1724 buffer_to_free = NULL;
1725 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1727 case AVMEDIA_TYPE_SUBTITLE:
1728 ret = avcodec_decode_subtitle2(ist->st->codec,
1729 &subtitle, &got_output, &avpkt);
1733 goto discard_packet;
1735 subtitle_to_free = &subtitle;
1742 switch(ist->st->codec->codec_type) {
1743 case AVMEDIA_TYPE_AUDIO:
1744 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1745 ist->st->codec->sample_rate;
1747 case AVMEDIA_TYPE_VIDEO:
1748 if (ist->st->codec->time_base.num != 0) {
1749 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1750 ist->next_pts += ((int64_t)AV_TIME_BASE *
1751 ist->st->codec->time_base.num * ticks) /
1752 ist->st->codec->time_base.den;
1760 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1761 for(i=0;i<nb_ostreams;i++) {
1762 OutputFile *of = &output_files[ost_table[i].file_index];
1763 if (of->start_time == 0 || ist->pts >= of->start_time) {
1764 ost = &ost_table[i];
1765 if (ost->input_video_filter && ost->source_index == ist_index) {
1766 if (!picture.sample_aspect_ratio.num)
1767 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1768 picture.pts = ist->pts;
1770 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
1776 // preprocess audio (volume)
1777 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1778 if (audio_volume != 256) {
1781 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1782 int v = ((*volp) * audio_volume + 128) >> 8;
1783 *volp++ = av_clip_int16(v);
1788 /* frame rate emulation */
1789 if (input_files[ist->file_index].rate_emu) {
1790 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1791 int64_t now = av_gettime() - ist->start;
1795 /* if output time reached then transcode raw format,
1796 encode packets and output them */
1797 for (i = 0; i < nb_ostreams; i++) {
1798 OutputFile *of = &output_files[ost_table[i].file_index];
1801 ost = &ost_table[i];
1802 if (ost->source_index != ist_index)
1805 if (of->start_time && ist->pts < of->start_time)
1808 if (of->recording_time != INT64_MAX &&
1809 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1810 (AVRational){1, 1000000}) >= 0) {
1811 ost->is_past_recording_time = 1;
1816 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1817 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1818 while (frame_available) {
1819 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
1820 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1821 if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1824 avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
1825 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1829 os = output_files[ost->file_index].ctx;
1831 /* set the input output pts pairs */
1832 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1834 if (ost->encoding_needed) {
1835 av_assert0(ist->decoding_needed);
1836 switch(ost->st->codec->codec_type) {
1837 case AVMEDIA_TYPE_AUDIO:
1838 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1840 case AVMEDIA_TYPE_VIDEO:
1842 if (ost->picref->video && !ost->frame_aspect_ratio)
1843 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1845 do_video_out(os, ost, ist, &picture, &frame_size,
1846 same_quant ? quality : ost->st->codec->global_quality);
1847 if (vstats_filename && frame_size)
1848 do_video_stats(os, ost, frame_size);
1850 case AVMEDIA_TYPE_SUBTITLE:
1851 do_subtitle_out(os, ost, ist, &subtitle,
1858 AVFrame avframe; //FIXME/XXX remove this
1861 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1862 av_init_packet(&opkt);
1864 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1865 #if !CONFIG_AVFILTER
1871 /* no reencoding needed : output the packet directly */
1872 /* force the input stream PTS */
1874 avcodec_get_frame_defaults(&avframe);
1875 ost->st->codec->coded_frame= &avframe;
1876 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1878 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1879 audio_size += data_size;
1880 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1881 video_size += data_size;
1885 opkt.stream_index= ost->index;
1886 if(pkt->pts != AV_NOPTS_VALUE)
1887 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1889 opkt.pts= AV_NOPTS_VALUE;
1891 if (pkt->dts == AV_NOPTS_VALUE)
1892 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1894 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1895 opkt.dts -= ost_tb_start_time;
1897 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1898 opkt.flags= pkt->flags;
1900 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1901 if( ost->st->codec->codec_id != CODEC_ID_H264
1902 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1903 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1905 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1906 opkt.destruct= av_destruct_packet;
1908 opkt.data = data_buf;
1909 opkt.size = data_size;
1912 if (os->oformat->flags & AVFMT_RAWPICTURE) {
1913 /* store AVPicture in AVPacket, as expected by the output format */
1914 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1915 opkt.data = (uint8_t *)&pict;
1916 opkt.size = sizeof(AVPicture);
1917 opkt.flags |= AV_PKT_FLAG_KEY;
1919 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1920 ost->st->codec->frame_number++;
1921 ost->frame_number++;
1922 av_free_packet(&opkt);
1926 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1927 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1928 avfilter_unref_buffer(ost->picref);
1933 av_free(buffer_to_free);
1934 /* XXX: allocate the subtitles in the codec ? */
1935 if (subtitle_to_free) {
1936 avsubtitle_free(subtitle_to_free);
1937 subtitle_to_free = NULL;
1945 static void print_sdp(OutputFile *output_files, int n)
1949 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1953 for (i = 0; i < n; i++)
1954 avc[i] = output_files[i].ctx;
1956 av_sdp_create(avc, n, sdp, sizeof(sdp));
1957 printf("SDP:\n%s\n", sdp);
1962 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1963 char *error, int error_len)
1965 InputStream *ist = &input_streams[ist_index];
1966 if (ist->decoding_needed) {
1967 AVCodec *codec = ist->dec;
1969 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d.%d",
1970 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
1971 return AVERROR(EINVAL);
1973 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1974 snprintf(error, error_len, "Error while opening decoder for input stream #%d.%d",
1975 ist->file_index, ist->st->index);
1976 return AVERROR(EINVAL);
1978 assert_codec_experimental(ist->st->codec, 0);
1979 assert_avoptions(ist->opts);
1982 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;
1983 ist->next_pts = AV_NOPTS_VALUE;
1989 static int transcode_init(OutputFile *output_files,
1990 int nb_output_files,
1991 InputFile *input_files,
1995 AVFormatContext *os;
1996 AVCodecContext *codec, *icodec;
2002 /* init framerate emulation */
2003 for (i = 0; i < nb_input_files; i++) {
2004 InputFile *ifile = &input_files[i];
2005 if (ifile->rate_emu)
2006 for (j = 0; j < ifile->nb_streams; j++)
2007 input_streams[j + ifile->ist_index].start = av_gettime();
2010 /* output stream init */
2011 for(i=0;i<nb_output_files;i++) {
2012 os = output_files[i].ctx;
2013 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
2014 av_dump_format(os, i, os->filename, 1);
2015 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
2016 return AVERROR(EINVAL);
2020 /* for each output stream, we compute the right encoding parameters */
2021 for (i = 0; i < nb_output_streams; i++) {
2022 ost = &output_streams[i];
2023 os = output_files[ost->file_index].ctx;
2024 ist = &input_streams[ost->source_index];
2026 codec = ost->st->codec;
2027 icodec = ist->st->codec;
2029 ost->st->disposition = ist->st->disposition;
2030 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2031 codec->chroma_sample_location = icodec->chroma_sample_location;
2033 if (ost->st->stream_copy) {
2034 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2036 if (extra_size > INT_MAX) {
2037 return AVERROR(EINVAL);
2040 /* if stream_copy is selected, no need to decode or encode */
2041 codec->codec_id = icodec->codec_id;
2042 codec->codec_type = icodec->codec_type;
2044 if(!codec->codec_tag){
2045 if( !os->oformat->codec_tag
2046 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2047 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2048 codec->codec_tag = icodec->codec_tag;
2051 codec->bit_rate = icodec->bit_rate;
2052 codec->rc_max_rate = icodec->rc_max_rate;
2053 codec->rc_buffer_size = icodec->rc_buffer_size;
2054 codec->extradata= av_mallocz(extra_size);
2055 if (!codec->extradata) {
2056 return AVERROR(ENOMEM);
2058 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2059 codec->extradata_size= icodec->extradata_size;
2061 codec->time_base = ist->st->time_base;
2062 if(!strcmp(os->oformat->name, "avi")) {
2063 if(!copy_tb && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/500){
2064 codec->time_base = icodec->time_base;
2065 codec->time_base.num *= icodec->ticks_per_frame;
2066 codec->time_base.den *= 2;
2068 } else if(!(os->oformat->flags & AVFMT_VARIABLE_FPS)) {
2069 if(!copy_tb && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/500){
2070 codec->time_base = icodec->time_base;
2071 codec->time_base.num *= icodec->ticks_per_frame;
2074 av_reduce(&codec->time_base.num, &codec->time_base.den,
2075 codec->time_base.num, codec->time_base.den, INT_MAX);
2077 switch(codec->codec_type) {
2078 case AVMEDIA_TYPE_AUDIO:
2079 if(audio_volume != 256) {
2080 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2083 codec->channel_layout = icodec->channel_layout;
2084 codec->sample_rate = icodec->sample_rate;
2085 codec->channels = icodec->channels;
2086 codec->frame_size = icodec->frame_size;
2087 codec->audio_service_type = icodec->audio_service_type;
2088 codec->block_align= icodec->block_align;
2089 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2090 codec->block_align= 0;
2091 if(codec->codec_id == CODEC_ID_AC3)
2092 codec->block_align= 0;
2094 case AVMEDIA_TYPE_VIDEO:
2095 codec->pix_fmt = icodec->pix_fmt;
2096 codec->width = icodec->width;
2097 codec->height = icodec->height;
2098 codec->has_b_frames = icodec->has_b_frames;
2099 if (!codec->sample_aspect_ratio.num) {
2100 codec->sample_aspect_ratio =
2101 ost->st->sample_aspect_ratio =
2102 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2103 ist->st->codec->sample_aspect_ratio.num ?
2104 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2107 case AVMEDIA_TYPE_SUBTITLE:
2108 codec->width = icodec->width;
2109 codec->height = icodec->height;
2111 case AVMEDIA_TYPE_DATA:
2118 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2119 switch(codec->codec_type) {
2120 case AVMEDIA_TYPE_AUDIO:
2121 ost->fifo= av_fifo_alloc(1024);
2123 return AVERROR(ENOMEM);
2125 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2126 if (!codec->sample_rate) {
2127 codec->sample_rate = icodec->sample_rate;
2129 choose_sample_rate(ost->st, ost->enc);
2130 codec->time_base = (AVRational){1, codec->sample_rate};
2131 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2132 codec->sample_fmt = icodec->sample_fmt;
2133 choose_sample_fmt(ost->st, ost->enc);
2134 if (!codec->channels) {
2135 codec->channels = icodec->channels;
2136 codec->channel_layout = icodec->channel_layout;
2138 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2139 codec->channel_layout = 0;
2140 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2141 icodec->request_channels = codec->channels;
2142 ist->decoding_needed = 1;
2143 ost->encoding_needed = 1;
2144 ost->resample_sample_fmt = icodec->sample_fmt;
2145 ost->resample_sample_rate = icodec->sample_rate;
2146 ost->resample_channels = icodec->channels;
2148 case AVMEDIA_TYPE_VIDEO:
2149 if (codec->pix_fmt == PIX_FMT_NONE)
2150 codec->pix_fmt = icodec->pix_fmt;
2151 choose_pixel_fmt(ost->st, ost->enc);
2153 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2154 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2158 if (!codec->width || !codec->height) {
2159 codec->width = icodec->width;
2160 codec->height = icodec->height;
2163 ost->video_resample = codec->width != icodec->width ||
2164 codec->height != icodec->height ||
2165 codec->pix_fmt != icodec->pix_fmt;
2166 if (ost->video_resample) {
2167 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2170 ost->resample_height = icodec->height;
2171 ost->resample_width = icodec->width;
2172 ost->resample_pix_fmt= icodec->pix_fmt;
2173 ost->encoding_needed = 1;
2174 ist->decoding_needed = 1;
2176 if (!ost->frame_rate.num)
2177 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2178 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2179 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2180 ost->frame_rate = ost->enc->supported_framerates[idx];
2182 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2183 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2184 && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
2185 av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2186 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2190 if (configure_video_filters(ist, ost)) {
2191 fprintf(stderr, "Error opening filters!\n");
2196 case AVMEDIA_TYPE_SUBTITLE:
2197 ost->encoding_needed = 1;
2198 ist->decoding_needed = 1;
2205 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2206 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2207 char logfilename[1024];
2210 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2211 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2213 if (codec->flags & CODEC_FLAG_PASS1) {
2214 f = fopen(logfilename, "wb");
2216 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2222 size_t logbuffer_size;
2223 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2224 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2227 codec->stats_in = logbuffer;
2231 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2232 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2233 int size= codec->width * codec->height;
2234 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2239 bit_buffer = av_malloc(bit_buffer_size);
2241 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2243 return AVERROR(ENOMEM);
2246 /* open each encoder */
2247 for (i = 0; i < nb_output_streams; i++) {
2248 ost = &output_streams[i];
2249 if (ost->encoding_needed) {
2250 AVCodec *codec = ost->enc;
2251 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2253 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d.%d",
2254 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2255 ret = AVERROR(EINVAL);
2258 if (dec->subtitle_header) {
2259 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2260 if (!ost->st->codec->subtitle_header) {
2261 ret = AVERROR(ENOMEM);
2264 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2265 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2267 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2268 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2269 ost->file_index, ost->index);
2270 ret = AVERROR(EINVAL);
2273 assert_codec_experimental(ost->st->codec, 1);
2274 assert_avoptions(ost->opts);
2275 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2276 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2277 "It takes bits/s as argument, not kbits/s\n");
2278 extra_size += ost->st->codec->extradata_size;
2282 /* init input streams */
2283 for (i = 0; i < nb_input_streams; i++)
2284 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2287 /* open files and write file headers */
2288 for (i = 0; i < nb_output_files; i++) {
2289 os = output_files[i].ctx;
2290 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2291 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2292 ret = AVERROR(EINVAL);
2295 // assert_avoptions(output_files[i].opts);
2296 if (strcmp(os->oformat->name, "rtp")) {
2302 /* dump the file output parameters - cannot be done before in case
2304 for(i=0;i<nb_output_files;i++) {
2305 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2308 /* dump the stream mapping */
2310 fprintf(stderr, "Stream mapping:\n");
2311 for (i = 0; i < nb_output_streams;i ++) {
2312 ost = &output_streams[i];
2313 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2314 input_streams[ost->source_index].file_index,
2315 input_streams[ost->source_index].st->index,
2318 if (ost->sync_ist != &input_streams[ost->source_index])
2319 fprintf(stderr, " [sync #%d.%d]",
2320 ost->sync_ist->file_index,
2321 ost->sync_ist->st->index);
2322 if (ost->st->stream_copy)
2323 fprintf(stderr, " (copy)");
2325 fprintf(stderr, " (%s -> %s)", input_streams[ost->source_index].dec ?
2326 input_streams[ost->source_index].dec->name : "?",
2327 ost->enc ? ost->enc->name : "?");
2328 fprintf(stderr, "\n");
2333 fprintf(stderr, "%s\n", error);
2338 print_sdp(output_files, nb_output_files);
2345 * The following code is the main loop of the file converter
2347 static int transcode(OutputFile *output_files,
2348 int nb_output_files,
2349 InputFile *input_files,
2353 AVFormatContext *is, *os;
2357 int no_packet_count=0;
2358 int64_t timer_start;
2361 if (!(no_packet = av_mallocz(nb_input_files)))
2364 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2370 fprintf(stderr, "Press [q] to stop, [?] for help\n");
2371 avio_set_interrupt_cb(decode_interrupt_cb);
2375 timer_start = av_gettime();
2377 for(; received_sigterm == 0;) {
2378 int file_index, ist_index;
2383 ipts_min= INT64_MAX;
2385 /* if 'q' pressed, exits */
2389 /* read_key() returns 0 on EOF */
2393 if (key == '+') verbose++;
2394 if (key == '-') verbose--;
2395 if (key == 's') qp_hist ^= 1;
2398 do_hex_dump = do_pkt_dump = 0;
2399 } else if(do_pkt_dump){
2403 av_log_set_level(AV_LOG_DEBUG);
2406 if (key == 'c' || key == 'C'){
2407 char ret[4096], target[64], cmd[256], arg[256]={0};
2410 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2412 while((k=read_key()) !='\n' && k!='\r' && i<sizeof(ret)-1)
2413 if(k>0) ret[i++]= k;
2415 if(k>0 && sscanf(ret, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &ts, cmd, arg) >= 3){
2416 for(i=0;i<nb_output_streams;i++) {
2418 ost = &output_streams[i];
2421 r= avfilter_graph_send_command(ost->graph, target, cmd, arg, ret, sizeof(ret), key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
2422 fprintf(stderr, "Command reply for %d: %d, %s\n", i, r, ret);
2424 r= avfilter_graph_queue_command(ost->graph, target, cmd, arg, 0, ts);
2429 fprintf(stderr, "Parse error\n");
2433 if (key == 'd' || key == 'D'){
2436 debug = input_streams[0].st->codec->debug<<1;
2437 if(!debug) debug = 1;
2438 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2441 scanf("%d", &debug);
2442 for(i=0;i<nb_input_streams;i++) {
2443 input_streams[i].st->codec->debug = debug;
2445 for(i=0;i<nb_output_streams;i++) {
2446 ost = &output_streams[i];
2447 ost->st->codec->debug = debug;
2449 if(debug) av_log_set_level(AV_LOG_DEBUG);
2450 fprintf(stderr,"debug=%d\n", debug);
2453 fprintf(stderr, "key function\n"
2454 "? show this help\n"
2455 "+ increase verbosity\n"
2456 "- decrease verbosity\n"
2457 "c Send command to filtergraph\n"
2458 "D cycle through available debug modes\n"
2459 "h dump packets/hex press to cycle through the 3 states\n"
2461 "s Show QP histogram\n"
2466 /* select the stream that we must read now by looking at the
2467 smallest output pts */
2469 for (i = 0; i < nb_output_streams; i++) {
2473 ost = &output_streams[i];
2474 of = &output_files[ost->file_index];
2475 os = output_files[ost->file_index].ctx;
2476 ist = &input_streams[ost->source_index];
2477 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2478 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2480 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2482 if (!input_files[ist->file_index].eof_reached){
2483 if(ipts < ipts_min) {
2485 if(input_sync ) file_index = ist->file_index;
2487 if(opts < opts_min) {
2489 if(!input_sync) file_index = ist->file_index;
2492 if (ost->frame_number >= ost->max_frames) {
2494 for (j = of->ost_index; j < of->ctx->nb_streams; j++)
2495 output_streams[j].is_past_recording_time = 1;
2499 /* if none, if is finished */
2500 if (file_index < 0) {
2501 if(no_packet_count){
2503 memset(no_packet, 0, nb_input_files);
2510 /* read a frame from it and output it in the fifo */
2511 is = input_files[file_index].ctx;
2512 ret= av_read_frame(is, &pkt);
2513 if(ret == AVERROR(EAGAIN)){
2514 no_packet[file_index]=1;
2519 input_files[file_index].eof_reached = 1;
2527 memset(no_packet, 0, nb_input_files);
2530 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2531 is->streams[pkt.stream_index]);
2533 /* the following test is needed in case new streams appear
2534 dynamically in stream : we ignore them */
2535 if (pkt.stream_index >= input_files[file_index].nb_streams)
2536 goto discard_packet;
2537 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2538 ist = &input_streams[ist_index];
2540 goto discard_packet;
2542 if (pkt.dts != AV_NOPTS_VALUE)
2543 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2544 if (pkt.pts != AV_NOPTS_VALUE)
2545 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2547 if(pkt.pts != AV_NOPTS_VALUE)
2548 pkt.pts *= ist->ts_scale;
2549 if(pkt.dts != AV_NOPTS_VALUE)
2550 pkt.dts *= ist->ts_scale;
2552 // 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);
2553 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2554 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2555 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2556 int64_t delta= pkt_dts - ist->next_pts;
2557 if((delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
2558 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
2559 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
2560 pkt_dts+1<ist->pts)&& !copy_ts){
2561 input_files[ist->file_index].ts_offset -= delta;
2563 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2564 delta, input_files[ist->file_index].ts_offset);
2565 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2566 if(pkt.pts != AV_NOPTS_VALUE)
2567 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2571 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2572 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2575 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2576 ist->file_index, ist->st->index);
2579 av_free_packet(&pkt);
2584 av_free_packet(&pkt);
2586 /* dump report by using the output first video and audio streams */
2587 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2590 /* at the end of stream, we must flush the decoder buffers */
2591 for (i = 0; i < nb_input_streams; i++) {
2592 ist = &input_streams[i];
2593 if (ist->decoding_needed) {
2594 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2597 flush_encoders(output_streams, nb_output_streams);
2601 /* write the trailer if needed and close file */
2602 for(i=0;i<nb_output_files;i++) {
2603 os = output_files[i].ctx;
2604 av_write_trailer(os);
2607 /* dump report by using the first video and audio streams */
2608 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2610 /* close each encoder */
2611 for (i = 0; i < nb_output_streams; i++) {
2612 ost = &output_streams[i];
2613 if (ost->encoding_needed) {
2614 av_freep(&ost->st->codec->stats_in);
2615 avcodec_close(ost->st->codec);
2618 avfilter_graph_free(&ost->graph);
2622 /* close each decoder */
2623 for (i = 0; i < nb_input_streams; i++) {
2624 ist = &input_streams[i];
2625 if (ist->decoding_needed) {
2626 avcodec_close(ist->st->codec);
2634 av_freep(&bit_buffer);
2635 av_freep(&no_packet);
2637 if (output_streams) {
2638 for (i = 0; i < nb_output_streams; i++) {
2639 ost = &output_streams[i];
2641 if (ost->st->stream_copy)
2642 av_freep(&ost->st->codec->extradata);
2644 fclose(ost->logfile);
2645 ost->logfile = NULL;
2647 av_fifo_free(ost->fifo); /* works even if fifo is not
2648 initialized but set to zero */
2649 av_freep(&ost->st->codec->subtitle_header);
2650 av_free(ost->resample_frame.data[0]);
2651 av_free(ost->forced_kf_pts);
2652 if (ost->video_resample)
2653 sws_freeContext(ost->img_resample_ctx);
2655 audio_resample_close(ost->resample);
2656 if (ost->reformat_ctx)
2657 av_audio_convert_free(ost->reformat_ctx);
2658 av_dict_free(&ost->opts);
2665 static int opt_video_rc_override_string(const char *opt, const char *arg)
2667 video_rc_override_string = arg;
2671 static int opt_me_threshold(const char *opt, const char *arg)
2673 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2677 static int opt_verbose(const char *opt, const char *arg)
2679 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2683 static int opt_frame_rate(const char *opt, const char *arg)
2685 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2686 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2692 static int opt_frame_crop(const char *opt, const char *arg)
2694 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2695 return AVERROR(EINVAL);
2698 static int opt_frame_size(const char *opt, const char *arg)
2700 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2701 fprintf(stderr, "Incorrect frame size\n");
2702 return AVERROR(EINVAL);
2707 static int opt_pad(const char *opt, const char *arg) {
2708 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2712 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2714 if (strcmp(arg, "list")) {
2715 frame_pix_fmt = av_get_pix_fmt(arg);
2716 if (frame_pix_fmt == PIX_FMT_NONE) {
2717 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2718 return AVERROR(EINVAL);
2721 opt_pix_fmts(NULL, NULL);
2727 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2734 p = strchr(arg, ':');
2736 x = strtol(arg, &end, 10);
2738 y = strtol(end+1, &end, 10);
2740 ar = (double)x / (double)y;
2742 ar = strtod(arg, NULL);
2745 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2746 return AVERROR(EINVAL);
2748 frame_aspect_ratio = ar;
2752 static int opt_qscale(const char *opt, const char *arg)
2754 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2755 if (video_qscale <= 0 || video_qscale > 255) {
2756 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2757 return AVERROR(EINVAL);
2762 static int opt_top_field_first(const char *opt, const char *arg)
2764 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2765 return opt_default(opt, arg);
2768 static int opt_thread_count(const char *opt, const char *arg)
2770 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2773 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2778 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2780 if (strcmp(arg, "list")) {
2781 audio_sample_fmt = av_get_sample_fmt(arg);
2782 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2783 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2784 return AVERROR(EINVAL);
2789 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2790 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2796 static int opt_audio_rate(const char *opt, const char *arg)
2798 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2802 static int opt_video_channel(const char *opt, const char *arg)
2804 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
2805 return opt_default("channel", arg);
2808 static int opt_video_standard(const char *opt, const char *arg)
2810 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
2811 return opt_default("standard", arg);
2814 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2816 audio_codec_name = arg;
2817 return parse_option(o, "codec:a", arg, options);
2820 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2822 video_codec_name = arg;
2823 return parse_option(o, "codec:v", arg, options);
2826 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2828 subtitle_codec_name = arg;
2829 return parse_option(o, "codec:s", arg, options);
2832 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2834 return parse_option(o, "codec:d", arg, options);
2837 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2839 StreamMap *m = NULL;
2840 int i, negative = 0, file_idx;
2841 int sync_file_idx = -1, sync_stream_idx;
2849 map = av_strdup(arg);
2851 /* parse sync stream first, just pick first matching stream */
2852 if (sync = strchr(map, ',')) {
2854 sync_file_idx = strtol(sync + 1, &sync, 0);
2855 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2856 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2861 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2862 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2863 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2864 sync_stream_idx = i;
2867 if (i == input_files[sync_file_idx].nb_streams) {
2868 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2869 "match any streams.\n", arg);
2875 file_idx = strtol(map, &p, 0);
2876 if (file_idx >= nb_input_files || file_idx < 0) {
2877 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2881 /* disable some already defined maps */
2882 for (i = 0; i < o->nb_stream_maps; i++) {
2883 m = &o->stream_maps[i];
2884 if (check_stream_specifier(input_files[m->file_index].ctx,
2885 input_files[m->file_index].ctx->streams[m->stream_index],
2886 *p == ':' ? p + 1 : p) > 0)
2890 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2891 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2892 *p == ':' ? p + 1 : p) <= 0)
2894 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2895 &o->nb_stream_maps, o->nb_stream_maps + 1);
2896 m = &o->stream_maps[o->nb_stream_maps - 1];
2898 m->file_index = file_idx;
2899 m->stream_index = i;
2901 if (sync_file_idx >= 0) {
2902 m->sync_file_index = sync_file_idx;
2903 m->sync_stream_index = sync_stream_idx;
2905 m->sync_file_index = file_idx;
2906 m->sync_stream_index = i;
2911 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2919 static void parse_meta_type(char *arg, char *type, int *index)
2929 if (*(++arg) == ':')
2930 *index = strtol(++arg, NULL, 0);
2933 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2940 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
2942 MetadataMap *m, *m1;
2945 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
2946 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
2948 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
2949 m->file = strtol(arg, &p, 0);
2950 parse_meta_type(*p ? p + 1 : p, &m->type, &m->index);
2952 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
2953 if (p = strchr(opt, ':'))
2954 parse_meta_type(p + 1, &m1->type, &m1->index);
2958 if (m->type == 'g' || m1->type == 'g')
2959 o->metadata_global_manual = 1;
2960 if (m->type == 's' || m1->type == 's')
2961 o->metadata_streams_manual = 1;
2962 if (m->type == 'c' || m1->type == 'c')
2963 o->metadata_chapters_manual = 1;
2968 static int opt_map_meta_data(OptionsContext *o, const char *opt, const char *arg)
2970 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
2971 "Use -map_metadata instead.\n");
2972 return opt_map_metadata(o, opt, arg);
2975 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
2978 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
2979 struct tm time = *gmtime((time_t*)&recording_timestamp);
2980 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
2981 parse_option(o, "metadata", buf, options);
2983 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
2984 "tag instead.\n", opt);
2988 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2990 const char *codec_string = encoder ? "encoder" : "decoder";
2994 return CODEC_ID_NONE;
2996 avcodec_find_encoder_by_name(name) :
2997 avcodec_find_decoder_by_name(name);
2999 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
3002 if(codec->type != type) {
3003 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
3009 static AVCodec *choose_codec(OptionsContext *o, AVFormatContext *s, AVStream *st, enum AVMediaType type)
3011 char *codec_name = NULL;
3013 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
3017 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
3018 return avcodec_find_encoder(st->codec->codec_id);
3020 } else if (!strcmp(codec_name, "copy"))
3021 st->stream_copy = 1;
3023 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
3024 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
3025 avcodec_find_decoder_by_name(codec_name);
3032 * Add all the streams from the given input file to the global
3033 * list of input streams.
3035 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
3037 int i, rfps, rfps_base;
3039 for (i = 0; i < ic->nb_streams; i++) {
3040 AVStream *st = ic->streams[i];
3041 AVCodecContext *dec = st->codec;
3045 dec->thread_count = thread_count;
3047 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3048 ist = &input_streams[nb_input_streams - 1];
3050 ist->file_index = nb_input_files;
3052 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
3054 MATCH_PER_STREAM_OPT(ts_scale, dbl, scale, ic, st);
3055 ist->ts_scale = scale;
3057 ist->dec = choose_codec(o, ic, st, dec->codec_type);
3059 ist->dec = avcodec_find_decoder(dec->codec_id);
3061 switch (dec->codec_type) {
3062 case AVMEDIA_TYPE_AUDIO:
3064 ist->dec = avcodec_find_decoder(dec->codec_id);
3065 if(o->audio_disable)
3066 st->discard= AVDISCARD_ALL;
3068 case AVMEDIA_TYPE_VIDEO:
3070 ist->dec = avcodec_find_decoder(dec->codec_id);
3071 rfps = ic->streams[i]->r_frame_rate.num;
3072 rfps_base = ic->streams[i]->r_frame_rate.den;
3074 dec->flags |= CODEC_FLAG_EMU_EDGE;
3077 dec->debug |= FF_DEBUG_MV;
3079 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3082 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3083 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3085 (float)rfps / rfps_base, rfps, rfps_base);
3088 if (o->video_disable)
3089 st->discard= AVDISCARD_ALL;
3090 else if(video_discard)
3091 st->discard= video_discard;
3093 case AVMEDIA_TYPE_DATA:
3095 case AVMEDIA_TYPE_SUBTITLE:
3097 ist->dec = avcodec_find_decoder(dec->codec_id);
3098 if(o->subtitle_disable)
3099 st->discard = AVDISCARD_ALL;
3101 case AVMEDIA_TYPE_ATTACHMENT:
3102 case AVMEDIA_TYPE_UNKNOWN:
3110 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
3112 AVFormatContext *ic;
3113 AVInputFormat *file_iformat = NULL;
3117 AVDictionary **opts;
3118 int orig_nb_streams; // number of streams before avformat_find_stream_info
3121 if (!(file_iformat = av_find_input_format(o->format))) {
3122 fprintf(stderr, "Unknown input format: '%s'\n", o->format);
3127 if (!strcmp(filename, "-"))
3130 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3131 !strcmp(filename, "/dev/stdin");
3133 /* get default parameters from command line */
3134 ic = avformat_alloc_context();
3136 print_error(filename, AVERROR(ENOMEM));
3139 if (audio_sample_rate) {
3140 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
3141 av_dict_set(&format_opts, "sample_rate", buf, 0);
3143 if (o->nb_audio_channels) {
3144 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
3145 av_dict_set(&format_opts, "channels", buf, 0);
3147 if (frame_rate.num) {
3148 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
3149 av_dict_set(&format_opts, "framerate", buf, 0);
3151 if (frame_width && frame_height) {
3152 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
3153 av_dict_set(&format_opts, "video_size", buf, 0);
3155 if (frame_pix_fmt != PIX_FMT_NONE)
3156 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
3158 ic->flags |= AVFMT_FLAG_NONBLOCK;
3161 av_log(NULL, AV_LOG_WARNING, "-loop_input is deprecated, use -loop 1\n");
3162 ic->loop_input = loop_input;
3165 /* open the input file with generic libav function */
3166 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3168 print_error(filename, err);
3171 assert_avoptions(format_opts);
3176 for(i=0; i<ic->nb_streams; i++){
3177 ic->streams[i]->discard= AVDISCARD_ALL;
3179 for(i=0; i<ic->nb_programs; i++){
3180 AVProgram *p= ic->programs[i];
3181 if(p->id != opt_programid){
3182 p->discard = AVDISCARD_ALL;
3185 for(j=0; j<p->nb_stream_indexes; j++){
3186 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3191 fprintf(stderr, "Specified program id not found\n");
3197 /* apply forced codec ids */
3198 for (i = 0; i < ic->nb_streams; i++)
3199 choose_codec(o, ic, ic->streams[i], ic->streams[i]->codec->codec_type);
3201 /* Set AVCodecContext options for avformat_find_stream_info */
3202 opts = setup_find_stream_info_opts(ic, codec_opts);
3203 orig_nb_streams = ic->nb_streams;
3205 /* If not enough info to get the stream parameters, we decode the
3206 first frames to get it. (used in mpeg case for example) */
3207 ret = avformat_find_stream_info(ic, opts);
3208 if (ret < 0 && verbose >= 0) {
3209 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3210 av_close_input_file(ic);
3214 timestamp = o->start_time;
3215 /* add the stream start time */
3216 if (ic->start_time != AV_NOPTS_VALUE)
3217 timestamp += ic->start_time;
3219 /* if seeking requested, we execute it */
3220 if (o->start_time != 0) {
3221 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3223 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3224 filename, (double)timestamp / AV_TIME_BASE);
3228 /* update the current parameters so that they match the one of the input stream */
3229 add_input_streams(o, ic);
3231 /* dump the file content */
3233 av_dump_format(ic, nb_input_files, filename, 0);
3235 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3236 input_files[nb_input_files - 1].ctx = ic;
3237 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3238 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3239 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3240 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
3242 top_field_first = -1;
3243 frame_rate = (AVRational){0, 0};
3244 frame_pix_fmt = PIX_FMT_NONE;
3247 audio_sample_rate = 0;
3248 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3250 for (i = 0; i < orig_nb_streams; i++)
3251 av_dict_free(&opts[i]);
3254 reset_options(o, 1);
3258 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3259 AVCodecContext *avctx)
3265 for (p = kf; *p; p++)
3268 ost->forced_kf_count = n;
3269 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3270 if (!ost->forced_kf_pts) {
3271 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3274 for (i = 0; i < n; i++) {
3275 p = i ? strchr(p, ',') + 1 : kf;
3276 t = parse_time_or_die("force_key_frames", p, 1);
3277 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3281 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3284 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3285 int idx = oc->nb_streams - 1;
3286 int64_t max_frames = INT64_MAX;
3287 char *bsf = NULL, *next, *codec_tag = NULL;
3288 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3291 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3295 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3296 nb_output_streams + 1);
3297 ost = &output_streams[nb_output_streams - 1];
3298 ost->file_index = nb_output_files;
3301 st->codec->codec_type = type;
3302 ost->enc = choose_codec(o, oc, st, type);
3304 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3307 avcodec_get_context_defaults3(st->codec, ost->enc);
3308 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3310 MATCH_PER_STREAM_OPT(max_frames, i64, max_frames, oc, st);
3311 ost->max_frames = max_frames;
3313 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3315 if (next = strchr(bsf, ','))
3317 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3318 av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter %s\n", bsf);
3322 bsfc_prev->next = bsfc;
3324 ost->bitstream_filters = bsfc;
3330 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3332 uint32_t tag = strtol(codec_tag, &next, 0);
3334 tag = AV_RL32(codec_tag);
3335 st->codec->codec_tag = tag;
3338 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3342 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3346 AVCodecContext *video_enc;
3348 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3350 if (!st->stream_copy) {
3351 ost->frame_aspect_ratio = frame_aspect_ratio;
3352 frame_aspect_ratio = 0;
3354 ost->avfilter = vfilters;
3359 st->codec->thread_count= thread_count;
3361 video_enc = st->codec;
3363 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3364 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3367 if (st->stream_copy) {
3368 video_enc->sample_aspect_ratio =
3369 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3375 ost->frame_rate = frame_rate;
3377 video_enc->width = frame_width;
3378 video_enc->height = frame_height;
3379 video_enc->pix_fmt = frame_pix_fmt;
3380 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3381 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3384 video_enc->gop_size = 0;
3385 if (video_qscale || same_quant) {
3386 video_enc->flags |= CODEC_FLAG_QSCALE;
3387 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3391 video_enc->intra_matrix = intra_matrix;
3393 video_enc->inter_matrix = inter_matrix;
3395 p= video_rc_override_string;
3398 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3400 fprintf(stderr, "error parsing rc_override\n");
3403 video_enc->rc_override=
3404 av_realloc(video_enc->rc_override,
3405 sizeof(RcOverride)*(i+1));
3406 video_enc->rc_override[i].start_frame= start;
3407 video_enc->rc_override[i].end_frame = end;
3409 video_enc->rc_override[i].qscale= q;
3410 video_enc->rc_override[i].quality_factor= 1.0;
3413 video_enc->rc_override[i].qscale= 0;
3414 video_enc->rc_override[i].quality_factor= -q/100.0;
3419 video_enc->rc_override_count=i;
3420 if (!video_enc->rc_initial_buffer_occupancy)
3421 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3422 video_enc->me_threshold= me_threshold;
3423 video_enc->intra_dc_precision= intra_dc_precision - 8;
3426 video_enc->flags|= CODEC_FLAG_PSNR;
3431 video_enc->flags |= CODEC_FLAG_PASS1;
3433 video_enc->flags |= CODEC_FLAG_PASS2;
3437 if (forced_key_frames)
3438 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3441 /* reset some key parameters */
3442 av_freep(&forced_key_frames);
3443 frame_pix_fmt = PIX_FMT_NONE;
3447 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3451 AVCodecContext *audio_enc;
3453 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3456 st->codec->thread_count= thread_count;
3458 audio_enc = st->codec;
3459 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3461 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3462 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3464 if (!st->stream_copy) {
3465 if (audio_qscale > QSCALE_NONE) {
3466 audio_enc->flags |= CODEC_FLAG_QSCALE;
3467 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3469 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3471 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3472 audio_enc->sample_fmt = audio_sample_fmt;
3473 if (audio_sample_rate)
3474 audio_enc->sample_rate = audio_sample_rate;
3480 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3484 AVCodecContext *data_enc;
3486 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3488 data_enc = st->codec;
3489 if (!st->stream_copy) {
3490 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3494 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3495 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3501 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3505 AVCodecContext *subtitle_enc;
3507 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3509 subtitle_enc = st->codec;
3511 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3513 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3514 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3520 /* arg format is "output-stream-index:streamid-value". */
3521 static int opt_streamid(const char *opt, const char *arg)
3527 av_strlcpy(idx_str, arg, sizeof(idx_str));
3528 p = strchr(idx_str, ':');
3531 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3536 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3537 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3538 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3542 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3544 AVFormatContext *is = ifile->ctx;
3545 AVFormatContext *os = ofile->ctx;
3548 for (i = 0; i < is->nb_chapters; i++) {
3549 AVChapter *in_ch = is->chapters[i], *out_ch;
3550 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3551 AV_TIME_BASE_Q, in_ch->time_base);
3552 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3553 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3556 if (in_ch->end < ts_off)
3558 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3561 out_ch = av_mallocz(sizeof(AVChapter));
3563 return AVERROR(ENOMEM);
3565 out_ch->id = in_ch->id;
3566 out_ch->time_base = in_ch->time_base;
3567 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3568 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3571 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3574 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3576 return AVERROR(ENOMEM);
3577 os->chapters[os->nb_chapters - 1] = out_ch;
3582 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3585 AVFormatContext *ic = NULL;
3587 err = avformat_open_input(&ic, filename, NULL, NULL);
3590 /* copy stream format */
3591 for(i=0;i<ic->nb_streams;i++) {
3596 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3597 ost = new_output_stream(o, s, codec->type);
3600 // FIXME: a more elegant solution is needed
3601 memcpy(st, ic->streams[i], sizeof(AVStream));
3602 st->info = av_malloc(sizeof(*st->info));
3603 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
3604 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3606 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3607 choose_sample_fmt(st, codec);
3608 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3609 choose_pixel_fmt(st, codec);
3612 av_close_input_file(ic);
3616 static void opt_output_file(void *optctx, const char *filename)
3618 OptionsContext *o = optctx;
3619 AVFormatContext *oc;
3621 AVOutputFormat *file_oformat;
3625 if (!strcmp(filename, "-"))
3628 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
3630 print_error(filename, err);
3633 file_oformat= oc->oformat;
3635 if (!strcmp(file_oformat->name, "ffm") &&
3636 av_strstart(filename, "http:", NULL)) {
3637 /* special case for files sent to ffserver: we get the stream
3638 parameters from ffserver */
3639 int err = read_ffserver_streams(o, oc, filename);
3641 print_error(filename, err);
3644 } else if (!o->nb_stream_maps) {
3645 /* pick the "best" stream of each type */
3646 #define NEW_STREAM(type, index)\
3648 ost = new_ ## type ## _stream(o, oc);\
3649 ost->source_index = index;\
3650 ost->sync_ist = &input_streams[index];\
3651 input_streams[index].discard = 0;\
3654 /* video: highest resolution */
3655 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3656 int area = 0, idx = -1;
3657 for (i = 0; i < nb_input_streams; i++) {
3658 ist = &input_streams[i];
3659 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3660 ist->st->codec->width * ist->st->codec->height > area) {
3661 area = ist->st->codec->width * ist->st->codec->height;
3665 NEW_STREAM(video, idx);
3668 /* audio: most channels */
3669 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3670 int channels = 0, idx = -1;
3671 for (i = 0; i < nb_input_streams; i++) {
3672 ist = &input_streams[i];
3673 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3674 ist->st->codec->channels > channels) {
3675 channels = ist->st->codec->channels;
3679 NEW_STREAM(audio, idx);
3682 /* subtitles: pick first */
3683 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
3684 for (i = 0; i < nb_input_streams; i++)
3685 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3686 NEW_STREAM(subtitle, i);
3690 /* do something with data? */
3692 for (i = 0; i < o->nb_stream_maps; i++) {
3693 StreamMap *map = &o->stream_maps[i];
3698 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3699 switch (ist->st->codec->codec_type) {
3700 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3701 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3702 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3703 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3705 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3706 map->file_index, map->stream_index);
3710 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3711 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3712 map->sync_stream_index];
3717 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3718 output_files[nb_output_files - 1].ctx = oc;
3719 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3720 output_files[nb_output_files - 1].recording_time = o->recording_time;
3721 output_files[nb_output_files - 1].start_time = o->start_time;
3722 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3723 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3725 /* check filename in case of an image number is expected */
3726 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3727 if (!av_filename_number_test(oc->filename)) {
3728 print_error(oc->filename, AVERROR(EINVAL));
3733 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3734 /* test if it already exists to avoid loosing precious files */
3735 if (!file_overwrite &&
3736 (strchr(filename, ':') == NULL ||
3737 filename[1] == ':' ||
3738 av_strstart(filename, "file:", NULL))) {
3739 if (avio_check(filename, 0) == 0) {
3741 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3743 if (!read_yesno()) {
3744 fprintf(stderr, "Not overwriting - exiting\n");
3749 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3756 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3757 print_error(filename, err);
3762 oc->preload = (int)(o->mux_preload * AV_TIME_BASE);
3763 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
3765 if (loop_output >= 0) {
3766 av_log(NULL, AV_LOG_WARNING, "-loop_output is deprecated, use -loop\n");
3767 oc->loop_output = loop_output;
3771 if (o->chapters_input_file >= nb_input_files) {
3772 if (o->chapters_input_file == INT_MAX) {
3773 /* copy chapters from the first input file that has them*/
3774 o->chapters_input_file = -1;
3775 for (i = 0; i < nb_input_files; i++)
3776 if (input_files[i].ctx->nb_chapters) {
3777 o->chapters_input_file = i;
3781 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3782 o->chapters_input_file);
3786 if (o->chapters_input_file >= 0)
3787 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
3788 o->metadata_chapters_manual);
3791 for (i = 0; i < o->nb_meta_data_maps; i++) {
3792 AVFormatContext *files[2];
3793 AVDictionary **meta[2];
3796 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3797 if ((index) < 0 || (index) >= (nb_elems)) {\
3798 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3803 int in_file_index = o->meta_data_maps[i][1].file;
3804 if (in_file_index < 0)
3806 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3809 files[1] = input_files[in_file_index].ctx;
3811 for (j = 0; j < 2; j++) {
3812 MetadataMap *map = &o->meta_data_maps[i][j];
3814 switch (map->type) {
3816 meta[j] = &files[j]->metadata;
3819 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3820 meta[j] = &files[j]->streams[map->index]->metadata;
3823 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3824 meta[j] = &files[j]->chapters[map->index]->metadata;
3827 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3828 meta[j] = &files[j]->programs[map->index]->metadata;
3833 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3836 /* copy global metadata by default */
3837 if (!o->metadata_global_manual && nb_input_files){
3838 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3839 AV_DICT_DONT_OVERWRITE);
3840 if(o->recording_time != INT64_MAX)
3841 av_dict_set(&oc->metadata, "duration", NULL, 0);
3843 if (!o->metadata_streams_manual)
3844 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3845 InputStream *ist = &input_streams[output_streams[i].source_index];
3846 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3849 /* process manually set metadata */
3850 for (i = 0; i < o->nb_metadata; i++) {
3855 val = strchr(o->metadata[i].u.str, '=');
3857 av_log(NULL, AV_LOG_ERROR, "No '=' character in metadata string %s.\n",
3858 o->metadata[i].u.str);
3863 parse_meta_type(o->metadata[i].specifier, &type, &index);
3869 if (index < 0 || index >= oc->nb_streams) {
3870 av_log(NULL, AV_LOG_ERROR, "Invalid stream index %d in metadata specifier.\n", index);
3873 m = &oc->streams[i]->metadata;
3876 if (index < 0 || index >= oc->nb_chapters) {
3877 av_log(NULL, AV_LOG_ERROR, "Invalid chapter index %d in metadata specifier.\n", index);
3880 m = &oc->chapters[i]->metadata;
3883 av_log(NULL, AV_LOG_ERROR, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
3887 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
3890 frame_rate = (AVRational){0, 0};
3893 audio_sample_rate = 0;
3894 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3896 av_freep(&streamid_map);
3897 nb_streamid_map = 0;
3899 av_freep(&forced_key_frames);
3900 reset_options(o, 0);
3903 /* same option as mencoder */
3904 static int opt_pass(const char *opt, const char *arg)
3906 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3910 static int64_t getutime(void)
3913 struct rusage rusage;
3915 getrusage(RUSAGE_SELF, &rusage);
3916 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3917 #elif HAVE_GETPROCESSTIMES
3919 FILETIME c, e, k, u;
3920 proc = GetCurrentProcess();
3921 GetProcessTimes(proc, &c, &e, &k, &u);
3922 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3924 return av_gettime();
3928 static int64_t getmaxrss(void)
3930 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3931 struct rusage rusage;
3932 getrusage(RUSAGE_SELF, &rusage);
3933 return (int64_t)rusage.ru_maxrss * 1024;
3934 #elif HAVE_GETPROCESSMEMORYINFO
3936 PROCESS_MEMORY_COUNTERS memcounters;
3937 proc = GetCurrentProcess();
3938 memcounters.cb = sizeof(memcounters);
3939 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3940 return memcounters.PeakPagefileUsage;
3946 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3949 const char *p = str;
3956 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3963 static int opt_inter_matrix(const char *opt, const char *arg)
3965 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3966 parse_matrix_coeffs(inter_matrix, arg);
3970 static int opt_intra_matrix(const char *opt, const char *arg)
3972 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3973 parse_matrix_coeffs(intra_matrix, arg);
3977 static void show_usage(void)
3979 printf("Hyper fast Audio and Video encoder\n");
3980 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3984 static int opt_help(const char *opt, const char *arg)
3987 AVOutputFormat *oformat = NULL;
3988 AVInputFormat *iformat = NULL;
3989 const AVClass *class;
3991 av_log_set_callback(log_callback_help);
3993 show_help_options(options, "Main options:\n",
3994 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3995 show_help_options(options, "\nAdvanced options:\n",
3996 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3998 show_help_options(options, "\nVideo options:\n",
3999 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4001 show_help_options(options, "\nAdvanced Video options:\n",
4002 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4003 OPT_VIDEO | OPT_EXPERT);
4004 show_help_options(options, "\nAudio options:\n",
4005 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4007 show_help_options(options, "\nAdvanced Audio options:\n",
4008 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4009 OPT_AUDIO | OPT_EXPERT);
4010 show_help_options(options, "\nSubtitle options:\n",
4011 OPT_SUBTITLE | OPT_GRAB,
4013 show_help_options(options, "\nAudio/Video grab options:\n",
4017 class = avcodec_get_class();
4018 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4021 /* individual codec options */
4023 while ((c = av_codec_next(c))) {
4024 if (c->priv_class) {
4025 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4030 class = avformat_get_class();
4031 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4034 /* individual muxer options */
4035 while ((oformat = av_oformat_next(oformat))) {
4036 if (oformat->priv_class) {
4037 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4042 /* individual demuxer options */
4043 while ((iformat = av_iformat_next(iformat))) {
4044 if (iformat->priv_class) {
4045 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
4050 class = sws_get_class();
4051 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4055 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
4057 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4058 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4060 if(!strncmp(arg, "pal-", 4)) {
4063 } else if(!strncmp(arg, "ntsc-", 5)) {
4066 } else if(!strncmp(arg, "film-", 5)) {
4071 /* Calculate FR via float to avoid int overflow */
4072 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4075 } else if((fr == 29970) || (fr == 23976)) {
4078 /* Try to determine PAL/NTSC by peeking in the input files */
4079 if(nb_input_files) {
4081 for (j = 0; j < nb_input_files; j++) {
4082 for (i = 0; i < input_files[j].nb_streams; i++) {
4083 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4084 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4086 fr = c->time_base.den * 1000 / c->time_base.num;
4090 } else if((fr == 29970) || (fr == 23976)) {
4100 if(verbose > 0 && norm != UNKNOWN)
4101 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4104 if(norm == UNKNOWN) {
4105 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4106 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4107 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4111 if(!strcmp(arg, "vcd")) {
4112 opt_video_codec(o, "c:v", "mpeg1video");
4113 opt_audio_codec(o, "c:a", "mp2");
4114 parse_option(o, "f", "vcd", options);
4116 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4117 opt_frame_rate("r", frame_rates[norm]);
4118 opt_default("g", norm == PAL ? "15" : "18");
4120 opt_default("b", "1150000");
4121 opt_default("maxrate", "1150000");
4122 opt_default("minrate", "1150000");
4123 opt_default("bufsize", "327680"); // 40*1024*8;
4125 opt_default("b:a", "224000");
4126 audio_sample_rate = 44100;
4127 parse_option(o, "ac", "2", options);
4129 opt_default("packetsize", "2324");
4130 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4132 /* We have to offset the PTS, so that it is consistent with the SCR.
4133 SCR starts at 36000, but the first two packs contain only padding
4134 and the first pack from the other stream, respectively, may also have
4135 been written before.
4136 So the real data starts at SCR 36000+3*1200. */
4137 o->mux_preload = (36000+3*1200) / 90000.0; //0.44
4138 } else if(!strcmp(arg, "svcd")) {
4140 opt_video_codec(o, "c:v", "mpeg2video");
4141 opt_audio_codec(o, "c:a", "mp2");
4142 parse_option(o, "f", "svcd", options);
4144 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4145 opt_frame_rate("r", frame_rates[norm]);
4146 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4147 opt_default("g", norm == PAL ? "15" : "18");
4149 opt_default("b", "2040000");
4150 opt_default("maxrate", "2516000");
4151 opt_default("minrate", "0"); //1145000;
4152 opt_default("bufsize", "1835008"); //224*1024*8;
4153 opt_default("flags", "+scan_offset");
4156 opt_default("b:a", "224000");
4157 audio_sample_rate = 44100;
4159 opt_default("packetsize", "2324");
4161 } else if(!strcmp(arg, "dvd")) {
4163 opt_video_codec(o, "c:v", "mpeg2video");
4164 opt_audio_codec(o, "c:a", "ac3");
4165 parse_option(o, "f", "dvd", options);
4167 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4168 opt_frame_rate("r", frame_rates[norm]);
4169 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4170 opt_default("g", norm == PAL ? "15" : "18");
4172 opt_default("b", "6000000");
4173 opt_default("maxrate", "9000000");
4174 opt_default("minrate", "0"); //1500000;
4175 opt_default("bufsize", "1835008"); //224*1024*8;
4177 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4178 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4180 opt_default("b:a", "448000");
4181 audio_sample_rate = 48000;
4183 } else if(!strncmp(arg, "dv", 2)) {
4185 parse_option(o, "f", "dv", options);
4187 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4188 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4189 norm == PAL ? "yuv420p" : "yuv411p");
4190 opt_frame_rate("r", frame_rates[norm]);
4192 audio_sample_rate = 48000;
4193 parse_option(o, "ac", "2", options);
4196 fprintf(stderr, "Unknown target: %s\n", arg);
4197 return AVERROR(EINVAL);
4202 static int opt_vstats_file(const char *opt, const char *arg)
4204 av_free (vstats_filename);
4205 vstats_filename=av_strdup (arg);
4209 static int opt_vstats(const char *opt, const char *arg)
4212 time_t today2 = time(NULL);
4213 struct tm *today = localtime(&today2);
4215 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4217 return opt_vstats_file(opt, filename);
4220 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4222 return parse_option(o, "frames:v", arg, options);
4225 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4227 return parse_option(o, "frames:a", arg, options);
4230 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4232 return parse_option(o, "frames:d", arg, options);
4235 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
4238 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4239 char *codec_name = *opt == 'v' ? video_codec_name :
4240 *opt == 'a' ? audio_codec_name :
4241 subtitle_codec_name;
4243 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4244 fprintf(stderr, "File for preset '%s' not found\n", arg);
4249 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4250 if(line[0] == '#' && !e)
4252 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4254 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4257 if(!strcmp(tmp, "acodec")){
4258 opt_audio_codec(o, tmp, tmp2);
4259 }else if(!strcmp(tmp, "vcodec")){
4260 opt_video_codec(o, tmp, tmp2);
4261 }else if(!strcmp(tmp, "scodec")){
4262 opt_subtitle_codec(o, tmp, tmp2);
4263 }else if(!strcmp(tmp, "dcodec")){
4264 opt_data_codec(o, tmp, tmp2);
4265 }else if(opt_default(tmp, tmp2) < 0){
4266 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4276 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4280 static int opt_passlogfile(const char *opt, const char *arg)
4282 pass_logfilename_prefix = arg;
4283 #if CONFIG_LIBX264_ENCODER
4284 return opt_default("passlogfile", arg);
4290 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg){
4291 char *s= av_malloc(strlen(opt)+2);
4292 snprintf(s, strlen(opt)+2, "%s:%c", opt+1, *opt);
4293 return parse_option(o, s, arg, options);
4297 #define OFFSET(x) offsetof(OptionsContext, x)
4298 static const OptionDef options[] = {
4300 #include "cmdutils_common_opts.h"
4301 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4302 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4303 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4304 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4305 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4306 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4307 { "map_meta_data", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4308 "outfile[,metadata]:infile[,metadata]" },
4309 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4310 "outfile[,metadata]:infile[,metadata]" },
4311 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4312 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4313 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4314 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4315 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4316 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4317 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4318 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4319 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4320 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4321 "add timings for benchmarking" },
4322 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4323 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4324 "dump each input packet" },
4325 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4326 "when dumping packets, also dump the payload" },
4327 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4328 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "deprecated, use -loop" },
4329 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "deprecated, use -loop", "" },
4330 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4331 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4332 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4333 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4334 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4335 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4336 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4337 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4338 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4339 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4340 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4341 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4342 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4343 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4344 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4347 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4348 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4349 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4350 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4351 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format, 'list' as argument shows all the pixel formats supported", "format" },
4352 { "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" },
4353 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4354 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4355 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4356 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4357 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4358 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4359 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4360 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4361 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4362 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4363 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4364 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4365 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4366 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4367 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4368 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimation threshold", "threshold" },
4369 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4370 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4371 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4372 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4373 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4374 "deinterlace pictures" },
4375 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4376 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4377 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4379 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4381 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4382 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4383 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4384 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4385 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
4386 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4387 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4388 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4389 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4392 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4393 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4394 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4395 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
4396 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
4397 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4398 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
4399 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4400 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_sample_fmt}, "set sample format, 'list' as argument shows all the sample formats supported", "format" },
4402 /* subtitle options */
4403 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
4404 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4405 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
4408 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
4409 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
4410 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4413 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4414 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4416 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4417 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
4418 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
4420 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4421 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4422 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4423 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4424 /* data codec support */
4425 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4427 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4431 int main(int argc, char **argv)
4433 OptionsContext o = { 0 };
4436 reset_options(&o, 0);
4438 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4440 if(argc>1 && !strcmp(argv[1], "-d")){
4443 av_log_set_callback(log_callback_null);
4448 avcodec_register_all();
4450 avdevice_register_all();
4453 avfilter_register_all();
4458 if(isatty(STDIN_FILENO))
4459 avio_set_interrupt_cb(decode_interrupt_cb);
4466 parse_options(&o, argc, argv, options, opt_output_file);
4468 if(nb_output_files <= 0 && nb_input_files == 0) {
4470 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4474 /* file converter / grab */
4475 if (nb_output_files <= 0) {
4476 fprintf(stderr, "At least one output file must be specified\n");
4480 if (nb_input_files == 0) {
4481 fprintf(stderr, "At least one input file must be specified\n");
4486 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4488 ti = getutime() - ti;
4490 int maxrss = getmaxrss() / 1024;
4491 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);