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/vsink_buffer.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_FILES 100
113 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
114 static const char *last_asked_format = NULL;
115 static double *ts_scale;
116 static int nb_ts_scale;
118 static AVFormatContext *output_files[MAX_FILES];
119 static AVDictionary *output_opts[MAX_FILES];
120 static int nb_output_files = 0;
122 static StreamMap *stream_maps = NULL;
123 static int nb_stream_maps;
125 static AVDictionary *codec_names;
127 /* first item specifies output metadata, second is input */
128 static MetadataMap (*meta_data_maps)[2] = NULL;
129 static int nb_meta_data_maps;
130 static int metadata_global_autocopy = 1;
131 static int metadata_streams_autocopy = 1;
132 static int metadata_chapters_autocopy = 1;
134 static int chapters_input_file = INT_MAX;
136 /* indexed by output file stream index */
137 static int *streamid_map = NULL;
138 static int nb_streamid_map = 0;
140 static int frame_width = 0;
141 static int frame_height = 0;
142 static float frame_aspect_ratio = 0;
143 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
144 static int frame_bits_per_raw_sample = 0;
145 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
146 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
147 static AVRational frame_rate;
148 static float video_qscale = 0;
149 static uint16_t *intra_matrix = NULL;
150 static uint16_t *inter_matrix = NULL;
151 static const char *video_rc_override_string=NULL;
152 static int video_disable = 0;
153 static int video_discard = 0;
154 static unsigned int video_codec_tag = 0;
155 static char *video_language = NULL;
156 static int same_quant = 0;
157 static int do_deinterlace = 0;
158 static int top_field_first = -1;
159 static int me_threshold = 0;
160 static int intra_dc_precision = 8;
161 static int loop_input = 0;
162 static int loop_output = AVFMT_NOOUTPUTLOOP;
163 static int qp_hist = 0;
165 static char *vfilters = NULL;
168 static int intra_only = 0;
169 static int audio_sample_rate = 0;
170 #define QSCALE_NONE -99999
171 static float audio_qscale = QSCALE_NONE;
172 static int audio_disable = 0;
173 static int audio_channels = 0;
174 static unsigned int audio_codec_tag = 0;
175 static char *audio_language = NULL;
177 static int subtitle_disable = 0;
178 static char *subtitle_language = NULL;
179 static unsigned int subtitle_codec_tag = 0;
181 static int data_disable = 0;
182 static unsigned int data_codec_tag = 0;
184 static float mux_preload= 0.5;
185 static float mux_max_delay= 0.7;
187 static int64_t recording_time = INT64_MAX;
188 static int64_t start_time = 0;
189 static int64_t input_ts_offset = 0;
190 static int file_overwrite = 0;
191 static AVDictionary *metadata;
192 static int do_benchmark = 0;
193 static int do_hex_dump = 0;
194 static int do_pkt_dump = 0;
195 static int do_psnr = 0;
196 static int do_pass = 0;
197 static const char *pass_logfilename_prefix;
198 static int video_sync_method= -1;
199 static int audio_sync_method= 0;
200 static float audio_drift_threshold= 0.1;
201 static int copy_ts= 0;
202 static int copy_tb= 0;
203 static int opt_shortest = 0;
204 static char *vstats_filename;
205 static FILE *vstats_file;
206 static int opt_programid = 0;
207 static int copy_initial_nonkeyframes = 0;
209 static int rate_emu = 0;
211 static int audio_volume = 256;
213 static int exit_on_error = 0;
214 static int using_stdin = 0;
215 static int verbose = 1;
216 static int run_as_daemon = 0;
217 static int thread_count= 1;
218 static int q_pressed = 0;
219 static int64_t video_size = 0;
220 static int64_t audio_size = 0;
221 static int64_t extra_size = 0;
222 static int nb_frames_dup = 0;
223 static int nb_frames_drop = 0;
224 static int input_sync;
225 static uint64_t limit_filesize = 0;
226 static int force_fps = 0;
227 static char *forced_key_frames = NULL;
229 static float dts_delta_threshold = 10;
231 static int64_t timer_start;
233 static uint8_t *audio_buf;
234 static uint8_t *audio_out;
235 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
237 static short *samples;
239 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
240 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
241 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
243 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
247 typedef struct OutputStream {
248 int file_index; /* file index */
249 int index; /* stream index in the output file */
250 int source_index; /* InputStream index */
251 AVStream *st; /* stream in the output file */
252 int encoding_needed; /* true if encoding needed for this stream */
254 /* input pts and corresponding output pts
256 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
257 struct InputStream *sync_ist; /* input stream to sync against */
258 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
259 AVBitStreamFilterContext *bitstream_filters;
264 AVFrame resample_frame; /* temporary frame for image resampling */
265 struct SwsContext *img_resample_ctx; /* for image resampling */
268 int resample_pix_fmt;
269 AVRational frame_rate;
271 float frame_aspect_ratio;
273 /* forced key frames */
274 int64_t *forced_kf_pts;
280 ReSampleContext *resample; /* for audio resampling */
281 int resample_sample_fmt;
282 int resample_channels;
283 int resample_sample_rate;
285 AVAudioConvert *reformat_ctx;
286 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
290 AVFilterContext *output_video_filter;
291 AVFilterContext *input_video_filter;
292 AVFilterBufferRef *picref;
294 AVFilterGraph *graph;
301 static OutputStream **output_streams_for_file[MAX_FILES] = { NULL };
302 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
304 typedef struct InputStream {
307 int discard; /* true if stream data should be discarded */
308 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
311 int64_t start; /* time when read started */
312 int64_t next_pts; /* synthetic pts for cases where pkt.pts
314 int64_t pts; /* current pts */
316 int is_start; /* is 1 at the start and after a discontinuity */
317 int showed_multi_packet_warning;
318 int is_past_recording_time;
322 typedef struct InputFile {
323 AVFormatContext *ctx;
324 int eof_reached; /* true if eof reached */
325 int ist_index; /* index of first stream in ist_table */
326 int buffer_size; /* current total buffer size */
333 /* init terminal so that we can grab keys */
334 static struct termios oldtty;
337 static InputStream *input_streams = NULL;
338 static int nb_input_streams = 0;
339 static InputFile *input_files = NULL;
340 static int nb_input_files = 0;
344 static int configure_video_filters(InputStream *ist, OutputStream *ost)
346 AVFilterContext *last_filter, *filter;
347 /** filter graph containing all filters including input & output */
348 AVCodecContext *codec = ost->st->codec;
349 AVCodecContext *icodec = ist->st->codec;
350 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
351 AVRational sample_aspect_ratio;
355 ost->graph = avfilter_graph_alloc();
357 if (ist->st->sample_aspect_ratio.num){
358 sample_aspect_ratio = ist->st->sample_aspect_ratio;
360 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
362 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
363 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
364 sample_aspect_ratio.num, sample_aspect_ratio.den);
366 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
367 "src", args, NULL, ost->graph);
370 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
371 "out", NULL, pix_fmts, ost->graph);
374 last_filter = ost->input_video_filter;
376 if (codec->width != icodec->width || codec->height != icodec->height) {
377 snprintf(args, 255, "%d:%d:flags=0x%X",
381 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
382 NULL, args, NULL, ost->graph)) < 0)
384 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
386 last_filter = filter;
389 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
390 ost->graph->scale_sws_opts = av_strdup(args);
393 AVFilterInOut *outputs = avfilter_inout_alloc();
394 AVFilterInOut *inputs = avfilter_inout_alloc();
396 outputs->name = av_strdup("in");
397 outputs->filter_ctx = last_filter;
398 outputs->pad_idx = 0;
399 outputs->next = NULL;
401 inputs->name = av_strdup("out");
402 inputs->filter_ctx = ost->output_video_filter;
406 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
408 av_freep(&ost->avfilter);
410 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
414 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
417 codec->width = ost->output_video_filter->inputs[0]->w;
418 codec->height = ost->output_video_filter->inputs[0]->h;
419 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
420 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
421 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
422 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
426 #endif /* CONFIG_AVFILTER */
428 static void term_exit(void)
430 av_log(NULL, AV_LOG_QUIET, "%s", "");
433 tcsetattr (0, TCSANOW, &oldtty);
437 static volatile int received_sigterm = 0;
440 sigterm_handler(int sig)
442 received_sigterm = sig;
447 static void term_init(void)
457 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
458 |INLCR|IGNCR|ICRNL|IXON);
459 tty.c_oflag |= OPOST;
460 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
461 tty.c_cflag &= ~(CSIZE|PARENB);
466 tcsetattr (0, TCSANOW, &tty);
467 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
471 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
472 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
474 signal(SIGXCPU, sigterm_handler);
478 /* read a key without blocking */
479 static int read_key(void)
494 n = select(1, &rfds, NULL, NULL, &tv);
509 static int decode_interrupt_cb(void)
511 q_pressed += read_key() == 'q';
512 return q_pressed > 1;
515 static int exit_program(int ret)
520 for(i=0;i<nb_output_files;i++) {
521 AVFormatContext *s = output_files[i];
522 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
524 avformat_free_context(s);
525 av_free(output_streams_for_file[i]);
526 av_dict_free(&output_opts[i]);
528 for(i=0;i<nb_input_files;i++) {
529 av_close_input_file(input_files[i].ctx);
531 for (i = 0; i < nb_input_streams; i++)
532 av_dict_free(&input_streams[i].opts);
534 av_free(intra_matrix);
535 av_free(inter_matrix);
539 av_free(vstats_filename);
541 av_free(streamid_map);
542 av_free(meta_data_maps);
544 av_freep(&input_streams);
545 av_freep(&input_files);
550 allocated_audio_buf_size= allocated_audio_out_size= 0;
557 if (received_sigterm) {
559 "Received signal %d: terminating.\n",
560 (int) received_sigterm);
564 exit(ret); /* not all OS-es handle main() return value */
568 static void assert_avoptions(AVDictionary *m)
570 AVDictionaryEntry *t;
571 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
572 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
577 static void assert_codec_experimental(AVCodecContext *c, int encoder)
579 const char *codec_string = encoder ? "encoder" : "decoder";
581 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
582 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
583 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
584 "results.\nAdd '-strict experimental' if you want to use it.\n",
585 codec_string, c->codec->name);
586 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
587 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
588 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
589 codec_string, codec->name);
594 /* similar to ff_dynarray_add() and av_fast_realloc() */
595 static void *grow_array(void *array, int elem_size, int *size, int new_size)
597 if (new_size >= INT_MAX / elem_size) {
598 fprintf(stderr, "Array too big.\n");
601 if (*size < new_size) {
602 uint8_t *tmp = av_realloc(array, new_size*elem_size);
604 fprintf(stderr, "Could not alloc buffer.\n");
607 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
614 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
616 if(codec && codec->sample_fmts){
617 const enum AVSampleFormat *p= codec->sample_fmts;
619 if(*p == st->codec->sample_fmt)
623 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
624 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
625 if(av_get_sample_fmt_name(st->codec->sample_fmt))
626 av_log(NULL, AV_LOG_WARNING,
627 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
628 av_get_sample_fmt_name(st->codec->sample_fmt),
630 av_get_sample_fmt_name(codec->sample_fmts[0]));
631 st->codec->sample_fmt = codec->sample_fmts[0];
636 static void choose_sample_rate(AVStream *st, AVCodec *codec)
638 if(codec && codec->supported_samplerates){
639 const int *p= codec->supported_samplerates;
641 int best_dist=INT_MAX;
643 int dist= abs(st->codec->sample_rate - *p);
644 if(dist < best_dist){
650 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
652 st->codec->sample_rate= best;
656 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
658 if(codec && codec->pix_fmts){
659 const enum PixelFormat *p= codec->pix_fmts;
660 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
661 if(st->codec->codec_id==CODEC_ID_MJPEG){
662 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
663 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
664 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};
668 if(*p == st->codec->pix_fmt)
672 if(st->codec->pix_fmt != PIX_FMT_NONE)
673 av_log(NULL, AV_LOG_WARNING,
674 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
675 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
677 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
678 st->codec->pix_fmt = codec->pix_fmts[0];
683 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
685 const char *codec_string = encoder ? "encoder" : "decoder";
689 return CODEC_ID_NONE;
691 avcodec_find_encoder_by_name(name) :
692 avcodec_find_decoder_by_name(name);
694 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
697 if(codec->type != type) {
698 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
704 static AVCodec *choose_codec(AVFormatContext *s, AVStream *st, enum AVMediaType type, AVDictionary *codec_names)
706 AVDictionaryEntry *e = NULL;
707 char *codec_name = NULL;
710 while (e = av_dict_get(codec_names, "", e, AV_DICT_IGNORE_SUFFIX)) {
711 char *p = strchr(e->key, ':');
713 if ((ret = check_stream_specifier(s, st, p ? p + 1 : "")) > 0)
714 codec_name = e->value;
721 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
722 return avcodec_find_encoder(st->codec->codec_id);
724 } else if (!strcmp(codec_name, "copy"))
727 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
728 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
729 avcodec_find_decoder_by_name(codec_name);
735 static OutputStream *new_output_stream(AVFormatContext *oc, int file_idx, enum AVMediaType type)
738 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
739 int idx = oc->nb_streams - 1;
742 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
746 output_streams_for_file[file_idx] =
747 grow_array(output_streams_for_file[file_idx],
748 sizeof(*output_streams_for_file[file_idx]),
749 &nb_output_streams_for_file[file_idx],
751 ost = output_streams_for_file[file_idx][idx] =
752 av_mallocz(sizeof(OutputStream));
754 fprintf(stderr, "Could not alloc output stream\n");
757 ost->file_index = file_idx;
760 st->codec->codec_type = type;
761 ost->enc = choose_codec(oc, st, type, codec_names);
763 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
766 avcodec_get_context_defaults3(st->codec, ost->enc);
767 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
769 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
773 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
776 AVFormatContext *ic = NULL;
778 err = avformat_open_input(&ic, filename, NULL, NULL);
781 /* copy stream format */
782 for(i=0;i<ic->nb_streams;i++) {
787 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
788 ost = new_output_stream(s, nb_output_files, codec->type);
791 // FIXME: a more elegant solution is needed
792 memcpy(st, ic->streams[i], sizeof(AVStream));
793 st->info = av_malloc(sizeof(*st->info));
794 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
795 avcodec_copy_context(st->codec, ic->streams[i]->codec);
797 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
798 choose_sample_fmt(st, codec);
799 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
800 choose_pixel_fmt(st, codec);
803 av_close_input_file(ic);
808 get_sync_ipts(const OutputStream *ost)
810 const InputStream *ist = ost->sync_ist;
811 return (double)(ist->pts - start_time)/AV_TIME_BASE;
814 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
818 AVPacket new_pkt= *pkt;
819 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
820 &new_pkt.data, &new_pkt.size,
821 pkt->data, pkt->size,
822 pkt->flags & AV_PKT_FLAG_KEY);
825 new_pkt.destruct= av_destruct_packet;
827 fprintf(stderr, "%s failed for stream %d, codec %s",
828 bsfc->filter->name, pkt->stream_index,
829 avctx->codec ? avctx->codec->name : "copy");
839 ret= av_interleaved_write_frame(s, pkt);
841 print_error("av_interleaved_write_frame()", ret);
846 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
848 static void do_audio_out(AVFormatContext *s,
851 unsigned char *buf, int size)
854 int64_t audio_out_size, audio_buf_size;
855 int64_t allocated_for_size= size;
857 int size_out, frame_bytes, ret, resample_changed;
858 AVCodecContext *enc= ost->st->codec;
859 AVCodecContext *dec= ist->st->codec;
860 int osize = av_get_bytes_per_sample(enc->sample_fmt);
861 int isize = av_get_bytes_per_sample(dec->sample_fmt);
862 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
865 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
866 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
867 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
868 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
869 audio_buf_size*= osize*enc->channels;
871 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
872 if(coded_bps > 8*osize)
873 audio_out_size= audio_out_size * coded_bps / (8*osize);
874 audio_out_size += FF_MIN_BUFFER_SIZE;
876 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
877 fprintf(stderr, "Buffer sizes too large\n");
881 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
882 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
883 if (!audio_buf || !audio_out){
884 fprintf(stderr, "Out of memory in do_audio_out\n");
888 if (enc->channels != dec->channels)
889 ost->audio_resample = 1;
891 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
892 ost->resample_channels != dec->channels ||
893 ost->resample_sample_rate != dec->sample_rate;
895 if ((ost->audio_resample && !ost->resample) || resample_changed) {
896 if (resample_changed) {
897 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",
898 ist->file_index, ist->st->index,
899 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
900 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
901 ost->resample_sample_fmt = dec->sample_fmt;
902 ost->resample_channels = dec->channels;
903 ost->resample_sample_rate = dec->sample_rate;
905 audio_resample_close(ost->resample);
907 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
908 if (audio_sync_method <= 1 &&
909 ost->resample_sample_fmt == enc->sample_fmt &&
910 ost->resample_channels == enc->channels &&
911 ost->resample_sample_rate == enc->sample_rate) {
912 ost->resample = NULL;
913 ost->audio_resample = 0;
915 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
916 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
917 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
918 enc->sample_rate, dec->sample_rate,
919 enc->sample_fmt, dec->sample_fmt,
921 if (!ost->resample) {
922 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
923 dec->channels, dec->sample_rate,
924 enc->channels, enc->sample_rate);
930 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
931 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
932 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
933 if (ost->reformat_ctx)
934 av_audio_convert_free(ost->reformat_ctx);
935 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
936 dec->sample_fmt, 1, NULL, 0);
937 if (!ost->reformat_ctx) {
938 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
939 av_get_sample_fmt_name(dec->sample_fmt),
940 av_get_sample_fmt_name(enc->sample_fmt));
943 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
946 if(audio_sync_method){
947 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
948 - av_fifo_size(ost->fifo)/(enc->channels * 2);
949 double idelta= delta*dec->sample_rate / enc->sample_rate;
950 int byte_delta= ((int)idelta)*2*dec->channels;
952 //FIXME resample delay
953 if(fabs(delta) > 50){
954 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
956 byte_delta= FFMAX(byte_delta, -size);
960 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
965 static uint8_t *input_tmp= NULL;
966 input_tmp= av_realloc(input_tmp, byte_delta + size);
968 if(byte_delta > allocated_for_size - size){
969 allocated_for_size= byte_delta + (int64_t)size;
974 memset(input_tmp, 0, byte_delta);
975 memcpy(input_tmp + byte_delta, buf, size);
979 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
981 }else if(audio_sync_method>1){
982 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
983 av_assert0(ost->audio_resample);
985 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
986 // 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));
987 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
991 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
992 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
994 if (ost->audio_resample) {
996 size_out = audio_resample(ost->resample,
997 (short *)buftmp, (short *)buf,
998 size / (dec->channels * isize));
999 size_out = size_out * enc->channels * osize;
1005 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
1006 const void *ibuf[6]= {buftmp};
1007 void *obuf[6]= {audio_buf};
1008 int istride[6]= {isize};
1009 int ostride[6]= {osize};
1010 int len= size_out/istride[0];
1011 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
1012 printf("av_audio_convert() failed\n");
1018 size_out = len*osize;
1021 /* now encode as many frames as possible */
1022 if (enc->frame_size > 1) {
1023 /* output resampled raw samples */
1024 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
1025 fprintf(stderr, "av_fifo_realloc2() failed\n");
1028 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
1030 frame_bytes = enc->frame_size * osize * enc->channels;
1032 while (av_fifo_size(ost->fifo) >= frame_bytes) {
1034 av_init_packet(&pkt);
1036 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
1038 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1040 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
1041 (short *)audio_buf);
1043 fprintf(stderr, "Audio encoding failed\n");
1047 pkt.stream_index= ost->index;
1048 pkt.data= audio_out;
1050 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1051 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1052 pkt.flags |= AV_PKT_FLAG_KEY;
1053 write_frame(s, &pkt, enc, ost->bitstream_filters);
1055 ost->sync_opts += enc->frame_size;
1059 av_init_packet(&pkt);
1061 ost->sync_opts += size_out / (osize * enc->channels);
1063 /* output a pcm frame */
1064 /* determine the size of the coded buffer */
1067 size_out = size_out*coded_bps/8;
1069 if(size_out > audio_out_size){
1070 fprintf(stderr, "Internal error, buffer size too small\n");
1074 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1075 ret = avcodec_encode_audio(enc, audio_out, size_out,
1078 fprintf(stderr, "Audio encoding failed\n");
1082 pkt.stream_index= ost->index;
1083 pkt.data= audio_out;
1085 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1086 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1087 pkt.flags |= AV_PKT_FLAG_KEY;
1088 write_frame(s, &pkt, enc, ost->bitstream_filters);
1092 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1094 AVCodecContext *dec;
1095 AVPicture *picture2;
1096 AVPicture picture_tmp;
1099 dec = ist->st->codec;
1101 /* deinterlace : must be done before any resize */
1102 if (do_deinterlace) {
1105 /* create temporary picture */
1106 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1107 buf = av_malloc(size);
1111 picture2 = &picture_tmp;
1112 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1114 if(avpicture_deinterlace(picture2, picture,
1115 dec->pix_fmt, dec->width, dec->height) < 0) {
1116 /* if error, do not deinterlace */
1117 fprintf(stderr, "Deinterlacing failed\n");
1126 if (picture != picture2)
1127 *picture = *picture2;
1131 /* we begin to correct av delay at this threshold */
1132 #define AV_DELAY_MAX 0.100
1134 static void do_subtitle_out(AVFormatContext *s,
1140 static uint8_t *subtitle_out = NULL;
1141 int subtitle_out_max_size = 1024 * 1024;
1142 int subtitle_out_size, nb, i;
1143 AVCodecContext *enc;
1146 if (pts == AV_NOPTS_VALUE) {
1147 fprintf(stderr, "Subtitle packets must have a pts\n");
1153 enc = ost->st->codec;
1155 if (!subtitle_out) {
1156 subtitle_out = av_malloc(subtitle_out_max_size);
1159 /* Note: DVB subtitle need one packet to draw them and one other
1160 packet to clear them */
1161 /* XXX: signal it in the codec context ? */
1162 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1167 for(i = 0; i < nb; i++) {
1168 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1169 // start_display_time is required to be 0
1170 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1171 sub->end_display_time -= sub->start_display_time;
1172 sub->start_display_time = 0;
1173 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1174 subtitle_out_max_size, sub);
1175 if (subtitle_out_size < 0) {
1176 fprintf(stderr, "Subtitle encoding failed\n");
1180 av_init_packet(&pkt);
1181 pkt.stream_index = ost->index;
1182 pkt.data = subtitle_out;
1183 pkt.size = subtitle_out_size;
1184 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1185 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1186 /* XXX: the pts correction is handled here. Maybe handling
1187 it in the codec would be better */
1189 pkt.pts += 90 * sub->start_display_time;
1191 pkt.pts += 90 * sub->end_display_time;
1193 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1197 static int bit_buffer_size= 1024*256;
1198 static uint8_t *bit_buffer= NULL;
1200 static void do_video_out(AVFormatContext *s,
1203 AVFrame *in_picture,
1204 int *frame_size, float quality)
1206 int nb_frames, i, ret, av_unused resample_changed;
1207 AVFrame *final_picture, *formatted_picture;
1208 AVCodecContext *enc, *dec;
1211 enc = ost->st->codec;
1212 dec = ist->st->codec;
1214 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1216 /* by default, we output a single frame */
1221 if(video_sync_method){
1222 double vdelta = sync_ipts - ost->sync_opts;
1223 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1226 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1229 }else if(vdelta>0.6)
1230 ost->sync_opts= lrintf(sync_ipts);
1231 }else if (vdelta > 1.1)
1232 nb_frames = lrintf(vdelta);
1233 //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);
1234 if (nb_frames == 0){
1237 fprintf(stderr, "*** drop!\n");
1238 }else if (nb_frames > 1) {
1239 nb_frames_dup += nb_frames - 1;
1241 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1244 ost->sync_opts= lrintf(sync_ipts);
1246 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1250 formatted_picture = in_picture;
1251 final_picture = formatted_picture;
1253 #if !CONFIG_AVFILTER
1254 resample_changed = ost->resample_width != dec->width ||
1255 ost->resample_height != dec->height ||
1256 ost->resample_pix_fmt != dec->pix_fmt;
1258 if (resample_changed) {
1259 av_log(NULL, AV_LOG_INFO,
1260 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1261 ist->file_index, ist->st->index,
1262 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1263 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1264 ost->resample_width = dec->width;
1265 ost->resample_height = dec->height;
1266 ost->resample_pix_fmt = dec->pix_fmt;
1269 ost->video_resample = dec->width != enc->width ||
1270 dec->height != enc->height ||
1271 dec->pix_fmt != enc->pix_fmt;
1273 if (ost->video_resample) {
1274 final_picture = &ost->resample_frame;
1275 if (!ost->img_resample_ctx || resample_changed) {
1276 /* initialize the destination picture */
1277 if (!ost->resample_frame.data[0]) {
1278 avcodec_get_frame_defaults(&ost->resample_frame);
1279 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1280 enc->width, enc->height)) {
1281 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1285 /* initialize a new scaler context */
1286 sws_freeContext(ost->img_resample_ctx);
1287 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1288 enc->width, enc->height, enc->pix_fmt,
1289 ost->sws_flags, NULL, NULL, NULL);
1290 if (ost->img_resample_ctx == NULL) {
1291 fprintf(stderr, "Cannot get resampling context\n");
1295 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1296 0, ost->resample_height, final_picture->data, final_picture->linesize);
1300 /* duplicates frame if needed */
1301 for(i=0;i<nb_frames;i++) {
1303 av_init_packet(&pkt);
1304 pkt.stream_index= ost->index;
1306 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1307 /* raw pictures are written as AVPicture structure to
1308 avoid any copies. We support temorarily the older
1310 AVFrame* old_frame = enc->coded_frame;
1311 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1312 pkt.data= (uint8_t *)final_picture;
1313 pkt.size= sizeof(AVPicture);
1314 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1315 pkt.flags |= AV_PKT_FLAG_KEY;
1317 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1318 enc->coded_frame = old_frame;
1320 AVFrame big_picture;
1322 big_picture= *final_picture;
1323 /* better than nothing: use input picture interlaced
1325 big_picture.interlaced_frame = in_picture->interlaced_frame;
1326 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1327 if(top_field_first == -1)
1328 big_picture.top_field_first = in_picture->top_field_first;
1330 big_picture.top_field_first = top_field_first;
1333 /* handles same_quant here. This is not correct because it may
1334 not be a global option */
1335 big_picture.quality = quality;
1337 big_picture.pict_type = 0;
1338 // big_picture.pts = AV_NOPTS_VALUE;
1339 big_picture.pts= ost->sync_opts;
1340 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1341 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1342 if (ost->forced_kf_index < ost->forced_kf_count &&
1343 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1344 big_picture.pict_type = AV_PICTURE_TYPE_I;
1345 ost->forced_kf_index++;
1347 ret = avcodec_encode_video(enc,
1348 bit_buffer, bit_buffer_size,
1351 fprintf(stderr, "Video encoding failed\n");
1356 pkt.data= bit_buffer;
1358 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1359 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1360 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1361 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1362 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1364 if(enc->coded_frame->key_frame)
1365 pkt.flags |= AV_PKT_FLAG_KEY;
1366 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1369 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1370 // enc->frame_number-1, ret, enc->pict_type);
1371 /* if two pass, output log */
1372 if (ost->logfile && enc->stats_out) {
1373 fprintf(ost->logfile, "%s", enc->stats_out);
1378 ost->frame_number++;
1382 static double psnr(double d){
1383 return -10.0*log(d)/log(10.0);
1386 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1389 AVCodecContext *enc;
1391 double ti1, bitrate, avg_bitrate;
1393 /* this is executed just the first time do_video_stats is called */
1395 vstats_file = fopen(vstats_filename, "w");
1402 enc = ost->st->codec;
1403 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1404 frame_number = ost->frame_number;
1405 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1406 if (enc->flags&CODEC_FLAG_PSNR)
1407 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1409 fprintf(vstats_file,"f_size= %6d ", frame_size);
1410 /* compute pts value */
1411 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1415 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1416 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1417 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1418 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1419 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1423 static void print_report(AVFormatContext **output_files,
1424 OutputStream **ost_table, int nb_ostreams,
1429 AVFormatContext *oc;
1431 AVCodecContext *enc;
1432 int frame_number, vid, i;
1434 int64_t pts = INT64_MAX;
1435 static int64_t last_time = -1;
1436 static int qp_histogram[52];
1438 if (!is_last_report) {
1440 /* display the report every 0.5 seconds */
1441 cur_time = av_gettime();
1442 if (last_time == -1) {
1443 last_time = cur_time;
1446 if ((cur_time - last_time) < 500000)
1448 last_time = cur_time;
1452 oc = output_files[0];
1454 total_size = avio_size(oc->pb);
1455 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1456 total_size= avio_tell(oc->pb);
1460 for(i=0;i<nb_ostreams;i++) {
1463 enc = ost->st->codec;
1464 if (!ost->st->stream_copy && enc->coded_frame)
1465 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1466 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1467 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1469 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1470 float t = (av_gettime()-timer_start) / 1000000.0;
1472 frame_number = ost->frame_number;
1473 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1474 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1476 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1480 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1483 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1485 if (enc->flags&CODEC_FLAG_PSNR){
1487 double error, error_sum=0;
1488 double scale, scale_sum=0;
1489 char type[3]= {'Y','U','V'};
1490 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1493 error= enc->error[j];
1494 scale= enc->width*enc->height*255.0*255.0*frame_number;
1496 error= enc->coded_frame->error[j];
1497 scale= enc->width*enc->height*255.0*255.0;
1502 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1504 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1508 /* compute min output value */
1509 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1510 ost->st->time_base, AV_TIME_BASE_Q));
1513 if (verbose > 0 || is_last_report) {
1514 int hours, mins, secs, us;
1515 secs = pts / AV_TIME_BASE;
1516 us = pts % AV_TIME_BASE;
1522 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1524 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1525 "size=%8.0fkB time=", total_size / 1024.0);
1526 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1527 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1528 (100 * us) / AV_TIME_BASE);
1529 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1530 "bitrate=%6.1fkbits/s", bitrate);
1532 if (nb_frames_dup || nb_frames_drop)
1533 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1534 nb_frames_dup, nb_frames_drop);
1537 fprintf(stderr, "%s \r", buf);
1542 if (is_last_report && verbose >= 0){
1543 int64_t raw= audio_size + video_size + extra_size;
1544 fprintf(stderr, "\n");
1545 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1549 100.0*(total_size - raw)/raw
1554 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1556 int fill_char = 0x00;
1557 if (sample_fmt == AV_SAMPLE_FMT_U8)
1559 memset(buf, fill_char, size);
1562 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1563 static int output_packet(InputStream *ist, int ist_index,
1564 OutputStream **ost_table, int nb_ostreams,
1565 const AVPacket *pkt)
1567 AVFormatContext *os;
1572 void *buffer_to_free = NULL;
1573 static unsigned int samples_size= 0;
1574 AVSubtitle subtitle, *subtitle_to_free;
1575 int64_t pkt_pts = AV_NOPTS_VALUE;
1577 int frame_available;
1582 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1584 if(ist->next_pts == AV_NOPTS_VALUE)
1585 ist->next_pts= ist->pts;
1589 av_init_packet(&avpkt);
1597 if(pkt->dts != AV_NOPTS_VALUE)
1598 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1599 if(pkt->pts != AV_NOPTS_VALUE)
1600 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1602 //while we have more to decode or while the decoder did output something on EOF
1603 while (avpkt.size > 0 || (!pkt && got_output)) {
1604 uint8_t *data_buf, *decoded_data_buf;
1605 int data_size, decoded_data_size;
1607 ist->pts= ist->next_pts;
1609 if(avpkt.size && avpkt.size != pkt->size &&
1610 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1611 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1612 ist->showed_multi_packet_warning=1;
1615 /* decode the packet if needed */
1616 decoded_data_buf = NULL; /* fail safe */
1617 decoded_data_size= 0;
1618 data_buf = avpkt.data;
1619 data_size = avpkt.size;
1620 subtitle_to_free = NULL;
1621 if (ist->decoding_needed) {
1622 switch(ist->st->codec->codec_type) {
1623 case AVMEDIA_TYPE_AUDIO:{
1624 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1625 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1627 samples= av_malloc(samples_size);
1629 decoded_data_size= samples_size;
1630 /* XXX: could avoid copy if PCM 16 bits with same
1631 endianness as CPU */
1632 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1639 got_output = decoded_data_size > 0;
1640 /* Some bug in mpeg audio decoder gives */
1641 /* decoded_data_size < 0, it seems they are overflows */
1643 /* no audio frame */
1646 decoded_data_buf = (uint8_t *)samples;
1647 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1648 (ist->st->codec->sample_rate * ist->st->codec->channels);
1650 case AVMEDIA_TYPE_VIDEO:
1651 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1652 /* XXX: allocate picture correctly */
1653 avcodec_get_frame_defaults(&picture);
1654 avpkt.pts = pkt_pts;
1655 avpkt.dts = ist->pts;
1656 pkt_pts = AV_NOPTS_VALUE;
1658 ret = avcodec_decode_video2(ist->st->codec,
1659 &picture, &got_output, &avpkt);
1660 quality = same_quant ? picture.quality : 0;
1664 /* no picture yet */
1665 goto discard_packet;
1667 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1668 if (ist->st->codec->time_base.num != 0) {
1669 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1670 ist->next_pts += ((int64_t)AV_TIME_BASE *
1671 ist->st->codec->time_base.num * ticks) /
1672 ist->st->codec->time_base.den;
1675 buffer_to_free = NULL;
1676 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1678 case AVMEDIA_TYPE_SUBTITLE:
1679 ret = avcodec_decode_subtitle2(ist->st->codec,
1680 &subtitle, &got_output, &avpkt);
1684 goto discard_packet;
1686 subtitle_to_free = &subtitle;
1693 switch(ist->st->codec->codec_type) {
1694 case AVMEDIA_TYPE_AUDIO:
1695 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1696 ist->st->codec->sample_rate;
1698 case AVMEDIA_TYPE_VIDEO:
1699 if (ist->st->codec->time_base.num != 0) {
1700 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1701 ist->next_pts += ((int64_t)AV_TIME_BASE *
1702 ist->st->codec->time_base.num * ticks) /
1703 ist->st->codec->time_base.den;
1712 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1713 if (start_time == 0 || ist->pts >= start_time) {
1714 for(i=0;i<nb_ostreams;i++) {
1716 if (ost->input_video_filter && ost->source_index == ist_index) {
1717 if (!picture.sample_aspect_ratio.num)
1718 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1719 picture.pts = ist->pts;
1721 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
1727 // preprocess audio (volume)
1728 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1729 if (audio_volume != 256) {
1732 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1733 int v = ((*volp) * audio_volume + 128) >> 8;
1734 if (v < -32768) v = -32768;
1735 if (v > 32767) v = 32767;
1741 /* frame rate emulation */
1743 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1744 int64_t now = av_gettime() - ist->start;
1748 /* if output time reached then transcode raw format,
1749 encode packets and output them */
1750 if (start_time == 0 || ist->pts >= start_time)
1751 for(i=0;i<nb_ostreams;i++) {
1756 /* finish if recording time exhausted */
1757 if (recording_time != INT64_MAX &&
1758 av_compare_ts(ist->pts, AV_TIME_BASE_Q, recording_time + start_time, (AVRational){1, 1000000})
1760 ist->is_past_recording_time = 1;
1763 if (ost->source_index == ist_index) {
1765 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1766 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1767 while (frame_available) {
1768 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
1769 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1770 if (av_vsink_buffer_get_video_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1773 avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
1774 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1778 os = output_files[ost->file_index];
1780 /* set the input output pts pairs */
1781 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1783 if (ost->encoding_needed) {
1784 av_assert0(ist->decoding_needed);
1785 switch(ost->st->codec->codec_type) {
1786 case AVMEDIA_TYPE_AUDIO:
1787 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1789 case AVMEDIA_TYPE_VIDEO:
1791 if (ost->picref->video && !ost->frame_aspect_ratio)
1792 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1794 do_video_out(os, ost, ist, &picture, &frame_size,
1795 same_quant ? quality : ost->st->codec->global_quality);
1796 if (vstats_filename && frame_size)
1797 do_video_stats(os, ost, frame_size);
1799 case AVMEDIA_TYPE_SUBTITLE:
1800 do_subtitle_out(os, ost, ist, &subtitle,
1807 AVFrame avframe; //FIXME/XXX remove this
1810 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1812 av_init_packet(&opkt);
1814 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1815 #if !CONFIG_AVFILTER
1821 /* no reencoding needed : output the packet directly */
1822 /* force the input stream PTS */
1824 avcodec_get_frame_defaults(&avframe);
1825 ost->st->codec->coded_frame= &avframe;
1826 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1828 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1829 audio_size += data_size;
1830 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1831 video_size += data_size;
1835 opkt.stream_index= ost->index;
1836 if(pkt->pts != AV_NOPTS_VALUE)
1837 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1839 opkt.pts= AV_NOPTS_VALUE;
1841 if (pkt->dts == AV_NOPTS_VALUE)
1842 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1844 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1845 opkt.dts -= ost_tb_start_time;
1847 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1848 opkt.flags= pkt->flags;
1850 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1851 if( ost->st->codec->codec_id != CODEC_ID_H264
1852 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1853 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1855 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1856 opkt.destruct= av_destruct_packet;
1858 opkt.data = data_buf;
1859 opkt.size = data_size;
1862 if (os->oformat->flags & AVFMT_RAWPICTURE) {
1863 /* store AVPicture in AVPacket, as expected by the output format */
1864 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1865 opkt.data = (uint8_t *)&pict;
1866 opkt.size = sizeof(AVPicture);
1867 opkt.flags |= AV_PKT_FLAG_KEY;
1869 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1870 ost->st->codec->frame_number++;
1871 ost->frame_number++;
1872 av_free_packet(&opkt);
1876 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1877 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1878 avfilter_unref_buffer(ost->picref);
1884 av_free(buffer_to_free);
1885 /* XXX: allocate the subtitles in the codec ? */
1886 if (subtitle_to_free) {
1887 avsubtitle_free(subtitle_to_free);
1888 subtitle_to_free = NULL;
1895 for(i=0;i<nb_ostreams;i++) {
1897 if (ost->source_index == ist_index) {
1898 AVCodecContext *enc= ost->st->codec;
1899 os = output_files[ost->file_index];
1901 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1903 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1906 if (ost->encoding_needed) {
1910 av_init_packet(&pkt);
1911 pkt.stream_index= ost->index;
1913 switch(ost->st->codec->codec_type) {
1914 case AVMEDIA_TYPE_AUDIO:
1915 fifo_bytes = av_fifo_size(ost->fifo);
1917 /* encode any samples remaining in fifo */
1918 if (fifo_bytes > 0) {
1919 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1920 int fs_tmp = enc->frame_size;
1922 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1923 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1924 enc->frame_size = fifo_bytes / (osize * enc->channels);
1926 int frame_bytes = enc->frame_size*osize*enc->channels;
1927 if (allocated_audio_buf_size < frame_bytes)
1929 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1932 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1933 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1934 ost->st->time_base.num, enc->sample_rate);
1935 enc->frame_size = fs_tmp;
1938 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1941 fprintf(stderr, "Audio encoding failed\n");
1945 pkt.flags |= AV_PKT_FLAG_KEY;
1947 case AVMEDIA_TYPE_VIDEO:
1948 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1950 fprintf(stderr, "Video encoding failed\n");
1954 if(enc->coded_frame && enc->coded_frame->key_frame)
1955 pkt.flags |= AV_PKT_FLAG_KEY;
1956 if (ost->logfile && enc->stats_out) {
1957 fprintf(ost->logfile, "%s", enc->stats_out);
1966 pkt.data= bit_buffer;
1968 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1969 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1970 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1980 static void print_sdp(AVFormatContext **avc, int n)
1984 av_sdp_create(avc, n, sdp, sizeof(sdp));
1985 printf("SDP:\n%s\n", sdp);
1989 static int copy_chapters(int infile, int outfile)
1991 AVFormatContext *is = input_files[infile].ctx;
1992 AVFormatContext *os = output_files[outfile];
1995 for (i = 0; i < is->nb_chapters; i++) {
1996 AVChapter *in_ch = is->chapters[i], *out_ch;
1997 int64_t ts_off = av_rescale_q(start_time - input_files[infile].ts_offset,
1998 AV_TIME_BASE_Q, in_ch->time_base);
1999 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
2000 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
2003 if (in_ch->end < ts_off)
2005 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
2008 out_ch = av_mallocz(sizeof(AVChapter));
2010 return AVERROR(ENOMEM);
2012 out_ch->id = in_ch->id;
2013 out_ch->time_base = in_ch->time_base;
2014 out_ch->start = FFMAX(0, in_ch->start - ts_off);
2015 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
2017 if (metadata_chapters_autocopy)
2018 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
2021 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
2023 return AVERROR(ENOMEM);
2024 os->chapters[os->nb_chapters - 1] = out_ch;
2029 static void parse_forced_key_frames(char *kf, OutputStream *ost,
2030 AVCodecContext *avctx)
2036 for (p = kf; *p; p++)
2039 ost->forced_kf_count = n;
2040 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
2041 if (!ost->forced_kf_pts) {
2042 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
2045 for (i = 0; i < n; i++) {
2046 p = i ? strchr(p, ',') + 1 : kf;
2047 t = parse_time_or_die("force_key_frames", p, 1);
2048 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
2053 * The following code is the main loop of the file converter
2055 static int transcode(AVFormatContext **output_files,
2056 int nb_output_files,
2057 InputFile *input_files,
2060 int ret = 0, i, j, k, n, nb_ostreams = 0, step;
2062 AVFormatContext *is, *os;
2063 AVCodecContext *codec, *icodec;
2064 OutputStream *ost, **ost_table = NULL;
2069 uint8_t no_packet[MAX_FILES]={0};
2070 int no_packet_count=0;
2071 int nb_frame_threshold[AVMEDIA_TYPE_NB]={0};
2072 int nb_streams[AVMEDIA_TYPE_NB]={0};
2075 for (i = 0; i < nb_input_streams; i++)
2076 input_streams[i].start = av_gettime();
2078 /* output stream init */
2080 for(i=0;i<nb_output_files;i++) {
2081 os = output_files[i];
2082 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
2083 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2084 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
2085 ret = AVERROR(EINVAL);
2088 nb_ostreams += os->nb_streams;
2091 ost_table = av_mallocz(sizeof(OutputStream *) * nb_ostreams);
2095 for(k=0;k<nb_output_files;k++) {
2096 os = output_files[k];
2097 for(i=0;i<os->nb_streams;i++,n++) {
2098 nb_streams[os->streams[i]->codec->codec_type]++;
2101 for(step=1<<30; step; step>>=1){
2102 int found_streams[AVMEDIA_TYPE_NB]={0};
2103 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2104 nb_frame_threshold[j] += step;
2106 for(j=0; j<nb_input_streams; j++) {
2108 ist = &input_streams[j];
2111 AVFormatContext *f= input_files[ ist->file_index ].ctx;
2113 for(pi=0; pi<f->nb_programs; pi++){
2114 AVProgram *p= f->programs[pi];
2115 if(p->id == opt_programid)
2116 for(si=0; si<p->nb_stream_indexes; si++){
2117 if(f->streams[ p->stream_index[si] ] == ist->st)
2122 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip
2123 && nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames){
2124 found_streams[ist->st->codec->codec_type]++;
2127 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2128 if(found_streams[j] < nb_streams[j])
2129 nb_frame_threshold[j] -= step;
2132 for(k=0;k<nb_output_files;k++) {
2133 os = output_files[k];
2134 for (i = 0; i < os->nb_streams; i++, n++)
2135 ost_table[n] = output_streams_for_file[k][i];
2138 /* for each output stream, we compute the right encoding parameters */
2139 for(i=0;i<nb_ostreams;i++) {
2141 os = output_files[ost->file_index];
2142 ist = &input_streams[ost->source_index];
2144 codec = ost->st->codec;
2145 icodec = ist->st->codec;
2147 ost->st->disposition = ist->st->disposition;
2148 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2149 codec->chroma_sample_location = icodec->chroma_sample_location;
2151 if (ost->st->stream_copy) {
2152 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2154 if (extra_size > INT_MAX)
2157 /* if stream_copy is selected, no need to decode or encode */
2158 codec->codec_id = icodec->codec_id;
2159 codec->codec_type = icodec->codec_type;
2161 if(!codec->codec_tag){
2162 if( !os->oformat->codec_tag
2163 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2164 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2165 codec->codec_tag = icodec->codec_tag;
2168 codec->bit_rate = icodec->bit_rate;
2169 codec->rc_max_rate = icodec->rc_max_rate;
2170 codec->rc_buffer_size = icodec->rc_buffer_size;
2171 codec->extradata= av_mallocz(extra_size);
2172 if (!codec->extradata)
2174 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2175 codec->extradata_size= icodec->extradata_size;
2177 codec->time_base = ist->st->time_base;
2178 if(!strcmp(os->oformat->name, "avi")) {
2179 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){
2180 codec->time_base = icodec->time_base;
2181 codec->time_base.num *= icodec->ticks_per_frame;
2182 codec->time_base.den *= 2;
2184 } else if(!(os->oformat->flags & AVFMT_VARIABLE_FPS)) {
2185 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){
2186 codec->time_base = icodec->time_base;
2187 codec->time_base.num *= icodec->ticks_per_frame;
2190 av_reduce(&codec->time_base.num, &codec->time_base.den,
2191 codec->time_base.num, codec->time_base.den, INT_MAX);
2193 switch(codec->codec_type) {
2194 case AVMEDIA_TYPE_AUDIO:
2195 if(audio_volume != 256) {
2196 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2199 codec->channel_layout = icodec->channel_layout;
2200 codec->sample_rate = icodec->sample_rate;
2201 codec->channels = icodec->channels;
2202 codec->frame_size = icodec->frame_size;
2203 codec->audio_service_type = icodec->audio_service_type;
2204 codec->block_align= icodec->block_align;
2205 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2206 codec->block_align= 0;
2207 if(codec->codec_id == CODEC_ID_AC3)
2208 codec->block_align= 0;
2210 case AVMEDIA_TYPE_VIDEO:
2211 codec->pix_fmt = icodec->pix_fmt;
2212 codec->width = icodec->width;
2213 codec->height = icodec->height;
2214 codec->has_b_frames = icodec->has_b_frames;
2215 if (!codec->sample_aspect_ratio.num) {
2216 codec->sample_aspect_ratio =
2217 ost->st->sample_aspect_ratio =
2218 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2219 ist->st->codec->sample_aspect_ratio.num ?
2220 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2223 case AVMEDIA_TYPE_SUBTITLE:
2224 codec->width = icodec->width;
2225 codec->height = icodec->height;
2227 case AVMEDIA_TYPE_DATA:
2234 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2235 switch(codec->codec_type) {
2236 case AVMEDIA_TYPE_AUDIO:
2237 ost->fifo= av_fifo_alloc(1024);
2240 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2241 if (!codec->sample_rate) {
2242 codec->sample_rate = icodec->sample_rate;
2244 choose_sample_rate(ost->st, ost->enc);
2245 codec->time_base = (AVRational){1, codec->sample_rate};
2246 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2247 codec->sample_fmt = icodec->sample_fmt;
2248 choose_sample_fmt(ost->st, ost->enc);
2249 if (!codec->channels) {
2250 codec->channels = icodec->channels;
2251 codec->channel_layout = icodec->channel_layout;
2253 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2254 codec->channel_layout = 0;
2255 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2256 icodec->request_channels = codec->channels;
2257 ist->decoding_needed = 1;
2258 ost->encoding_needed = 1;
2259 ost->resample_sample_fmt = icodec->sample_fmt;
2260 ost->resample_sample_rate = icodec->sample_rate;
2261 ost->resample_channels = icodec->channels;
2263 case AVMEDIA_TYPE_VIDEO:
2264 if (codec->pix_fmt == PIX_FMT_NONE)
2265 codec->pix_fmt = icodec->pix_fmt;
2266 choose_pixel_fmt(ost->st, ost->enc);
2268 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2269 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2273 if (!codec->width || !codec->height) {
2274 codec->width = icodec->width;
2275 codec->height = icodec->height;
2278 ost->video_resample = codec->width != icodec->width ||
2279 codec->height != icodec->height ||
2280 codec->pix_fmt != icodec->pix_fmt;
2281 if (ost->video_resample) {
2282 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2285 ost->resample_height = icodec->height;
2286 ost->resample_width = icodec->width;
2287 ost->resample_pix_fmt= icodec->pix_fmt;
2288 ost->encoding_needed = 1;
2289 ist->decoding_needed = 1;
2291 if (!ost->frame_rate.num)
2292 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2293 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2294 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2295 ost->frame_rate = ost->enc->supported_framerates[idx];
2297 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2298 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2299 && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
2300 av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2301 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2305 if (configure_video_filters(ist, ost)) {
2306 fprintf(stderr, "Error opening filters!\n");
2311 case AVMEDIA_TYPE_SUBTITLE:
2312 ost->encoding_needed = 1;
2313 ist->decoding_needed = 1;
2320 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2321 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2322 char logfilename[1024];
2325 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2326 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2328 if (codec->flags & CODEC_FLAG_PASS1) {
2329 f = fopen(logfilename, "wb");
2331 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2337 size_t logbuffer_size;
2338 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2339 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2342 codec->stats_in = logbuffer;
2346 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2347 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2348 int size= codec->width * codec->height;
2349 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2354 bit_buffer = av_malloc(bit_buffer_size);
2356 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2358 ret = AVERROR(ENOMEM);
2362 /* open each encoder */
2363 for(i=0;i<nb_ostreams;i++) {
2365 if (ost->encoding_needed) {
2366 AVCodec *codec = ost->enc;
2367 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2369 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d.%d",
2370 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2371 ret = AVERROR(EINVAL);
2374 if (dec->subtitle_header) {
2375 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2376 if (!ost->st->codec->subtitle_header) {
2377 ret = AVERROR(ENOMEM);
2380 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2381 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2383 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2384 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2385 ost->file_index, ost->index);
2386 ret = AVERROR(EINVAL);
2389 assert_codec_experimental(ost->st->codec, 1);
2390 assert_avoptions(ost->opts);
2391 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2392 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2393 "It takes bits/s as argument, not kbits/s\n");
2394 extra_size += ost->st->codec->extradata_size;
2398 /* open each decoder */
2399 for (i = 0; i < nb_input_streams; i++) {
2400 ist = &input_streams[i];
2401 if (ist->decoding_needed) {
2402 AVCodec *codec = ist->dec;
2404 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2406 snprintf(error, sizeof(error), "Decoder (codec %s) not found for input stream #%d.%d",
2407 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2408 ret = AVERROR(EINVAL);
2411 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2412 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2413 ist->file_index, ist->st->index);
2414 ret = AVERROR(EINVAL);
2417 assert_codec_experimental(ist->st->codec, 0);
2418 assert_avoptions(ost->opts);
2423 for (i = 0; i < nb_input_streams; i++) {
2425 ist = &input_streams[i];
2427 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2428 ist->next_pts = AV_NOPTS_VALUE;
2432 /* open files and write file headers */
2433 for(i=0;i<nb_output_files;i++) {
2434 os = output_files[i];
2435 if (avformat_write_header(os, &output_opts[i]) < 0) {
2436 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2437 ret = AVERROR(EINVAL);
2440 // assert_avoptions(output_opts[i]);
2441 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2447 /* dump the file output parameters - cannot be done before in case
2449 for(i=0;i<nb_output_files;i++) {
2450 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2453 /* dump the stream mapping */
2455 fprintf(stderr, "Stream mapping:\n");
2456 for(i=0;i<nb_ostreams;i++) {
2458 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2459 input_streams[ost->source_index].file_index,
2460 input_streams[ost->source_index].st->index,
2463 if (ost->sync_ist != &input_streams[ost->source_index])
2464 fprintf(stderr, " [sync #%d.%d]",
2465 ost->sync_ist->file_index,
2466 ost->sync_ist->st->index);
2467 if(ost->encoding_needed)
2468 fprintf(stderr, ": %s -> %s",
2469 input_streams[ost->source_index].dec ?
2470 input_streams[ost->source_index].dec->name : "?",
2471 ost->enc ? ost->enc->name : "?");
2473 fprintf(stderr, ": copy");
2474 fprintf(stderr, "\n");
2479 fprintf(stderr, "%s\n", error);
2484 print_sdp(output_files, nb_output_files);
2489 fprintf(stderr, "Press [q] to stop, [?] for help\n");
2490 avio_set_interrupt_cb(decode_interrupt_cb);
2494 timer_start = av_gettime();
2496 for(; received_sigterm == 0;) {
2497 int file_index, ist_index;
2505 /* if 'q' pressed, exits */
2509 /* read_key() returns 0 on EOF */
2513 if (key == '+') verbose++;
2514 if (key == '-') verbose--;
2515 if (key == 's') qp_hist ^= 1;
2518 do_hex_dump = do_pkt_dump = 0;
2519 } else if(do_pkt_dump){
2523 av_log_set_level(AV_LOG_DEBUG);
2525 if (key == 'c' || key == 'C'){
2526 char ret[4096], target[64], cmd[256], arg[256]={0};
2528 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2529 if(scanf("%4095[^\n\r]%*c", ret) == 1 && sscanf(ret, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &ts, cmd, arg) >= 3){
2530 for(i=0;i<nb_ostreams;i++) {
2535 r= avfilter_graph_send_command(ost->graph, target, cmd, arg, ret, sizeof(ret), key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
2536 fprintf(stderr, "Command reply for %d: %d, %s\n", i, r, ret);
2538 r= avfilter_graph_queue_command(ost->graph, target, cmd, arg, 0, ts);
2543 fprintf(stderr, "Parse error\n");
2546 if (key == 'd' || key == 'D'){
2549 debug = input_streams[0].st->codec->debug<<1;
2550 if(!debug) debug = 1;
2551 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2554 scanf("%d", &debug);
2555 for(i=0;i<nb_input_streams;i++) {
2556 input_streams[i].st->codec->debug = debug;
2558 for(i=0;i<nb_ostreams;i++) {
2560 ost->st->codec->debug = debug;
2562 if(debug) av_log_set_level(AV_LOG_DEBUG);
2563 fprintf(stderr,"debug=%d\n", debug);
2566 fprintf(stderr, "key function\n"
2567 "? show this help\n"
2568 "+ increase verbosity\n"
2569 "- decrease verbosity\n"
2570 "c Send command to filtergraph\n"
2571 "D cycle through available debug modes\n"
2572 "h dump packets/hex press to cycle through the 3 states\n"
2574 "s Show QP histogram\n"
2579 /* select the stream that we must read now by looking at the
2580 smallest output pts */
2582 for(i=0;i<nb_ostreams;i++) {
2585 os = output_files[ost->file_index];
2586 ist = &input_streams[ost->source_index];
2587 if(ist->is_past_recording_time || no_packet[ist->file_index])
2589 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2590 ipts = (double)ist->pts;
2591 if (!input_files[ist->file_index].eof_reached){
2592 if(ipts < ipts_min) {
2594 if(input_sync ) file_index = ist->file_index;
2596 if(opts < opts_min) {
2598 if(!input_sync) file_index = ist->file_index;
2601 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2606 /* if none, if is finished */
2607 if (file_index < 0) {
2608 if(no_packet_count){
2610 memset(no_packet, 0, sizeof(no_packet));
2617 /* finish if limit size exhausted */
2618 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2621 /* read a frame from it and output it in the fifo */
2622 is = input_files[file_index].ctx;
2623 ret= av_read_frame(is, &pkt);
2624 if(ret == AVERROR(EAGAIN)){
2625 no_packet[file_index]=1;
2630 input_files[file_index].eof_reached = 1;
2638 memset(no_packet, 0, sizeof(no_packet));
2641 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2642 is->streams[pkt.stream_index]);
2644 /* the following test is needed in case new streams appear
2645 dynamically in stream : we ignore them */
2646 if (pkt.stream_index >= input_files[file_index].nb_streams)
2647 goto discard_packet;
2648 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2649 ist = &input_streams[ist_index];
2651 goto discard_packet;
2653 if (pkt.dts != AV_NOPTS_VALUE)
2654 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2655 if (pkt.pts != AV_NOPTS_VALUE)
2656 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2658 if (ist->ts_scale) {
2659 if(pkt.pts != AV_NOPTS_VALUE)
2660 pkt.pts *= ist->ts_scale;
2661 if(pkt.dts != AV_NOPTS_VALUE)
2662 pkt.dts *= ist->ts_scale;
2665 // 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);
2666 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2667 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2668 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2669 int64_t delta= pkt_dts - ist->next_pts;
2670 if((delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
2671 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
2672 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
2673 pkt_dts+1<ist->pts)&& !copy_ts){
2674 input_files[ist->file_index].ts_offset -= delta;
2676 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2677 delta, input_files[ist->file_index].ts_offset);
2678 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2679 if(pkt.pts != AV_NOPTS_VALUE)
2680 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2684 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2685 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2688 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2689 ist->file_index, ist->st->index);
2692 av_free_packet(&pkt);
2697 av_free_packet(&pkt);
2699 /* dump report by using the output first video and audio streams */
2700 print_report(output_files, ost_table, nb_ostreams, 0);
2703 /* at the end of stream, we must flush the decoder buffers */
2704 for (i = 0; i < nb_input_streams; i++) {
2705 ist = &input_streams[i];
2706 if (ist->decoding_needed) {
2707 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2713 /* write the trailer if needed and close file */
2714 for(i=0;i<nb_output_files;i++) {
2715 os = output_files[i];
2716 av_write_trailer(os);
2719 /* dump report by using the first video and audio streams */
2720 print_report(output_files, ost_table, nb_ostreams, 1);
2722 /* close each encoder */
2723 for(i=0;i<nb_ostreams;i++) {
2725 if (ost->encoding_needed) {
2726 av_freep(&ost->st->codec->stats_in);
2727 avcodec_close(ost->st->codec);
2730 avfilter_graph_free(&ost->graph);
2734 /* close each decoder */
2735 for (i = 0; i < nb_input_streams; i++) {
2736 ist = &input_streams[i];
2737 if (ist->decoding_needed) {
2738 avcodec_close(ist->st->codec);
2746 av_freep(&bit_buffer);
2749 for(i=0;i<nb_ostreams;i++) {
2752 if (ost->st->stream_copy)
2753 av_freep(&ost->st->codec->extradata);
2755 fclose(ost->logfile);
2756 ost->logfile = NULL;
2758 av_fifo_free(ost->fifo); /* works even if fifo is not
2759 initialized but set to zero */
2760 av_freep(&ost->st->codec->subtitle_header);
2761 av_free(ost->resample_frame.data[0]);
2762 av_free(ost->forced_kf_pts);
2763 if (ost->video_resample)
2764 sws_freeContext(ost->img_resample_ctx);
2766 audio_resample_close(ost->resample);
2767 if (ost->reformat_ctx)
2768 av_audio_convert_free(ost->reformat_ctx);
2769 av_dict_free(&ost->opts);
2778 static int opt_format(const char *opt, const char *arg)
2780 last_asked_format = arg;
2784 static int opt_video_rc_override_string(const char *opt, const char *arg)
2786 video_rc_override_string = arg;
2790 static int opt_me_threshold(const char *opt, const char *arg)
2792 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2796 static int opt_verbose(const char *opt, const char *arg)
2798 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2802 static int opt_frame_rate(const char *opt, const char *arg)
2804 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2805 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2811 static int opt_frame_crop(const char *opt, const char *arg)
2813 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2814 return AVERROR(EINVAL);
2817 static int opt_frame_size(const char *opt, const char *arg)
2819 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2820 fprintf(stderr, "Incorrect frame size\n");
2821 return AVERROR(EINVAL);
2826 static int opt_pad(const char *opt, const char *arg) {
2827 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2831 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2833 if (strcmp(arg, "list")) {
2834 frame_pix_fmt = av_get_pix_fmt(arg);
2835 if (frame_pix_fmt == PIX_FMT_NONE) {
2836 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2837 return AVERROR(EINVAL);
2840 opt_pix_fmts(NULL, NULL);
2846 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2853 p = strchr(arg, ':');
2855 x = strtol(arg, &end, 10);
2857 y = strtol(end+1, &end, 10);
2859 ar = (double)x / (double)y;
2861 ar = strtod(arg, NULL);
2864 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2865 return AVERROR(EINVAL);
2867 frame_aspect_ratio = ar;
2871 static int opt_metadata(const char *opt, const char *arg)
2873 char *mid= strchr(arg, '=');
2876 fprintf(stderr, "Missing =\n");
2881 av_dict_set(&metadata, arg, mid, 0);
2886 static int opt_qscale(const char *opt, const char *arg)
2888 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2889 if (video_qscale <= 0 || video_qscale > 255) {
2890 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2891 return AVERROR(EINVAL);
2896 static int opt_top_field_first(const char *opt, const char *arg)
2898 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2899 return opt_default(opt, arg);
2902 static int opt_thread_count(const char *opt, const char *arg)
2904 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2907 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2912 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2914 if (strcmp(arg, "list")) {
2915 audio_sample_fmt = av_get_sample_fmt(arg);
2916 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2917 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2918 return AVERROR(EINVAL);
2923 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2924 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2930 static int opt_audio_rate(const char *opt, const char *arg)
2932 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2936 static int opt_audio_channels(const char *opt, const char *arg)
2938 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2942 static int opt_video_channel(const char *opt, const char *arg)
2944 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
2945 return opt_default("channel", arg);
2948 static int opt_video_standard(const char *opt, const char *arg)
2950 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
2951 return opt_default("standard", arg);
2954 static int opt_codec(const char *opt, const char *arg)
2956 return av_dict_set(&codec_names, opt, arg, 0);
2959 static int opt_audio_codec(const char *opt, const char *arg)
2961 return opt_codec("codec:a", arg);
2964 static int opt_video_codec(const char *opt, const char *arg)
2966 return opt_codec("codec:v", arg);
2969 static int opt_subtitle_codec(const char *opt, const char *arg)
2971 return opt_codec("codec:s", arg);
2974 static int opt_data_codec(const char *opt, const char *arg)
2976 return opt_codec("codec:d", arg);
2979 static int opt_codec_tag(const char *opt, const char *arg)
2982 uint32_t *codec_tag;
2984 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2985 !strcmp(opt, "vtag") ? &video_codec_tag :
2986 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2990 *codec_tag = strtol(arg, &tail, 0);
2992 *codec_tag = AV_RL32(arg);
2997 static int opt_map(const char *opt, const char *arg)
2999 StreamMap *m = NULL;
3000 int i, negative = 0, file_idx;
3001 int sync_file_idx = -1, sync_stream_idx;
3009 map = av_strdup(arg);
3011 /* parse sync stream first, just pick first matching stream */
3012 if (sync = strchr(map, ',')) {
3014 sync_file_idx = strtol(sync + 1, &sync, 0);
3015 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3016 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
3021 for (i = 0; i < input_files[sync_file_idx].ctx->nb_streams; i++)
3022 if (check_stream_specifier(input_files[sync_file_idx].ctx,
3023 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
3024 sync_stream_idx = i;
3027 if (i == input_files[sync_file_idx].ctx->nb_streams) {
3028 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
3029 "match any streams.\n", arg);
3035 file_idx = strtol(map, &p, 0);
3036 if (file_idx >= nb_input_files || file_idx < 0) {
3037 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
3041 /* disable some already defined maps */
3042 for (i = 0; i < nb_stream_maps; i++) {
3043 m = &stream_maps[i];
3044 if (check_stream_specifier(input_files[m->file_index].ctx,
3045 input_files[m->file_index].ctx->streams[m->stream_index],
3046 *p == ':' ? p + 1 : p) > 0)
3050 for (i = 0; i < input_files[file_idx].ctx->nb_streams; i++) {
3051 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
3052 *p == ':' ? p + 1 : p) <= 0)
3054 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
3055 m = &stream_maps[nb_stream_maps - 1];
3057 m->file_index = file_idx;
3058 m->stream_index = i;
3060 if (sync_file_idx >= 0) {
3061 m->sync_file_index = sync_file_idx;
3062 m->sync_stream_index = sync_stream_idx;
3064 m->sync_file_index = file_idx;
3065 m->sync_stream_index = i;
3070 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
3078 static void parse_meta_type(char *arg, char *type, int *index)
3088 if (*(++arg) == ':')
3089 *index = strtol(++arg, NULL, 0);
3092 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3099 static int opt_map_metadata(const char *opt, const char *arg)
3101 MetadataMap *m, *m1;
3104 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3105 &nb_meta_data_maps, nb_meta_data_maps + 1);
3107 m = &meta_data_maps[nb_meta_data_maps - 1][1];
3108 m->file = strtol(arg, &p, 0);
3109 parse_meta_type(p, &m->type, &m->index);
3111 m1 = &meta_data_maps[nb_meta_data_maps - 1][0];
3112 if (p = strchr(opt, ':'))
3113 parse_meta_type(p, &m1->type, &m1->index);
3117 if (m->type == 'g' || m1->type == 'g')
3118 metadata_global_autocopy = 0;
3119 if (m->type == 's' || m1->type == 's')
3120 metadata_streams_autocopy = 0;
3121 if (m->type == 'c' || m1->type == 'c')
3122 metadata_chapters_autocopy = 0;
3127 static int opt_map_meta_data(const char *opt, const char *arg)
3129 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3130 "Use -map_metadata instead.\n");
3131 return opt_map_metadata(opt, arg);
3134 static int opt_input_ts_scale(const char *opt, const char *arg)
3136 unsigned int stream;
3140 stream = strtol(arg, &p, 0);
3143 scale= strtod(p, &p);
3145 if(stream >= MAX_STREAMS)
3148 ts_scale = grow_array(ts_scale, sizeof(*ts_scale), &nb_ts_scale, stream + 1);
3149 ts_scale[stream] = scale;
3153 static int opt_recording_time(const char *opt, const char *arg)
3155 recording_time = parse_time_or_die(opt, arg, 1);
3159 static int opt_start_time(const char *opt, const char *arg)
3161 start_time = parse_time_or_die(opt, arg, 1);
3165 static int opt_recording_timestamp(const char *opt, const char *arg)
3168 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
3169 struct tm time = *gmtime((time_t*)&recording_timestamp);
3170 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
3171 opt_metadata("metadata", buf);
3173 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
3174 "tag instead.\n", opt);
3178 static int opt_input_ts_offset(const char *opt, const char *arg)
3180 input_ts_offset = parse_time_or_die(opt, arg, 1);
3185 static int opt_input_file(const char *opt, const char *filename)
3187 AVFormatContext *ic;
3188 AVInputFormat *file_iformat = NULL;
3189 int err, i, ret, rfps, rfps_base;
3192 AVDictionary **opts;
3193 int orig_nb_streams; // number of streams before avformat_find_stream_info
3195 if (last_asked_format) {
3196 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3197 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3200 last_asked_format = NULL;
3203 if (!strcmp(filename, "-"))
3206 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3207 !strcmp(filename, "/dev/stdin");
3209 /* get default parameters from command line */
3210 ic = avformat_alloc_context();
3212 print_error(filename, AVERROR(ENOMEM));
3215 if (audio_sample_rate) {
3216 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
3217 av_dict_set(&format_opts, "sample_rate", buf, 0);
3219 if (audio_channels) {
3220 snprintf(buf, sizeof(buf), "%d", audio_channels);
3221 av_dict_set(&format_opts, "channels", buf, 0);
3223 if (frame_rate.num) {
3224 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
3225 av_dict_set(&format_opts, "framerate", buf, 0);
3227 if (frame_width && frame_height) {
3228 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
3229 av_dict_set(&format_opts, "video_size", buf, 0);
3231 if (frame_pix_fmt != PIX_FMT_NONE)
3232 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
3234 ic->flags |= AVFMT_FLAG_NONBLOCK;
3237 av_log(NULL, AV_LOG_WARNING, "-loop_input is deprecated, use -loop 1\n");
3238 ic->loop_input = loop_input;
3241 /* open the input file with generic libav function */
3242 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3244 print_error(filename, err);
3247 assert_avoptions(format_opts);
3252 for(i=0; i<ic->nb_streams; i++){
3253 ic->streams[i]->discard= AVDISCARD_ALL;
3255 for(i=0; i<ic->nb_programs; i++){
3256 AVProgram *p= ic->programs[i];
3257 if(p->id != opt_programid){
3258 p->discard = AVDISCARD_ALL;
3261 for(j=0; j<p->nb_stream_indexes; j++){
3262 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3267 fprintf(stderr, "Specified program id not found\n");
3273 /* apply forced codec ids */
3274 for (i = 0; i < ic->nb_streams; i++)
3275 choose_codec(ic, ic->streams[i], ic->streams[i]->codec->codec_type, codec_names);
3277 /* Set AVCodecContext options for avformat_find_stream_info */
3278 opts = setup_find_stream_info_opts(ic, codec_opts);
3279 orig_nb_streams = ic->nb_streams;
3281 /* If not enough info to get the stream parameters, we decode the
3282 first frames to get it. (used in mpeg case for example) */
3283 ret = avformat_find_stream_info(ic, opts);
3284 if (ret < 0 && verbose >= 0) {
3285 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3286 av_close_input_file(ic);
3290 timestamp = start_time;
3291 /* add the stream start time */
3292 if (ic->start_time != AV_NOPTS_VALUE)
3293 timestamp += ic->start_time;
3295 /* if seeking requested, we execute it */
3296 if (start_time != 0) {
3297 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3299 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3300 filename, (double)timestamp / AV_TIME_BASE);
3302 /* reset seek info */
3306 /* update the current parameters so that they match the one of the input stream */
3307 for(i=0;i<ic->nb_streams;i++) {
3308 AVStream *st = ic->streams[i];
3309 AVCodecContext *dec = st->codec;
3312 dec->thread_count = thread_count;
3314 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3315 ist = &input_streams[nb_input_streams - 1];
3317 ist->file_index = nb_input_files;
3319 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
3321 if (i < nb_ts_scale)
3322 ist->ts_scale = ts_scale[i];
3324 ist->dec = choose_codec(ic, st, dec->codec_type, codec_names);
3326 switch (dec->codec_type) {
3327 case AVMEDIA_TYPE_AUDIO:
3329 ist->dec = avcodec_find_decoder(dec->codec_id);
3331 st->discard= AVDISCARD_ALL;
3333 case AVMEDIA_TYPE_VIDEO:
3335 ist->dec = avcodec_find_decoder(dec->codec_id);
3336 rfps = ic->streams[i]->r_frame_rate.num;
3337 rfps_base = ic->streams[i]->r_frame_rate.den;
3339 dec->flags |= CODEC_FLAG_EMU_EDGE;
3342 dec->debug |= FF_DEBUG_MV;
3344 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3347 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3348 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3350 (float)rfps / rfps_base, rfps, rfps_base);
3354 st->discard= AVDISCARD_ALL;
3355 else if(video_discard)
3356 st->discard= video_discard;
3358 case AVMEDIA_TYPE_DATA:
3360 case AVMEDIA_TYPE_SUBTITLE:
3362 ist->dec = avcodec_find_decoder(dec->codec_id);
3363 if(subtitle_disable)
3364 st->discard = AVDISCARD_ALL;
3366 case AVMEDIA_TYPE_ATTACHMENT:
3367 case AVMEDIA_TYPE_UNKNOWN:
3374 /* dump the file content */
3376 av_dump_format(ic, nb_input_files, filename, 0);
3378 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3379 input_files[nb_input_files - 1].ctx = ic;
3380 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3381 input_files[nb_input_files - 1].ts_offset = input_ts_offset - (copy_ts ? 0 : timestamp);
3382 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3384 top_field_first = -1;
3385 frame_rate = (AVRational){0, 0};
3386 frame_pix_fmt = PIX_FMT_NONE;
3389 audio_sample_rate = 0;
3391 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3392 av_freep(&ts_scale);
3395 for (i = 0; i < orig_nb_streams; i++)
3396 av_dict_free(&opts[i]);
3398 av_dict_free(&codec_names);
3404 static OutputStream *new_video_stream(AVFormatContext *oc, int file_idx)
3408 AVCodecContext *video_enc;
3410 ost = new_output_stream(oc, file_idx, AVMEDIA_TYPE_VIDEO);
3412 if (!st->stream_copy) {
3413 ost->frame_aspect_ratio = frame_aspect_ratio;
3414 frame_aspect_ratio = 0;
3416 ost->avfilter = vfilters;
3421 ost->bitstream_filters = video_bitstream_filters;
3422 video_bitstream_filters= NULL;
3424 st->codec->thread_count= thread_count;
3426 video_enc = st->codec;
3429 video_enc->codec_tag= video_codec_tag;
3431 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3432 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3435 if (st->stream_copy) {
3436 video_enc->sample_aspect_ratio =
3437 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3443 ost->frame_rate = frame_rate;
3445 video_enc->width = frame_width;
3446 video_enc->height = frame_height;
3447 video_enc->pix_fmt = frame_pix_fmt;
3448 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3449 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3452 video_enc->gop_size = 0;
3453 if (video_qscale || same_quant) {
3454 video_enc->flags |= CODEC_FLAG_QSCALE;
3455 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3459 video_enc->intra_matrix = intra_matrix;
3461 video_enc->inter_matrix = inter_matrix;
3463 p= video_rc_override_string;
3466 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3468 fprintf(stderr, "error parsing rc_override\n");
3471 video_enc->rc_override=
3472 av_realloc(video_enc->rc_override,
3473 sizeof(RcOverride)*(i+1));
3474 video_enc->rc_override[i].start_frame= start;
3475 video_enc->rc_override[i].end_frame = end;
3477 video_enc->rc_override[i].qscale= q;
3478 video_enc->rc_override[i].quality_factor= 1.0;
3481 video_enc->rc_override[i].qscale= 0;
3482 video_enc->rc_override[i].quality_factor= -q/100.0;
3487 video_enc->rc_override_count=i;
3488 if (!video_enc->rc_initial_buffer_occupancy)
3489 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3490 video_enc->me_threshold= me_threshold;
3491 video_enc->intra_dc_precision= intra_dc_precision - 8;
3494 video_enc->flags|= CODEC_FLAG_PSNR;
3499 video_enc->flags |= CODEC_FLAG_PASS1;
3501 video_enc->flags |= CODEC_FLAG_PASS2;
3505 if (forced_key_frames)
3506 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3508 if (video_language) {
3509 av_dict_set(&st->metadata, "language", video_language, 0);
3510 av_freep(&video_language);
3513 /* reset some key parameters */
3515 av_freep(&forced_key_frames);
3516 frame_pix_fmt = PIX_FMT_NONE;
3520 static OutputStream *new_audio_stream(AVFormatContext *oc, int file_idx)
3524 AVCodecContext *audio_enc;
3526 ost = new_output_stream(oc, file_idx, AVMEDIA_TYPE_AUDIO);
3529 ost->bitstream_filters = audio_bitstream_filters;
3530 audio_bitstream_filters= NULL;
3532 st->codec->thread_count= thread_count;
3534 audio_enc = st->codec;
3535 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3538 audio_enc->codec_tag= audio_codec_tag;
3540 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3541 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3543 if (!st->stream_copy) {
3544 if (audio_qscale > QSCALE_NONE) {
3545 audio_enc->flags |= CODEC_FLAG_QSCALE;
3546 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3549 audio_enc->channels = audio_channels;
3550 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3551 audio_enc->sample_fmt = audio_sample_fmt;
3552 if (audio_sample_rate)
3553 audio_enc->sample_rate = audio_sample_rate;
3555 if (audio_language) {
3556 av_dict_set(&st->metadata, "language", audio_language, 0);
3557 av_freep(&audio_language);
3560 /* reset some key parameters */
3566 static OutputStream *new_data_stream(AVFormatContext *oc, int file_idx)
3570 AVCodecContext *data_enc;
3572 ost = new_output_stream(oc, file_idx, AVMEDIA_TYPE_DATA);
3574 data_enc = st->codec;
3575 if (!st->stream_copy) {
3576 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3581 data_enc->codec_tag= data_codec_tag;
3583 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3584 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3591 static OutputStream *new_subtitle_stream(AVFormatContext *oc, int file_idx)
3595 AVCodecContext *subtitle_enc;
3597 ost = new_output_stream(oc, file_idx, AVMEDIA_TYPE_SUBTITLE);
3599 subtitle_enc = st->codec;
3601 ost->bitstream_filters = subtitle_bitstream_filters;
3602 subtitle_bitstream_filters= NULL;
3604 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3606 if(subtitle_codec_tag)
3607 subtitle_enc->codec_tag= subtitle_codec_tag;
3609 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3610 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3613 if (subtitle_language) {
3614 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3615 av_freep(&subtitle_language);
3618 subtitle_disable = 0;
3622 /* arg format is "output-stream-index:streamid-value". */
3623 static int opt_streamid(const char *opt, const char *arg)
3629 av_strlcpy(idx_str, arg, sizeof(idx_str));
3630 p = strchr(idx_str, ':');
3633 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3638 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3639 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3640 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3644 static int opt_output_file(const char *opt, const char *filename)
3646 AVFormatContext *oc;
3648 AVOutputFormat *file_oformat;
3652 if(nb_output_files >= FF_ARRAY_ELEMS(output_files)){
3653 fprintf(stderr, "Too many output files\n");
3657 if (!strcmp(filename, "-"))
3660 err = avformat_alloc_output_context2(&oc, NULL, last_asked_format, filename);
3661 last_asked_format = NULL;
3663 print_error(filename, err);
3666 file_oformat= oc->oformat;
3668 if (!strcmp(file_oformat->name, "ffm") &&
3669 av_strstart(filename, "http:", NULL)) {
3670 /* special case for files sent to ffserver: we get the stream
3671 parameters from ffserver */
3672 int err = read_ffserver_streams(oc, filename);
3674 print_error(filename, err);
3677 } else if (!nb_stream_maps) {
3678 /* pick the "best" stream of each type */
3679 #define NEW_STREAM(type, index)\
3681 ost = new_ ## type ## _stream(oc, nb_output_files);\
3682 ost->source_index = index;\
3683 ost->sync_ist = &input_streams[index];\
3684 input_streams[index].discard = 0;\
3687 /* video: highest resolution */
3688 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3689 int area = 0, idx = -1;
3690 for (i = 0; i < nb_input_streams; i++) {
3691 ist = &input_streams[i];
3692 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3693 ist->st->codec->width * ist->st->codec->height > area) {
3694 area = ist->st->codec->width * ist->st->codec->height;
3698 NEW_STREAM(video, idx);
3701 /* audio: most channels */
3702 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3703 int channels = 0, idx = -1;
3704 for (i = 0; i < nb_input_streams; i++) {
3705 ist = &input_streams[i];
3706 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3707 ist->st->codec->channels > channels) {
3708 channels = ist->st->codec->channels;
3712 NEW_STREAM(audio, idx);
3715 /* subtitles: pick first */
3716 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3717 for (i = 0; i < nb_input_streams; i++)
3718 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3719 NEW_STREAM(subtitle, i);
3723 /* do something with data? */
3725 for (i = 0; i < nb_stream_maps; i++) {
3726 StreamMap *map = &stream_maps[i];
3731 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3732 switch (ist->st->codec->codec_type) {
3733 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(oc, nb_output_files); break;
3734 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(oc, nb_output_files); break;
3735 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(oc, nb_output_files); break;
3736 case AVMEDIA_TYPE_DATA: ost = new_data_stream(oc, nb_output_files); break;
3738 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3739 map->file_index, map->stream_index);
3743 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3744 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3745 map->sync_stream_index];
3750 av_dict_copy(&oc->metadata, metadata, 0);
3751 av_dict_free(&metadata);
3753 av_dict_copy(&output_opts[nb_output_files], format_opts, 0);
3754 output_files[nb_output_files++] = oc;
3756 /* check filename in case of an image number is expected */
3757 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3758 if (!av_filename_number_test(oc->filename)) {
3759 print_error(oc->filename, AVERROR(EINVAL));
3764 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3765 /* test if it already exists to avoid loosing precious files */
3766 if (!file_overwrite &&
3767 (strchr(filename, ':') == NULL ||
3768 filename[1] == ':' ||
3769 av_strstart(filename, "file:", NULL))) {
3770 if (avio_check(filename, 0) == 0) {
3772 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3774 if (!read_yesno()) {
3775 fprintf(stderr, "Not overwriting - exiting\n");
3780 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3787 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3788 print_error(filename, err);
3793 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3794 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3796 if (loop_output >= 0) {
3797 av_log(NULL, AV_LOG_WARNING, "-loop_output is deprecated, use -loop\n");
3798 oc->loop_output = loop_output;
3802 if (chapters_input_file >= nb_input_files) {
3803 if (chapters_input_file == INT_MAX) {
3804 /* copy chapters from the first input file that has them*/
3805 chapters_input_file = -1;
3806 for (i = 0; i < nb_input_files; i++)
3807 if (input_files[i].ctx->nb_chapters) {
3808 chapters_input_file = i;
3812 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3813 chapters_input_file);
3817 if (chapters_input_file >= 0)
3818 copy_chapters(chapters_input_file, nb_output_files - 1);
3821 for (i = 0; i < nb_meta_data_maps; i++) {
3822 AVFormatContext *files[2];
3823 AVDictionary **meta[2];
3826 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3827 if ((index) < 0 || (index) >= (nb_elems)) {\
3828 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3833 int in_file_index = meta_data_maps[i][1].file;
3834 if (in_file_index < 0)
3836 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3839 files[1] = input_files[in_file_index].ctx;
3841 for (j = 0; j < 2; j++) {
3842 MetadataMap *map = &meta_data_maps[i][j];
3844 switch (map->type) {
3846 meta[j] = &files[j]->metadata;
3849 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3850 meta[j] = &files[j]->streams[map->index]->metadata;
3853 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3854 meta[j] = &files[j]->chapters[map->index]->metadata;
3857 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3858 meta[j] = &files[j]->programs[map->index]->metadata;
3863 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3866 /* copy global metadata by default */
3867 if (metadata_global_autocopy)
3868 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3869 AV_DICT_DONT_OVERWRITE);
3870 if (metadata_streams_autocopy)
3871 for (i = 0; i < oc->nb_streams; i++) {
3872 InputStream *ist = &input_streams[output_streams_for_file[nb_output_files-1][i]->source_index];
3873 av_dict_copy(&oc->streams[i]->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3876 frame_rate = (AVRational){0, 0};
3879 audio_sample_rate = 0;
3881 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3882 chapters_input_file = INT_MAX;
3884 av_freep(&meta_data_maps);
3885 nb_meta_data_maps = 0;
3886 metadata_global_autocopy = 1;
3887 metadata_streams_autocopy = 1;
3888 metadata_chapters_autocopy = 1;
3889 av_freep(&stream_maps);
3892 av_dict_free(&codec_names);
3894 av_freep(&forced_key_frames);
3900 /* same option as mencoder */
3901 static int opt_pass(const char *opt, const char *arg)
3903 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3907 static int64_t getutime(void)
3910 struct rusage rusage;
3912 getrusage(RUSAGE_SELF, &rusage);
3913 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3914 #elif HAVE_GETPROCESSTIMES
3916 FILETIME c, e, k, u;
3917 proc = GetCurrentProcess();
3918 GetProcessTimes(proc, &c, &e, &k, &u);
3919 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3921 return av_gettime();
3925 static int64_t getmaxrss(void)
3927 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3928 struct rusage rusage;
3929 getrusage(RUSAGE_SELF, &rusage);
3930 return (int64_t)rusage.ru_maxrss * 1024;
3931 #elif HAVE_GETPROCESSMEMORYINFO
3933 PROCESS_MEMORY_COUNTERS memcounters;
3934 proc = GetCurrentProcess();
3935 memcounters.cb = sizeof(memcounters);
3936 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3937 return memcounters.PeakPagefileUsage;
3943 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3946 const char *p = str;
3953 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3960 static int opt_inter_matrix(const char *opt, const char *arg)
3962 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3963 parse_matrix_coeffs(inter_matrix, arg);
3967 static int opt_intra_matrix(const char *opt, const char *arg)
3969 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3970 parse_matrix_coeffs(intra_matrix, arg);
3974 static void show_usage(void)
3976 printf("Hyper fast Audio and Video encoder\n");
3977 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3981 static int opt_help(const char *opt, const char *arg)
3984 AVOutputFormat *oformat = NULL;
3985 AVInputFormat *iformat = NULL;
3987 av_log_set_callback(log_callback_help);
3989 show_help_options(options, "Main options:\n",
3990 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3991 show_help_options(options, "\nAdvanced options:\n",
3992 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3994 show_help_options(options, "\nVideo options:\n",
3995 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3997 show_help_options(options, "\nAdvanced Video options:\n",
3998 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3999 OPT_VIDEO | OPT_EXPERT);
4000 show_help_options(options, "\nAudio options:\n",
4001 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4003 show_help_options(options, "\nAdvanced Audio options:\n",
4004 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4005 OPT_AUDIO | OPT_EXPERT);
4006 show_help_options(options, "\nSubtitle options:\n",
4007 OPT_SUBTITLE | OPT_GRAB,
4009 show_help_options(options, "\nAudio/Video grab options:\n",
4013 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4016 /* individual codec options */
4018 while ((c = av_codec_next(c))) {
4019 if (c->priv_class) {
4020 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4025 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4028 /* individual muxer options */
4029 while ((oformat = av_oformat_next(oformat))) {
4030 if (oformat->priv_class) {
4031 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4036 /* individual demuxer options */
4037 while ((iformat = av_iformat_next(iformat))) {
4038 if (iformat->priv_class) {
4039 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
4044 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4048 static int opt_target(const char *opt, const char *arg)
4050 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4051 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4053 if(!strncmp(arg, "pal-", 4)) {
4056 } else if(!strncmp(arg, "ntsc-", 5)) {
4059 } else if(!strncmp(arg, "film-", 5)) {
4064 /* Calculate FR via float to avoid int overflow */
4065 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4068 } else if((fr == 29970) || (fr == 23976)) {
4071 /* Try to determine PAL/NTSC by peeking in the input files */
4072 if(nb_input_files) {
4074 for (j = 0; j < nb_input_files; j++) {
4075 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
4076 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4077 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4079 fr = c->time_base.den * 1000 / c->time_base.num;
4083 } else if((fr == 29970) || (fr == 23976)) {
4093 if(verbose > 0 && norm != UNKNOWN)
4094 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4097 if(norm == UNKNOWN) {
4098 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4099 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4100 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4104 if(!strcmp(arg, "vcd")) {
4105 opt_codec("c:v", "mpeg1video");
4106 opt_codec("c:a", "mp2");
4107 opt_format("f", "vcd");
4109 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4110 opt_frame_rate("r", frame_rates[norm]);
4111 opt_default("g", norm == PAL ? "15" : "18");
4113 opt_default("b", "1150000");
4114 opt_default("maxrate", "1150000");
4115 opt_default("minrate", "1150000");
4116 opt_default("bufsize", "327680"); // 40*1024*8;
4118 opt_default("b:a", "224000");
4119 audio_sample_rate = 44100;
4122 opt_default("packetsize", "2324");
4123 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4125 /* We have to offset the PTS, so that it is consistent with the SCR.
4126 SCR starts at 36000, but the first two packs contain only padding
4127 and the first pack from the other stream, respectively, may also have
4128 been written before.
4129 So the real data starts at SCR 36000+3*1200. */
4130 mux_preload= (36000+3*1200) / 90000.0; //0.44
4131 } else if(!strcmp(arg, "svcd")) {
4133 opt_codec("c:v", "mpeg2video");
4134 opt_codec("c:a", "mp2");
4135 opt_format("f", "svcd");
4137 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4138 opt_frame_rate("r", frame_rates[norm]);
4139 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4140 opt_default("g", norm == PAL ? "15" : "18");
4142 opt_default("b", "2040000");
4143 opt_default("maxrate", "2516000");
4144 opt_default("minrate", "0"); //1145000;
4145 opt_default("bufsize", "1835008"); //224*1024*8;
4146 opt_default("flags", "+scan_offset");
4149 opt_default("b:a", "224000");
4150 audio_sample_rate = 44100;
4152 opt_default("packetsize", "2324");
4154 } else if(!strcmp(arg, "dvd")) {
4156 opt_codec("c:v", "mpeg2video");
4157 opt_codec("c:a", "ac3");
4158 opt_format("f", "dvd");
4160 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4161 opt_frame_rate("r", frame_rates[norm]);
4162 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4163 opt_default("g", norm == PAL ? "15" : "18");
4165 opt_default("b", "6000000");
4166 opt_default("maxrate", "9000000");
4167 opt_default("minrate", "0"); //1500000;
4168 opt_default("bufsize", "1835008"); //224*1024*8;
4170 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4171 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4173 opt_default("b:a", "448000");
4174 audio_sample_rate = 48000;
4176 } else if(!strncmp(arg, "dv", 2)) {
4178 opt_format("f", "dv");
4180 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4181 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4182 norm == PAL ? "yuv420p" : "yuv411p");
4183 opt_frame_rate("r", frame_rates[norm]);
4185 audio_sample_rate = 48000;
4189 fprintf(stderr, "Unknown target: %s\n", arg);
4190 return AVERROR(EINVAL);
4195 static int opt_vstats_file(const char *opt, const char *arg)
4197 av_free (vstats_filename);
4198 vstats_filename=av_strdup (arg);
4202 static int opt_vstats(const char *opt, const char *arg)
4205 time_t today2 = time(NULL);
4206 struct tm *today = localtime(&today2);
4208 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4210 return opt_vstats_file(opt, filename);
4213 static int opt_bsf(const char *opt, const char *arg)
4215 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4216 AVBitStreamFilterContext **bsfp;
4219 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4223 bsfp= *opt == 'v' ? &video_bitstream_filters :
4224 *opt == 'a' ? &audio_bitstream_filters :
4225 &subtitle_bitstream_filters;
4227 bsfp= &(*bsfp)->next;
4234 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4238 static int opt_passlogfile(const char *opt, const char *arg)
4240 pass_logfilename_prefix = arg;
4241 #if CONFIG_LIBX264_ENCODER
4242 return opt_default("passlogfile", arg);
4248 static const OptionDef options[] = {
4250 #include "cmdutils_common_opts.h"
4251 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4252 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4253 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4254 { "c", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4255 { "codec", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4256 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4257 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4258 "outfile[,metadata]:infile[,metadata]" },
4259 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4260 "outfile[,metadata]:infile[,metadata]" },
4261 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&chapters_input_file}, "set chapters mapping", "input_file_index" },
4262 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4263 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4264 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4265 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4266 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4267 { "timestamp", HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4268 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4269 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4270 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4271 "add timings for benchmarking" },
4272 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4273 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4274 "dump each input packet" },
4275 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4276 "when dumping packets, also dump the payload" },
4277 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4278 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "deprecated, use -loop" },
4279 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "deprecated, use -loop", "" },
4280 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4281 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4282 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4283 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4284 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4285 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4286 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4287 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4288 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4289 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4290 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4291 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4292 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4295 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4296 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4297 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4298 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4299 { "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" },
4300 { "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" },
4301 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4302 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4303 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4304 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4305 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4306 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4307 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4308 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4309 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4310 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4311 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4312 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4313 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4314 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4315 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4316 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4317 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4318 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4319 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4320 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4321 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4322 "deinterlace pictures" },
4323 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4324 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4325 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4327 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4329 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4330 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4331 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4332 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4333 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4334 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4335 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4336 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4337 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4338 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4341 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4342 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4343 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4344 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4345 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4346 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4347 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4348 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4349 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4350 { "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" },
4352 /* subtitle options */
4353 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4354 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4355 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4356 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4359 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
4360 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
4361 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4364 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4365 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4367 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4368 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4369 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4371 /* data codec support */
4372 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4374 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4378 int main(int argc, char **argv)
4382 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4384 if(argc>1 && !strcmp(argv[1], "-d")){
4387 av_log_set_callback(log_callback_null);
4392 avcodec_register_all();
4394 avdevice_register_all();
4397 avfilter_register_all();
4402 if(isatty(STDIN_FILENO))
4403 avio_set_interrupt_cb(decode_interrupt_cb);
4412 parse_options(argc, argv, options, opt_output_file);
4414 if(nb_output_files <= 0 && nb_input_files == 0) {
4416 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4420 /* file converter / grab */
4421 if (nb_output_files <= 0) {
4422 fprintf(stderr, "At least one output file must be specified\n");
4426 if (nb_input_files == 0) {
4427 fprintf(stderr, "At least one input file must be specified\n");
4432 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4434 ti = getutime() - ti;
4436 int maxrss = getmaxrss() / 1024;
4437 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4440 return exit_program(0);