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
22 /* needed for usleep() */
23 #define _XOPEN_SOURCE 600
34 #include "libavformat/avformat.h"
35 #include "libavdevice/avdevice.h"
36 #include "libswscale/swscale.h"
37 #include "libavcodec/opt.h"
38 #include "libavcodec/audioconvert.h"
39 #include "libavcodec/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/pixdesc.h"
42 #include "libavutil/avstring.h"
43 #include "libavutil/libm.h"
44 #include "libavformat/os_support.h"
47 # include "libavfilter/avfilter.h"
48 # include "libavfilter/avfiltergraph.h"
49 # include "libavfilter/graphparser.h"
50 # include "libavfilter/vsrc_buffer.h"
53 #if HAVE_SYS_RESOURCE_H
54 #include <sys/types.h>
56 #include <sys/resource.h>
57 #elif HAVE_GETPROCESSTIMES
60 #if HAVE_GETPROCESSMEMORYINFO
66 #include <sys/select.h>
71 #include <sys/ioctl.h>
84 const char program_name[] = "FFmpeg";
85 const int program_birth_year = 2000;
87 /* select an input stream for an output stream */
88 typedef struct AVStreamMap {
92 int sync_stream_index;
95 /** select an input file for an output file */
96 typedef struct AVMetaDataMap {
101 static const OptionDef options[];
103 #define MAX_FILES 100
105 static const char *last_asked_format = NULL;
106 static AVFormatContext *input_files[MAX_FILES];
107 static int64_t input_files_ts_offset[MAX_FILES];
108 static double input_files_ts_scale[MAX_FILES][MAX_STREAMS];
109 static AVCodec *input_codecs[MAX_FILES*MAX_STREAMS];
110 static int nb_input_files = 0;
111 static int nb_icodecs;
113 static AVFormatContext *output_files[MAX_FILES];
114 static AVCodec *output_codecs[MAX_FILES*MAX_STREAMS];
115 static int nb_output_files = 0;
116 static int nb_ocodecs;
118 static AVStreamMap stream_maps[MAX_FILES*MAX_STREAMS];
119 static int nb_stream_maps;
121 static AVMetaDataMap meta_data_maps[MAX_FILES];
122 static int nb_meta_data_maps;
124 static int frame_width = 0;
125 static int frame_height = 0;
126 static float frame_aspect_ratio = 0;
127 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
128 static enum SampleFormat audio_sample_fmt = SAMPLE_FMT_NONE;
129 static int frame_padtop = 0;
130 static int frame_padbottom = 0;
131 static int frame_padleft = 0;
132 static int frame_padright = 0;
133 static int padcolor[3] = {16,128,128}; /* default to black */
134 static int frame_topBand = 0;
135 static int frame_bottomBand = 0;
136 static int frame_leftBand = 0;
137 static int frame_rightBand = 0;
138 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
139 static AVRational frame_rate;
140 static float video_qscale = 0;
141 static uint16_t *intra_matrix = NULL;
142 static uint16_t *inter_matrix = NULL;
143 static const char *video_rc_override_string=NULL;
144 static int video_disable = 0;
145 static int video_discard = 0;
146 static char *video_codec_name = NULL;
147 static int video_codec_tag = 0;
148 static char *video_language = NULL;
149 static int same_quality = 0;
150 static int do_deinterlace = 0;
151 static int top_field_first = -1;
152 static int me_threshold = 0;
153 static int intra_dc_precision = 8;
154 static int loop_input = 0;
155 static int loop_output = AVFMT_NOOUTPUTLOOP;
156 static int qp_hist = 0;
158 static char *vfilters = NULL;
159 AVFilterGraph *filt_graph_all = NULL;
162 static int intra_only = 0;
163 static int audio_sample_rate = 44100;
164 static int64_t channel_layout = 0;
165 #define QSCALE_NONE -99999
166 static float audio_qscale = QSCALE_NONE;
167 static int audio_disable = 0;
168 static int audio_channels = 1;
169 static char *audio_codec_name = NULL;
170 static int audio_codec_tag = 0;
171 static char *audio_language = NULL;
173 static int subtitle_disable = 0;
174 static char *subtitle_codec_name = NULL;
175 static char *subtitle_language = NULL;
176 static int subtitle_codec_tag = 0;
178 static float mux_preload= 0.5;
179 static float mux_max_delay= 0.7;
181 static int64_t recording_time = INT64_MAX;
182 static int64_t start_time = 0;
183 static int64_t rec_timestamp = 0;
184 static int64_t input_ts_offset = 0;
185 static int file_overwrite = 0;
186 static int metadata_count;
187 static AVMetadataTag *metadata;
188 static int do_benchmark = 0;
189 static int do_hex_dump = 0;
190 static int do_pkt_dump = 0;
191 static int do_psnr = 0;
192 static int do_pass = 0;
193 static char *pass_logfilename_prefix = NULL;
194 static int audio_stream_copy = 0;
195 static int video_stream_copy = 0;
196 static int subtitle_stream_copy = 0;
197 static int video_sync_method= -1;
198 static int audio_sync_method= 0;
199 static float audio_drift_threshold= 0.1;
200 static int copy_ts= 0;
201 static int opt_shortest = 0;
202 static int video_global_header = 0;
203 static char *vstats_filename;
204 static FILE *vstats_file;
205 static int opt_programid = 0;
206 static int copy_initial_nonkeyframes = 0;
208 static int rate_emu = 0;
210 static int video_channel = 0;
211 static char *video_standard;
213 static int audio_volume = 256;
215 static int exit_on_error = 0;
216 static int using_stdin = 0;
217 static int verbose = 1;
218 static int thread_count= 1;
219 static int q_pressed = 0;
220 static int64_t video_size = 0;
221 static int64_t audio_size = 0;
222 static int64_t extra_size = 0;
223 static int nb_frames_dup = 0;
224 static int nb_frames_drop = 0;
225 static int input_sync;
226 static uint64_t limit_filesize = 0;
227 static int force_fps = 0;
229 static int pgmyuv_compatibility_hack=0;
230 static float dts_delta_threshold = 10;
232 static unsigned int sws_flags = SWS_BICUBIC;
234 static int64_t timer_start;
236 static uint8_t *audio_buf;
237 static uint8_t *audio_out;
238 unsigned int allocated_audio_out_size, allocated_audio_buf_size;
240 static short *samples;
242 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
243 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
244 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
245 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
247 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
249 struct AVInputStream;
251 typedef struct AVOutputStream {
252 int file_index; /* file index */
253 int index; /* stream index in the output file */
254 int source_index; /* AVInputStream index */
255 AVStream *st; /* stream in the output file */
256 int encoding_needed; /* true if encoding needed for this stream */
258 /* input pts and corresponding output pts
260 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
261 struct AVInputStream *sync_ist; /* input stream to sync against */
262 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
265 AVFrame pict_tmp; /* temporary image for resampling */
266 struct SwsContext *img_resample_ctx; /* for image resampling */
269 int resample_pix_fmt;
271 /* full frame size of first frame */
275 /* cropping area sizes */
282 /* cropping area of first frame */
283 int original_topBand;
284 int original_bottomBand;
285 int original_leftBand;
286 int original_rightBand;
288 /* padding area sizes */
297 ReSampleContext *resample; /* for audio resampling */
299 AVAudioConvert *reformat_ctx;
300 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
304 typedef struct AVInputStream {
308 int discard; /* true if stream data should be discarded */
309 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
310 int64_t sample_index; /* current sample */
312 int64_t start; /* time when read started */
313 int64_t next_pts; /* synthetic pts for cases where pkt.pts
315 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;
320 AVFilterContext *out_video_filter;
321 AVFilterContext *input_video_filter;
322 AVFrame *filter_frame;
323 int has_filter_frame;
324 AVFilterPicRef *picref;
328 typedef struct AVInputFile {
329 int eof_reached; /* true if eof reached */
330 int ist_index; /* index of first stream in ist_table */
331 int buffer_size; /* current total buffer size */
332 int nb_streams; /* nb streams we are aware of */
337 /* init terminal so that we can grab keys */
338 static struct termios oldtty;
347 static int output_init(AVFilterContext *ctx, const char *args, void *opaque)
349 FilterOutPriv *priv = ctx->priv;
351 if(!opaque) return -1;
353 priv->pix_fmt = *((int *)opaque);
358 static void output_end_frame(AVFilterLink *link)
362 static int output_query_formats(AVFilterContext *ctx)
364 FilterOutPriv *priv = ctx->priv;
365 enum PixelFormat pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE };
367 avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
371 static int get_filtered_video_pic(AVFilterContext *ctx,
372 AVFilterPicRef **picref, AVFrame *pic2,
377 if(avfilter_request_frame(ctx->inputs[0]))
379 if(!(pic = ctx->inputs[0]->cur_pic))
382 ctx->inputs[0]->cur_pic = NULL;
386 memcpy(pic2->data, pic->data, sizeof(pic->data));
387 memcpy(pic2->linesize, pic->linesize, sizeof(pic->linesize));
392 static AVFilter output_filter =
394 .name = "ffmpeg_output",
396 .priv_size = sizeof(FilterOutPriv),
399 .query_formats = output_query_formats,
401 .inputs = (AVFilterPad[]) {{ .name = "default",
402 .type = AVMEDIA_TYPE_VIDEO,
403 .end_frame = output_end_frame,
404 .min_perms = AV_PERM_READ, },
406 .outputs = (AVFilterPad[]) {{ .name = NULL }},
409 static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
411 AVFilterContext *curr_filter;
412 /** filter graph containing all filters including input & output */
413 AVCodecContext *codec = ost->st->codec;
414 AVCodecContext *icodec = ist->st->codec;
417 filt_graph_all = av_mallocz(sizeof(AVFilterGraph));
419 if(!(ist->input_video_filter = avfilter_open(avfilter_get_by_name("buffer"), "src")))
421 if(!(ist->out_video_filter = avfilter_open(&output_filter, "out")))
424 snprintf(args, 255, "%d:%d:%d", ist->st->codec->width,
425 ist->st->codec->height, ist->st->codec->pix_fmt);
426 if(avfilter_init_filter(ist->input_video_filter, args, NULL))
428 if(avfilter_init_filter(ist->out_video_filter, NULL, &codec->pix_fmt))
431 /* add input and output filters to the overall graph */
432 avfilter_graph_add_filter(filt_graph_all, ist->input_video_filter);
433 avfilter_graph_add_filter(filt_graph_all, ist->out_video_filter);
435 curr_filter = ist->input_video_filter;
437 if(ost->video_crop) {
439 AVFilterContext *filt_crop;
440 snprintf(crop_args, 255, "%d:%d:%d:%d", ost->leftBand, ost->topBand,
441 codec->width - (frame_padleft + frame_padright),
442 codec->height - (frame_padtop + frame_padbottom));
443 filt_crop = avfilter_open(avfilter_get_by_name("crop"), NULL);
446 if (avfilter_init_filter(filt_crop, crop_args, NULL))
448 if (avfilter_link(curr_filter, 0, filt_crop, 0))
450 curr_filter = filt_crop;
451 avfilter_graph_add_filter(filt_graph_all, curr_filter);
455 icodec->width - (frame_leftBand + frame_rightBand) +
456 (frame_padleft + frame_padright)) ||
457 (codec->height != icodec->height - (frame_topBand + frame_bottomBand) +
458 (frame_padtop + frame_padbottom))) {
459 char scale_args[255];
460 AVFilterContext *filt_scale;
461 snprintf(scale_args, 255, "%d:%d:flags=0x%X",
462 codec->width - (frame_padleft + frame_padright),
463 codec->height - (frame_padtop + frame_padbottom),
464 (int)av_get_int(sws_opts, "sws_flags", NULL));
465 filt_scale = avfilter_open(avfilter_get_by_name("scale"), NULL);
468 if (avfilter_init_filter(filt_scale, scale_args, NULL))
470 if (avfilter_link(curr_filter, 0, filt_scale, 0))
472 curr_filter = filt_scale;
473 avfilter_graph_add_filter(filt_graph_all, curr_filter);
477 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
478 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
480 outputs->name = av_strdup("in");
481 outputs->filter = curr_filter;
482 outputs->pad_idx = 0;
483 outputs->next = NULL;
485 inputs->name = av_strdup("out");
486 inputs->filter = ist->out_video_filter;
490 if (avfilter_graph_parse(filt_graph_all, vfilters, inputs, outputs, NULL) < 0)
494 if(avfilter_link(curr_filter, 0, ist->out_video_filter, 0) < 0)
499 char scale_sws_opts[128];
500 snprintf(scale_sws_opts, sizeof(scale_sws_opts), "flags=0x%X", (int)av_get_int(sws_opts, "sws_flags", NULL));
501 filt_graph_all->scale_sws_opts = av_strdup(scale_sws_opts);
504 /* configure all the filter links */
505 if(avfilter_graph_check_validity(filt_graph_all, NULL))
507 if(avfilter_graph_config_formats(filt_graph_all, NULL))
509 if(avfilter_graph_config_links(filt_graph_all, NULL))
512 codec->width = ist->out_video_filter->inputs[0]->w;
513 codec->height = ist->out_video_filter->inputs[0]->h;
517 #endif /* CONFIG_AVFILTER */
519 static void term_exit(void)
522 tcsetattr (0, TCSANOW, &oldtty);
526 static volatile int received_sigterm = 0;
529 sigterm_handler(int sig)
531 received_sigterm = sig;
535 static void term_init(void)
544 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
545 |INLCR|IGNCR|ICRNL|IXON);
546 tty.c_oflag |= OPOST;
547 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
548 tty.c_cflag &= ~(CSIZE|PARENB);
553 tcsetattr (0, TCSANOW, &tty);
554 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
557 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
558 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
560 signal(SIGXCPU, sigterm_handler);
563 #if CONFIG_BEOS_NETSERVER
564 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
568 /* read a key without blocking */
569 static int read_key(void)
574 #if !CONFIG_BEOS_NETSERVER
582 n = select(1, &rfds, NULL, NULL, &tv);
598 static int decode_interrupt_cb(void)
600 return q_pressed || (q_pressed = read_key() == 'q');
603 static int av_exit(int ret)
608 for(i=0;i<nb_output_files;i++) {
609 /* maybe av_close_output_file ??? */
610 AVFormatContext *s = output_files[i];
612 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
614 for(j=0;j<s->nb_streams;j++) {
615 av_metadata_free(&s->streams[j]->metadata);
616 av_free(s->streams[j]->codec);
617 av_free(s->streams[j]);
619 for(j=0;j<s->nb_programs;j++) {
620 av_metadata_free(&s->programs[j]->metadata);
622 for(j=0;j<s->nb_chapters;j++) {
623 av_metadata_free(&s->chapters[j]->metadata);
625 av_metadata_free(&s->metadata);
628 for(i=0;i<nb_input_files;i++)
629 av_close_input_file(input_files[i]);
631 av_free(intra_matrix);
632 av_free(inter_matrix);
636 av_free(vstats_filename);
640 av_free(video_codec_name);
641 av_free(audio_codec_name);
642 av_free(subtitle_codec_name);
644 av_free(video_standard);
646 #if CONFIG_POWERPC_PERF
647 void powerpc_display_perf_report(void);
648 powerpc_display_perf_report();
649 #endif /* CONFIG_POWERPC_PERF */
651 for (i=0;i<AVMEDIA_TYPE_NB;i++)
652 av_free(avcodec_opts[i]);
653 av_free(avformat_opts);
657 allocated_audio_buf_size= allocated_audio_out_size= 0;
664 if (received_sigterm) {
666 "Received signal %d: terminating.\n",
667 (int) received_sigterm);
671 exit(ret); /* not all OS-es handle main() return value */
675 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
677 if(codec && codec->sample_fmts){
678 const enum SampleFormat *p= codec->sample_fmts;
680 if(*p == st->codec->sample_fmt)
684 st->codec->sample_fmt = codec->sample_fmts[0];
688 static void choose_sample_rate(AVStream *st, AVCodec *codec)
690 if(codec && codec->supported_samplerates){
691 const int *p= codec->supported_samplerates;
693 int best_dist=INT_MAX;
695 int dist= abs(st->codec->sample_rate - *p);
696 if(dist < best_dist){
702 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
704 st->codec->sample_rate= best;
708 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
710 if(codec && codec->pix_fmts){
711 const enum PixelFormat *p= codec->pix_fmts;
713 if(*p == st->codec->pix_fmt)
717 && !( st->codec->codec_id==CODEC_ID_MJPEG
718 && st->codec->strict_std_compliance <= FF_COMPLIANCE_INOFFICIAL
719 && ( st->codec->pix_fmt == PIX_FMT_YUV420P
720 || st->codec->pix_fmt == PIX_FMT_YUV422P)))
721 st->codec->pix_fmt = codec->pix_fmts[0];
725 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
731 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
734 /* copy stream format */
735 s->nb_streams = ic->nb_streams;
736 for(i=0;i<ic->nb_streams;i++) {
740 // FIXME: a more elegant solution is needed
741 st = av_mallocz(sizeof(AVStream));
742 memcpy(st, ic->streams[i], sizeof(AVStream));
743 st->codec = avcodec_alloc_context();
745 print_error(filename, AVERROR(ENOMEM));
748 avcodec_copy_context(st->codec, ic->streams[i]->codec);
751 codec = avcodec_find_encoder(st->codec->codec_id);
752 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
753 if (audio_stream_copy) {
756 choose_sample_fmt(st, codec);
757 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
758 if (video_stream_copy) {
761 choose_pixel_fmt(st, codec);
764 if(!st->codec->thread_count)
765 st->codec->thread_count = 1;
766 if(st->codec->thread_count>1)
767 avcodec_thread_init(st->codec, st->codec->thread_count);
769 if(st->codec->flags & CODEC_FLAG_BITEXACT)
774 s->timestamp = av_gettime();
776 av_close_input_file(ic);
781 get_sync_ipts(const AVOutputStream *ost)
783 const AVInputStream *ist = ost->sync_ist;
784 return (double)(ist->pts - start_time)/AV_TIME_BASE;
787 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
791 AVPacket new_pkt= *pkt;
792 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
793 &new_pkt.data, &new_pkt.size,
794 pkt->data, pkt->size,
795 pkt->flags & AV_PKT_FLAG_KEY);
798 new_pkt.destruct= av_destruct_packet;
800 fprintf(stderr, "%s failed for stream %d, codec %s",
801 bsfc->filter->name, pkt->stream_index,
802 avctx->codec ? avctx->codec->name : "copy");
812 ret= av_interleaved_write_frame(s, pkt);
814 print_error("av_interleaved_write_frame()", ret);
819 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
821 static void do_audio_out(AVFormatContext *s,
824 unsigned char *buf, int size)
827 int64_t audio_out_size, audio_buf_size;
828 int64_t allocated_for_size= size;
830 int size_out, frame_bytes, ret;
831 AVCodecContext *enc= ost->st->codec;
832 AVCodecContext *dec= ist->st->codec;
833 int osize= av_get_bits_per_sample_format(enc->sample_fmt)/8;
834 int isize= av_get_bits_per_sample_format(dec->sample_fmt)/8;
835 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
838 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
839 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
840 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
841 audio_buf_size*= osize*enc->channels;
843 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
844 if(coded_bps > 8*osize)
845 audio_out_size= audio_out_size * coded_bps / (8*osize);
846 audio_out_size += FF_MIN_BUFFER_SIZE;
848 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
849 fprintf(stderr, "Buffer sizes too large\n");
853 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
854 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
855 if (!audio_buf || !audio_out){
856 fprintf(stderr, "Out of memory in do_audio_out\n");
860 if (enc->channels != dec->channels)
861 ost->audio_resample = 1;
863 if (ost->audio_resample && !ost->resample) {
864 if (dec->sample_fmt != SAMPLE_FMT_S16)
865 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
866 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
867 enc->sample_rate, dec->sample_rate,
868 enc->sample_fmt, dec->sample_fmt,
870 if (!ost->resample) {
871 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
872 dec->channels, dec->sample_rate,
873 enc->channels, enc->sample_rate);
878 #define MAKE_SFMT_PAIR(a,b) ((a)+SAMPLE_FMT_NB*(b))
879 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
880 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
881 if (ost->reformat_ctx)
882 av_audio_convert_free(ost->reformat_ctx);
883 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
884 dec->sample_fmt, 1, NULL, 0);
885 if (!ost->reformat_ctx) {
886 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
887 avcodec_get_sample_fmt_name(dec->sample_fmt),
888 avcodec_get_sample_fmt_name(enc->sample_fmt));
891 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
894 if(audio_sync_method){
895 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
896 - av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2);
897 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
898 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
900 //FIXME resample delay
901 if(fabs(delta) > 50){
902 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
904 byte_delta= FFMAX(byte_delta, -size);
908 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
913 static uint8_t *input_tmp= NULL;
914 input_tmp= av_realloc(input_tmp, byte_delta + size);
916 if(byte_delta > allocated_for_size - size){
917 allocated_for_size= byte_delta + (int64_t)size;
922 memset(input_tmp, 0, byte_delta);
923 memcpy(input_tmp + byte_delta, buf, size);
927 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
929 }else if(audio_sync_method>1){
930 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
931 assert(ost->audio_resample);
933 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
934 // 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));
935 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
939 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
940 - av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
942 if (ost->audio_resample) {
944 size_out = audio_resample(ost->resample,
945 (short *)buftmp, (short *)buf,
946 size / (ist->st->codec->channels * isize));
947 size_out = size_out * enc->channels * osize;
953 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
954 const void *ibuf[6]= {buftmp};
955 void *obuf[6]= {audio_buf};
956 int istride[6]= {isize};
957 int ostride[6]= {osize};
958 int len= size_out/istride[0];
959 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
960 printf("av_audio_convert() failed\n");
966 size_out = len*osize;
969 /* now encode as many frames as possible */
970 if (enc->frame_size > 1) {
971 /* output resampled raw samples */
972 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
973 fprintf(stderr, "av_fifo_realloc2() failed\n");
976 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
978 frame_bytes = enc->frame_size * osize * enc->channels;
980 while (av_fifo_size(ost->fifo) >= frame_bytes) {
982 av_init_packet(&pkt);
984 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
986 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
988 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
991 fprintf(stderr, "Audio encoding failed\n");
995 pkt.stream_index= ost->index;
998 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
999 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1000 pkt.flags |= AV_PKT_FLAG_KEY;
1001 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1003 ost->sync_opts += enc->frame_size;
1007 av_init_packet(&pkt);
1009 ost->sync_opts += size_out / (osize * enc->channels);
1011 /* output a pcm frame */
1012 /* determine the size of the coded buffer */
1015 size_out = size_out*coded_bps/8;
1017 if(size_out > audio_out_size){
1018 fprintf(stderr, "Internal error, buffer size too small\n");
1022 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1023 ret = avcodec_encode_audio(enc, audio_out, size_out,
1026 fprintf(stderr, "Audio encoding failed\n");
1030 pkt.stream_index= ost->index;
1031 pkt.data= audio_out;
1033 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1034 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1035 pkt.flags |= AV_PKT_FLAG_KEY;
1036 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1040 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
1042 AVCodecContext *dec;
1043 AVPicture *picture2;
1044 AVPicture picture_tmp;
1047 dec = ist->st->codec;
1049 /* deinterlace : must be done before any resize */
1050 if (do_deinterlace) {
1053 /* create temporary picture */
1054 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1055 buf = av_malloc(size);
1059 picture2 = &picture_tmp;
1060 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1062 if(avpicture_deinterlace(picture2, picture,
1063 dec->pix_fmt, dec->width, dec->height) < 0) {
1064 /* if error, do not deinterlace */
1065 fprintf(stderr, "Deinterlacing failed\n");
1074 if (picture != picture2)
1075 *picture = *picture2;
1079 /* we begin to correct av delay at this threshold */
1080 #define AV_DELAY_MAX 0.100
1082 static void do_subtitle_out(AVFormatContext *s,
1083 AVOutputStream *ost,
1088 static uint8_t *subtitle_out = NULL;
1089 int subtitle_out_max_size = 1024 * 1024;
1090 int subtitle_out_size, nb, i;
1091 AVCodecContext *enc;
1094 if (pts == AV_NOPTS_VALUE) {
1095 fprintf(stderr, "Subtitle packets must have a pts\n");
1101 enc = ost->st->codec;
1103 if (!subtitle_out) {
1104 subtitle_out = av_malloc(subtitle_out_max_size);
1107 /* Note: DVB subtitle need one packet to draw them and one other
1108 packet to clear them */
1109 /* XXX: signal it in the codec context ? */
1110 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1115 for(i = 0; i < nb; i++) {
1116 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1117 // start_display_time is required to be 0
1118 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1119 sub->end_display_time -= sub->start_display_time;
1120 sub->start_display_time = 0;
1121 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1122 subtitle_out_max_size, sub);
1123 if (subtitle_out_size < 0) {
1124 fprintf(stderr, "Subtitle encoding failed\n");
1128 av_init_packet(&pkt);
1129 pkt.stream_index = ost->index;
1130 pkt.data = subtitle_out;
1131 pkt.size = subtitle_out_size;
1132 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1133 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1134 /* XXX: the pts correction is handled here. Maybe handling
1135 it in the codec would be better */
1137 pkt.pts += 90 * sub->start_display_time;
1139 pkt.pts += 90 * sub->end_display_time;
1141 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1145 static int bit_buffer_size= 1024*256;
1146 static uint8_t *bit_buffer= NULL;
1148 static void do_video_out(AVFormatContext *s,
1149 AVOutputStream *ost,
1151 AVFrame *in_picture,
1154 int nb_frames, i, ret;
1155 #if !CONFIG_AVFILTER
1156 int64_t topBand, bottomBand, leftBand, rightBand;
1158 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
1159 AVFrame picture_crop_temp, picture_pad_temp;
1160 AVCodecContext *enc, *dec;
1163 avcodec_get_frame_defaults(&picture_crop_temp);
1164 avcodec_get_frame_defaults(&picture_pad_temp);
1166 enc = ost->st->codec;
1167 dec = ist->st->codec;
1169 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1171 /* by default, we output a single frame */
1176 if(video_sync_method){
1177 double vdelta = sync_ipts - ost->sync_opts;
1178 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1181 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1184 }else if(vdelta>0.6)
1185 ost->sync_opts= lrintf(sync_ipts);
1186 }else if (vdelta > 1.1)
1187 nb_frames = lrintf(vdelta);
1188 //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);
1189 if (nb_frames == 0){
1192 fprintf(stderr, "*** drop!\n");
1193 }else if (nb_frames > 1) {
1194 nb_frames_dup += nb_frames - 1;
1196 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1199 ost->sync_opts= lrintf(sync_ipts);
1201 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1206 formatted_picture = in_picture;
1208 if (ost->video_crop) {
1209 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
1210 fprintf(stderr, "error cropping picture\n");
1215 formatted_picture = &picture_crop_temp;
1217 formatted_picture = in_picture;
1221 final_picture = formatted_picture;
1222 padding_src = formatted_picture;
1223 resampling_dst = &ost->pict_tmp;
1224 if (ost->video_pad) {
1225 final_picture = &ost->pict_tmp;
1226 if (ost->video_resample) {
1227 if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
1228 fprintf(stderr, "error padding picture\n");
1233 resampling_dst = &picture_pad_temp;
1237 if( (ost->resample_height != (ist->st->codec->height - (ost->topBand + ost->bottomBand)))
1238 || (ost->resample_width != (ist->st->codec->width - (ost->leftBand + ost->rightBand)))
1239 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1241 fprintf(stderr,"Input Stream #%d.%d frame size changed to %dx%d, %s\n", ist->file_index, ist->index, ist->st->codec->width, ist->st->codec->height,avcodec_get_pix_fmt_name(ist->st->codec->pix_fmt));
1242 if(!ost->video_resample)
1246 #if !CONFIG_AVFILTER
1247 if (ost->video_resample) {
1249 final_picture = &ost->pict_tmp;
1250 if( (ost->resample_height != (ist->st->codec->height - (ost->topBand + ost->bottomBand)))
1251 || (ost->resample_width != (ist->st->codec->width - (ost->leftBand + ost->rightBand)))
1252 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1254 /* keep bands proportional to the frame size */
1255 topBand = ((int64_t)ist->st->codec->height * ost->original_topBand / ost->original_height) & ~1;
1256 bottomBand = ((int64_t)ist->st->codec->height * ost->original_bottomBand / ost->original_height) & ~1;
1257 leftBand = ((int64_t)ist->st->codec->width * ost->original_leftBand / ost->original_width) & ~1;
1258 rightBand = ((int64_t)ist->st->codec->width * ost->original_rightBand / ost->original_width) & ~1;
1260 /* sanity check to ensure no bad band sizes sneak in */
1261 assert(topBand <= INT_MAX && topBand >= 0);
1262 assert(bottomBand <= INT_MAX && bottomBand >= 0);
1263 assert(leftBand <= INT_MAX && leftBand >= 0);
1264 assert(rightBand <= INT_MAX && rightBand >= 0);
1266 ost->topBand = topBand;
1267 ost->bottomBand = bottomBand;
1268 ost->leftBand = leftBand;
1269 ost->rightBand = rightBand;
1271 ost->resample_height = ist->st->codec->height - (ost->topBand + ost->bottomBand);
1272 ost->resample_width = ist->st->codec->width - (ost->leftBand + ost->rightBand);
1273 ost->resample_pix_fmt= ist->st->codec->pix_fmt;
1275 /* initialize a new scaler context */
1276 sws_freeContext(ost->img_resample_ctx);
1277 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1278 ost->img_resample_ctx = sws_getContext(
1279 ist->st->codec->width - (ost->leftBand + ost->rightBand),
1280 ist->st->codec->height - (ost->topBand + ost->bottomBand),
1281 ist->st->codec->pix_fmt,
1282 ost->st->codec->width - (ost->padleft + ost->padright),
1283 ost->st->codec->height - (ost->padtop + ost->padbottom),
1284 ost->st->codec->pix_fmt,
1285 sws_flags, NULL, NULL, NULL);
1286 if (ost->img_resample_ctx == NULL) {
1287 fprintf(stderr, "Cannot get resampling context\n");
1291 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1292 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1296 if (ost->video_pad) {
1297 av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
1298 enc->height, enc->width, enc->pix_fmt,
1299 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
1302 /* duplicates frame if needed */
1303 for(i=0;i<nb_frames;i++) {
1305 av_init_packet(&pkt);
1306 pkt.stream_index= ost->index;
1308 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1309 /* raw pictures are written as AVPicture structure to
1310 avoid any copies. We support temorarily the older
1312 AVFrame* old_frame = enc->coded_frame;
1313 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1314 pkt.data= (uint8_t *)final_picture;
1315 pkt.size= sizeof(AVPicture);
1316 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1317 pkt.flags |= AV_PKT_FLAG_KEY;
1319 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1320 enc->coded_frame = old_frame;
1322 AVFrame big_picture;
1324 big_picture= *final_picture;
1325 /* better than nothing: use input picture interlaced
1327 big_picture.interlaced_frame = in_picture->interlaced_frame;
1328 if(avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
1329 if(top_field_first == -1)
1330 big_picture.top_field_first = in_picture->top_field_first;
1332 big_picture.top_field_first = top_field_first;
1335 /* handles sameq here. This is not correct because it may
1336 not be a global option */
1338 big_picture.quality = ist->st->quality;
1340 big_picture.quality = ost->st->quality;
1342 big_picture.pict_type = 0;
1343 // big_picture.pts = AV_NOPTS_VALUE;
1344 big_picture.pts= ost->sync_opts;
1345 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1346 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
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, bitstream_filters[ost->file_index][pkt.stream_index]);
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, AVOutputStream *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_pict_type_char(enc->coded_frame->pict_type));
1423 static void print_report(AVFormatContext **output_files,
1424 AVOutputStream **ost_table, int nb_ostreams,
1428 AVOutputStream *ost;
1429 AVFormatContext *oc;
1431 AVCodecContext *enc;
1432 int frame_number, vid, i;
1433 double bitrate, ti1, pts;
1434 static int64_t last_time = -1;
1435 static int qp_histogram[52];
1437 if (!is_last_report) {
1439 /* display the report every 0.5 seconds */
1440 cur_time = av_gettime();
1441 if (last_time == -1) {
1442 last_time = cur_time;
1445 if ((cur_time - last_time) < 500000)
1447 last_time = cur_time;
1451 oc = output_files[0];
1453 total_size = url_fsize(oc->pb);
1454 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1455 total_size= url_ftell(oc->pb);
1460 for(i=0;i<nb_ostreams;i++) {
1462 enc = ost->st->codec;
1463 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1464 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1465 !ost->st->stream_copy ?
1466 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1468 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1469 float t = (av_gettime()-timer_start) / 1000000.0;
1471 frame_number = ost->frame_number;
1472 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1473 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1474 !ost->st->stream_copy ?
1475 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1477 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1480 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1481 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1484 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1486 if (enc->flags&CODEC_FLAG_PSNR){
1488 double error, error_sum=0;
1489 double scale, scale_sum=0;
1490 char type[3]= {'Y','U','V'};
1491 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1494 error= enc->error[j];
1495 scale= enc->width*enc->height*255.0*255.0*frame_number;
1497 error= enc->coded_frame->error[j];
1498 scale= enc->width*enc->height*255.0*255.0;
1503 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1505 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1509 /* compute min output value */
1510 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1511 if ((pts < ti1) && (pts > 0))
1517 if (verbose || is_last_report) {
1518 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1520 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1521 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1522 (double)total_size / 1024, ti1, bitrate);
1524 if (nb_frames_dup || nb_frames_drop)
1525 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1526 nb_frames_dup, nb_frames_drop);
1529 fprintf(stderr, "%s \r", buf);
1534 if (is_last_report && verbose >= 0){
1535 int64_t raw= audio_size + video_size + extra_size;
1536 fprintf(stderr, "\n");
1537 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1541 100.0*(total_size - raw)/raw
1546 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1547 static int output_packet(AVInputStream *ist, int ist_index,
1548 AVOutputStream **ost_table, int nb_ostreams,
1549 const AVPacket *pkt)
1551 AVFormatContext *os;
1552 AVOutputStream *ost;
1556 void *buffer_to_free;
1557 static unsigned int samples_size= 0;
1558 AVSubtitle subtitle, *subtitle_to_free;
1565 int bps = av_get_bits_per_sample_format(ist->st->codec->sample_fmt)>>3;
1567 if(ist->next_pts == AV_NOPTS_VALUE)
1568 ist->next_pts= ist->pts;
1572 av_init_packet(&avpkt);
1580 if(pkt->dts != AV_NOPTS_VALUE)
1581 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1583 //while we have more to decode or while the decoder did output something on EOF
1584 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1585 uint8_t *data_buf, *decoded_data_buf;
1586 int data_size, decoded_data_size;
1588 ist->pts= ist->next_pts;
1590 if(avpkt.size && avpkt.size != pkt->size &&
1591 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1592 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1593 ist->showed_multi_packet_warning=1;
1596 /* decode the packet if needed */
1597 decoded_data_buf = NULL; /* fail safe */
1598 decoded_data_size= 0;
1599 data_buf = avpkt.data;
1600 data_size = avpkt.size;
1601 subtitle_to_free = NULL;
1602 if (ist->decoding_needed) {
1603 switch(ist->st->codec->codec_type) {
1604 case AVMEDIA_TYPE_AUDIO:{
1605 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1606 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1608 samples= av_malloc(samples_size);
1610 decoded_data_size= samples_size;
1611 /* XXX: could avoid copy if PCM 16 bits with same
1612 endianness as CPU */
1613 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1620 /* Some bug in mpeg audio decoder gives */
1621 /* decoded_data_size < 0, it seems they are overflows */
1622 if (decoded_data_size <= 0) {
1623 /* no audio frame */
1626 decoded_data_buf = (uint8_t *)samples;
1627 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1628 (ist->st->codec->sample_rate * ist->st->codec->channels);
1630 case AVMEDIA_TYPE_VIDEO:
1631 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1632 /* XXX: allocate picture correctly */
1633 avcodec_get_frame_defaults(&picture);
1635 ret = avcodec_decode_video2(ist->st->codec,
1636 &picture, &got_picture, &avpkt);
1637 ist->st->quality= picture.quality;
1641 /* no picture yet */
1642 goto discard_packet;
1644 if (ist->st->codec->time_base.num != 0) {
1645 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1646 ist->next_pts += ((int64_t)AV_TIME_BASE *
1647 ist->st->codec->time_base.num * ticks) /
1648 ist->st->codec->time_base.den;
1652 case AVMEDIA_TYPE_SUBTITLE:
1653 ret = avcodec_decode_subtitle2(ist->st->codec,
1654 &subtitle, &got_subtitle, &avpkt);
1657 if (!got_subtitle) {
1658 goto discard_packet;
1660 subtitle_to_free = &subtitle;
1667 switch(ist->st->codec->codec_type) {
1668 case AVMEDIA_TYPE_AUDIO:
1669 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1670 ist->st->codec->sample_rate;
1672 case AVMEDIA_TYPE_VIDEO:
1673 if (ist->st->codec->time_base.num != 0) {
1674 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1675 ist->next_pts += ((int64_t)AV_TIME_BASE *
1676 ist->st->codec->time_base.num * ticks) /
1677 ist->st->codec->time_base.den;
1685 buffer_to_free = NULL;
1686 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1687 pre_process_video_frame(ist, (AVPicture *)&picture,
1692 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->input_video_filter) {
1693 // add it to be filtered
1694 av_vsrc_buffer_add_frame(ist->input_video_filter, &picture,
1696 ist->st->codec->sample_aspect_ratio);
1700 // preprocess audio (volume)
1701 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1702 if (audio_volume != 256) {
1705 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1706 int v = ((*volp) * audio_volume + 128) >> 8;
1707 if (v < -32768) v = -32768;
1708 if (v > 32767) v = 32767;
1714 /* frame rate emulation */
1716 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1717 int64_t now = av_gettime() - ist->start;
1722 loop = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1723 !ist->out_video_filter || avfilter_poll_frame(ist->out_video_filter->inputs[0]);
1725 /* if output time reached then transcode raw format,
1726 encode packets and output them */
1727 if (start_time == 0 || ist->pts >= start_time)
1730 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->out_video_filter)
1731 get_filtered_video_pic(ist->out_video_filter, &ist->picref, &picture, &ist->pts);
1733 for(i=0;i<nb_ostreams;i++) {
1737 if (ost->source_index == ist_index) {
1738 os = output_files[ost->file_index];
1740 /* set the input output pts pairs */
1741 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1743 if (ost->encoding_needed) {
1744 assert(ist->decoding_needed);
1745 switch(ost->st->codec->codec_type) {
1746 case AVMEDIA_TYPE_AUDIO:
1747 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1749 case AVMEDIA_TYPE_VIDEO:
1751 ost->st->codec->sample_aspect_ratio = ist->picref->pixel_aspect;
1753 do_video_out(os, ost, ist, &picture, &frame_size);
1754 if (vstats_filename && frame_size)
1755 do_video_stats(os, ost, frame_size);
1757 case AVMEDIA_TYPE_SUBTITLE:
1758 do_subtitle_out(os, ost, ist, &subtitle,
1765 AVFrame avframe; //FIXME/XXX remove this
1767 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1769 av_init_packet(&opkt);
1771 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1774 /* no reencoding needed : output the packet directly */
1775 /* force the input stream PTS */
1777 avcodec_get_frame_defaults(&avframe);
1778 ost->st->codec->coded_frame= &avframe;
1779 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1781 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1782 audio_size += data_size;
1783 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1784 video_size += data_size;
1788 opkt.stream_index= ost->index;
1789 if(pkt->pts != AV_NOPTS_VALUE)
1790 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1792 opkt.pts= AV_NOPTS_VALUE;
1794 if (pkt->dts == AV_NOPTS_VALUE)
1795 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1797 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1798 opkt.dts -= ost_tb_start_time;
1800 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1801 opkt.flags= pkt->flags;
1803 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1804 if( ost->st->codec->codec_id != CODEC_ID_H264
1805 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1806 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1808 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1809 opkt.destruct= av_destruct_packet;
1811 opkt.data = data_buf;
1812 opkt.size = data_size;
1815 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][opkt.stream_index]);
1816 ost->st->codec->frame_number++;
1817 ost->frame_number++;
1818 av_free_packet(&opkt);
1822 loop = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1823 ist->out_video_filter && avfilter_poll_frame(ist->out_video_filter->inputs[0]);
1829 avfilter_unref_pic(ist->picref);
1832 av_free(buffer_to_free);
1833 /* XXX: allocate the subtitles in the codec ? */
1834 if (subtitle_to_free) {
1835 if (subtitle_to_free->rects != NULL) {
1836 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1837 av_freep(&subtitle_to_free->rects[i]->pict.data[0]);
1838 av_freep(&subtitle_to_free->rects[i]->pict.data[1]);
1839 av_freep(&subtitle_to_free->rects[i]);
1841 av_freep(&subtitle_to_free->rects);
1843 subtitle_to_free->num_rects = 0;
1844 subtitle_to_free = NULL;
1851 for(i=0;i<nb_ostreams;i++) {
1853 if (ost->source_index == ist_index) {
1854 AVCodecContext *enc= ost->st->codec;
1855 os = output_files[ost->file_index];
1857 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1859 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1862 if (ost->encoding_needed) {
1866 av_init_packet(&pkt);
1867 pkt.stream_index= ost->index;
1869 switch(ost->st->codec->codec_type) {
1870 case AVMEDIA_TYPE_AUDIO:
1871 fifo_bytes = av_fifo_size(ost->fifo);
1873 /* encode any samples remaining in fifo */
1874 if (fifo_bytes > 0) {
1875 int osize = av_get_bits_per_sample_format(enc->sample_fmt) >> 3;
1876 int fs_tmp = enc->frame_size;
1878 av_fifo_generic_read(ost->fifo, samples, fifo_bytes, NULL);
1879 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1880 enc->frame_size = fifo_bytes / (osize * enc->channels);
1882 int frame_bytes = enc->frame_size*osize*enc->channels;
1883 if (samples_size < frame_bytes)
1885 memset((uint8_t*)samples+fifo_bytes, 0, frame_bytes - fifo_bytes);
1888 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1889 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1890 ost->st->time_base.num, enc->sample_rate);
1891 enc->frame_size = fs_tmp;
1894 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1897 fprintf(stderr, "Audio encoding failed\n");
1901 pkt.flags |= AV_PKT_FLAG_KEY;
1903 case AVMEDIA_TYPE_VIDEO:
1904 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1906 fprintf(stderr, "Video encoding failed\n");
1910 if(enc->coded_frame && enc->coded_frame->key_frame)
1911 pkt.flags |= AV_PKT_FLAG_KEY;
1912 if (ost->logfile && enc->stats_out) {
1913 fprintf(ost->logfile, "%s", enc->stats_out);
1922 pkt.data= bit_buffer;
1924 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1925 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1926 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1938 static void print_sdp(AVFormatContext **avc, int n)
1942 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1943 printf("SDP:\n%s\n", sdp);
1947 static int copy_chapters(int infile, int outfile)
1949 AVFormatContext *is = input_files[infile];
1950 AVFormatContext *os = output_files[outfile];
1953 for (i = 0; i < is->nb_chapters; i++) {
1954 AVChapter *in_ch = is->chapters[i], *out_ch;
1955 AVMetadataTag *t = NULL;
1956 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1957 AV_TIME_BASE_Q, in_ch->time_base);
1958 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1959 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1962 if (in_ch->end < ts_off)
1964 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1967 out_ch = av_mallocz(sizeof(AVChapter));
1969 return AVERROR(ENOMEM);
1971 out_ch->id = in_ch->id;
1972 out_ch->time_base = in_ch->time_base;
1973 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1974 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1976 while ((t = av_metadata_get(in_ch->metadata, "", t, AV_METADATA_IGNORE_SUFFIX)))
1977 av_metadata_set2(&out_ch->metadata, t->key, t->value, 0);
1980 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1982 return AVERROR(ENOMEM);
1983 os->chapters[os->nb_chapters - 1] = out_ch;
1989 * The following code is the main loop of the file converter
1991 static int av_transcode(AVFormatContext **output_files,
1992 int nb_output_files,
1993 AVFormatContext **input_files,
1995 AVStreamMap *stream_maps, int nb_stream_maps)
1997 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1998 AVFormatContext *is, *os;
1999 AVCodecContext *codec, *icodec;
2000 AVOutputStream *ost, **ost_table = NULL;
2001 AVInputStream *ist, **ist_table = NULL;
2002 AVInputFile *file_table;
2006 uint8_t no_packet[MAX_FILES]={0};
2007 int no_packet_count=0;
2009 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
2013 /* input stream init */
2015 for(i=0;i<nb_input_files;i++) {
2016 is = input_files[i];
2017 file_table[i].ist_index = j;
2018 file_table[i].nb_streams = is->nb_streams;
2019 j += is->nb_streams;
2023 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
2027 for(i=0;i<nb_istreams;i++) {
2028 ist = av_mallocz(sizeof(AVInputStream));
2034 for(i=0;i<nb_input_files;i++) {
2035 is = input_files[i];
2036 for(k=0;k<is->nb_streams;k++) {
2037 ist = ist_table[j++];
2038 ist->st = is->streams[k];
2039 ist->file_index = i;
2041 ist->discard = 1; /* the stream is discarded by default
2045 ist->start = av_gettime();
2050 /* output stream init */
2052 for(i=0;i<nb_output_files;i++) {
2053 os = output_files[i];
2054 if (!os->nb_streams) {
2055 dump_format(output_files[i], i, output_files[i]->filename, 1);
2056 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
2059 nb_ostreams += os->nb_streams;
2061 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
2062 fprintf(stderr, "Number of stream maps must match number of output streams\n");
2066 /* Sanity check the mapping args -- do the input files & streams exist? */
2067 for(i=0;i<nb_stream_maps;i++) {
2068 int fi = stream_maps[i].file_index;
2069 int si = stream_maps[i].stream_index;
2071 if (fi < 0 || fi > nb_input_files - 1 ||
2072 si < 0 || si > file_table[fi].nb_streams - 1) {
2073 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
2076 fi = stream_maps[i].sync_file_index;
2077 si = stream_maps[i].sync_stream_index;
2078 if (fi < 0 || fi > nb_input_files - 1 ||
2079 si < 0 || si > file_table[fi].nb_streams - 1) {
2080 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2085 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2088 for(i=0;i<nb_ostreams;i++) {
2089 ost = av_mallocz(sizeof(AVOutputStream));
2096 for(k=0;k<nb_output_files;k++) {
2097 os = output_files[k];
2098 for(i=0;i<os->nb_streams;i++,n++) {
2101 ost->file_index = k;
2103 ost->st = os->streams[i];
2104 if (nb_stream_maps > 0) {
2105 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
2106 stream_maps[n].stream_index;
2108 /* Sanity check that the stream types match */
2109 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
2110 int i= ost->file_index;
2111 dump_format(output_files[i], i, output_files[i]->filename, 1);
2112 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2113 stream_maps[n].file_index, stream_maps[n].stream_index,
2114 ost->file_index, ost->index);
2119 int best_nb_frames=-1;
2120 /* get corresponding input stream index : we select the first one with the right type */
2122 for(j=0;j<nb_istreams;j++) {
2127 AVFormatContext *f= input_files[ ist->file_index ];
2129 for(pi=0; pi<f->nb_programs; pi++){
2130 AVProgram *p= f->programs[pi];
2131 if(p->id == opt_programid)
2132 for(si=0; si<p->nb_stream_indexes; si++){
2133 if(f->streams[ p->stream_index[si] ] == ist->st)
2138 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2139 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2140 if(best_nb_frames < ist->st->codec_info_nb_frames){
2141 best_nb_frames= ist->st->codec_info_nb_frames;
2142 ost->source_index = j;
2149 if(! opt_programid) {
2150 /* try again and reuse existing stream */
2151 for(j=0;j<nb_istreams;j++) {
2153 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2154 && ist->st->discard != AVDISCARD_ALL) {
2155 ost->source_index = j;
2161 int i= ost->file_index;
2162 dump_format(output_files[i], i, output_files[i]->filename, 1);
2163 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2164 ost->file_index, ost->index);
2169 ist = ist_table[ost->source_index];
2171 ost->sync_ist = (nb_stream_maps > 0) ?
2172 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2173 stream_maps[n].sync_stream_index] : ist;
2177 /* for each output stream, we compute the right encoding parameters */
2178 for(i=0;i<nb_ostreams;i++) {
2179 AVMetadataTag *t = NULL;
2181 os = output_files[ost->file_index];
2182 ist = ist_table[ost->source_index];
2184 codec = ost->st->codec;
2185 icodec = ist->st->codec;
2187 while ((t = av_metadata_get(ist->st->metadata, "", t, AV_METADATA_IGNORE_SUFFIX))) {
2188 av_metadata_set2(&ost->st->metadata, t->key, t->value, AV_METADATA_DONT_OVERWRITE);
2191 ost->st->disposition = ist->st->disposition;
2192 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2193 codec->chroma_sample_location = icodec->chroma_sample_location;
2195 if (ost->st->stream_copy) {
2196 /* if stream_copy is selected, no need to decode or encode */
2197 codec->codec_id = icodec->codec_id;
2198 codec->codec_type = icodec->codec_type;
2200 if(!codec->codec_tag){
2201 if( !os->oformat->codec_tag
2202 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2203 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2204 codec->codec_tag = icodec->codec_tag;
2207 codec->bit_rate = icodec->bit_rate;
2208 codec->extradata= icodec->extradata;
2209 codec->extradata_size= icodec->extradata_size;
2210 if(av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000){
2211 codec->time_base = icodec->time_base;
2212 codec->time_base.num *= icodec->ticks_per_frame;
2214 codec->time_base = ist->st->time_base;
2215 switch(codec->codec_type) {
2216 case AVMEDIA_TYPE_AUDIO:
2217 if(audio_volume != 256) {
2218 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2221 codec->channel_layout = icodec->channel_layout;
2222 codec->sample_rate = icodec->sample_rate;
2223 codec->channels = icodec->channels;
2224 codec->frame_size = icodec->frame_size;
2225 codec->block_align= icodec->block_align;
2226 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2227 codec->block_align= 0;
2228 if(codec->codec_id == CODEC_ID_AC3)
2229 codec->block_align= 0;
2231 case AVMEDIA_TYPE_VIDEO:
2232 codec->pix_fmt = icodec->pix_fmt;
2233 codec->width = icodec->width;
2234 codec->height = icodec->height;
2235 codec->has_b_frames = icodec->has_b_frames;
2237 case AVMEDIA_TYPE_SUBTITLE:
2238 codec->width = icodec->width;
2239 codec->height = icodec->height;
2245 switch(codec->codec_type) {
2246 case AVMEDIA_TYPE_AUDIO:
2247 ost->fifo= av_fifo_alloc(1024);
2250 ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
2251 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2252 icodec->request_channels = codec->channels;
2253 ist->decoding_needed = 1;
2254 ost->encoding_needed = 1;
2256 case AVMEDIA_TYPE_VIDEO:
2257 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2258 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2261 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
2262 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
2263 ost->video_resample = ((codec->width != icodec->width -
2264 (frame_leftBand + frame_rightBand) +
2265 (frame_padleft + frame_padright)) ||
2266 (codec->height != icodec->height -
2267 (frame_topBand + frame_bottomBand) +
2268 (frame_padtop + frame_padbottom)) ||
2269 (codec->pix_fmt != icodec->pix_fmt));
2270 if (ost->video_crop) {
2271 ost->topBand = ost->original_topBand = frame_topBand;
2272 ost->bottomBand = ost->original_bottomBand = frame_bottomBand;
2273 ost->leftBand = ost->original_leftBand = frame_leftBand;
2274 ost->rightBand = ost->original_rightBand = frame_rightBand;
2276 if (ost->video_pad) {
2277 ost->padtop = frame_padtop;
2278 ost->padleft = frame_padleft;
2279 ost->padbottom = frame_padbottom;
2280 ost->padright = frame_padright;
2281 if (!ost->video_resample) {
2282 avcodec_get_frame_defaults(&ost->pict_tmp);
2283 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2284 codec->width, codec->height))
2288 if (ost->video_resample) {
2289 avcodec_get_frame_defaults(&ost->pict_tmp);
2290 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2291 codec->width, codec->height)) {
2292 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2295 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
2296 ost->img_resample_ctx = sws_getContext(
2297 icodec->width - (frame_leftBand + frame_rightBand),
2298 icodec->height - (frame_topBand + frame_bottomBand),
2300 codec->width - (frame_padleft + frame_padright),
2301 codec->height - (frame_padtop + frame_padbottom),
2303 sws_flags, NULL, NULL, NULL);
2304 if (ost->img_resample_ctx == NULL) {
2305 fprintf(stderr, "Cannot get resampling context\n");
2309 #if !CONFIG_AVFILTER
2310 ost->original_height = icodec->height;
2311 ost->original_width = icodec->width;
2313 codec->bits_per_raw_sample= 0;
2315 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
2316 ost->resample_width = icodec->width - (frame_leftBand + frame_rightBand);
2317 ost->resample_pix_fmt= icodec->pix_fmt;
2318 ost->encoding_needed = 1;
2319 ist->decoding_needed = 1;
2322 if (configure_filters(ist, ost)) {
2323 fprintf(stderr, "Error opening filters!\n");
2328 case AVMEDIA_TYPE_SUBTITLE:
2329 ost->encoding_needed = 1;
2330 ist->decoding_needed = 1;
2337 if (ost->encoding_needed &&
2338 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2339 char logfilename[1024];
2342 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2343 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2345 if (codec->flags & CODEC_FLAG_PASS1) {
2346 f = fopen(logfilename, "w");
2348 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2354 size_t logbuffer_size;
2355 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2356 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2359 codec->stats_in = logbuffer;
2363 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2364 int size= codec->width * codec->height;
2365 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2370 bit_buffer = av_malloc(bit_buffer_size);
2372 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2374 ret = AVERROR(ENOMEM);
2378 /* open each encoder */
2379 for(i=0;i<nb_ostreams;i++) {
2381 if (ost->encoding_needed) {
2382 AVCodec *codec = output_codecs[i];
2384 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2386 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2387 ost->st->codec->codec_id, ost->file_index, ost->index);
2388 ret = AVERROR(EINVAL);
2391 if (avcodec_open(ost->st->codec, codec) < 0) {
2392 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2393 ost->file_index, ost->index);
2394 ret = AVERROR(EINVAL);
2397 extra_size += ost->st->codec->extradata_size;
2401 /* open each decoder */
2402 for(i=0;i<nb_istreams;i++) {
2404 if (ist->decoding_needed) {
2405 AVCodec *codec = input_codecs[i];
2407 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2409 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2410 ist->st->codec->codec_id, ist->file_index, ist->index);
2411 ret = AVERROR(EINVAL);
2414 if (avcodec_open(ist->st->codec, codec) < 0) {
2415 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2416 ist->file_index, ist->index);
2417 ret = AVERROR(EINVAL);
2420 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2421 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2426 for(i=0;i<nb_istreams;i++) {
2430 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2431 ist->next_pts = AV_NOPTS_VALUE;
2435 /* set meta data information from input file if required */
2436 for (i=0;i<nb_meta_data_maps;i++) {
2437 AVFormatContext *out_file;
2438 AVFormatContext *in_file;
2439 AVMetadataTag *mtag;
2441 int out_file_index = meta_data_maps[i].out_file;
2442 int in_file_index = meta_data_maps[i].in_file;
2443 if (out_file_index < 0 || out_file_index >= nb_output_files) {
2444 snprintf(error, sizeof(error), "Invalid output file index %d map_meta_data(%d,%d)",
2445 out_file_index, out_file_index, in_file_index);
2446 ret = AVERROR(EINVAL);
2449 if (in_file_index < 0 || in_file_index >= nb_input_files) {
2450 snprintf(error, sizeof(error), "Invalid input file index %d map_meta_data(%d,%d)",
2451 in_file_index, out_file_index, in_file_index);
2452 ret = AVERROR(EINVAL);
2456 out_file = output_files[out_file_index];
2457 in_file = input_files[in_file_index];
2461 while((mtag=av_metadata_get(in_file->metadata, "", mtag, AV_METADATA_IGNORE_SUFFIX)))
2462 av_metadata_set2(&out_file->metadata, mtag->key, mtag->value, AV_METADATA_DONT_OVERWRITE);
2463 av_metadata_conv(out_file, out_file->oformat->metadata_conv,
2464 in_file->iformat->metadata_conv);
2467 /* copy chapters from the first input file that has them*/
2468 for (i = 0; i < nb_input_files; i++) {
2469 if (!input_files[i]->nb_chapters)
2472 for (j = 0; j < nb_output_files; j++)
2473 if ((ret = copy_chapters(i, j)) < 0)
2477 /* open files and write file headers */
2478 for(i=0;i<nb_output_files;i++) {
2479 os = output_files[i];
2480 if (av_write_header(os) < 0) {
2481 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2482 ret = AVERROR(EINVAL);
2485 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2491 /* dump the file output parameters - cannot be done before in case
2493 for(i=0;i<nb_output_files;i++) {
2494 dump_format(output_files[i], i, output_files[i]->filename, 1);
2497 /* dump the stream mapping */
2499 fprintf(stderr, "Stream mapping:\n");
2500 for(i=0;i<nb_ostreams;i++) {
2502 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2503 ist_table[ost->source_index]->file_index,
2504 ist_table[ost->source_index]->index,
2507 if (ost->sync_ist != ist_table[ost->source_index])
2508 fprintf(stderr, " [sync #%d.%d]",
2509 ost->sync_ist->file_index,
2510 ost->sync_ist->index);
2511 fprintf(stderr, "\n");
2516 fprintf(stderr, "%s\n", error);
2521 print_sdp(output_files, nb_output_files);
2524 if (!using_stdin && verbose >= 0) {
2525 fprintf(stderr, "Press [q] to stop encoding\n");
2526 url_set_interrupt_cb(decode_interrupt_cb);
2530 timer_start = av_gettime();
2532 for(; received_sigterm == 0;) {
2533 int file_index, ist_index;
2541 /* if 'q' pressed, exits */
2545 /* read_key() returns 0 on EOF */
2551 /* select the stream that we must read now by looking at the
2552 smallest output pts */
2554 for(i=0;i<nb_ostreams;i++) {
2557 os = output_files[ost->file_index];
2558 ist = ist_table[ost->source_index];
2559 if(ist->is_past_recording_time || no_packet[ist->file_index])
2561 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2562 ipts = (double)ist->pts;
2563 if (!file_table[ist->file_index].eof_reached){
2564 if(ipts < ipts_min) {
2566 if(input_sync ) file_index = ist->file_index;
2568 if(opts < opts_min) {
2570 if(!input_sync) file_index = ist->file_index;
2573 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2578 /* if none, if is finished */
2579 if (file_index < 0) {
2580 if(no_packet_count){
2582 memset(no_packet, 0, sizeof(no_packet));
2589 /* finish if limit size exhausted */
2590 if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
2593 /* read a frame from it and output it in the fifo */
2594 is = input_files[file_index];
2595 ret= av_read_frame(is, &pkt);
2596 if(ret == AVERROR(EAGAIN)){
2597 no_packet[file_index]=1;
2602 file_table[file_index].eof_reached = 1;
2610 memset(no_packet, 0, sizeof(no_packet));
2613 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2615 /* the following test is needed in case new streams appear
2616 dynamically in stream : we ignore them */
2617 if (pkt.stream_index >= file_table[file_index].nb_streams)
2618 goto discard_packet;
2619 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2620 ist = ist_table[ist_index];
2622 goto discard_packet;
2624 if (pkt.dts != AV_NOPTS_VALUE)
2625 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2626 if (pkt.pts != AV_NOPTS_VALUE)
2627 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2629 if(input_files_ts_scale[file_index][pkt.stream_index]){
2630 if(pkt.pts != AV_NOPTS_VALUE)
2631 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2632 if(pkt.dts != AV_NOPTS_VALUE)
2633 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2636 // fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files_ts_offset[ist->file_index], ist->st->codec->codec_type);
2637 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2638 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2639 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2640 int64_t delta= pkt_dts - ist->next_pts;
2641 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2642 input_files_ts_offset[ist->file_index]-= delta;
2644 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2645 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2646 if(pkt.pts != AV_NOPTS_VALUE)
2647 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2651 /* finish if recording time exhausted */
2652 if (recording_time != INT64_MAX &&
2653 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2654 ist->is_past_recording_time = 1;
2655 goto discard_packet;
2658 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2659 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2662 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2663 ist->file_index, ist->index);
2666 av_free_packet(&pkt);
2671 av_free_packet(&pkt);
2673 /* dump report by using the output first video and audio streams */
2674 print_report(output_files, ost_table, nb_ostreams, 0);
2677 /* at the end of stream, we must flush the decoder buffers */
2678 for(i=0;i<nb_istreams;i++) {
2680 if (ist->decoding_needed) {
2681 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2687 /* write the trailer if needed and close file */
2688 for(i=0;i<nb_output_files;i++) {
2689 os = output_files[i];
2690 av_write_trailer(os);
2693 /* dump report by using the first video and audio streams */
2694 print_report(output_files, ost_table, nb_ostreams, 1);
2696 /* close each encoder */
2697 for(i=0;i<nb_ostreams;i++) {
2699 if (ost->encoding_needed) {
2700 av_freep(&ost->st->codec->stats_in);
2701 avcodec_close(ost->st->codec);
2705 /* close each decoder */
2706 for(i=0;i<nb_istreams;i++) {
2708 if (ist->decoding_needed) {
2709 avcodec_close(ist->st->codec);
2713 if (filt_graph_all) {
2714 avfilter_graph_destroy(filt_graph_all);
2715 av_freep(&filt_graph_all);
2723 av_freep(&bit_buffer);
2724 av_free(file_table);
2727 for(i=0;i<nb_istreams;i++) {
2734 for(i=0;i<nb_ostreams;i++) {
2738 fclose(ost->logfile);
2739 ost->logfile = NULL;
2741 av_fifo_free(ost->fifo); /* works even if fifo is not
2742 initialized but set to zero */
2743 av_free(ost->pict_tmp.data[0]);
2744 if (ost->video_resample)
2745 sws_freeContext(ost->img_resample_ctx);
2747 audio_resample_close(ost->resample);
2748 if (ost->reformat_ctx)
2749 av_audio_convert_free(ost->reformat_ctx);
2758 static void opt_format(const char *arg)
2760 /* compatibility stuff for pgmyuv */
2761 if (!strcmp(arg, "pgmyuv")) {
2762 pgmyuv_compatibility_hack=1;
2763 // opt_image_format(arg);
2765 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2768 last_asked_format = arg;
2771 static void opt_video_rc_override_string(const char *arg)
2773 video_rc_override_string = arg;
2776 static int opt_me_threshold(const char *opt, const char *arg)
2778 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2782 static int opt_verbose(const char *opt, const char *arg)
2784 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2788 static int opt_frame_rate(const char *opt, const char *arg)
2790 if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2791 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2797 static int opt_bitrate(const char *opt, const char *arg)
2799 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2801 opt_default(opt, arg);
2803 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2804 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2809 static void opt_frame_crop_top(const char *arg)
2811 frame_topBand = atoi(arg);
2812 if (frame_topBand < 0) {
2813 fprintf(stderr, "Incorrect top crop size\n");
2816 if ((frame_topBand) >= frame_height){
2817 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2820 frame_height -= frame_topBand;
2823 static void opt_frame_crop_bottom(const char *arg)
2825 frame_bottomBand = atoi(arg);
2826 if (frame_bottomBand < 0) {
2827 fprintf(stderr, "Incorrect bottom crop size\n");
2830 if ((frame_bottomBand) >= frame_height){
2831 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2834 frame_height -= frame_bottomBand;
2837 static void opt_frame_crop_left(const char *arg)
2839 frame_leftBand = atoi(arg);
2840 if (frame_leftBand < 0) {
2841 fprintf(stderr, "Incorrect left crop size\n");
2844 if ((frame_leftBand) >= frame_width){
2845 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2848 frame_width -= frame_leftBand;
2851 static void opt_frame_crop_right(const char *arg)
2853 frame_rightBand = atoi(arg);
2854 if (frame_rightBand < 0) {
2855 fprintf(stderr, "Incorrect right crop size\n");
2858 if ((frame_rightBand) >= frame_width){
2859 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2862 frame_width -= frame_rightBand;
2865 static void opt_frame_size(const char *arg)
2867 if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
2868 fprintf(stderr, "Incorrect frame size\n");
2873 static void opt_pad_color(const char *arg) {
2874 /* Input is expected to be six hex digits similar to
2875 how colors are expressed in html tags (but without the #) */
2876 int rgb = strtol(arg, NULL, 16);
2880 g = ((rgb >> 8) & 255);
2883 padcolor[0] = RGB_TO_Y(r,g,b);
2884 padcolor[1] = RGB_TO_U(r,g,b,0);
2885 padcolor[2] = RGB_TO_V(r,g,b,0);
2888 static void opt_frame_pad_top(const char *arg)
2890 frame_padtop = atoi(arg);
2891 if (frame_padtop < 0) {
2892 fprintf(stderr, "Incorrect top pad size\n");
2897 static void opt_frame_pad_bottom(const char *arg)
2899 frame_padbottom = atoi(arg);
2900 if (frame_padbottom < 0) {
2901 fprintf(stderr, "Incorrect bottom pad size\n");
2907 static void opt_frame_pad_left(const char *arg)
2909 frame_padleft = atoi(arg);
2910 if (frame_padleft < 0) {
2911 fprintf(stderr, "Incorrect left pad size\n");
2917 static void opt_frame_pad_right(const char *arg)
2919 frame_padright = atoi(arg);
2920 if (frame_padright < 0) {
2921 fprintf(stderr, "Incorrect right pad size\n");
2926 static void opt_frame_pix_fmt(const char *arg)
2928 if (strcmp(arg, "list")) {
2929 frame_pix_fmt = av_get_pix_fmt(arg);
2930 if (frame_pix_fmt == PIX_FMT_NONE) {
2931 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2940 static void opt_frame_aspect_ratio(const char *arg)
2947 p = strchr(arg, ':');
2949 x = strtol(arg, &end, 10);
2951 y = strtol(end+1, &end, 10);
2953 ar = (double)x / (double)y;
2955 ar = strtod(arg, NULL);
2958 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2961 frame_aspect_ratio = ar;
2964 static int opt_metadata(const char *opt, const char *arg)
2966 char *mid= strchr(arg, '=');
2969 fprintf(stderr, "Missing =\n");
2975 metadata= av_realloc(metadata, sizeof(*metadata)*metadata_count);
2976 metadata[metadata_count-1].key = av_strdup(arg);
2977 metadata[metadata_count-1].value= av_strdup(mid);
2982 static void opt_qscale(const char *arg)
2984 video_qscale = atof(arg);
2985 if (video_qscale <= 0 ||
2986 video_qscale > 255) {
2987 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2992 static void opt_top_field_first(const char *arg)
2994 top_field_first= atoi(arg);
2997 static int opt_thread_count(const char *opt, const char *arg)
2999 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3002 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
3007 static void opt_audio_sample_fmt(const char *arg)
3009 if (strcmp(arg, "list"))
3010 audio_sample_fmt = avcodec_get_sample_fmt(arg);
3012 list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
3017 static int opt_audio_rate(const char *opt, const char *arg)
3019 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3023 static int opt_audio_channels(const char *opt, const char *arg)
3025 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3029 static void opt_video_channel(const char *arg)
3031 video_channel = strtol(arg, NULL, 0);
3034 static void opt_video_standard(const char *arg)
3036 video_standard = av_strdup(arg);
3039 static void opt_codec(int *pstream_copy, char **pcodec_name,
3040 int codec_type, const char *arg)
3042 av_freep(pcodec_name);
3043 if (!strcmp(arg, "copy")) {
3046 *pcodec_name = av_strdup(arg);
3050 static void opt_audio_codec(const char *arg)
3052 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
3055 static void opt_audio_tag(const char *arg)
3058 audio_codec_tag= strtol(arg, &tail, 0);
3061 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
3064 static void opt_video_tag(const char *arg)
3067 video_codec_tag= strtol(arg, &tail, 0);
3070 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
3073 static void opt_video_codec(const char *arg)
3075 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
3078 static void opt_subtitle_codec(const char *arg)
3080 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
3083 static void opt_subtitle_tag(const char *arg)
3086 subtitle_codec_tag= strtol(arg, &tail, 0);
3089 subtitle_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
3092 static void opt_map(const char *arg)
3097 m = &stream_maps[nb_stream_maps++];
3099 m->file_index = strtol(arg, &p, 0);
3103 m->stream_index = strtol(p, &p, 0);
3106 m->sync_file_index = strtol(p, &p, 0);
3109 m->sync_stream_index = strtol(p, &p, 0);
3111 m->sync_file_index = m->file_index;
3112 m->sync_stream_index = m->stream_index;
3116 static void opt_map_meta_data(const char *arg)
3121 m = &meta_data_maps[nb_meta_data_maps++];
3123 m->out_file = strtol(arg, &p, 0);
3127 m->in_file = strtol(p, &p, 0);
3130 static void opt_input_ts_scale(const char *arg)
3132 unsigned int stream;
3136 stream = strtol(arg, &p, 0);
3139 scale= strtod(p, &p);
3141 if(stream >= MAX_STREAMS)
3144 input_files_ts_scale[nb_input_files][stream]= scale;
3147 static int opt_recording_time(const char *opt, const char *arg)
3149 recording_time = parse_time_or_die(opt, arg, 1);
3153 static int opt_start_time(const char *opt, const char *arg)
3155 start_time = parse_time_or_die(opt, arg, 1);
3159 static int opt_rec_timestamp(const char *opt, const char *arg)
3161 rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3165 static int opt_input_ts_offset(const char *opt, const char *arg)
3167 input_ts_offset = parse_time_or_die(opt, arg, 1);
3171 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
3173 const char *codec_string = encoder ? "encoder" : "decoder";
3177 return CODEC_ID_NONE;
3179 avcodec_find_encoder_by_name(name) :
3180 avcodec_find_decoder_by_name(name);
3182 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3185 if(codec->type != type) {
3186 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3192 static void opt_input_file(const char *filename)
3194 AVFormatContext *ic;
3195 AVFormatParameters params, *ap = ¶ms;
3196 AVInputFormat *file_iformat = NULL;
3197 int err, i, ret, rfps, rfps_base;
3200 if (last_asked_format) {
3201 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3202 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3205 last_asked_format = NULL;
3208 if (!strcmp(filename, "-"))
3211 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3212 !strcmp(filename, "/dev/stdin");
3214 /* get default parameters from command line */
3215 ic = avformat_alloc_context();
3217 print_error(filename, AVERROR(ENOMEM));
3221 memset(ap, 0, sizeof(*ap));
3222 ap->prealloced_context = 1;
3223 ap->sample_rate = audio_sample_rate;
3224 ap->channels = audio_channels;
3225 ap->time_base.den = frame_rate.num;
3226 ap->time_base.num = frame_rate.den;
3227 ap->width = frame_width + frame_padleft + frame_padright;
3228 ap->height = frame_height + frame_padtop + frame_padbottom;
3229 ap->pix_fmt = frame_pix_fmt;
3230 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3231 ap->channel = video_channel;
3232 ap->standard = video_standard;
3234 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
3236 ic->video_codec_id = find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0);
3237 ic->audio_codec_id = find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0);
3238 ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0);
3239 ic->flags |= AVFMT_FLAG_NONBLOCK;
3241 if(pgmyuv_compatibility_hack)
3242 ic->video_codec_id= CODEC_ID_PGMYUV;
3244 /* open the input file with generic libav function */
3245 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3247 print_error(filename, err);
3253 for(i=0; i<ic->nb_streams; i++){
3254 ic->streams[i]->discard= AVDISCARD_ALL;
3256 for(i=0; i<ic->nb_programs; i++){
3257 AVProgram *p= ic->programs[i];
3258 if(p->id != opt_programid){
3259 p->discard = AVDISCARD_ALL;
3262 for(j=0; j<p->nb_stream_indexes; j++){
3263 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3268 fprintf(stderr, "Specified program id not found\n");
3274 ic->loop_input = loop_input;
3276 /* If not enough info to get the stream parameters, we decode the
3277 first frames to get it. (used in mpeg case for example) */
3278 ret = av_find_stream_info(ic);
3279 if (ret < 0 && verbose >= 0) {
3280 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3284 timestamp = start_time;
3285 /* add the stream start time */
3286 if (ic->start_time != AV_NOPTS_VALUE)
3287 timestamp += ic->start_time;
3289 /* if seeking requested, we execute it */
3290 if (start_time != 0) {
3291 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3293 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3294 filename, (double)timestamp / AV_TIME_BASE);
3296 /* reset seek info */
3300 /* update the current parameters so that they match the one of the input stream */
3301 for(i=0;i<ic->nb_streams;i++) {
3302 AVStream *st = ic->streams[i];
3303 AVCodecContext *enc = st->codec;
3304 avcodec_thread_init(enc, thread_count);
3305 switch(enc->codec_type) {
3306 case AVMEDIA_TYPE_AUDIO:
3307 set_context_opts(enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
3308 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
3309 channel_layout = enc->channel_layout;
3310 audio_channels = enc->channels;
3311 audio_sample_rate = enc->sample_rate;
3312 audio_sample_fmt = enc->sample_fmt;
3313 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(audio_codec_name);
3315 st->discard= AVDISCARD_ALL;
3317 case AVMEDIA_TYPE_VIDEO:
3318 set_context_opts(enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
3319 frame_height = enc->height;
3320 frame_width = enc->width;
3321 if(ic->streams[i]->sample_aspect_ratio.num)
3322 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3324 frame_aspect_ratio=av_q2d(enc->sample_aspect_ratio);
3325 frame_aspect_ratio *= (float) enc->width / enc->height;
3326 frame_pix_fmt = enc->pix_fmt;
3327 rfps = ic->streams[i]->r_frame_rate.num;
3328 rfps_base = ic->streams[i]->r_frame_rate.den;
3330 enc->flags |= CODEC_FLAG_EMU_EDGE;
3331 frame_height >>= enc->lowres;
3332 frame_width >>= enc->lowres;
3335 enc->debug |= FF_DEBUG_MV;
3337 if (enc->time_base.den != rfps*enc->ticks_per_frame || enc->time_base.num != rfps_base) {
3340 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3341 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
3343 (float)rfps / rfps_base, rfps, rfps_base);
3345 /* update the current frame rate to match the stream frame rate */
3346 frame_rate.num = rfps;
3347 frame_rate.den = rfps_base;
3349 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(video_codec_name);
3351 st->discard= AVDISCARD_ALL;
3352 else if(video_discard)
3353 st->discard= video_discard;
3355 case AVMEDIA_TYPE_DATA:
3357 case AVMEDIA_TYPE_SUBTITLE:
3358 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(subtitle_codec_name);
3359 if(subtitle_disable)
3360 st->discard = AVDISCARD_ALL;
3362 case AVMEDIA_TYPE_ATTACHMENT:
3363 case AVMEDIA_TYPE_UNKNOWN:
3371 input_files[nb_input_files] = ic;
3372 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3373 /* dump the file content */
3375 dump_format(ic, nb_input_files, filename, 0);
3381 av_freep(&video_codec_name);
3382 av_freep(&audio_codec_name);
3383 av_freep(&subtitle_codec_name);
3386 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3387 int *has_subtitle_ptr)
3389 int has_video, has_audio, has_subtitle, i, j;
3390 AVFormatContext *ic;
3395 for(j=0;j<nb_input_files;j++) {
3396 ic = input_files[j];
3397 for(i=0;i<ic->nb_streams;i++) {
3398 AVCodecContext *enc = ic->streams[i]->codec;
3399 switch(enc->codec_type) {
3400 case AVMEDIA_TYPE_AUDIO:
3403 case AVMEDIA_TYPE_VIDEO:
3406 case AVMEDIA_TYPE_SUBTITLE:
3409 case AVMEDIA_TYPE_DATA:
3410 case AVMEDIA_TYPE_ATTACHMENT:
3411 case AVMEDIA_TYPE_UNKNOWN:
3418 *has_video_ptr = has_video;
3419 *has_audio_ptr = has_audio;
3420 *has_subtitle_ptr = has_subtitle;
3423 static void new_video_stream(AVFormatContext *oc)
3426 AVCodecContext *video_enc;
3427 enum CodecID codec_id;
3429 st = av_new_stream(oc, oc->nb_streams);
3431 fprintf(stderr, "Could not alloc stream\n");
3434 avcodec_get_context_defaults2(st->codec, AVMEDIA_TYPE_VIDEO);
3435 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
3436 video_bitstream_filters= NULL;
3438 avcodec_thread_init(st->codec, thread_count);
3440 video_enc = st->codec;
3443 video_enc->codec_tag= video_codec_tag;
3445 if( (video_global_header&1)
3446 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3447 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3448 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3450 if(video_global_header&2){
3451 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3452 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3455 if (video_stream_copy) {
3456 st->stream_copy = 1;
3457 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3458 video_enc->sample_aspect_ratio =
3459 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3464 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3466 if (video_codec_name) {
3467 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1);
3468 codec = avcodec_find_encoder_by_name(video_codec_name);
3469 output_codecs[nb_ocodecs] = codec;
3471 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3472 codec = avcodec_find_encoder(codec_id);
3475 video_enc->codec_id = codec_id;
3477 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3479 if (codec && codec->supported_framerates && !force_fps)
3480 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3481 video_enc->time_base.den = fps.num;
3482 video_enc->time_base.num = fps.den;
3484 video_enc->width = frame_width + frame_padright + frame_padleft;
3485 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3486 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3487 video_enc->pix_fmt = frame_pix_fmt;
3488 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3490 choose_pixel_fmt(st, codec);
3493 video_enc->gop_size = 0;
3494 if (video_qscale || same_quality) {
3495 video_enc->flags |= CODEC_FLAG_QSCALE;
3496 video_enc->global_quality=
3497 st->quality = FF_QP2LAMBDA * video_qscale;
3501 video_enc->intra_matrix = intra_matrix;
3503 video_enc->inter_matrix = inter_matrix;
3505 p= video_rc_override_string;
3508 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3510 fprintf(stderr, "error parsing rc_override\n");
3513 video_enc->rc_override=
3514 av_realloc(video_enc->rc_override,
3515 sizeof(RcOverride)*(i+1));
3516 video_enc->rc_override[i].start_frame= start;
3517 video_enc->rc_override[i].end_frame = end;
3519 video_enc->rc_override[i].qscale= q;
3520 video_enc->rc_override[i].quality_factor= 1.0;
3523 video_enc->rc_override[i].qscale= 0;
3524 video_enc->rc_override[i].quality_factor= -q/100.0;
3529 video_enc->rc_override_count=i;
3530 if (!video_enc->rc_initial_buffer_occupancy)
3531 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3532 video_enc->me_threshold= me_threshold;
3533 video_enc->intra_dc_precision= intra_dc_precision - 8;
3536 video_enc->flags|= CODEC_FLAG_PSNR;
3541 video_enc->flags |= CODEC_FLAG_PASS1;
3543 video_enc->flags |= CODEC_FLAG_PASS2;
3548 if (video_language) {
3549 av_metadata_set2(&st->metadata, "language", video_language, 0);
3550 av_freep(&video_language);
3553 /* reset some key parameters */
3555 av_freep(&video_codec_name);
3556 video_stream_copy = 0;
3557 frame_pix_fmt = PIX_FMT_NONE;
3560 static void new_audio_stream(AVFormatContext *oc)
3563 AVCodecContext *audio_enc;
3564 enum CodecID codec_id;
3566 st = av_new_stream(oc, oc->nb_streams);
3568 fprintf(stderr, "Could not alloc stream\n");
3571 avcodec_get_context_defaults2(st->codec, AVMEDIA_TYPE_AUDIO);
3573 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
3574 audio_bitstream_filters= NULL;
3576 avcodec_thread_init(st->codec, thread_count);
3578 audio_enc = st->codec;
3579 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3582 audio_enc->codec_tag= audio_codec_tag;
3584 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3585 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3586 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3588 if (audio_stream_copy) {
3589 st->stream_copy = 1;
3590 audio_enc->channels = audio_channels;
3591 audio_enc->sample_rate = audio_sample_rate;
3595 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3597 if (audio_codec_name) {
3598 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1);
3599 codec = avcodec_find_encoder_by_name(audio_codec_name);
3600 output_codecs[nb_ocodecs] = codec;
3602 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3603 codec = avcodec_find_encoder(codec_id);
3605 audio_enc->codec_id = codec_id;
3607 if (audio_qscale > QSCALE_NONE) {
3608 audio_enc->flags |= CODEC_FLAG_QSCALE;
3609 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3611 audio_enc->channels = audio_channels;
3612 audio_enc->sample_fmt = audio_sample_fmt;
3613 audio_enc->sample_rate = audio_sample_rate;
3614 audio_enc->channel_layout = channel_layout;
3615 if (avcodec_channel_layout_num_channels(channel_layout) != audio_channels)
3616 audio_enc->channel_layout = 0;
3617 choose_sample_fmt(st, codec);
3618 choose_sample_rate(st, codec);
3621 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3622 if (audio_language) {
3623 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3624 av_freep(&audio_language);
3627 /* reset some key parameters */
3629 av_freep(&audio_codec_name);
3630 audio_stream_copy = 0;
3633 static void new_subtitle_stream(AVFormatContext *oc)
3636 AVCodecContext *subtitle_enc;
3638 st = av_new_stream(oc, oc->nb_streams);
3640 fprintf(stderr, "Could not alloc stream\n");
3643 avcodec_get_context_defaults2(st->codec, AVMEDIA_TYPE_SUBTITLE);
3645 bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
3646 subtitle_bitstream_filters= NULL;
3648 subtitle_enc = st->codec;
3649 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3651 if(subtitle_codec_tag)
3652 subtitle_enc->codec_tag= subtitle_codec_tag;
3654 if (subtitle_stream_copy) {
3655 st->stream_copy = 1;
3657 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3658 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1);
3659 output_codecs[nb_ocodecs] = avcodec_find_encoder_by_name(subtitle_codec_name);
3663 if (subtitle_language) {
3664 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3665 av_freep(&subtitle_language);
3668 subtitle_disable = 0;
3669 av_freep(&subtitle_codec_name);
3670 subtitle_stream_copy = 0;
3673 static void opt_new_audio_stream(void)
3675 AVFormatContext *oc;
3676 if (nb_output_files <= 0) {
3677 fprintf(stderr, "At least one output file must be specified\n");
3680 oc = output_files[nb_output_files - 1];
3681 new_audio_stream(oc);
3684 static void opt_new_video_stream(void)
3686 AVFormatContext *oc;
3687 if (nb_output_files <= 0) {
3688 fprintf(stderr, "At least one output file must be specified\n");
3691 oc = output_files[nb_output_files - 1];
3692 new_video_stream(oc);
3695 static void opt_new_subtitle_stream(void)
3697 AVFormatContext *oc;
3698 if (nb_output_files <= 0) {
3699 fprintf(stderr, "At least one output file must be specified\n");
3702 oc = output_files[nb_output_files - 1];
3703 new_subtitle_stream(oc);
3706 static void opt_output_file(const char *filename)
3708 AVFormatContext *oc;
3709 int err, use_video, use_audio, use_subtitle;
3710 int input_has_video, input_has_audio, input_has_subtitle;
3711 AVFormatParameters params, *ap = ¶ms;
3712 AVOutputFormat *file_oformat;
3714 if (!strcmp(filename, "-"))
3717 oc = avformat_alloc_context();
3719 print_error(filename, AVERROR(ENOMEM));
3723 if (last_asked_format) {
3724 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3725 if (!file_oformat) {
3726 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3729 last_asked_format = NULL;
3731 file_oformat = av_guess_format(NULL, filename, NULL);
3732 if (!file_oformat) {
3733 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3739 oc->oformat = file_oformat;
3740 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3742 if (!strcmp(file_oformat->name, "ffm") &&
3743 av_strstart(filename, "http:", NULL)) {
3744 /* special case for files sent to ffserver: we get the stream
3745 parameters from ffserver */
3746 int err = read_ffserver_streams(oc, filename);
3748 print_error(filename, err);
3752 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3753 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3754 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3756 /* disable if no corresponding type found and at least one
3758 if (nb_input_files > 0) {
3759 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3760 &input_has_subtitle);
3761 if (!input_has_video)
3763 if (!input_has_audio)
3765 if (!input_has_subtitle)
3769 /* manual disable */
3770 if (audio_disable) {
3773 if (video_disable) {
3776 if (subtitle_disable) {
3781 new_video_stream(oc);
3785 new_audio_stream(oc);
3789 new_subtitle_stream(oc);
3792 oc->timestamp = rec_timestamp;
3794 for(; metadata_count>0; metadata_count--){
3795 av_metadata_set2(&oc->metadata, metadata[metadata_count-1].key,
3796 metadata[metadata_count-1].value, 0);
3798 av_metadata_conv(oc, oc->oformat->metadata_conv, NULL);
3801 output_files[nb_output_files++] = oc;
3803 /* check filename in case of an image number is expected */
3804 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3805 if (!av_filename_number_test(oc->filename)) {
3806 print_error(oc->filename, AVERROR_NUMEXPECTED);
3811 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3812 /* test if it already exists to avoid loosing precious files */
3813 if (!file_overwrite &&
3814 (strchr(filename, ':') == NULL ||
3815 filename[1] == ':' ||
3816 av_strstart(filename, "file:", NULL))) {
3817 if (url_exist(filename)) {
3819 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3821 if (!read_yesno()) {
3822 fprintf(stderr, "Not overwriting - exiting\n");
3827 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3834 if ((err = url_fopen(&oc->pb, filename, URL_WRONLY)) < 0) {
3835 print_error(filename, err);
3840 memset(ap, 0, sizeof(*ap));
3841 if (av_set_parameters(oc, ap) < 0) {
3842 fprintf(stderr, "%s: Invalid encoding parameters\n",
3847 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3848 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3849 oc->loop_output = loop_output;
3850 oc->flags |= AVFMT_FLAG_NONBLOCK;
3852 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
3855 /* same option as mencoder */
3856 static void opt_pass(const char *pass_str)
3859 pass = atoi(pass_str);
3860 if (pass != 1 && pass != 2) {
3861 fprintf(stderr, "pass number can be only 1 or 2\n");
3867 static int64_t getutime(void)
3870 struct rusage rusage;
3872 getrusage(RUSAGE_SELF, &rusage);
3873 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3874 #elif HAVE_GETPROCESSTIMES
3876 FILETIME c, e, k, u;
3877 proc = GetCurrentProcess();
3878 GetProcessTimes(proc, &c, &e, &k, &u);
3879 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3881 return av_gettime();
3885 static int64_t getmaxrss(void)
3887 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3888 struct rusage rusage;
3889 getrusage(RUSAGE_SELF, &rusage);
3890 return (int64_t)rusage.ru_maxrss * 1024;
3891 #elif HAVE_GETPROCESSMEMORYINFO
3893 PROCESS_MEMORY_COUNTERS memcounters;
3894 proc = GetCurrentProcess();
3895 memcounters.cb = sizeof(memcounters);
3896 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3897 return memcounters.PeakPagefileUsage;
3903 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3906 const char *p = str;
3913 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3920 static void opt_inter_matrix(const char *arg)
3922 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3923 parse_matrix_coeffs(inter_matrix, arg);
3926 static void opt_intra_matrix(const char *arg)
3928 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3929 parse_matrix_coeffs(intra_matrix, arg);
3933 * Trivial log callback.
3934 * Only suitable for show_help and similar since it lacks prefix handling.
3936 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
3938 vfprintf(stdout, fmt, vl);
3941 static void show_usage(void)
3943 printf("Hyper fast Audio and Video encoder\n");
3944 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3948 static void show_help(void)
3950 av_log_set_callback(log_callback_help);
3952 show_help_options(options, "Main options:\n",
3953 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3954 show_help_options(options, "\nAdvanced options:\n",
3955 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3957 show_help_options(options, "\nVideo options:\n",
3958 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3960 show_help_options(options, "\nAdvanced Video options:\n",
3961 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3962 OPT_VIDEO | OPT_EXPERT);
3963 show_help_options(options, "\nAudio options:\n",
3964 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3966 show_help_options(options, "\nAdvanced Audio options:\n",
3967 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3968 OPT_AUDIO | OPT_EXPERT);
3969 show_help_options(options, "\nSubtitle options:\n",
3970 OPT_SUBTITLE | OPT_GRAB,
3972 show_help_options(options, "\nAudio/Video grab options:\n",
3976 av_opt_show(avcodec_opts[0], NULL);
3978 av_opt_show(avformat_opts, NULL);
3980 av_opt_show(sws_opts, NULL);
3983 static void opt_target(const char *arg)
3985 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3986 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3988 if(!strncmp(arg, "pal-", 4)) {
3991 } else if(!strncmp(arg, "ntsc-", 5)) {
3994 } else if(!strncmp(arg, "film-", 5)) {
3999 /* Calculate FR via float to avoid int overflow */
4000 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4003 } else if((fr == 29970) || (fr == 23976)) {
4006 /* Try to determine PAL/NTSC by peeking in the input files */
4007 if(nb_input_files) {
4009 for(j = 0; j < nb_input_files; j++) {
4010 for(i = 0; i < input_files[j]->nb_streams; i++) {
4011 AVCodecContext *c = input_files[j]->streams[i]->codec;
4012 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4014 fr = c->time_base.den * 1000 / c->time_base.num;
4018 } else if((fr == 29970) || (fr == 23976)) {
4028 if(verbose && norm != UNKNOWN)
4029 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4032 if(norm == UNKNOWN) {
4033 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4034 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4035 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4039 if(!strcmp(arg, "vcd")) {
4041 opt_video_codec("mpeg1video");
4042 opt_audio_codec("mp2");
4045 opt_frame_size(norm == PAL ? "352x288" : "352x240");
4046 opt_frame_rate(NULL, frame_rates[norm]);
4047 opt_default("g", norm == PAL ? "15" : "18");
4049 opt_default("b", "1150000");
4050 opt_default("maxrate", "1150000");
4051 opt_default("minrate", "1150000");
4052 opt_default("bufsize", "327680"); // 40*1024*8;
4054 opt_default("ab", "224000");
4055 audio_sample_rate = 44100;
4058 opt_default("packetsize", "2324");
4059 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4061 /* We have to offset the PTS, so that it is consistent with the SCR.
4062 SCR starts at 36000, but the first two packs contain only padding
4063 and the first pack from the other stream, respectively, may also have
4064 been written before.
4065 So the real data starts at SCR 36000+3*1200. */
4066 mux_preload= (36000+3*1200) / 90000.0; //0.44
4067 } else if(!strcmp(arg, "svcd")) {
4069 opt_video_codec("mpeg2video");
4070 opt_audio_codec("mp2");
4073 opt_frame_size(norm == PAL ? "480x576" : "480x480");
4074 opt_frame_rate(NULL, frame_rates[norm]);
4075 opt_default("g", norm == PAL ? "15" : "18");
4077 opt_default("b", "2040000");
4078 opt_default("maxrate", "2516000");
4079 opt_default("minrate", "0"); //1145000;
4080 opt_default("bufsize", "1835008"); //224*1024*8;
4081 opt_default("flags", "+scan_offset");
4084 opt_default("ab", "224000");
4085 audio_sample_rate = 44100;
4087 opt_default("packetsize", "2324");
4089 } else if(!strcmp(arg, "dvd")) {
4091 opt_video_codec("mpeg2video");
4092 opt_audio_codec("ac3");
4095 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4096 opt_frame_rate(NULL, frame_rates[norm]);
4097 opt_default("g", norm == PAL ? "15" : "18");
4099 opt_default("b", "6000000");
4100 opt_default("maxrate", "9000000");
4101 opt_default("minrate", "0"); //1500000;
4102 opt_default("bufsize", "1835008"); //224*1024*8;
4104 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4105 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4107 opt_default("ab", "448000");
4108 audio_sample_rate = 48000;
4110 } else if(!strncmp(arg, "dv", 2)) {
4114 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4115 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4116 (norm == PAL ? "yuv420p" : "yuv411p"));
4117 opt_frame_rate(NULL, frame_rates[norm]);
4119 audio_sample_rate = 48000;
4123 fprintf(stderr, "Unknown target: %s\n", arg);
4128 static void opt_vstats_file (const char *arg)
4130 av_free (vstats_filename);
4131 vstats_filename=av_strdup (arg);
4134 static void opt_vstats (void)
4137 time_t today2 = time(NULL);
4138 struct tm *today = localtime(&today2);
4140 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4142 opt_vstats_file(filename);
4145 static int opt_bsf(const char *opt, const char *arg)
4147 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4148 AVBitStreamFilterContext **bsfp;
4151 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4155 bsfp= *opt == 'v' ? &video_bitstream_filters :
4156 *opt == 'a' ? &audio_bitstream_filters :
4157 &subtitle_bitstream_filters;
4159 bsfp= &(*bsfp)->next;
4166 static int opt_preset(const char *opt, const char *arg)
4169 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4171 const char *base[3]= { getenv("FFMPEG_DATADIR"),
4177 for(i=0; i<3 && !f; i++){
4180 snprintf(filename, sizeof(filename), "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", arg);
4181 f= fopen(filename, "r");
4183 char *codec_name= *opt == 'v' ? video_codec_name :
4184 *opt == 'a' ? audio_codec_name :
4185 subtitle_codec_name;
4186 snprintf(filename, sizeof(filename), "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", codec_name, arg);
4187 f= fopen(filename, "r");
4191 av_strlcpy(filename, arg, sizeof(filename));
4192 f= fopen(filename, "r");
4196 fprintf(stderr, "File for preset '%s' not found\n", arg);
4201 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4202 if(line[0] == '#' && !e)
4204 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4206 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4209 if(!strcmp(tmp, "acodec")){
4210 opt_audio_codec(tmp2);
4211 }else if(!strcmp(tmp, "vcodec")){
4212 opt_video_codec(tmp2);
4213 }else if(!strcmp(tmp, "scodec")){
4214 opt_subtitle_codec(tmp2);
4215 }else if(opt_default(tmp, tmp2) < 0){
4216 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4226 static const OptionDef options[] = {
4228 #include "cmdutils_common_opts.h"
4229 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4230 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4231 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4232 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
4233 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
4234 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4235 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4236 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4237 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4238 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4239 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_rec_timestamp}, "set the timestamp ('now' to set the current time)", "time" },
4240 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4241 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4242 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4243 "add timings for benchmarking" },
4244 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4245 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4246 "dump each input packet" },
4247 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4248 "when dumping packets, also dump the payload" },
4249 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4250 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4251 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "number of times to loop output in formats that support looping (0 loops forever)", "" },
4252 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4253 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4254 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4255 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4256 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4257 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4258 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4259 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4260 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4261 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4262 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4263 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4264 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4267 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4268 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4269 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4270 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4271 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4272 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4273 { "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" },
4274 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
4275 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
4276 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
4277 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
4278 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
4279 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
4280 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
4281 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
4282 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
4283 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4284 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4285 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4286 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4287 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4288 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4289 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4290 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4291 "use same video quality as source (implies VBR)" },
4292 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4293 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4294 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4295 "deinterlace pictures" },
4296 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4297 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4298 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4300 { "vfilters", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4302 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4303 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4304 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4305 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4306 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4307 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
4308 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4309 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4310 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4313 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4314 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4315 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4316 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4317 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4318 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4319 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4320 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4321 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4322 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
4323 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4324 { "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" },
4326 /* subtitle options */
4327 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4328 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4329 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
4330 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4331 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4334 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4335 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4336 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4339 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4340 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4342 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4343 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4344 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4346 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4347 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4348 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4349 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4351 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4355 int main(int argc, char **argv)
4360 avcodec_register_all();
4362 avdevice_register_all();
4365 avfilter_register_all();
4370 if(isatty(STDIN_FILENO))
4371 url_set_interrupt_cb(decode_interrupt_cb);
4374 for(i=0; i<AVMEDIA_TYPE_NB; i++){
4375 avcodec_opts[i]= avcodec_alloc_context2(i);
4377 avformat_opts = avformat_alloc_context();
4378 sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
4383 parse_options(argc, argv, options, opt_output_file);
4385 if(nb_output_files <= 0 && nb_input_files == 0) {
4387 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4391 /* file converter / grab */
4392 if (nb_output_files <= 0) {
4393 fprintf(stderr, "At least one output file must be specified\n");
4397 if (nb_input_files == 0) {
4398 fprintf(stderr, "At least one input file must be specified\n");
4403 if (av_transcode(output_files, nb_output_files, input_files, nb_input_files,
4404 stream_maps, nb_stream_maps) < 0)
4406 ti = getutime() - ti;
4408 int maxrss = getmaxrss() / 1024;
4409 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);