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 "libavcore/parseutils.h"
40 #include "libavutil/colorspace.h"
41 #include "libavutil/fifo.h"
42 #include "libavutil/pixdesc.h"
43 #include "libavutil/avstring.h"
44 #include "libavutil/libm.h"
45 #include "libavformat/os_support.h"
48 # include "libavfilter/avfilter.h"
49 # include "libavfilter/avfiltergraph.h"
50 # include "libavfilter/graphparser.h"
51 # include "libavfilter/vsrc_buffer.h"
54 #if HAVE_SYS_RESOURCE_H
55 #include <sys/types.h>
57 #include <sys/resource.h>
58 #elif HAVE_GETPROCESSTIMES
61 #if HAVE_GETPROCESSMEMORYINFO
67 #include <sys/select.h>
72 #include <sys/ioctl.h>
82 #include "libavutil/avassert.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;
96 * select an input file for an output file
98 typedef struct AVMetaDataMap {
103 static const OptionDef options[];
105 #define MAX_FILES 100
106 #if !FF_API_MAX_STREAMS
107 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
110 static const char *last_asked_format = NULL;
111 static AVFormatContext *input_files[MAX_FILES];
112 static int64_t input_files_ts_offset[MAX_FILES];
113 static double *input_files_ts_scale[MAX_FILES] = {NULL};
114 static AVCodec **input_codecs = NULL;
115 static int nb_input_files = 0;
116 static int nb_input_codecs = 0;
117 static int nb_input_files_ts_scale[MAX_FILES] = {0};
119 static AVFormatContext *output_files[MAX_FILES];
120 static AVCodec **output_codecs = NULL;
121 static int nb_output_files = 0;
122 static int nb_output_codecs = 0;
124 static AVStreamMap *stream_maps = NULL;
125 static int nb_stream_maps;
127 static AVMetaDataMap meta_data_maps[MAX_FILES];
128 static int nb_meta_data_maps;
130 /* indexed by output file stream index */
131 static int *streamid_map = NULL;
132 static int nb_streamid_map = 0;
134 static int frame_width = 0;
135 static int frame_height = 0;
136 static float frame_aspect_ratio = 0;
137 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
138 static enum SampleFormat audio_sample_fmt = SAMPLE_FMT_NONE;
139 static int frame_topBand = 0;
140 static int frame_bottomBand = 0;
141 static int frame_leftBand = 0;
142 static int frame_rightBand = 0;
143 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
144 static AVRational frame_rate;
145 static float video_qscale = 0;
146 static uint16_t *intra_matrix = NULL;
147 static uint16_t *inter_matrix = NULL;
148 static const char *video_rc_override_string=NULL;
149 static int video_disable = 0;
150 static int video_discard = 0;
151 static char *video_codec_name = NULL;
152 static unsigned int video_codec_tag = 0;
153 static char *video_language = NULL;
154 static int same_quality = 0;
155 static int do_deinterlace = 0;
156 static int top_field_first = -1;
157 static int me_threshold = 0;
158 static int intra_dc_precision = 8;
159 static int loop_input = 0;
160 static int loop_output = AVFMT_NOOUTPUTLOOP;
161 static int qp_hist = 0;
163 static char *vfilters = NULL;
164 AVFilterGraph *graph = NULL;
167 static int intra_only = 0;
168 static int audio_sample_rate = 44100;
169 static int64_t channel_layout = 0;
170 #define QSCALE_NONE -99999
171 static float audio_qscale = QSCALE_NONE;
172 static int audio_disable = 0;
173 static int audio_channels = 1;
174 static char *audio_codec_name = NULL;
175 static unsigned int audio_codec_tag = 0;
176 static char *audio_language = NULL;
178 static int subtitle_disable = 0;
179 static char *subtitle_codec_name = NULL;
180 static char *subtitle_language = NULL;
181 static unsigned int subtitle_codec_tag = 0;
183 static float mux_preload= 0.5;
184 static float mux_max_delay= 0.7;
186 static int64_t recording_time = INT64_MAX;
187 static int64_t start_time = 0;
188 static int64_t recording_timestamp = 0;
189 static int64_t input_ts_offset = 0;
190 static int file_overwrite = 0;
191 static int metadata_count;
192 static AVMetadataTag *metadata;
193 static int do_benchmark = 0;
194 static int do_hex_dump = 0;
195 static int do_pkt_dump = 0;
196 static int do_psnr = 0;
197 static int do_pass = 0;
198 static char *pass_logfilename_prefix = NULL;
199 static int audio_stream_copy = 0;
200 static int video_stream_copy = 0;
201 static int subtitle_stream_copy = 0;
202 static int video_sync_method= -1;
203 static int audio_sync_method= 0;
204 static float audio_drift_threshold= 0.1;
205 static int copy_ts= 0;
206 static int opt_shortest = 0;
207 static int video_global_header = 0;
208 static char *vstats_filename;
209 static FILE *vstats_file;
210 static int opt_programid = 0;
211 static int copy_initial_nonkeyframes = 0;
213 static int rate_emu = 0;
215 static int video_channel = 0;
216 static char *video_standard;
218 static int audio_volume = 256;
220 static int exit_on_error = 0;
221 static int using_stdin = 0;
222 static int verbose = 1;
223 static int thread_count= 1;
224 static int q_pressed = 0;
225 static int64_t video_size = 0;
226 static int64_t audio_size = 0;
227 static int64_t extra_size = 0;
228 static int nb_frames_dup = 0;
229 static int nb_frames_drop = 0;
230 static int input_sync;
231 static uint64_t limit_filesize = 0;
232 static int force_fps = 0;
234 static int pgmyuv_compatibility_hack=0;
235 static float dts_delta_threshold = 10;
237 static unsigned int sws_flags = SWS_BICUBIC;
239 static int64_t timer_start;
241 static uint8_t *audio_buf;
242 static uint8_t *audio_out;
243 unsigned int allocated_audio_out_size, allocated_audio_buf_size;
245 static short *samples;
247 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
248 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
249 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
251 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
253 struct AVInputStream;
255 typedef struct AVOutputStream {
256 int file_index; /* file index */
257 int index; /* stream index in the output file */
258 int source_index; /* AVInputStream index */
259 AVStream *st; /* stream in the output file */
260 int encoding_needed; /* true if encoding needed for this stream */
262 /* input pts and corresponding output pts
264 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
265 struct AVInputStream *sync_ist; /* input stream to sync against */
266 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
267 AVBitStreamFilterContext *bitstream_filters;
270 AVFrame pict_tmp; /* temporary image for resampling */
271 struct SwsContext *img_resample_ctx; /* for image resampling */
274 int resample_pix_fmt;
276 /* full frame size of first frame */
280 /* cropping area sizes */
287 /* cropping area of first frame */
288 int original_topBand;
289 int original_bottomBand;
290 int original_leftBand;
291 int original_rightBand;
295 ReSampleContext *resample; /* for audio resampling */
297 AVAudioConvert *reformat_ctx;
298 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
302 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
303 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
305 typedef struct AVInputStream {
309 int discard; /* true if stream data should be discarded */
310 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
311 int64_t sample_index; /* current sample */
313 int64_t start; /* time when read started */
314 int64_t next_pts; /* synthetic pts for cases where pkt.pts
316 int64_t pts; /* current pts */
317 PtsCorrectionContext pts_ctx;
318 int is_start; /* is 1 at the start and after a discontinuity */
319 int showed_multi_packet_warning;
320 int is_past_recording_time;
322 AVFilterContext *output_video_filter;
323 AVFilterContext *input_video_filter;
324 AVFrame *filter_frame;
325 int has_filter_frame;
326 AVFilterBufferRef *picref;
330 typedef struct AVInputFile {
331 int eof_reached; /* true if eof reached */
332 int ist_index; /* index of first stream in ist_table */
333 int buffer_size; /* current total buffer size */
334 int nb_streams; /* nb streams we are aware of */
339 /* init terminal so that we can grab keys */
340 static struct termios oldtty;
345 static int get_filtered_video_pic(AVFilterContext *ctx,
346 AVFilterBufferRef **picref, AVFrame *pic2,
349 AVFilterBufferRef *pic;
351 if(avfilter_request_frame(ctx->inputs[0]))
353 if(!(pic = ctx->inputs[0]->cur_buf))
356 ctx->inputs[0]->cur_buf = NULL;
360 memcpy(pic2->data, pic->data, sizeof(pic->data));
361 memcpy(pic2->linesize, pic->linesize, sizeof(pic->linesize));
362 pic2->interlaced_frame = pic->video->interlaced;
363 pic2->top_field_first = pic->video->top_field_first;
368 static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
370 AVFilterContext *last_filter, *filter;
371 /** filter graph containing all filters including input & output */
372 AVCodecContext *codec = ost->st->codec;
373 AVCodecContext *icodec = ist->st->codec;
374 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
378 graph = av_mallocz(sizeof(AVFilterGraph));
380 if ((ret = avfilter_open(&ist->input_video_filter, avfilter_get_by_name("buffer"), "src")) < 0)
382 if ((ret = avfilter_open(&ist->output_video_filter, &ffsink, "out")) < 0)
385 snprintf(args, 255, "%d:%d:%d:%d:%d", ist->st->codec->width,
386 ist->st->codec->height, ist->st->codec->pix_fmt,
387 ist->st->time_base.num, ist->st->time_base.den);
388 if ((ret = avfilter_init_filter(ist->input_video_filter, args, NULL)) < 0)
390 if ((ret = avfilter_init_filter(ist->output_video_filter, NULL, &ffsink_ctx)) < 0)
393 /* add input and output filters to the overall graph */
394 avfilter_graph_add_filter(graph, ist->input_video_filter);
395 avfilter_graph_add_filter(graph, ist->output_video_filter);
397 last_filter = ist->input_video_filter;
399 if (ost->video_crop) {
400 snprintf(args, 255, "%d:%d:%d:%d",
401 codec->width, codec->height,
402 ost->leftBand, ost->topBand);
403 if ((ret = avfilter_open(&filter, avfilter_get_by_name("crop"), NULL)) < 0)
405 if ((ret = avfilter_init_filter(filter, args, NULL)) < 0)
407 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
409 last_filter = filter;
410 avfilter_graph_add_filter(graph, last_filter);
414 icodec->width - (frame_leftBand + frame_rightBand)) ||
415 (codec->height != icodec->height - (frame_topBand + frame_bottomBand))) {
416 snprintf(args, 255, "%d:%d:flags=0x%X",
419 (int)av_get_int(sws_opts, "sws_flags", NULL));
420 if ((ret = avfilter_open(&filter, avfilter_get_by_name("scale"), NULL)) < 0)
422 if ((ret = avfilter_init_filter(filter, args, NULL)) < 0)
424 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
426 last_filter = filter;
427 avfilter_graph_add_filter(graph, last_filter);
430 snprintf(args, sizeof(args), "flags=0x%X", (int)av_get_int(sws_opts, "sws_flags", NULL));
431 graph->scale_sws_opts = av_strdup(args);
434 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
435 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
437 outputs->name = av_strdup("in");
438 outputs->filter = last_filter;
439 outputs->pad_idx = 0;
440 outputs->next = NULL;
442 inputs->name = av_strdup("out");
443 inputs->filter = ist->output_video_filter;
447 if ((ret = avfilter_graph_parse(graph, vfilters, inputs, outputs, NULL)) < 0)
451 if ((ret = avfilter_link(last_filter, 0, ist->output_video_filter, 0)) < 0)
455 /* configure all the filter links */
456 if ((ret = avfilter_graph_check_validity(graph, NULL)) < 0)
458 if ((ret = avfilter_graph_config_formats(graph, NULL)) < 0)
460 if ((ret = avfilter_graph_config_links(graph, NULL)) < 0)
463 codec->width = ist->output_video_filter->inputs[0]->w;
464 codec->height = ist->output_video_filter->inputs[0]->h;
468 #endif /* CONFIG_AVFILTER */
470 static void term_exit(void)
472 av_log(NULL, AV_LOG_QUIET, "");
474 tcsetattr (0, TCSANOW, &oldtty);
478 static volatile int received_sigterm = 0;
481 sigterm_handler(int sig)
483 received_sigterm = sig;
487 static void term_init(void)
496 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
497 |INLCR|IGNCR|ICRNL|IXON);
498 tty.c_oflag |= OPOST;
499 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
500 tty.c_cflag &= ~(CSIZE|PARENB);
505 tcsetattr (0, TCSANOW, &tty);
506 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
509 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
510 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
512 signal(SIGXCPU, sigterm_handler);
516 /* read a key without blocking */
517 static int read_key(void)
529 n = select(1, &rfds, NULL, NULL, &tv);
544 static int decode_interrupt_cb(void)
546 return q_pressed || (q_pressed = read_key() == 'q');
549 static int ffmpeg_exit(int ret)
554 for(i=0;i<nb_output_files;i++) {
555 /* maybe av_close_output_file ??? */
556 AVFormatContext *s = output_files[i];
558 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
560 for(j=0;j<s->nb_streams;j++) {
561 av_metadata_free(&s->streams[j]->metadata);
562 av_free(s->streams[j]->codec);
563 av_free(s->streams[j]->info);
564 av_free(s->streams[j]);
566 for(j=0;j<s->nb_programs;j++) {
567 av_metadata_free(&s->programs[j]->metadata);
569 for(j=0;j<s->nb_chapters;j++) {
570 av_metadata_free(&s->chapters[j]->metadata);
572 av_metadata_free(&s->metadata);
574 av_free(output_streams_for_file[i]);
576 for(i=0;i<nb_input_files;i++) {
577 av_close_input_file(input_files[i]);
578 av_free(input_files_ts_scale[i]);
581 av_free(intra_matrix);
582 av_free(inter_matrix);
586 av_free(vstats_filename);
589 av_free(streamid_map);
590 av_free(input_codecs);
591 av_free(output_codecs);
592 av_free(stream_maps);
594 av_free(video_codec_name);
595 av_free(audio_codec_name);
596 av_free(subtitle_codec_name);
598 av_free(video_standard);
603 allocated_audio_buf_size= allocated_audio_out_size= 0;
610 if (received_sigterm) {
612 "Received signal %d: terminating.\n",
613 (int) received_sigterm);
617 exit(ret); /* not all OS-es handle main() return value */
621 /* similar to ff_dynarray_add() and av_fast_realloc() */
622 static void *grow_array(void *array, int elem_size, int *size, int new_size)
624 if (new_size >= INT_MAX / elem_size) {
625 fprintf(stderr, "Array too big.\n");
628 if (*size < new_size) {
629 uint8_t *tmp = av_realloc(array, new_size*elem_size);
631 fprintf(stderr, "Could not alloc buffer.\n");
634 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
641 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
643 if(codec && codec->sample_fmts){
644 const enum SampleFormat *p= codec->sample_fmts;
646 if(*p == st->codec->sample_fmt)
650 st->codec->sample_fmt = codec->sample_fmts[0];
654 static void choose_sample_rate(AVStream *st, AVCodec *codec)
656 if(codec && codec->supported_samplerates){
657 const int *p= codec->supported_samplerates;
659 int best_dist=INT_MAX;
661 int dist= abs(st->codec->sample_rate - *p);
662 if(dist < best_dist){
668 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
670 st->codec->sample_rate= best;
674 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
676 if(codec && codec->pix_fmts){
677 const enum PixelFormat *p= codec->pix_fmts;
679 if(*p == st->codec->pix_fmt)
683 && !( st->codec->codec_id==CODEC_ID_MJPEG
684 && st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL
685 && ( st->codec->pix_fmt == PIX_FMT_YUV420P
686 || st->codec->pix_fmt == PIX_FMT_YUV422P)))
687 st->codec->pix_fmt = codec->pix_fmts[0];
691 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
697 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
700 /* copy stream format */
701 s->nb_streams = ic->nb_streams;
702 for(i=0;i<ic->nb_streams;i++) {
706 // FIXME: a more elegant solution is needed
707 st = av_mallocz(sizeof(AVStream));
708 memcpy(st, ic->streams[i], sizeof(AVStream));
709 st->codec = avcodec_alloc_context();
711 print_error(filename, AVERROR(ENOMEM));
714 avcodec_copy_context(st->codec, ic->streams[i]->codec);
717 codec = avcodec_find_encoder(st->codec->codec_id);
718 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
719 if (audio_stream_copy) {
722 choose_sample_fmt(st, codec);
723 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
724 if (video_stream_copy) {
727 choose_pixel_fmt(st, codec);
730 if(!st->codec->thread_count)
731 st->codec->thread_count = 1;
732 if(st->codec->thread_count>1)
733 avcodec_thread_init(st->codec, st->codec->thread_count);
735 if(st->codec->flags & CODEC_FLAG_BITEXACT)
740 s->timestamp = av_gettime();
742 av_close_input_file(ic);
747 get_sync_ipts(const AVOutputStream *ost)
749 const AVInputStream *ist = ost->sync_ist;
750 return (double)(ist->pts - start_time)/AV_TIME_BASE;
753 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
757 AVPacket new_pkt= *pkt;
758 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
759 &new_pkt.data, &new_pkt.size,
760 pkt->data, pkt->size,
761 pkt->flags & AV_PKT_FLAG_KEY);
764 new_pkt.destruct= av_destruct_packet;
766 fprintf(stderr, "%s failed for stream %d, codec %s",
767 bsfc->filter->name, pkt->stream_index,
768 avctx->codec ? avctx->codec->name : "copy");
778 ret= av_interleaved_write_frame(s, pkt);
780 print_error("av_interleaved_write_frame()", ret);
785 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
787 static void do_audio_out(AVFormatContext *s,
790 unsigned char *buf, int size)
793 int64_t audio_out_size, audio_buf_size;
794 int64_t allocated_for_size= size;
796 int size_out, frame_bytes, ret;
797 AVCodecContext *enc= ost->st->codec;
798 AVCodecContext *dec= ist->st->codec;
799 int osize= av_get_bits_per_sample_format(enc->sample_fmt)/8;
800 int isize= av_get_bits_per_sample_format(dec->sample_fmt)/8;
801 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
804 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
805 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
806 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
807 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
808 audio_buf_size*= osize*enc->channels;
810 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
811 if(coded_bps > 8*osize)
812 audio_out_size= audio_out_size * coded_bps / (8*osize);
813 audio_out_size += FF_MIN_BUFFER_SIZE;
815 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
816 fprintf(stderr, "Buffer sizes too large\n");
820 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
821 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
822 if (!audio_buf || !audio_out){
823 fprintf(stderr, "Out of memory in do_audio_out\n");
827 if (enc->channels != dec->channels)
828 ost->audio_resample = 1;
830 if (ost->audio_resample && !ost->resample) {
831 if (dec->sample_fmt != SAMPLE_FMT_S16)
832 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
833 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
834 enc->sample_rate, dec->sample_rate,
835 enc->sample_fmt, dec->sample_fmt,
837 if (!ost->resample) {
838 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
839 dec->channels, dec->sample_rate,
840 enc->channels, enc->sample_rate);
845 #define MAKE_SFMT_PAIR(a,b) ((a)+SAMPLE_FMT_NB*(b))
846 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
847 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
848 if (ost->reformat_ctx)
849 av_audio_convert_free(ost->reformat_ctx);
850 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
851 dec->sample_fmt, 1, NULL, 0);
852 if (!ost->reformat_ctx) {
853 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
854 avcodec_get_sample_fmt_name(dec->sample_fmt),
855 avcodec_get_sample_fmt_name(enc->sample_fmt));
858 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
861 if(audio_sync_method){
862 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
863 - av_fifo_size(ost->fifo)/(enc->channels * 2);
864 double idelta= delta*dec->sample_rate / enc->sample_rate;
865 int byte_delta= ((int)idelta)*2*dec->channels;
867 //FIXME resample delay
868 if(fabs(delta) > 50){
869 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
871 byte_delta= FFMAX(byte_delta, -size);
875 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
880 static uint8_t *input_tmp= NULL;
881 input_tmp= av_realloc(input_tmp, byte_delta + size);
883 if(byte_delta > allocated_for_size - size){
884 allocated_for_size= byte_delta + (int64_t)size;
889 memset(input_tmp, 0, byte_delta);
890 memcpy(input_tmp + byte_delta, buf, size);
894 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
896 }else if(audio_sync_method>1){
897 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
898 av_assert0(ost->audio_resample);
900 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
901 // 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));
902 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
906 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
907 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
909 if (ost->audio_resample) {
911 size_out = audio_resample(ost->resample,
912 (short *)buftmp, (short *)buf,
913 size / (dec->channels * isize));
914 size_out = size_out * enc->channels * osize;
920 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
921 const void *ibuf[6]= {buftmp};
922 void *obuf[6]= {audio_buf};
923 int istride[6]= {isize};
924 int ostride[6]= {osize};
925 int len= size_out/istride[0];
926 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
927 printf("av_audio_convert() failed\n");
933 size_out = len*osize;
936 /* now encode as many frames as possible */
937 if (enc->frame_size > 1) {
938 /* output resampled raw samples */
939 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
940 fprintf(stderr, "av_fifo_realloc2() failed\n");
943 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
945 frame_bytes = enc->frame_size * osize * enc->channels;
947 while (av_fifo_size(ost->fifo) >= frame_bytes) {
949 av_init_packet(&pkt);
951 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
953 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
955 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
958 fprintf(stderr, "Audio encoding failed\n");
962 pkt.stream_index= ost->index;
965 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
966 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
967 pkt.flags |= AV_PKT_FLAG_KEY;
968 write_frame(s, &pkt, enc, ost->bitstream_filters);
970 ost->sync_opts += enc->frame_size;
974 av_init_packet(&pkt);
976 ost->sync_opts += size_out / (osize * enc->channels);
978 /* output a pcm frame */
979 /* determine the size of the coded buffer */
982 size_out = size_out*coded_bps/8;
984 if(size_out > audio_out_size){
985 fprintf(stderr, "Internal error, buffer size too small\n");
989 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
990 ret = avcodec_encode_audio(enc, audio_out, size_out,
993 fprintf(stderr, "Audio encoding failed\n");
997 pkt.stream_index= ost->index;
1000 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1001 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1002 pkt.flags |= AV_PKT_FLAG_KEY;
1003 write_frame(s, &pkt, enc, ost->bitstream_filters);
1007 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
1009 AVCodecContext *dec;
1010 AVPicture *picture2;
1011 AVPicture picture_tmp;
1014 dec = ist->st->codec;
1016 /* deinterlace : must be done before any resize */
1017 if (do_deinterlace) {
1020 /* create temporary picture */
1021 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1022 buf = av_malloc(size);
1026 picture2 = &picture_tmp;
1027 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1029 if(avpicture_deinterlace(picture2, picture,
1030 dec->pix_fmt, dec->width, dec->height) < 0) {
1031 /* if error, do not deinterlace */
1032 fprintf(stderr, "Deinterlacing failed\n");
1041 if (picture != picture2)
1042 *picture = *picture2;
1046 /* we begin to correct av delay at this threshold */
1047 #define AV_DELAY_MAX 0.100
1049 static void do_subtitle_out(AVFormatContext *s,
1050 AVOutputStream *ost,
1055 static uint8_t *subtitle_out = NULL;
1056 int subtitle_out_max_size = 1024 * 1024;
1057 int subtitle_out_size, nb, i;
1058 AVCodecContext *enc;
1061 if (pts == AV_NOPTS_VALUE) {
1062 fprintf(stderr, "Subtitle packets must have a pts\n");
1068 enc = ost->st->codec;
1070 if (!subtitle_out) {
1071 subtitle_out = av_malloc(subtitle_out_max_size);
1074 /* Note: DVB subtitle need one packet to draw them and one other
1075 packet to clear them */
1076 /* XXX: signal it in the codec context ? */
1077 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1082 for(i = 0; i < nb; i++) {
1083 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1084 // start_display_time is required to be 0
1085 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1086 sub->end_display_time -= sub->start_display_time;
1087 sub->start_display_time = 0;
1088 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1089 subtitle_out_max_size, sub);
1090 if (subtitle_out_size < 0) {
1091 fprintf(stderr, "Subtitle encoding failed\n");
1095 av_init_packet(&pkt);
1096 pkt.stream_index = ost->index;
1097 pkt.data = subtitle_out;
1098 pkt.size = subtitle_out_size;
1099 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1100 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1101 /* XXX: the pts correction is handled here. Maybe handling
1102 it in the codec would be better */
1104 pkt.pts += 90 * sub->start_display_time;
1106 pkt.pts += 90 * sub->end_display_time;
1108 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1112 static int bit_buffer_size= 1024*256;
1113 static uint8_t *bit_buffer= NULL;
1115 static void do_video_out(AVFormatContext *s,
1116 AVOutputStream *ost,
1118 AVFrame *in_picture,
1121 int nb_frames, i, ret;
1122 #if !CONFIG_AVFILTER
1123 int64_t topBand, bottomBand, leftBand, rightBand;
1125 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
1126 AVFrame picture_crop_temp, picture_pad_temp;
1127 AVCodecContext *enc, *dec;
1130 avcodec_get_frame_defaults(&picture_crop_temp);
1131 avcodec_get_frame_defaults(&picture_pad_temp);
1133 enc = ost->st->codec;
1134 dec = ist->st->codec;
1136 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1138 /* by default, we output a single frame */
1143 if(video_sync_method){
1144 double vdelta = sync_ipts - ost->sync_opts;
1145 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1148 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1151 }else if(vdelta>0.6)
1152 ost->sync_opts= lrintf(sync_ipts);
1153 }else if (vdelta > 1.1)
1154 nb_frames = lrintf(vdelta);
1155 //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);
1156 if (nb_frames == 0){
1159 fprintf(stderr, "*** drop!\n");
1160 }else if (nb_frames > 1) {
1161 nb_frames_dup += nb_frames - 1;
1163 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1166 ost->sync_opts= lrintf(sync_ipts);
1168 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1173 formatted_picture = in_picture;
1175 if (ost->video_crop) {
1176 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
1177 fprintf(stderr, "error cropping picture\n");
1182 formatted_picture = &picture_crop_temp;
1184 formatted_picture = in_picture;
1188 final_picture = formatted_picture;
1189 padding_src = formatted_picture;
1190 resampling_dst = &ost->pict_tmp;
1192 if( (ost->resample_height != (ist->st->codec->height - (ost->topBand + ost->bottomBand)))
1193 || (ost->resample_width != (ist->st->codec->width - (ost->leftBand + ost->rightBand)))
1194 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1196 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));
1197 if(!ost->video_resample)
1201 #if !CONFIG_AVFILTER
1202 if (ost->video_resample) {
1204 final_picture = &ost->pict_tmp;
1205 if( (ost->resample_height != (ist->st->codec->height - (ost->topBand + ost->bottomBand)))
1206 || (ost->resample_width != (ist->st->codec->width - (ost->leftBand + ost->rightBand)))
1207 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1209 /* keep bands proportional to the frame size */
1210 topBand = ((int64_t)ist->st->codec->height * ost->original_topBand / ost->original_height) & ~1;
1211 bottomBand = ((int64_t)ist->st->codec->height * ost->original_bottomBand / ost->original_height) & ~1;
1212 leftBand = ((int64_t)ist->st->codec->width * ost->original_leftBand / ost->original_width) & ~1;
1213 rightBand = ((int64_t)ist->st->codec->width * ost->original_rightBand / ost->original_width) & ~1;
1215 /* sanity check to ensure no bad band sizes sneak in */
1216 av_assert0(topBand <= INT_MAX && topBand >= 0);
1217 av_assert0(bottomBand <= INT_MAX && bottomBand >= 0);
1218 av_assert0(leftBand <= INT_MAX && leftBand >= 0);
1219 av_assert0(rightBand <= INT_MAX && rightBand >= 0);
1221 ost->topBand = topBand;
1222 ost->bottomBand = bottomBand;
1223 ost->leftBand = leftBand;
1224 ost->rightBand = rightBand;
1226 ost->resample_height = ist->st->codec->height - (ost->topBand + ost->bottomBand);
1227 ost->resample_width = ist->st->codec->width - (ost->leftBand + ost->rightBand);
1228 ost->resample_pix_fmt= ist->st->codec->pix_fmt;
1230 /* initialize a new scaler context */
1231 sws_freeContext(ost->img_resample_ctx);
1232 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1233 ost->img_resample_ctx = sws_getContext(
1234 ist->st->codec->width - (ost->leftBand + ost->rightBand),
1235 ist->st->codec->height - (ost->topBand + ost->bottomBand),
1236 ist->st->codec->pix_fmt,
1237 ost->st->codec->width,
1238 ost->st->codec->height,
1239 ost->st->codec->pix_fmt,
1240 sws_flags, NULL, NULL, NULL);
1241 if (ost->img_resample_ctx == NULL) {
1242 fprintf(stderr, "Cannot get resampling context\n");
1246 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1247 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1251 /* duplicates frame if needed */
1252 for(i=0;i<nb_frames;i++) {
1254 av_init_packet(&pkt);
1255 pkt.stream_index= ost->index;
1257 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1258 /* raw pictures are written as AVPicture structure to
1259 avoid any copies. We support temorarily the older
1261 AVFrame* old_frame = enc->coded_frame;
1262 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1263 pkt.data= (uint8_t *)final_picture;
1264 pkt.size= sizeof(AVPicture);
1265 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1266 pkt.flags |= AV_PKT_FLAG_KEY;
1268 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1269 enc->coded_frame = old_frame;
1271 AVFrame big_picture;
1273 big_picture= *final_picture;
1274 /* better than nothing: use input picture interlaced
1276 big_picture.interlaced_frame = in_picture->interlaced_frame;
1277 if(avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
1278 if(top_field_first == -1)
1279 big_picture.top_field_first = in_picture->top_field_first;
1281 big_picture.top_field_first = top_field_first;
1284 /* handles sameq here. This is not correct because it may
1285 not be a global option */
1286 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1288 big_picture.pict_type = 0;
1289 // big_picture.pts = AV_NOPTS_VALUE;
1290 big_picture.pts= ost->sync_opts;
1291 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1292 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1293 ret = avcodec_encode_video(enc,
1294 bit_buffer, bit_buffer_size,
1297 fprintf(stderr, "Video encoding failed\n");
1302 pkt.data= bit_buffer;
1304 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1305 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1306 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1307 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1308 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1310 if(enc->coded_frame->key_frame)
1311 pkt.flags |= AV_PKT_FLAG_KEY;
1312 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1315 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1316 // enc->frame_number-1, ret, enc->pict_type);
1317 /* if two pass, output log */
1318 if (ost->logfile && enc->stats_out) {
1319 fprintf(ost->logfile, "%s", enc->stats_out);
1324 ost->frame_number++;
1328 static double psnr(double d){
1329 return -10.0*log(d)/log(10.0);
1332 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1335 AVCodecContext *enc;
1337 double ti1, bitrate, avg_bitrate;
1339 /* this is executed just the first time do_video_stats is called */
1341 vstats_file = fopen(vstats_filename, "w");
1348 enc = ost->st->codec;
1349 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1350 frame_number = ost->frame_number;
1351 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1352 if (enc->flags&CODEC_FLAG_PSNR)
1353 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1355 fprintf(vstats_file,"f_size= %6d ", frame_size);
1356 /* compute pts value */
1357 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1361 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1362 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1363 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1364 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1365 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1369 static void print_report(AVFormatContext **output_files,
1370 AVOutputStream **ost_table, int nb_ostreams,
1374 AVOutputStream *ost;
1375 AVFormatContext *oc;
1377 AVCodecContext *enc;
1378 int frame_number, vid, i;
1379 double bitrate, ti1, pts;
1380 static int64_t last_time = -1;
1381 static int qp_histogram[52];
1383 if (!is_last_report) {
1385 /* display the report every 0.5 seconds */
1386 cur_time = av_gettime();
1387 if (last_time == -1) {
1388 last_time = cur_time;
1391 if ((cur_time - last_time) < 500000)
1393 last_time = cur_time;
1397 oc = output_files[0];
1399 total_size = url_fsize(oc->pb);
1400 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1401 total_size= url_ftell(oc->pb);
1406 for(i=0;i<nb_ostreams;i++) {
1408 enc = ost->st->codec;
1409 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1410 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1411 !ost->st->stream_copy ?
1412 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1414 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1415 float t = (av_gettime()-timer_start) / 1000000.0;
1417 frame_number = ost->frame_number;
1418 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1419 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1420 !ost->st->stream_copy ?
1421 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1423 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1426 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1427 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1430 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1432 if (enc->flags&CODEC_FLAG_PSNR){
1434 double error, error_sum=0;
1435 double scale, scale_sum=0;
1436 char type[3]= {'Y','U','V'};
1437 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1440 error= enc->error[j];
1441 scale= enc->width*enc->height*255.0*255.0*frame_number;
1443 error= enc->coded_frame->error[j];
1444 scale= enc->width*enc->height*255.0*255.0;
1449 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1451 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1455 /* compute min output value */
1456 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1457 if ((pts < ti1) && (pts > 0))
1463 if (verbose || is_last_report) {
1464 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1466 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1467 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1468 (double)total_size / 1024, ti1, bitrate);
1470 if (nb_frames_dup || nb_frames_drop)
1471 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1472 nb_frames_dup, nb_frames_drop);
1475 fprintf(stderr, "%s \r", buf);
1480 if (is_last_report && verbose >= 0){
1481 int64_t raw= audio_size + video_size + extra_size;
1482 fprintf(stderr, "\n");
1483 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1487 100.0*(total_size - raw)/raw
1492 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1493 static int output_packet(AVInputStream *ist, int ist_index,
1494 AVOutputStream **ost_table, int nb_ostreams,
1495 const AVPacket *pkt)
1497 AVFormatContext *os;
1498 AVOutputStream *ost;
1502 void *buffer_to_free;
1503 static unsigned int samples_size= 0;
1504 AVSubtitle subtitle, *subtitle_to_free;
1505 int64_t pkt_pts = AV_NOPTS_VALUE;
1507 int frame_available;
1511 int bps = av_get_bits_per_sample_format(ist->st->codec->sample_fmt)>>3;
1513 if(ist->next_pts == AV_NOPTS_VALUE)
1514 ist->next_pts= ist->pts;
1518 av_init_packet(&avpkt);
1526 if(pkt->dts != AV_NOPTS_VALUE)
1527 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1528 if(pkt->pts != AV_NOPTS_VALUE)
1529 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1531 //while we have more to decode or while the decoder did output something on EOF
1532 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1533 uint8_t *data_buf, *decoded_data_buf;
1534 int data_size, decoded_data_size;
1536 ist->pts= ist->next_pts;
1538 if(avpkt.size && avpkt.size != pkt->size &&
1539 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1540 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1541 ist->showed_multi_packet_warning=1;
1544 /* decode the packet if needed */
1545 decoded_data_buf = NULL; /* fail safe */
1546 decoded_data_size= 0;
1547 data_buf = avpkt.data;
1548 data_size = avpkt.size;
1549 subtitle_to_free = NULL;
1550 if (ist->decoding_needed) {
1551 switch(ist->st->codec->codec_type) {
1552 case AVMEDIA_TYPE_AUDIO:{
1553 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1554 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1556 samples= av_malloc(samples_size);
1558 decoded_data_size= samples_size;
1559 /* XXX: could avoid copy if PCM 16 bits with same
1560 endianness as CPU */
1561 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1568 /* Some bug in mpeg audio decoder gives */
1569 /* decoded_data_size < 0, it seems they are overflows */
1570 if (decoded_data_size <= 0) {
1571 /* no audio frame */
1574 decoded_data_buf = (uint8_t *)samples;
1575 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1576 (ist->st->codec->sample_rate * ist->st->codec->channels);
1578 case AVMEDIA_TYPE_VIDEO:
1579 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1580 /* XXX: allocate picture correctly */
1581 avcodec_get_frame_defaults(&picture);
1582 ist->st->codec->reordered_opaque = pkt_pts;
1583 pkt_pts = AV_NOPTS_VALUE;
1585 ret = avcodec_decode_video2(ist->st->codec,
1586 &picture, &got_picture, &avpkt);
1587 ist->st->quality= picture.quality;
1591 /* no picture yet */
1592 goto discard_packet;
1594 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.reordered_opaque, ist->pts);
1595 if (ist->st->codec->time_base.num != 0) {
1596 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1597 ist->next_pts += ((int64_t)AV_TIME_BASE *
1598 ist->st->codec->time_base.num * ticks) /
1599 ist->st->codec->time_base.den;
1603 case AVMEDIA_TYPE_SUBTITLE:
1604 ret = avcodec_decode_subtitle2(ist->st->codec,
1605 &subtitle, &got_picture, &avpkt);
1609 goto discard_packet;
1611 subtitle_to_free = &subtitle;
1618 switch(ist->st->codec->codec_type) {
1619 case AVMEDIA_TYPE_AUDIO:
1620 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1621 ist->st->codec->sample_rate;
1623 case AVMEDIA_TYPE_VIDEO:
1624 if (ist->st->codec->time_base.num != 0) {
1625 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1626 ist->next_pts += ((int64_t)AV_TIME_BASE *
1627 ist->st->codec->time_base.num * ticks) /
1628 ist->st->codec->time_base.den;
1636 buffer_to_free = NULL;
1637 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1638 pre_process_video_frame(ist, (AVPicture *)&picture,
1643 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->input_video_filter) {
1644 // add it to be filtered
1645 av_vsrc_buffer_add_frame(ist->input_video_filter, &picture,
1647 ist->st->codec->sample_aspect_ratio);
1651 // preprocess audio (volume)
1652 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1653 if (audio_volume != 256) {
1656 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1657 int v = ((*volp) * audio_volume + 128) >> 8;
1658 if (v < -32768) v = -32768;
1659 if (v > 32767) v = 32767;
1665 /* frame rate emulation */
1667 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1668 int64_t now = av_gettime() - ist->start;
1673 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1674 !ist->output_video_filter || avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1676 /* if output time reached then transcode raw format,
1677 encode packets and output them */
1678 if (start_time == 0 || ist->pts >= start_time)
1680 while (frame_available) {
1681 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->output_video_filter)
1682 get_filtered_video_pic(ist->output_video_filter, &ist->picref, &picture, &ist->pts);
1684 for(i=0;i<nb_ostreams;i++) {
1688 if (ost->source_index == ist_index) {
1689 os = output_files[ost->file_index];
1691 /* set the input output pts pairs */
1692 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1694 if (ost->encoding_needed) {
1695 av_assert0(ist->decoding_needed);
1696 switch(ost->st->codec->codec_type) {
1697 case AVMEDIA_TYPE_AUDIO:
1698 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1700 case AVMEDIA_TYPE_VIDEO:
1702 if (ist->picref->video)
1703 ost->st->codec->sample_aspect_ratio = ist->picref->video->pixel_aspect;
1705 do_video_out(os, ost, ist, &picture, &frame_size);
1706 if (vstats_filename && frame_size)
1707 do_video_stats(os, ost, frame_size);
1709 case AVMEDIA_TYPE_SUBTITLE:
1710 do_subtitle_out(os, ost, ist, &subtitle,
1717 AVFrame avframe; //FIXME/XXX remove this
1719 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1721 av_init_packet(&opkt);
1723 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1726 /* no reencoding needed : output the packet directly */
1727 /* force the input stream PTS */
1729 avcodec_get_frame_defaults(&avframe);
1730 ost->st->codec->coded_frame= &avframe;
1731 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1733 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1734 audio_size += data_size;
1735 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1736 video_size += data_size;
1740 opkt.stream_index= ost->index;
1741 if(pkt->pts != AV_NOPTS_VALUE)
1742 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1744 opkt.pts= AV_NOPTS_VALUE;
1746 if (pkt->dts == AV_NOPTS_VALUE)
1747 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1749 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1750 opkt.dts -= ost_tb_start_time;
1752 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1753 opkt.flags= pkt->flags;
1755 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1756 if( ost->st->codec->codec_id != CODEC_ID_H264
1757 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1758 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1760 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1761 opkt.destruct= av_destruct_packet;
1763 opkt.data = data_buf;
1764 opkt.size = data_size;
1767 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1768 ost->st->codec->frame_number++;
1769 ost->frame_number++;
1770 av_free_packet(&opkt);
1776 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1777 ist->output_video_filter && avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1779 avfilter_unref_buffer(ist->picref);
1782 av_free(buffer_to_free);
1783 /* XXX: allocate the subtitles in the codec ? */
1784 if (subtitle_to_free) {
1785 if (subtitle_to_free->rects != NULL) {
1786 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1787 av_freep(&subtitle_to_free->rects[i]->pict.data[0]);
1788 av_freep(&subtitle_to_free->rects[i]->pict.data[1]);
1789 av_freep(&subtitle_to_free->rects[i]);
1791 av_freep(&subtitle_to_free->rects);
1793 subtitle_to_free->num_rects = 0;
1794 subtitle_to_free = NULL;
1801 for(i=0;i<nb_ostreams;i++) {
1803 if (ost->source_index == ist_index) {
1804 AVCodecContext *enc= ost->st->codec;
1805 os = output_files[ost->file_index];
1807 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1809 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1812 if (ost->encoding_needed) {
1816 av_init_packet(&pkt);
1817 pkt.stream_index= ost->index;
1819 switch(ost->st->codec->codec_type) {
1820 case AVMEDIA_TYPE_AUDIO:
1821 fifo_bytes = av_fifo_size(ost->fifo);
1823 /* encode any samples remaining in fifo */
1824 if (fifo_bytes > 0) {
1825 int osize = av_get_bits_per_sample_format(enc->sample_fmt) >> 3;
1826 int fs_tmp = enc->frame_size;
1828 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1829 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1830 enc->frame_size = fifo_bytes / (osize * enc->channels);
1832 int frame_bytes = enc->frame_size*osize*enc->channels;
1833 if (allocated_audio_buf_size < frame_bytes)
1835 memset(audio_buf+fifo_bytes, 0, frame_bytes - fifo_bytes);
1838 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1839 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1840 ost->st->time_base.num, enc->sample_rate);
1841 enc->frame_size = fs_tmp;
1844 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1847 fprintf(stderr, "Audio encoding failed\n");
1851 pkt.flags |= AV_PKT_FLAG_KEY;
1853 case AVMEDIA_TYPE_VIDEO:
1854 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1856 fprintf(stderr, "Video encoding failed\n");
1860 if(enc->coded_frame && enc->coded_frame->key_frame)
1861 pkt.flags |= AV_PKT_FLAG_KEY;
1862 if (ost->logfile && enc->stats_out) {
1863 fprintf(ost->logfile, "%s", enc->stats_out);
1872 pkt.data= bit_buffer;
1874 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1875 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1876 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1888 static void print_sdp(AVFormatContext **avc, int n)
1892 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1893 printf("SDP:\n%s\n", sdp);
1897 static int copy_chapters(int infile, int outfile)
1899 AVFormatContext *is = input_files[infile];
1900 AVFormatContext *os = output_files[outfile];
1903 for (i = 0; i < is->nb_chapters; i++) {
1904 AVChapter *in_ch = is->chapters[i], *out_ch;
1905 AVMetadataTag *t = NULL;
1906 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1907 AV_TIME_BASE_Q, in_ch->time_base);
1908 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1909 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1912 if (in_ch->end < ts_off)
1914 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1917 out_ch = av_mallocz(sizeof(AVChapter));
1919 return AVERROR(ENOMEM);
1921 out_ch->id = in_ch->id;
1922 out_ch->time_base = in_ch->time_base;
1923 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1924 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1926 while ((t = av_metadata_get(in_ch->metadata, "", t, AV_METADATA_IGNORE_SUFFIX)))
1927 av_metadata_set2(&out_ch->metadata, t->key, t->value, 0);
1930 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1932 return AVERROR(ENOMEM);
1933 os->chapters[os->nb_chapters - 1] = out_ch;
1939 * The following code is the main loop of the file converter
1941 static int transcode(AVFormatContext **output_files,
1942 int nb_output_files,
1943 AVFormatContext **input_files,
1945 AVStreamMap *stream_maps, int nb_stream_maps)
1947 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1948 AVFormatContext *is, *os;
1949 AVCodecContext *codec, *icodec;
1950 AVOutputStream *ost, **ost_table = NULL;
1951 AVInputStream *ist, **ist_table = NULL;
1952 AVInputFile *file_table;
1956 uint8_t no_packet[MAX_FILES]={0};
1957 int no_packet_count=0;
1959 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1963 /* input stream init */
1965 for(i=0;i<nb_input_files;i++) {
1966 is = input_files[i];
1967 file_table[i].ist_index = j;
1968 file_table[i].nb_streams = is->nb_streams;
1969 j += is->nb_streams;
1973 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1977 for(i=0;i<nb_istreams;i++) {
1978 ist = av_mallocz(sizeof(AVInputStream));
1984 for(i=0;i<nb_input_files;i++) {
1985 is = input_files[i];
1986 for(k=0;k<is->nb_streams;k++) {
1987 ist = ist_table[j++];
1988 ist->st = is->streams[k];
1989 ist->file_index = i;
1991 ist->discard = 1; /* the stream is discarded by default
1995 ist->start = av_gettime();
2000 /* output stream init */
2002 for(i=0;i<nb_output_files;i++) {
2003 os = output_files[i];
2004 if (!os->nb_streams) {
2005 dump_format(output_files[i], i, output_files[i]->filename, 1);
2006 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
2007 ret = AVERROR(EINVAL);
2010 nb_ostreams += os->nb_streams;
2012 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
2013 fprintf(stderr, "Number of stream maps must match number of output streams\n");
2014 ret = AVERROR(EINVAL);
2018 /* Sanity check the mapping args -- do the input files & streams exist? */
2019 for(i=0;i<nb_stream_maps;i++) {
2020 int fi = stream_maps[i].file_index;
2021 int si = stream_maps[i].stream_index;
2023 if (fi < 0 || fi > nb_input_files - 1 ||
2024 si < 0 || si > file_table[fi].nb_streams - 1) {
2025 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
2026 ret = AVERROR(EINVAL);
2029 fi = stream_maps[i].sync_file_index;
2030 si = stream_maps[i].sync_stream_index;
2031 if (fi < 0 || fi > nb_input_files - 1 ||
2032 si < 0 || si > file_table[fi].nb_streams - 1) {
2033 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2034 ret = AVERROR(EINVAL);
2039 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2043 for(k=0;k<nb_output_files;k++) {
2044 os = output_files[k];
2045 for(i=0;i<os->nb_streams;i++,n++) {
2047 ost = ost_table[n] = output_streams_for_file[k][i];
2048 ost->st = os->streams[i];
2049 if (nb_stream_maps > 0) {
2050 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
2051 stream_maps[n].stream_index;
2053 /* Sanity check that the stream types match */
2054 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
2055 int i= ost->file_index;
2056 dump_format(output_files[i], i, output_files[i]->filename, 1);
2057 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2058 stream_maps[n].file_index, stream_maps[n].stream_index,
2059 ost->file_index, ost->index);
2064 int best_nb_frames=-1;
2065 /* get corresponding input stream index : we select the first one with the right type */
2067 for(j=0;j<nb_istreams;j++) {
2072 AVFormatContext *f= input_files[ ist->file_index ];
2074 for(pi=0; pi<f->nb_programs; pi++){
2075 AVProgram *p= f->programs[pi];
2076 if(p->id == opt_programid)
2077 for(si=0; si<p->nb_stream_indexes; si++){
2078 if(f->streams[ p->stream_index[si] ] == ist->st)
2083 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2084 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2085 if(best_nb_frames < ist->st->codec_info_nb_frames){
2086 best_nb_frames= ist->st->codec_info_nb_frames;
2087 ost->source_index = j;
2094 if(! opt_programid) {
2095 /* try again and reuse existing stream */
2096 for(j=0;j<nb_istreams;j++) {
2098 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2099 && ist->st->discard != AVDISCARD_ALL) {
2100 ost->source_index = j;
2106 int i= ost->file_index;
2107 dump_format(output_files[i], i, output_files[i]->filename, 1);
2108 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2109 ost->file_index, ost->index);
2114 ist = ist_table[ost->source_index];
2116 ost->sync_ist = (nb_stream_maps > 0) ?
2117 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2118 stream_maps[n].sync_stream_index] : ist;
2122 /* for each output stream, we compute the right encoding parameters */
2123 for(i=0;i<nb_ostreams;i++) {
2124 AVMetadataTag *t = NULL;
2126 os = output_files[ost->file_index];
2127 ist = ist_table[ost->source_index];
2129 codec = ost->st->codec;
2130 icodec = ist->st->codec;
2132 while ((t = av_metadata_get(ist->st->metadata, "", t, AV_METADATA_IGNORE_SUFFIX))) {
2133 av_metadata_set2(&ost->st->metadata, t->key, t->value, AV_METADATA_DONT_OVERWRITE);
2136 ost->st->disposition = ist->st->disposition;
2137 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2138 codec->chroma_sample_location = icodec->chroma_sample_location;
2140 if (ost->st->stream_copy) {
2141 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2143 if (extra_size > INT_MAX)
2146 /* if stream_copy is selected, no need to decode or encode */
2147 codec->codec_id = icodec->codec_id;
2148 codec->codec_type = icodec->codec_type;
2150 if(!codec->codec_tag){
2151 if( !os->oformat->codec_tag
2152 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2153 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2154 codec->codec_tag = icodec->codec_tag;
2157 codec->bit_rate = icodec->bit_rate;
2158 codec->rc_max_rate = icodec->rc_max_rate;
2159 codec->rc_buffer_size = icodec->rc_buffer_size;
2160 codec->extradata= av_mallocz(extra_size);
2161 if (!codec->extradata)
2163 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2164 codec->extradata_size= icodec->extradata_size;
2165 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){
2166 codec->time_base = icodec->time_base;
2167 codec->time_base.num *= icodec->ticks_per_frame;
2168 av_reduce(&codec->time_base.num, &codec->time_base.den,
2169 codec->time_base.num, codec->time_base.den, INT_MAX);
2171 codec->time_base = ist->st->time_base;
2172 switch(codec->codec_type) {
2173 case AVMEDIA_TYPE_AUDIO:
2174 if(audio_volume != 256) {
2175 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2178 codec->channel_layout = icodec->channel_layout;
2179 codec->sample_rate = icodec->sample_rate;
2180 codec->channels = icodec->channels;
2181 codec->frame_size = icodec->frame_size;
2182 codec->block_align= icodec->block_align;
2183 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2184 codec->block_align= 0;
2185 if(codec->codec_id == CODEC_ID_AC3)
2186 codec->block_align= 0;
2188 case AVMEDIA_TYPE_VIDEO:
2189 codec->pix_fmt = icodec->pix_fmt;
2190 codec->width = icodec->width;
2191 codec->height = icodec->height;
2192 codec->has_b_frames = icodec->has_b_frames;
2194 case AVMEDIA_TYPE_SUBTITLE:
2195 codec->width = icodec->width;
2196 codec->height = icodec->height;
2202 switch(codec->codec_type) {
2203 case AVMEDIA_TYPE_AUDIO:
2204 ost->fifo= av_fifo_alloc(1024);
2207 ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
2208 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2209 icodec->request_channels = codec->channels;
2210 ist->decoding_needed = 1;
2211 ost->encoding_needed = 1;
2213 case AVMEDIA_TYPE_VIDEO:
2214 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2215 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2218 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
2219 ost->video_resample = ((codec->width != icodec->width -
2220 (frame_leftBand + frame_rightBand)) ||
2221 (codec->height != icodec->height -
2222 (frame_topBand + frame_bottomBand)) ||
2223 (codec->pix_fmt != icodec->pix_fmt));
2224 if (ost->video_crop) {
2225 ost->topBand = ost->original_topBand = frame_topBand;
2226 ost->bottomBand = ost->original_bottomBand = frame_bottomBand;
2227 ost->leftBand = ost->original_leftBand = frame_leftBand;
2228 ost->rightBand = ost->original_rightBand = frame_rightBand;
2230 if (ost->video_resample) {
2231 avcodec_get_frame_defaults(&ost->pict_tmp);
2232 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2233 codec->width, codec->height)) {
2234 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2237 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
2238 ost->img_resample_ctx = sws_getContext(
2239 icodec->width - (frame_leftBand + frame_rightBand),
2240 icodec->height - (frame_topBand + frame_bottomBand),
2245 sws_flags, NULL, NULL, NULL);
2246 if (ost->img_resample_ctx == NULL) {
2247 fprintf(stderr, "Cannot get resampling context\n");
2251 #if !CONFIG_AVFILTER
2252 ost->original_height = icodec->height;
2253 ost->original_width = icodec->width;
2255 codec->bits_per_raw_sample= 0;
2257 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
2258 ost->resample_width = icodec->width - (frame_leftBand + frame_rightBand);
2259 ost->resample_pix_fmt= icodec->pix_fmt;
2260 ost->encoding_needed = 1;
2261 ist->decoding_needed = 1;
2264 if (configure_filters(ist, ost)) {
2265 fprintf(stderr, "Error opening filters!\n");
2270 case AVMEDIA_TYPE_SUBTITLE:
2271 ost->encoding_needed = 1;
2272 ist->decoding_needed = 1;
2279 if (ost->encoding_needed &&
2280 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2281 char logfilename[1024];
2284 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2285 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2287 if (codec->flags & CODEC_FLAG_PASS1) {
2288 f = fopen(logfilename, "wb");
2290 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2296 size_t logbuffer_size;
2297 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2298 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2301 codec->stats_in = logbuffer;
2305 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2306 int size= codec->width * codec->height;
2307 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2312 bit_buffer = av_malloc(bit_buffer_size);
2314 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2316 ret = AVERROR(ENOMEM);
2320 /* open each encoder */
2321 for(i=0;i<nb_ostreams;i++) {
2323 if (ost->encoding_needed) {
2324 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2326 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2328 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2329 ost->st->codec->codec_id, ost->file_index, ost->index);
2330 ret = AVERROR(EINVAL);
2333 if (avcodec_open(ost->st->codec, codec) < 0) {
2334 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2335 ost->file_index, ost->index);
2336 ret = AVERROR(EINVAL);
2339 extra_size += ost->st->codec->extradata_size;
2343 /* open each decoder */
2344 for(i=0;i<nb_istreams;i++) {
2346 if (ist->decoding_needed) {
2347 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2349 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2351 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2352 ist->st->codec->codec_id, ist->file_index, ist->index);
2353 ret = AVERROR(EINVAL);
2356 if (avcodec_open(ist->st->codec, codec) < 0) {
2357 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2358 ist->file_index, ist->index);
2359 ret = AVERROR(EINVAL);
2362 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2363 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2368 for(i=0;i<nb_istreams;i++) {
2372 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2373 ist->next_pts = AV_NOPTS_VALUE;
2374 init_pts_correction(&ist->pts_ctx);
2378 /* set meta data information from input file if required */
2379 for (i=0;i<nb_meta_data_maps;i++) {
2380 AVFormatContext *out_file;
2381 AVFormatContext *in_file;
2382 AVMetadataTag *mtag;
2384 int out_file_index = meta_data_maps[i].out_file;
2385 int in_file_index = meta_data_maps[i].in_file;
2386 if (out_file_index < 0 || out_file_index >= nb_output_files) {
2387 snprintf(error, sizeof(error), "Invalid output file index %d map_meta_data(%d,%d)",
2388 out_file_index, out_file_index, in_file_index);
2389 ret = AVERROR(EINVAL);
2392 if (in_file_index < 0 || in_file_index >= nb_input_files) {
2393 snprintf(error, sizeof(error), "Invalid input file index %d map_meta_data(%d,%d)",
2394 in_file_index, out_file_index, in_file_index);
2395 ret = AVERROR(EINVAL);
2399 out_file = output_files[out_file_index];
2400 in_file = input_files[in_file_index];
2404 while((mtag=av_metadata_get(in_file->metadata, "", mtag, AV_METADATA_IGNORE_SUFFIX)))
2405 av_metadata_set2(&out_file->metadata, mtag->key, mtag->value, AV_METADATA_DONT_OVERWRITE);
2406 av_metadata_conv(out_file, out_file->oformat->metadata_conv,
2407 in_file->iformat->metadata_conv);
2410 /* copy chapters from the first input file that has them*/
2411 for (i = 0; i < nb_input_files; i++) {
2412 if (!input_files[i]->nb_chapters)
2415 for (j = 0; j < nb_output_files; j++)
2416 if ((ret = copy_chapters(i, j)) < 0)
2420 /* open files and write file headers */
2421 for(i=0;i<nb_output_files;i++) {
2422 os = output_files[i];
2423 if (av_write_header(os) < 0) {
2424 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2425 ret = AVERROR(EINVAL);
2428 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2434 /* dump the file output parameters - cannot be done before in case
2436 for(i=0;i<nb_output_files;i++) {
2437 dump_format(output_files[i], i, output_files[i]->filename, 1);
2440 /* dump the stream mapping */
2442 fprintf(stderr, "Stream mapping:\n");
2443 for(i=0;i<nb_ostreams;i++) {
2445 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2446 ist_table[ost->source_index]->file_index,
2447 ist_table[ost->source_index]->index,
2450 if (ost->sync_ist != ist_table[ost->source_index])
2451 fprintf(stderr, " [sync #%d.%d]",
2452 ost->sync_ist->file_index,
2453 ost->sync_ist->index);
2454 fprintf(stderr, "\n");
2459 fprintf(stderr, "%s\n", error);
2464 print_sdp(output_files, nb_output_files);
2467 if (!using_stdin && verbose >= 0) {
2468 fprintf(stderr, "Press [q] to stop encoding\n");
2469 url_set_interrupt_cb(decode_interrupt_cb);
2473 timer_start = av_gettime();
2475 for(; received_sigterm == 0;) {
2476 int file_index, ist_index;
2484 /* if 'q' pressed, exits */
2488 /* read_key() returns 0 on EOF */
2494 /* select the stream that we must read now by looking at the
2495 smallest output pts */
2497 for(i=0;i<nb_ostreams;i++) {
2500 os = output_files[ost->file_index];
2501 ist = ist_table[ost->source_index];
2502 if(ist->is_past_recording_time || no_packet[ist->file_index])
2504 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2505 ipts = (double)ist->pts;
2506 if (!file_table[ist->file_index].eof_reached){
2507 if(ipts < ipts_min) {
2509 if(input_sync ) file_index = ist->file_index;
2511 if(opts < opts_min) {
2513 if(!input_sync) file_index = ist->file_index;
2516 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2521 /* if none, if is finished */
2522 if (file_index < 0) {
2523 if(no_packet_count){
2525 memset(no_packet, 0, sizeof(no_packet));
2532 /* finish if limit size exhausted */
2533 if (limit_filesize != 0 && limit_filesize <= url_ftell(output_files[0]->pb))
2536 /* read a frame from it and output it in the fifo */
2537 is = input_files[file_index];
2538 ret= av_read_frame(is, &pkt);
2539 if(ret == AVERROR(EAGAIN)){
2540 no_packet[file_index]=1;
2545 file_table[file_index].eof_reached = 1;
2553 memset(no_packet, 0, sizeof(no_packet));
2556 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2558 /* the following test is needed in case new streams appear
2559 dynamically in stream : we ignore them */
2560 if (pkt.stream_index >= file_table[file_index].nb_streams)
2561 goto discard_packet;
2562 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2563 ist = ist_table[ist_index];
2565 goto discard_packet;
2567 if (pkt.dts != AV_NOPTS_VALUE)
2568 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2569 if (pkt.pts != AV_NOPTS_VALUE)
2570 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2572 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2573 && input_files_ts_scale[file_index][pkt.stream_index]){
2574 if(pkt.pts != AV_NOPTS_VALUE)
2575 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2576 if(pkt.dts != AV_NOPTS_VALUE)
2577 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2580 // 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);
2581 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2582 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2583 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2584 int64_t delta= pkt_dts - ist->next_pts;
2585 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2586 input_files_ts_offset[ist->file_index]-= delta;
2588 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2589 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2590 if(pkt.pts != AV_NOPTS_VALUE)
2591 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2595 /* finish if recording time exhausted */
2596 if (recording_time != INT64_MAX &&
2597 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2598 ist->is_past_recording_time = 1;
2599 goto discard_packet;
2602 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2603 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2606 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2607 ist->file_index, ist->index);
2610 av_free_packet(&pkt);
2615 av_free_packet(&pkt);
2617 /* dump report by using the output first video and audio streams */
2618 print_report(output_files, ost_table, nb_ostreams, 0);
2621 /* at the end of stream, we must flush the decoder buffers */
2622 for(i=0;i<nb_istreams;i++) {
2624 if (ist->decoding_needed) {
2625 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2631 /* write the trailer if needed and close file */
2632 for(i=0;i<nb_output_files;i++) {
2633 os = output_files[i];
2634 av_write_trailer(os);
2637 /* dump report by using the first video and audio streams */
2638 print_report(output_files, ost_table, nb_ostreams, 1);
2640 /* close each encoder */
2641 for(i=0;i<nb_ostreams;i++) {
2643 if (ost->encoding_needed) {
2644 av_freep(&ost->st->codec->stats_in);
2645 avcodec_close(ost->st->codec);
2649 /* close each decoder */
2650 for(i=0;i<nb_istreams;i++) {
2652 if (ist->decoding_needed) {
2653 avcodec_close(ist->st->codec);
2658 avfilter_graph_destroy(graph);
2667 av_freep(&bit_buffer);
2668 av_free(file_table);
2671 for(i=0;i<nb_istreams;i++) {
2678 for(i=0;i<nb_ostreams;i++) {
2681 if (ost->st->stream_copy)
2682 av_freep(&ost->st->codec->extradata);
2684 fclose(ost->logfile);
2685 ost->logfile = NULL;
2687 av_fifo_free(ost->fifo); /* works even if fifo is not
2688 initialized but set to zero */
2689 av_free(ost->pict_tmp.data[0]);
2690 if (ost->video_resample)
2691 sws_freeContext(ost->img_resample_ctx);
2693 audio_resample_close(ost->resample);
2694 if (ost->reformat_ctx)
2695 av_audio_convert_free(ost->reformat_ctx);
2704 static void opt_format(const char *arg)
2706 /* compatibility stuff for pgmyuv */
2707 if (!strcmp(arg, "pgmyuv")) {
2708 pgmyuv_compatibility_hack=1;
2709 // opt_image_format(arg);
2711 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2714 last_asked_format = arg;
2717 static void opt_video_rc_override_string(const char *arg)
2719 video_rc_override_string = arg;
2722 static int opt_me_threshold(const char *opt, const char *arg)
2724 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2728 static int opt_verbose(const char *opt, const char *arg)
2730 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2734 static int opt_frame_rate(const char *opt, const char *arg)
2736 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2737 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2743 static int opt_bitrate(const char *opt, const char *arg)
2745 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2747 opt_default(opt, arg);
2749 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2750 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2755 static void opt_frame_crop_top(const char *arg)
2757 frame_topBand = atoi(arg);
2758 if (frame_topBand < 0) {
2759 fprintf(stderr, "Incorrect top crop size\n");
2762 if ((frame_topBand) >= frame_height){
2763 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2766 fprintf(stderr, "-crop* is deprecated in favor of the crop avfilter\n");
2767 frame_height -= frame_topBand;
2770 static void opt_frame_crop_bottom(const char *arg)
2772 frame_bottomBand = atoi(arg);
2773 if (frame_bottomBand < 0) {
2774 fprintf(stderr, "Incorrect bottom crop size\n");
2777 if ((frame_bottomBand) >= frame_height){
2778 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2781 fprintf(stderr, "-crop* is deprecated in favor of the crop avfilter\n");
2782 frame_height -= frame_bottomBand;
2785 static void opt_frame_crop_left(const char *arg)
2787 frame_leftBand = atoi(arg);
2788 if (frame_leftBand < 0) {
2789 fprintf(stderr, "Incorrect left crop size\n");
2792 if ((frame_leftBand) >= frame_width){
2793 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2796 fprintf(stderr, "-crop* is deprecated in favor of the crop avfilter\n");
2797 frame_width -= frame_leftBand;
2800 static void opt_frame_crop_right(const char *arg)
2802 frame_rightBand = atoi(arg);
2803 if (frame_rightBand < 0) {
2804 fprintf(stderr, "Incorrect right crop size\n");
2807 if ((frame_rightBand) >= frame_width){
2808 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2811 fprintf(stderr, "-crop* is deprecated in favor of the crop avfilter\n");
2812 frame_width -= frame_rightBand;
2815 static void opt_frame_size(const char *arg)
2817 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2818 fprintf(stderr, "Incorrect frame size\n");
2823 static int opt_pad(const char *opt, const char *arg) {
2824 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2828 static void opt_frame_pix_fmt(const char *arg)
2830 if (strcmp(arg, "list")) {
2831 frame_pix_fmt = av_get_pix_fmt(arg);
2832 if (frame_pix_fmt == PIX_FMT_NONE) {
2833 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2842 static void opt_frame_aspect_ratio(const char *arg)
2849 p = strchr(arg, ':');
2851 x = strtol(arg, &end, 10);
2853 y = strtol(end+1, &end, 10);
2855 ar = (double)x / (double)y;
2857 ar = strtod(arg, NULL);
2860 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2863 frame_aspect_ratio = ar;
2866 static int opt_metadata(const char *opt, const char *arg)
2868 char *mid= strchr(arg, '=');
2871 fprintf(stderr, "Missing =\n");
2877 metadata= av_realloc(metadata, sizeof(*metadata)*metadata_count);
2878 metadata[metadata_count-1].key = av_strdup(arg);
2879 metadata[metadata_count-1].value= av_strdup(mid);
2884 static void opt_qscale(const char *arg)
2886 video_qscale = atof(arg);
2887 if (video_qscale <= 0 ||
2888 video_qscale > 255) {
2889 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2894 static void opt_top_field_first(const char *arg)
2896 top_field_first= atoi(arg);
2899 static int opt_thread_count(const char *opt, const char *arg)
2901 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2904 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2909 static void opt_audio_sample_fmt(const char *arg)
2911 if (strcmp(arg, "list"))
2912 audio_sample_fmt = avcodec_get_sample_fmt(arg);
2914 list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
2919 static int opt_audio_rate(const char *opt, const char *arg)
2921 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2925 static int opt_audio_channels(const char *opt, const char *arg)
2927 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2931 static void opt_video_channel(const char *arg)
2933 video_channel = strtol(arg, NULL, 0);
2936 static void opt_video_standard(const char *arg)
2938 video_standard = av_strdup(arg);
2941 static void opt_codec(int *pstream_copy, char **pcodec_name,
2942 int codec_type, const char *arg)
2944 av_freep(pcodec_name);
2945 if (!strcmp(arg, "copy")) {
2948 *pcodec_name = av_strdup(arg);
2952 static void opt_audio_codec(const char *arg)
2954 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2957 static void opt_audio_tag(const char *arg)
2960 audio_codec_tag= strtol(arg, &tail, 0);
2963 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2966 static void opt_video_tag(const char *arg)
2969 video_codec_tag= strtol(arg, &tail, 0);
2972 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2975 static void opt_video_codec(const char *arg)
2977 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2980 static void opt_subtitle_codec(const char *arg)
2982 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2985 static void opt_subtitle_tag(const char *arg)
2988 subtitle_codec_tag= strtol(arg, &tail, 0);
2991 subtitle_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2994 static void opt_map(const char *arg)
2999 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
3000 m = &stream_maps[nb_stream_maps-1];
3002 m->file_index = strtol(arg, &p, 0);
3006 m->stream_index = strtol(p, &p, 0);
3009 m->sync_file_index = strtol(p, &p, 0);
3012 m->sync_stream_index = strtol(p, &p, 0);
3014 m->sync_file_index = m->file_index;
3015 m->sync_stream_index = m->stream_index;
3019 static void opt_map_meta_data(const char *arg)
3024 m = &meta_data_maps[nb_meta_data_maps++];
3026 m->out_file = strtol(arg, &p, 0);
3030 m->in_file = strtol(p, &p, 0);
3033 static void opt_input_ts_scale(const char *arg)
3035 unsigned int stream;
3039 stream = strtol(arg, &p, 0);
3042 scale= strtod(p, &p);
3044 if(stream >= MAX_STREAMS)
3047 input_files_ts_scale[nb_input_files] = grow_array(input_files_ts_scale[nb_input_files], sizeof(*input_files_ts_scale[nb_input_files]), &nb_input_files_ts_scale[nb_input_files], stream + 1);
3048 input_files_ts_scale[nb_input_files][stream]= scale;
3051 static int opt_recording_time(const char *opt, const char *arg)
3053 recording_time = parse_time_or_die(opt, arg, 1);
3057 static int opt_start_time(const char *opt, const char *arg)
3059 start_time = parse_time_or_die(opt, arg, 1);
3063 static int opt_recording_timestamp(const char *opt, const char *arg)
3065 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3069 static int opt_input_ts_offset(const char *opt, const char *arg)
3071 input_ts_offset = parse_time_or_die(opt, arg, 1);
3075 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3077 const char *codec_string = encoder ? "encoder" : "decoder";
3081 return CODEC_ID_NONE;
3083 avcodec_find_encoder_by_name(name) :
3084 avcodec_find_decoder_by_name(name);
3086 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3089 if(codec->type != type) {
3090 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3093 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3094 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3095 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3096 "results.\nAdd '-strict experimental' if you want to use it.\n",
3097 codec_string, codec->name);
3099 avcodec_find_encoder(codec->id) :
3100 avcodec_find_decoder(codec->id);
3101 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3102 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3103 codec_string, codec->name);
3109 static void opt_input_file(const char *filename)
3111 AVFormatContext *ic;
3112 AVFormatParameters params, *ap = ¶ms;
3113 AVInputFormat *file_iformat = NULL;
3114 int err, i, ret, rfps, rfps_base;
3117 if (last_asked_format) {
3118 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3119 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3122 last_asked_format = NULL;
3125 if (!strcmp(filename, "-"))
3128 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3129 !strcmp(filename, "/dev/stdin");
3131 /* get default parameters from command line */
3132 ic = avformat_alloc_context();
3134 print_error(filename, AVERROR(ENOMEM));
3138 memset(ap, 0, sizeof(*ap));
3139 ap->prealloced_context = 1;
3140 ap->sample_rate = audio_sample_rate;
3141 ap->channels = audio_channels;
3142 ap->time_base.den = frame_rate.num;
3143 ap->time_base.num = frame_rate.den;
3144 ap->width = frame_width;
3145 ap->height = frame_height;
3146 ap->pix_fmt = frame_pix_fmt;
3147 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3148 ap->channel = video_channel;
3149 ap->standard = video_standard;
3151 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3153 ic->video_codec_id =
3154 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3155 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3156 ic->audio_codec_id =
3157 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3158 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3159 ic->subtitle_codec_id=
3160 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3161 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3162 ic->flags |= AVFMT_FLAG_NONBLOCK;
3164 if(pgmyuv_compatibility_hack)
3165 ic->video_codec_id= CODEC_ID_PGMYUV;
3167 /* open the input file with generic libav function */
3168 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3170 print_error(filename, err);
3176 for(i=0; i<ic->nb_streams; i++){
3177 ic->streams[i]->discard= AVDISCARD_ALL;
3179 for(i=0; i<ic->nb_programs; i++){
3180 AVProgram *p= ic->programs[i];
3181 if(p->id != opt_programid){
3182 p->discard = AVDISCARD_ALL;
3185 for(j=0; j<p->nb_stream_indexes; j++){
3186 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3191 fprintf(stderr, "Specified program id not found\n");
3197 ic->loop_input = loop_input;
3199 /* If not enough info to get the stream parameters, we decode the
3200 first frames to get it. (used in mpeg case for example) */
3201 ret = av_find_stream_info(ic);
3202 if (ret < 0 && verbose >= 0) {
3203 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3204 av_close_input_file(ic);
3208 timestamp = start_time;
3209 /* add the stream start time */
3210 if (ic->start_time != AV_NOPTS_VALUE)
3211 timestamp += ic->start_time;
3213 /* if seeking requested, we execute it */
3214 if (start_time != 0) {
3215 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3217 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3218 filename, (double)timestamp / AV_TIME_BASE);
3220 /* reset seek info */
3224 /* update the current parameters so that they match the one of the input stream */
3225 for(i=0;i<ic->nb_streams;i++) {
3226 AVStream *st = ic->streams[i];
3227 AVCodecContext *dec = st->codec;
3228 avcodec_thread_init(dec, thread_count);
3229 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3230 switch (dec->codec_type) {
3231 case AVMEDIA_TYPE_AUDIO:
3232 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3233 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM, input_codecs[nb_input_codecs-1]);
3234 //fprintf(stderr, "\nInput Audio channels: %d", dec->channels);
3235 channel_layout = dec->channel_layout;
3236 audio_channels = dec->channels;
3237 audio_sample_rate = dec->sample_rate;
3238 audio_sample_fmt = dec->sample_fmt;
3240 st->discard= AVDISCARD_ALL;
3241 /* Note that av_find_stream_info can add more streams, and we
3242 * currently have no chance of setting up lowres decoding
3243 * early enough for them. */
3245 audio_sample_rate >>= dec->lowres;
3247 case AVMEDIA_TYPE_VIDEO:
3248 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3249 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM, input_codecs[nb_input_codecs-1]);
3250 frame_height = dec->height;
3251 frame_width = dec->width;
3252 if(ic->streams[i]->sample_aspect_ratio.num)
3253 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3255 frame_aspect_ratio=av_q2d(dec->sample_aspect_ratio);
3256 frame_aspect_ratio *= (float) dec->width / dec->height;
3257 frame_pix_fmt = dec->pix_fmt;
3258 rfps = ic->streams[i]->r_frame_rate.num;
3259 rfps_base = ic->streams[i]->r_frame_rate.den;
3261 dec->flags |= CODEC_FLAG_EMU_EDGE;
3262 frame_height >>= dec->lowres;
3263 frame_width >>= dec->lowres;
3266 dec->debug |= FF_DEBUG_MV;
3268 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3271 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3272 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3274 (float)rfps / rfps_base, rfps, rfps_base);
3276 /* update the current frame rate to match the stream frame rate */
3277 frame_rate.num = rfps;
3278 frame_rate.den = rfps_base;
3281 st->discard= AVDISCARD_ALL;
3282 else if(video_discard)
3283 st->discard= video_discard;
3285 case AVMEDIA_TYPE_DATA:
3287 case AVMEDIA_TYPE_SUBTITLE:
3288 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3289 if(subtitle_disable)
3290 st->discard = AVDISCARD_ALL;
3292 case AVMEDIA_TYPE_ATTACHMENT:
3293 case AVMEDIA_TYPE_UNKNOWN:
3300 input_files[nb_input_files] = ic;
3301 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3302 /* dump the file content */
3304 dump_format(ic, nb_input_files, filename, 0);
3310 av_freep(&video_codec_name);
3311 av_freep(&audio_codec_name);
3312 av_freep(&subtitle_codec_name);
3315 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3316 int *has_subtitle_ptr)
3318 int has_video, has_audio, has_subtitle, i, j;
3319 AVFormatContext *ic;
3324 for(j=0;j<nb_input_files;j++) {
3325 ic = input_files[j];
3326 for(i=0;i<ic->nb_streams;i++) {
3327 AVCodecContext *enc = ic->streams[i]->codec;
3328 switch(enc->codec_type) {
3329 case AVMEDIA_TYPE_AUDIO:
3332 case AVMEDIA_TYPE_VIDEO:
3335 case AVMEDIA_TYPE_SUBTITLE:
3338 case AVMEDIA_TYPE_DATA:
3339 case AVMEDIA_TYPE_ATTACHMENT:
3340 case AVMEDIA_TYPE_UNKNOWN:
3347 *has_video_ptr = has_video;
3348 *has_audio_ptr = has_audio;
3349 *has_subtitle_ptr = has_subtitle;
3352 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
3354 int idx = oc->nb_streams - 1;
3355 AVOutputStream *ost;
3357 output_streams_for_file[file_idx] =
3358 grow_array(output_streams_for_file[file_idx],
3359 sizeof(*output_streams_for_file[file_idx]),
3360 &nb_output_streams_for_file[file_idx],
3362 ost = output_streams_for_file[file_idx][idx] =
3363 av_mallocz(sizeof(AVOutputStream));
3365 fprintf(stderr, "Could not alloc output stream\n");
3368 ost->file_index = file_idx;
3373 static void new_video_stream(AVFormatContext *oc, int file_idx)
3376 AVOutputStream *ost;
3377 AVCodecContext *video_enc;
3378 enum CodecID codec_id;
3379 AVCodec *codec= NULL;
3381 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3383 fprintf(stderr, "Could not alloc stream\n");
3386 ost = new_output_stream(oc, file_idx);
3388 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3389 if(!video_stream_copy){
3390 if (video_codec_name) {
3391 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3392 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3393 codec = avcodec_find_encoder_by_name(video_codec_name);
3394 output_codecs[nb_output_codecs-1] = codec;
3396 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3397 codec = avcodec_find_encoder(codec_id);
3401 avcodec_get_context_defaults3(st->codec, codec);
3402 ost->bitstream_filters = video_bitstream_filters;
3403 video_bitstream_filters= NULL;
3405 avcodec_thread_init(st->codec, thread_count);
3407 video_enc = st->codec;
3410 video_enc->codec_tag= video_codec_tag;
3412 if( (video_global_header&1)
3413 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3414 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3415 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3417 if(video_global_header&2){
3418 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3419 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3422 if (video_stream_copy) {
3423 st->stream_copy = 1;
3424 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3425 video_enc->sample_aspect_ratio =
3426 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3430 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3432 video_enc->codec_id = codec_id;
3433 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3435 if (codec && codec->supported_framerates && !force_fps)
3436 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3437 video_enc->time_base.den = fps.num;
3438 video_enc->time_base.num = fps.den;
3440 video_enc->width = frame_width;
3441 video_enc->height = frame_height;
3442 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3443 video_enc->pix_fmt = frame_pix_fmt;
3444 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3446 choose_pixel_fmt(st, codec);
3449 video_enc->gop_size = 0;
3450 if (video_qscale || same_quality) {
3451 video_enc->flags |= CODEC_FLAG_QSCALE;
3452 video_enc->global_quality=
3453 st->quality = FF_QP2LAMBDA * video_qscale;
3457 video_enc->intra_matrix = intra_matrix;
3459 video_enc->inter_matrix = inter_matrix;
3461 p= video_rc_override_string;
3464 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3466 fprintf(stderr, "error parsing rc_override\n");
3469 video_enc->rc_override=
3470 av_realloc(video_enc->rc_override,
3471 sizeof(RcOverride)*(i+1));
3472 video_enc->rc_override[i].start_frame= start;
3473 video_enc->rc_override[i].end_frame = end;
3475 video_enc->rc_override[i].qscale= q;
3476 video_enc->rc_override[i].quality_factor= 1.0;
3479 video_enc->rc_override[i].qscale= 0;
3480 video_enc->rc_override[i].quality_factor= -q/100.0;
3485 video_enc->rc_override_count=i;
3486 if (!video_enc->rc_initial_buffer_occupancy)
3487 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3488 video_enc->me_threshold= me_threshold;
3489 video_enc->intra_dc_precision= intra_dc_precision - 8;
3492 video_enc->flags|= CODEC_FLAG_PSNR;
3497 video_enc->flags |= CODEC_FLAG_PASS1;
3499 video_enc->flags |= CODEC_FLAG_PASS2;
3503 if (video_language) {
3504 av_metadata_set2(&st->metadata, "language", video_language, 0);
3505 av_freep(&video_language);
3508 /* reset some key parameters */
3510 av_freep(&video_codec_name);
3511 video_stream_copy = 0;
3512 frame_pix_fmt = PIX_FMT_NONE;
3515 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3518 AVOutputStream *ost;
3519 AVCodec *codec= NULL;
3520 AVCodecContext *audio_enc;
3521 enum CodecID codec_id;
3523 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3525 fprintf(stderr, "Could not alloc stream\n");
3528 ost = new_output_stream(oc, file_idx);
3530 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3531 if(!audio_stream_copy){
3532 if (audio_codec_name) {
3533 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3534 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3535 codec = avcodec_find_encoder_by_name(audio_codec_name);
3536 output_codecs[nb_output_codecs-1] = codec;
3538 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3539 codec = avcodec_find_encoder(codec_id);
3543 avcodec_get_context_defaults3(st->codec, codec);
3545 ost->bitstream_filters = audio_bitstream_filters;
3546 audio_bitstream_filters= NULL;
3548 avcodec_thread_init(st->codec, thread_count);
3550 audio_enc = st->codec;
3551 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3554 audio_enc->codec_tag= audio_codec_tag;
3556 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3557 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3558 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3560 if (audio_stream_copy) {
3561 st->stream_copy = 1;
3562 audio_enc->channels = audio_channels;
3563 audio_enc->sample_rate = audio_sample_rate;
3565 audio_enc->codec_id = codec_id;
3566 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3568 if (audio_qscale > QSCALE_NONE) {
3569 audio_enc->flags |= CODEC_FLAG_QSCALE;
3570 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3572 audio_enc->channels = audio_channels;
3573 audio_enc->sample_fmt = audio_sample_fmt;
3574 audio_enc->sample_rate = audio_sample_rate;
3575 audio_enc->channel_layout = channel_layout;
3576 if (avcodec_channel_layout_num_channels(channel_layout) != audio_channels)
3577 audio_enc->channel_layout = 0;
3578 choose_sample_fmt(st, codec);
3579 choose_sample_rate(st, codec);
3581 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3582 if (audio_language) {
3583 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3584 av_freep(&audio_language);
3587 /* reset some key parameters */
3589 av_freep(&audio_codec_name);
3590 audio_stream_copy = 0;
3593 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3596 AVOutputStream *ost;
3597 AVCodec *codec=NULL;
3598 AVCodecContext *subtitle_enc;
3600 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3602 fprintf(stderr, "Could not alloc stream\n");
3605 ost = new_output_stream(oc, file_idx);
3606 subtitle_enc = st->codec;
3607 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3608 if(!subtitle_stream_copy){
3609 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3610 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3611 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3613 avcodec_get_context_defaults3(st->codec, codec);
3615 ost->bitstream_filters = subtitle_bitstream_filters;
3616 subtitle_bitstream_filters= NULL;
3618 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3620 if(subtitle_codec_tag)
3621 subtitle_enc->codec_tag= subtitle_codec_tag;
3623 if (subtitle_stream_copy) {
3624 st->stream_copy = 1;
3626 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3629 if (subtitle_language) {
3630 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3631 av_freep(&subtitle_language);
3634 subtitle_disable = 0;
3635 av_freep(&subtitle_codec_name);
3636 subtitle_stream_copy = 0;
3639 static int opt_new_stream(const char *opt, const char *arg)
3641 AVFormatContext *oc;
3642 int file_idx = nb_output_files - 1;
3643 if (nb_output_files <= 0) {
3644 fprintf(stderr, "At least one output file must be specified\n");
3647 oc = output_files[file_idx];
3649 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3650 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3651 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3656 /* arg format is "output-stream-index:streamid-value". */
3657 static int opt_streamid(const char *opt, const char *arg)
3663 strncpy(idx_str, arg, sizeof(idx_str));
3664 idx_str[sizeof(idx_str)-1] = '\0';
3665 p = strchr(idx_str, ':');
3668 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3673 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3674 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3675 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3679 static void opt_output_file(const char *filename)
3681 AVFormatContext *oc;
3682 int err, use_video, use_audio, use_subtitle;
3683 int input_has_video, input_has_audio, input_has_subtitle;
3684 AVFormatParameters params, *ap = ¶ms;
3685 AVOutputFormat *file_oformat;
3687 if (!strcmp(filename, "-"))
3690 oc = avformat_alloc_context();
3692 print_error(filename, AVERROR(ENOMEM));
3696 if (last_asked_format) {
3697 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3698 if (!file_oformat) {
3699 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3702 last_asked_format = NULL;
3704 file_oformat = av_guess_format(NULL, filename, NULL);
3705 if (!file_oformat) {
3706 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3712 oc->oformat = file_oformat;
3713 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3715 if (!strcmp(file_oformat->name, "ffm") &&
3716 av_strstart(filename, "http:", NULL)) {
3717 /* special case for files sent to ffserver: we get the stream
3718 parameters from ffserver */
3719 int err = read_ffserver_streams(oc, filename);
3721 print_error(filename, err);
3725 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3726 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3727 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3729 /* disable if no corresponding type found and at least one
3731 if (nb_input_files > 0) {
3732 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3733 &input_has_subtitle);
3734 if (!input_has_video)
3736 if (!input_has_audio)
3738 if (!input_has_subtitle)
3742 /* manual disable */
3743 if (audio_disable) {
3746 if (video_disable) {
3749 if (subtitle_disable) {
3754 new_video_stream(oc, nb_output_files);
3758 new_audio_stream(oc, nb_output_files);
3762 new_subtitle_stream(oc, nb_output_files);
3765 oc->timestamp = recording_timestamp;
3767 for(; metadata_count>0; metadata_count--){
3768 av_metadata_set2(&oc->metadata, metadata[metadata_count-1].key,
3769 metadata[metadata_count-1].value, 0);
3771 av_metadata_conv(oc, oc->oformat->metadata_conv, NULL);
3774 output_files[nb_output_files++] = oc;
3776 /* check filename in case of an image number is expected */
3777 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3778 if (!av_filename_number_test(oc->filename)) {
3779 print_error(oc->filename, AVERROR_NUMEXPECTED);
3784 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3785 /* test if it already exists to avoid loosing precious files */
3786 if (!file_overwrite &&
3787 (strchr(filename, ':') == NULL ||
3788 filename[1] == ':' ||
3789 av_strstart(filename, "file:", NULL))) {
3790 if (url_exist(filename)) {
3792 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3794 if (!read_yesno()) {
3795 fprintf(stderr, "Not overwriting - exiting\n");
3800 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3807 if ((err = url_fopen(&oc->pb, filename, URL_WRONLY)) < 0) {
3808 print_error(filename, err);
3813 memset(ap, 0, sizeof(*ap));
3814 if (av_set_parameters(oc, ap) < 0) {
3815 fprintf(stderr, "%s: Invalid encoding parameters\n",
3820 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3821 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3822 oc->loop_output = loop_output;
3823 oc->flags |= AVFMT_FLAG_NONBLOCK;
3825 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3827 nb_streamid_map = 0;
3830 /* same option as mencoder */
3831 static void opt_pass(const char *pass_str)
3834 pass = atoi(pass_str);
3835 if (pass != 1 && pass != 2) {
3836 fprintf(stderr, "pass number can be only 1 or 2\n");
3842 static int64_t getutime(void)
3845 struct rusage rusage;
3847 getrusage(RUSAGE_SELF, &rusage);
3848 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3849 #elif HAVE_GETPROCESSTIMES
3851 FILETIME c, e, k, u;
3852 proc = GetCurrentProcess();
3853 GetProcessTimes(proc, &c, &e, &k, &u);
3854 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3856 return av_gettime();
3860 static int64_t getmaxrss(void)
3862 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3863 struct rusage rusage;
3864 getrusage(RUSAGE_SELF, &rusage);
3865 return (int64_t)rusage.ru_maxrss * 1024;
3866 #elif HAVE_GETPROCESSMEMORYINFO
3868 PROCESS_MEMORY_COUNTERS memcounters;
3869 proc = GetCurrentProcess();
3870 memcounters.cb = sizeof(memcounters);
3871 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3872 return memcounters.PeakPagefileUsage;
3878 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3881 const char *p = str;
3888 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3895 static void opt_inter_matrix(const char *arg)
3897 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3898 parse_matrix_coeffs(inter_matrix, arg);
3901 static void opt_intra_matrix(const char *arg)
3903 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3904 parse_matrix_coeffs(intra_matrix, arg);
3907 static void show_usage(void)
3909 printf("Hyper fast Audio and Video encoder\n");
3910 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3914 static void show_help(void)
3916 av_log_set_callback(log_callback_help);
3918 show_help_options(options, "Main options:\n",
3919 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3920 show_help_options(options, "\nAdvanced options:\n",
3921 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3923 show_help_options(options, "\nVideo options:\n",
3924 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3926 show_help_options(options, "\nAdvanced Video options:\n",
3927 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3928 OPT_VIDEO | OPT_EXPERT);
3929 show_help_options(options, "\nAudio options:\n",
3930 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3932 show_help_options(options, "\nAdvanced Audio options:\n",
3933 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3934 OPT_AUDIO | OPT_EXPERT);
3935 show_help_options(options, "\nSubtitle options:\n",
3936 OPT_SUBTITLE | OPT_GRAB,
3938 show_help_options(options, "\nAudio/Video grab options:\n",
3942 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3944 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3946 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3949 static void opt_target(const char *arg)
3951 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3952 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3954 if(!strncmp(arg, "pal-", 4)) {
3957 } else if(!strncmp(arg, "ntsc-", 5)) {
3960 } else if(!strncmp(arg, "film-", 5)) {
3965 /* Calculate FR via float to avoid int overflow */
3966 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3969 } else if((fr == 29970) || (fr == 23976)) {
3972 /* Try to determine PAL/NTSC by peeking in the input files */
3973 if(nb_input_files) {
3975 for(j = 0; j < nb_input_files; j++) {
3976 for(i = 0; i < input_files[j]->nb_streams; i++) {
3977 AVCodecContext *c = input_files[j]->streams[i]->codec;
3978 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3980 fr = c->time_base.den * 1000 / c->time_base.num;
3984 } else if((fr == 29970) || (fr == 23976)) {
3994 if(verbose && norm != UNKNOWN)
3995 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3998 if(norm == UNKNOWN) {
3999 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4000 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4001 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4005 if(!strcmp(arg, "vcd")) {
4007 opt_video_codec("mpeg1video");
4008 opt_audio_codec("mp2");
4011 opt_frame_size(norm == PAL ? "352x288" : "352x240");
4012 opt_frame_rate(NULL, frame_rates[norm]);
4013 opt_default("g", norm == PAL ? "15" : "18");
4015 opt_default("b", "1150000");
4016 opt_default("maxrate", "1150000");
4017 opt_default("minrate", "1150000");
4018 opt_default("bufsize", "327680"); // 40*1024*8;
4020 opt_default("ab", "224000");
4021 audio_sample_rate = 44100;
4024 opt_default("packetsize", "2324");
4025 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4027 /* We have to offset the PTS, so that it is consistent with the SCR.
4028 SCR starts at 36000, but the first two packs contain only padding
4029 and the first pack from the other stream, respectively, may also have
4030 been written before.
4031 So the real data starts at SCR 36000+3*1200. */
4032 mux_preload= (36000+3*1200) / 90000.0; //0.44
4033 } else if(!strcmp(arg, "svcd")) {
4035 opt_video_codec("mpeg2video");
4036 opt_audio_codec("mp2");
4039 opt_frame_size(norm == PAL ? "480x576" : "480x480");
4040 opt_frame_rate(NULL, frame_rates[norm]);
4041 opt_default("g", norm == PAL ? "15" : "18");
4043 opt_default("b", "2040000");
4044 opt_default("maxrate", "2516000");
4045 opt_default("minrate", "0"); //1145000;
4046 opt_default("bufsize", "1835008"); //224*1024*8;
4047 opt_default("flags", "+scan_offset");
4050 opt_default("ab", "224000");
4051 audio_sample_rate = 44100;
4053 opt_default("packetsize", "2324");
4055 } else if(!strcmp(arg, "dvd")) {
4057 opt_video_codec("mpeg2video");
4058 opt_audio_codec("ac3");
4061 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4062 opt_frame_rate(NULL, frame_rates[norm]);
4063 opt_default("g", norm == PAL ? "15" : "18");
4065 opt_default("b", "6000000");
4066 opt_default("maxrate", "9000000");
4067 opt_default("minrate", "0"); //1500000;
4068 opt_default("bufsize", "1835008"); //224*1024*8;
4070 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4071 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4073 opt_default("ab", "448000");
4074 audio_sample_rate = 48000;
4076 } else if(!strncmp(arg, "dv", 2)) {
4080 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4081 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4082 (norm == PAL ? "yuv420p" : "yuv411p"));
4083 opt_frame_rate(NULL, frame_rates[norm]);
4085 audio_sample_rate = 48000;
4089 fprintf(stderr, "Unknown target: %s\n", arg);
4094 static void opt_vstats_file (const char *arg)
4096 av_free (vstats_filename);
4097 vstats_filename=av_strdup (arg);
4100 static void opt_vstats (void)
4103 time_t today2 = time(NULL);
4104 struct tm *today = localtime(&today2);
4106 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4108 opt_vstats_file(filename);
4111 static int opt_bsf(const char *opt, const char *arg)
4113 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4114 AVBitStreamFilterContext **bsfp;
4117 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4121 bsfp= *opt == 'v' ? &video_bitstream_filters :
4122 *opt == 'a' ? &audio_bitstream_filters :
4123 &subtitle_bitstream_filters;
4125 bsfp= &(*bsfp)->next;
4132 static int opt_preset(const char *opt, const char *arg)
4135 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4137 const char *base[3]= { getenv("FFMPEG_DATADIR"),
4143 for(i=0; i<3 && !f; i++){
4146 snprintf(filename, sizeof(filename), "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", arg);
4147 f= fopen(filename, "r");
4149 char *codec_name= *opt == 'v' ? video_codec_name :
4150 *opt == 'a' ? audio_codec_name :
4151 subtitle_codec_name;
4152 snprintf(filename, sizeof(filename), "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", codec_name, arg);
4153 f= fopen(filename, "r");
4157 av_strlcpy(filename, arg, sizeof(filename));
4158 f= fopen(filename, "r");
4162 fprintf(stderr, "File for preset '%s' not found\n", arg);
4167 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4168 if(line[0] == '#' && !e)
4170 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4172 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4175 if(!strcmp(tmp, "acodec")){
4176 opt_audio_codec(tmp2);
4177 }else if(!strcmp(tmp, "vcodec")){
4178 opt_video_codec(tmp2);
4179 }else if(!strcmp(tmp, "scodec")){
4180 opt_subtitle_codec(tmp2);
4181 }else if(opt_default(tmp, tmp2) < 0){
4182 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4192 static const OptionDef options[] = {
4194 #include "cmdutils_common_opts.h"
4195 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4196 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4197 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4198 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
4199 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
4200 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4201 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4202 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4203 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4204 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4205 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4206 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4207 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4208 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4209 "add timings for benchmarking" },
4210 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4211 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4212 "dump each input packet" },
4213 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4214 "when dumping packets, also dump the payload" },
4215 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4216 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4217 { "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)", "" },
4218 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4219 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4220 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4221 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4222 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4223 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4224 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4225 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4226 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4227 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4228 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4229 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4230 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4233 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4234 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4235 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4236 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4237 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4238 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4239 { "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" },
4240 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "Deprecated, please use the crop avfilter", "size" },
4241 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "Deprecated, please use the crop avfilter", "size" },
4242 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "Deprecated, please use the crop avfilter", "size" },
4243 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "Deprecated, please use the crop avfilter", "size" },
4244 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4245 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4246 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4247 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4248 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4249 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4250 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4251 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4252 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4253 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4254 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4255 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4256 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4257 "use same video quality as source (implies VBR)" },
4258 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4259 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4260 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4261 "deinterlace pictures" },
4262 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4263 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4264 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4266 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4268 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4269 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4270 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4271 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4272 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4273 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4274 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4275 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4276 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4277 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4280 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4281 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4282 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4283 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4284 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4285 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4286 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4287 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4288 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4289 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4290 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4291 { "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" },
4293 /* subtitle options */
4294 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4295 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4296 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4297 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4298 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4301 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4302 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4303 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4306 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4307 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4309 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4310 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4311 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4313 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4314 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4315 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4316 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4318 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4322 int main(int argc, char **argv)
4326 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4328 avcodec_register_all();
4330 avdevice_register_all();
4333 avfilter_register_all();
4338 if(isatty(STDIN_FILENO))
4339 url_set_interrupt_cb(decode_interrupt_cb);
4347 parse_options(argc, argv, options, opt_output_file);
4349 if(nb_output_files <= 0 && nb_input_files == 0) {
4351 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4355 /* file converter / grab */
4356 if (nb_output_files <= 0) {
4357 fprintf(stderr, "At least one output file must be specified\n");
4361 if (nb_input_files == 0) {
4362 fprintf(stderr, "At least one input file must be specified\n");
4367 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4368 stream_maps, nb_stream_maps) < 0)
4370 ti = getutime() - ti;
4372 int maxrss = getmaxrss() / 1024;
4373 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4376 return ffmpeg_exit(0);