3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 /* needed for usleep() */
23 #define _XOPEN_SOURCE 600
34 #include "libavformat/avformat.h"
35 #include "libavdevice/avdevice.h"
36 #include "libswscale/swscale.h"
37 #include "libavcodec/opt.h"
38 #include "libavcodec/audioconvert.h"
39 #include "libavcodec/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/pixdesc.h"
42 #include "libavutil/avstring.h"
43 #include "libavutil/libm.h"
44 #include "libavformat/os_support.h"
46 #if HAVE_SYS_RESOURCE_H
47 #include <sys/types.h>
49 #include <sys/resource.h>
50 #elif HAVE_GETPROCESSTIMES
53 #if HAVE_GETPROCESSMEMORYINFO
59 #include <sys/select.h>
64 #include <sys/ioctl.h>
77 const char program_name[] = "FFmpeg";
78 const int program_birth_year = 2000;
80 /* select an input stream for an output stream */
81 typedef struct AVStreamMap {
85 int sync_stream_index;
88 /** select an input file for an output file */
89 typedef struct AVMetaDataMap {
94 static const OptionDef options[];
98 static const char *last_asked_format = NULL;
99 static AVFormatContext *input_files[MAX_FILES];
100 static int64_t input_files_ts_offset[MAX_FILES];
101 static double input_files_ts_scale[MAX_FILES][MAX_STREAMS];
102 static AVCodec *input_codecs[MAX_FILES*MAX_STREAMS];
103 static int nb_input_files = 0;
104 static int nb_icodecs;
106 static AVFormatContext *output_files[MAX_FILES];
107 static AVCodec *output_codecs[MAX_FILES*MAX_STREAMS];
108 static int nb_output_files = 0;
109 static int nb_ocodecs;
111 static AVStreamMap stream_maps[MAX_FILES*MAX_STREAMS];
112 static int nb_stream_maps;
114 static AVMetaDataMap meta_data_maps[MAX_FILES];
115 static int nb_meta_data_maps;
117 static int frame_width = 0;
118 static int frame_height = 0;
119 static float frame_aspect_ratio = 0;
120 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
121 static enum SampleFormat audio_sample_fmt = SAMPLE_FMT_NONE;
122 static int frame_padtop = 0;
123 static int frame_padbottom = 0;
124 static int frame_padleft = 0;
125 static int frame_padright = 0;
126 static int padcolor[3] = {16,128,128}; /* default to black */
127 static int frame_topBand = 0;
128 static int frame_bottomBand = 0;
129 static int frame_leftBand = 0;
130 static int frame_rightBand = 0;
131 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
132 static AVRational frame_rate;
133 static float video_qscale = 0;
134 static uint16_t *intra_matrix = NULL;
135 static uint16_t *inter_matrix = NULL;
136 static const char *video_rc_override_string=NULL;
137 static int video_disable = 0;
138 static int video_discard = 0;
139 static char *video_codec_name = NULL;
140 static int video_codec_tag = 0;
141 static char *video_language = NULL;
142 static int same_quality = 0;
143 static int do_deinterlace = 0;
144 static int top_field_first = -1;
145 static int me_threshold = 0;
146 static int intra_dc_precision = 8;
147 static int loop_input = 0;
148 static int loop_output = AVFMT_NOOUTPUTLOOP;
149 static int qp_hist = 0;
151 static int intra_only = 0;
152 static int audio_sample_rate = 44100;
153 static int64_t channel_layout = 0;
154 #define QSCALE_NONE -99999
155 static float audio_qscale = QSCALE_NONE;
156 static int audio_disable = 0;
157 static int audio_channels = 1;
158 static char *audio_codec_name = NULL;
159 static int audio_codec_tag = 0;
160 static char *audio_language = NULL;
162 static int subtitle_disable = 0;
163 static char *subtitle_codec_name = NULL;
164 static char *subtitle_language = NULL;
165 static int subtitle_codec_tag = 0;
167 static float mux_preload= 0.5;
168 static float mux_max_delay= 0.7;
170 static int64_t recording_time = INT64_MAX;
171 static int64_t start_time = 0;
172 static int64_t rec_timestamp = 0;
173 static int64_t input_ts_offset = 0;
174 static int file_overwrite = 0;
175 static int metadata_count;
176 static AVMetadataTag *metadata;
177 static int do_benchmark = 0;
178 static int do_hex_dump = 0;
179 static int do_pkt_dump = 0;
180 static int do_psnr = 0;
181 static int do_pass = 0;
182 static char *pass_logfilename_prefix = NULL;
183 static int audio_stream_copy = 0;
184 static int video_stream_copy = 0;
185 static int subtitle_stream_copy = 0;
186 static int video_sync_method= -1;
187 static int audio_sync_method= 0;
188 static float audio_drift_threshold= 0.1;
189 static int copy_ts= 0;
190 static int opt_shortest = 0;
191 static int video_global_header = 0;
192 static char *vstats_filename;
193 static FILE *vstats_file;
194 static int opt_programid = 0;
195 static int copy_initial_nonkeyframes = 0;
197 static int rate_emu = 0;
199 static int video_channel = 0;
200 static char *video_standard;
202 static int audio_volume = 256;
204 static int exit_on_error = 0;
205 static int using_stdin = 0;
206 static int verbose = 1;
207 static int thread_count= 1;
208 static int q_pressed = 0;
209 static int64_t video_size = 0;
210 static int64_t audio_size = 0;
211 static int64_t extra_size = 0;
212 static int nb_frames_dup = 0;
213 static int nb_frames_drop = 0;
214 static int input_sync;
215 static uint64_t limit_filesize = 0;
216 static int force_fps = 0;
218 static int pgmyuv_compatibility_hack=0;
219 static float dts_delta_threshold = 10;
221 static unsigned int sws_flags = SWS_BICUBIC;
223 static int64_t timer_start;
225 static uint8_t *audio_buf;
226 static uint8_t *audio_out;
227 unsigned int allocated_audio_out_size, allocated_audio_buf_size;
229 static short *samples;
231 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
232 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
233 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
234 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
236 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
238 struct AVInputStream;
240 typedef struct AVOutputStream {
241 int file_index; /* file index */
242 int index; /* stream index in the output file */
243 int source_index; /* AVInputStream index */
244 AVStream *st; /* stream in the output file */
245 int encoding_needed; /* true if encoding needed for this stream */
247 /* input pts and corresponding output pts
249 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
250 struct AVInputStream *sync_ist; /* input stream to sync against */
251 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
254 AVFrame pict_tmp; /* temporary image for resampling */
255 struct SwsContext *img_resample_ctx; /* for image resampling */
258 int resample_pix_fmt;
260 /* full frame size of first frame */
264 /* cropping area sizes */
271 /* cropping area of first frame */
272 int original_topBand;
273 int original_bottomBand;
274 int original_leftBand;
275 int original_rightBand;
277 /* padding area sizes */
286 ReSampleContext *resample; /* for audio resampling */
288 AVAudioConvert *reformat_ctx;
289 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
293 typedef struct AVInputStream {
297 int discard; /* true if stream data should be discarded */
298 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
299 int64_t sample_index; /* current sample */
301 int64_t start; /* time when read started */
302 int64_t next_pts; /* synthetic pts for cases where pkt.pts
304 int64_t pts; /* current pts */
305 int is_start; /* is 1 at the start and after a discontinuity */
306 int showed_multi_packet_warning;
307 int is_past_recording_time;
310 typedef struct AVInputFile {
311 int eof_reached; /* true if eof reached */
312 int ist_index; /* index of first stream in ist_table */
313 int buffer_size; /* current total buffer size */
314 int nb_streams; /* nb streams we are aware of */
319 /* init terminal so that we can grab keys */
320 static struct termios oldtty;
323 static void term_exit(void)
326 tcsetattr (0, TCSANOW, &oldtty);
330 static volatile int received_sigterm = 0;
333 sigterm_handler(int sig)
335 received_sigterm = sig;
339 static void term_init(void)
348 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
349 |INLCR|IGNCR|ICRNL|IXON);
350 tty.c_oflag |= OPOST;
351 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
352 tty.c_cflag &= ~(CSIZE|PARENB);
357 tcsetattr (0, TCSANOW, &tty);
358 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
361 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
362 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
364 signal(SIGXCPU, sigterm_handler);
367 #if CONFIG_BEOS_NETSERVER
368 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
372 /* read a key without blocking */
373 static int read_key(void)
378 #if !CONFIG_BEOS_NETSERVER
386 n = select(1, &rfds, NULL, NULL, &tv);
402 static int decode_interrupt_cb(void)
404 return q_pressed || (q_pressed = read_key() == 'q');
407 static int av_exit(int ret)
412 for(i=0;i<nb_output_files;i++) {
413 /* maybe av_close_output_file ??? */
414 AVFormatContext *s = output_files[i];
416 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
418 for(j=0;j<s->nb_streams;j++) {
419 av_metadata_free(&s->streams[j]->metadata);
420 av_free(s->streams[j]->codec);
421 av_free(s->streams[j]);
423 for(j=0;j<s->nb_programs;j++) {
424 av_metadata_free(&s->programs[j]->metadata);
426 for(j=0;j<s->nb_chapters;j++) {
427 av_metadata_free(&s->chapters[j]->metadata);
429 av_metadata_free(&s->metadata);
432 for(i=0;i<nb_input_files;i++)
433 av_close_input_file(input_files[i]);
435 av_free(intra_matrix);
436 av_free(inter_matrix);
440 av_free(vstats_filename);
444 av_free(video_codec_name);
445 av_free(audio_codec_name);
446 av_free(subtitle_codec_name);
448 av_free(video_standard);
450 #if CONFIG_POWERPC_PERF
451 void powerpc_display_perf_report(void);
452 powerpc_display_perf_report();
453 #endif /* CONFIG_POWERPC_PERF */
455 for (i=0;i<AVMEDIA_TYPE_NB;i++)
456 av_free(avcodec_opts[i]);
457 av_free(avformat_opts);
461 allocated_audio_buf_size= allocated_audio_out_size= 0;
464 if (received_sigterm) {
466 "Received signal %d: terminating.\n",
467 (int) received_sigterm);
471 exit(ret); /* not all OS-es handle main() return value */
475 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
477 if(codec && codec->sample_fmts){
478 const enum SampleFormat *p= codec->sample_fmts;
480 if(*p == st->codec->sample_fmt)
484 st->codec->sample_fmt = codec->sample_fmts[0];
488 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
490 if(codec && codec->pix_fmts){
491 const enum PixelFormat *p= codec->pix_fmts;
493 if(*p == st->codec->pix_fmt)
497 && !( st->codec->codec_id==CODEC_ID_MJPEG
498 && st->codec->strict_std_compliance <= FF_COMPLIANCE_INOFFICIAL
499 && ( st->codec->pix_fmt == PIX_FMT_YUV420P
500 || st->codec->pix_fmt == PIX_FMT_YUV422P)))
501 st->codec->pix_fmt = codec->pix_fmts[0];
505 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
511 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
514 /* copy stream format */
515 s->nb_streams = ic->nb_streams;
516 for(i=0;i<ic->nb_streams;i++) {
520 // FIXME: a more elegant solution is needed
521 st = av_mallocz(sizeof(AVStream));
522 memcpy(st, ic->streams[i], sizeof(AVStream));
523 st->codec = avcodec_alloc_context();
525 print_error(filename, AVERROR(ENOMEM));
528 avcodec_copy_context(st->codec, ic->streams[i]->codec);
531 codec = avcodec_find_encoder(st->codec->codec_id);
532 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
533 if (audio_stream_copy) {
536 choose_sample_fmt(st, codec);
537 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
538 if (video_stream_copy) {
541 choose_pixel_fmt(st, codec);
544 if(!st->codec->thread_count)
545 st->codec->thread_count = 1;
546 if(st->codec->thread_count>1)
547 avcodec_thread_init(st->codec, st->codec->thread_count);
549 if(st->codec->flags & CODEC_FLAG_BITEXACT)
554 s->timestamp = av_gettime();
556 av_close_input_file(ic);
561 get_sync_ipts(const AVOutputStream *ost)
563 const AVInputStream *ist = ost->sync_ist;
564 return (double)(ist->pts - start_time)/AV_TIME_BASE;
567 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
571 AVPacket new_pkt= *pkt;
572 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
573 &new_pkt.data, &new_pkt.size,
574 pkt->data, pkt->size,
575 pkt->flags & AV_PKT_FLAG_KEY);
578 new_pkt.destruct= av_destruct_packet;
580 fprintf(stderr, "%s failed for stream %d, codec %s",
581 bsfc->filter->name, pkt->stream_index,
582 avctx->codec ? avctx->codec->name : "copy");
592 ret= av_interleaved_write_frame(s, pkt);
594 print_error("av_interleaved_write_frame()", ret);
599 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
601 static void do_audio_out(AVFormatContext *s,
604 unsigned char *buf, int size)
607 int64_t audio_out_size, audio_buf_size;
608 int64_t allocated_for_size= size;
610 int size_out, frame_bytes, ret;
611 AVCodecContext *enc= ost->st->codec;
612 AVCodecContext *dec= ist->st->codec;
613 int osize= av_get_bits_per_sample_format(enc->sample_fmt)/8;
614 int isize= av_get_bits_per_sample_format(dec->sample_fmt)/8;
615 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
618 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
619 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
620 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
621 audio_buf_size*= osize*enc->channels;
623 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
624 if(coded_bps > 8*osize)
625 audio_out_size= audio_out_size * coded_bps / (8*osize);
626 audio_out_size += FF_MIN_BUFFER_SIZE;
628 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
629 fprintf(stderr, "Buffer sizes too large\n");
633 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
634 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
635 if (!audio_buf || !audio_out){
636 fprintf(stderr, "Out of memory in do_audio_out\n");
640 if (enc->channels != dec->channels)
641 ost->audio_resample = 1;
643 if (ost->audio_resample && !ost->resample) {
644 if (dec->sample_fmt != SAMPLE_FMT_S16)
645 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
646 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
647 enc->sample_rate, dec->sample_rate,
648 enc->sample_fmt, dec->sample_fmt,
650 if (!ost->resample) {
651 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
652 dec->channels, dec->sample_rate,
653 enc->channels, enc->sample_rate);
658 #define MAKE_SFMT_PAIR(a,b) ((a)+SAMPLE_FMT_NB*(b))
659 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
660 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
661 if (ost->reformat_ctx)
662 av_audio_convert_free(ost->reformat_ctx);
663 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
664 dec->sample_fmt, 1, NULL, 0);
665 if (!ost->reformat_ctx) {
666 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
667 avcodec_get_sample_fmt_name(dec->sample_fmt),
668 avcodec_get_sample_fmt_name(enc->sample_fmt));
671 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
674 if(audio_sync_method){
675 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
676 - av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2);
677 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
678 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
680 //FIXME resample delay
681 if(fabs(delta) > 50){
682 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
684 byte_delta= FFMAX(byte_delta, -size);
688 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
693 static uint8_t *input_tmp= NULL;
694 input_tmp= av_realloc(input_tmp, byte_delta + size);
696 if(byte_delta > allocated_for_size - size){
697 allocated_for_size= byte_delta + (int64_t)size;
702 memset(input_tmp, 0, byte_delta);
703 memcpy(input_tmp + byte_delta, buf, size);
707 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
709 }else if(audio_sync_method>1){
710 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
711 assert(ost->audio_resample);
713 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
714 // 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));
715 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
719 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
720 - av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
722 if (ost->audio_resample) {
724 size_out = audio_resample(ost->resample,
725 (short *)buftmp, (short *)buf,
726 size / (ist->st->codec->channels * isize));
727 size_out = size_out * enc->channels * osize;
733 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
734 const void *ibuf[6]= {buftmp};
735 void *obuf[6]= {audio_buf};
736 int istride[6]= {isize};
737 int ostride[6]= {osize};
738 int len= size_out/istride[0];
739 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
740 printf("av_audio_convert() failed\n");
746 size_out = len*osize;
749 /* now encode as many frames as possible */
750 if (enc->frame_size > 1) {
751 /* output resampled raw samples */
752 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
753 fprintf(stderr, "av_fifo_realloc2() failed\n");
756 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
758 frame_bytes = enc->frame_size * osize * enc->channels;
760 while (av_fifo_size(ost->fifo) >= frame_bytes) {
762 av_init_packet(&pkt);
764 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
766 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
768 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
771 fprintf(stderr, "Audio encoding failed\n");
775 pkt.stream_index= ost->index;
778 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
779 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
780 pkt.flags |= AV_PKT_FLAG_KEY;
781 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
783 ost->sync_opts += enc->frame_size;
787 av_init_packet(&pkt);
789 ost->sync_opts += size_out / (osize * enc->channels);
791 /* output a pcm frame */
792 /* determine the size of the coded buffer */
795 size_out = size_out*coded_bps/8;
797 if(size_out > audio_out_size){
798 fprintf(stderr, "Internal error, buffer size too small\n");
802 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
803 ret = avcodec_encode_audio(enc, audio_out, size_out,
806 fprintf(stderr, "Audio encoding failed\n");
810 pkt.stream_index= ost->index;
813 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
814 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
815 pkt.flags |= AV_PKT_FLAG_KEY;
816 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
820 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
824 AVPicture picture_tmp;
827 dec = ist->st->codec;
829 /* deinterlace : must be done before any resize */
830 if (do_deinterlace) {
833 /* create temporary picture */
834 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
835 buf = av_malloc(size);
839 picture2 = &picture_tmp;
840 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
842 if(avpicture_deinterlace(picture2, picture,
843 dec->pix_fmt, dec->width, dec->height) < 0) {
844 /* if error, do not deinterlace */
845 fprintf(stderr, "Deinterlacing failed\n");
854 if (picture != picture2)
855 *picture = *picture2;
859 /* we begin to correct av delay at this threshold */
860 #define AV_DELAY_MAX 0.100
862 static void do_subtitle_out(AVFormatContext *s,
868 static uint8_t *subtitle_out = NULL;
869 int subtitle_out_max_size = 1024 * 1024;
870 int subtitle_out_size, nb, i;
874 if (pts == AV_NOPTS_VALUE) {
875 fprintf(stderr, "Subtitle packets must have a pts\n");
881 enc = ost->st->codec;
884 subtitle_out = av_malloc(subtitle_out_max_size);
887 /* Note: DVB subtitle need one packet to draw them and one other
888 packet to clear them */
889 /* XXX: signal it in the codec context ? */
890 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
895 for(i = 0; i < nb; i++) {
896 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
897 // start_display_time is required to be 0
898 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
899 sub->end_display_time -= sub->start_display_time;
900 sub->start_display_time = 0;
901 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
902 subtitle_out_max_size, sub);
903 if (subtitle_out_size < 0) {
904 fprintf(stderr, "Subtitle encoding failed\n");
908 av_init_packet(&pkt);
909 pkt.stream_index = ost->index;
910 pkt.data = subtitle_out;
911 pkt.size = subtitle_out_size;
912 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
913 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
914 /* XXX: the pts correction is handled here. Maybe handling
915 it in the codec would be better */
917 pkt.pts += 90 * sub->start_display_time;
919 pkt.pts += 90 * sub->end_display_time;
921 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
925 static int bit_buffer_size= 1024*256;
926 static uint8_t *bit_buffer= NULL;
928 static void do_video_out(AVFormatContext *s,
934 int nb_frames, i, ret;
935 int64_t topBand, bottomBand, leftBand, rightBand;
936 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
937 AVFrame picture_crop_temp, picture_pad_temp;
938 AVCodecContext *enc, *dec;
941 avcodec_get_frame_defaults(&picture_crop_temp);
942 avcodec_get_frame_defaults(&picture_pad_temp);
944 enc = ost->st->codec;
945 dec = ist->st->codec;
947 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
949 /* by default, we output a single frame */
954 if(video_sync_method){
955 double vdelta = sync_ipts - ost->sync_opts;
956 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
959 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
963 ost->sync_opts= lrintf(sync_ipts);
964 }else if (vdelta > 1.1)
965 nb_frames = lrintf(vdelta);
966 //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);
970 fprintf(stderr, "*** drop!\n");
971 }else if (nb_frames > 1) {
972 nb_frames_dup += nb_frames - 1;
974 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
977 ost->sync_opts= lrintf(sync_ipts);
979 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
983 if (ost->video_crop) {
984 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
985 fprintf(stderr, "error cropping picture\n");
990 formatted_picture = &picture_crop_temp;
992 formatted_picture = in_picture;
995 final_picture = formatted_picture;
996 padding_src = formatted_picture;
997 resampling_dst = &ost->pict_tmp;
998 if (ost->video_pad) {
999 final_picture = &ost->pict_tmp;
1000 if (ost->video_resample) {
1001 if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
1002 fprintf(stderr, "error padding picture\n");
1007 resampling_dst = &picture_pad_temp;
1011 if( (ost->resample_height != (ist->st->codec->height - (ost->topBand + ost->bottomBand)))
1012 || (ost->resample_width != (ist->st->codec->width - (ost->leftBand + ost->rightBand)))
1013 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1015 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));
1016 if(!ost->video_resample)
1020 if (ost->video_resample) {
1022 final_picture = &ost->pict_tmp;
1023 if( (ost->resample_height != (ist->st->codec->height - (ost->topBand + ost->bottomBand)))
1024 || (ost->resample_width != (ist->st->codec->width - (ost->leftBand + ost->rightBand)))
1025 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1027 /* keep bands proportional to the frame size */
1028 topBand = ((int64_t)ist->st->codec->height * ost->original_topBand / ost->original_height) & ~1;
1029 bottomBand = ((int64_t)ist->st->codec->height * ost->original_bottomBand / ost->original_height) & ~1;
1030 leftBand = ((int64_t)ist->st->codec->width * ost->original_leftBand / ost->original_width) & ~1;
1031 rightBand = ((int64_t)ist->st->codec->width * ost->original_rightBand / ost->original_width) & ~1;
1033 /* sanity check to ensure no bad band sizes sneak in */
1034 assert(topBand <= INT_MAX && topBand >= 0);
1035 assert(bottomBand <= INT_MAX && bottomBand >= 0);
1036 assert(leftBand <= INT_MAX && leftBand >= 0);
1037 assert(rightBand <= INT_MAX && rightBand >= 0);
1039 ost->topBand = topBand;
1040 ost->bottomBand = bottomBand;
1041 ost->leftBand = leftBand;
1042 ost->rightBand = rightBand;
1044 ost->resample_height = ist->st->codec->height - (ost->topBand + ost->bottomBand);
1045 ost->resample_width = ist->st->codec->width - (ost->leftBand + ost->rightBand);
1046 ost->resample_pix_fmt= ist->st->codec->pix_fmt;
1048 /* initialize a new scaler context */
1049 sws_freeContext(ost->img_resample_ctx);
1050 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1051 ost->img_resample_ctx = sws_getContext(
1052 ist->st->codec->width - (ost->leftBand + ost->rightBand),
1053 ist->st->codec->height - (ost->topBand + ost->bottomBand),
1054 ist->st->codec->pix_fmt,
1055 ost->st->codec->width - (ost->padleft + ost->padright),
1056 ost->st->codec->height - (ost->padtop + ost->padbottom),
1057 ost->st->codec->pix_fmt,
1058 sws_flags, NULL, NULL, NULL);
1059 if (ost->img_resample_ctx == NULL) {
1060 fprintf(stderr, "Cannot get resampling context\n");
1064 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1065 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1068 if (ost->video_pad) {
1069 av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
1070 enc->height, enc->width, enc->pix_fmt,
1071 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
1074 /* duplicates frame if needed */
1075 for(i=0;i<nb_frames;i++) {
1077 av_init_packet(&pkt);
1078 pkt.stream_index= ost->index;
1080 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1081 /* raw pictures are written as AVPicture structure to
1082 avoid any copies. We support temorarily the older
1084 AVFrame* old_frame = enc->coded_frame;
1085 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1086 pkt.data= (uint8_t *)final_picture;
1087 pkt.size= sizeof(AVPicture);
1088 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1089 pkt.flags |= AV_PKT_FLAG_KEY;
1091 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1092 enc->coded_frame = old_frame;
1094 AVFrame big_picture;
1096 big_picture= *final_picture;
1097 /* better than nothing: use input picture interlaced
1099 big_picture.interlaced_frame = in_picture->interlaced_frame;
1100 if(avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
1101 if(top_field_first == -1)
1102 big_picture.top_field_first = in_picture->top_field_first;
1104 big_picture.top_field_first = top_field_first;
1107 /* handles sameq here. This is not correct because it may
1108 not be a global option */
1110 big_picture.quality = ist->st->quality;
1112 big_picture.quality = ost->st->quality;
1114 big_picture.pict_type = 0;
1115 // big_picture.pts = AV_NOPTS_VALUE;
1116 big_picture.pts= ost->sync_opts;
1117 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1118 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1119 ret = avcodec_encode_video(enc,
1120 bit_buffer, bit_buffer_size,
1123 fprintf(stderr, "Video encoding failed\n");
1128 pkt.data= bit_buffer;
1130 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1131 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1132 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1133 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1134 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1136 if(enc->coded_frame->key_frame)
1137 pkt.flags |= AV_PKT_FLAG_KEY;
1138 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1141 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1142 // enc->frame_number-1, ret, enc->pict_type);
1143 /* if two pass, output log */
1144 if (ost->logfile && enc->stats_out) {
1145 fprintf(ost->logfile, "%s", enc->stats_out);
1150 ost->frame_number++;
1154 static double psnr(double d){
1155 return -10.0*log(d)/log(10.0);
1158 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1161 AVCodecContext *enc;
1163 double ti1, bitrate, avg_bitrate;
1165 /* this is executed just the first time do_video_stats is called */
1167 vstats_file = fopen(vstats_filename, "w");
1174 enc = ost->st->codec;
1175 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1176 frame_number = ost->frame_number;
1177 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1178 if (enc->flags&CODEC_FLAG_PSNR)
1179 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1181 fprintf(vstats_file,"f_size= %6d ", frame_size);
1182 /* compute pts value */
1183 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1187 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1188 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1189 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1190 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1191 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1195 static void print_report(AVFormatContext **output_files,
1196 AVOutputStream **ost_table, int nb_ostreams,
1200 AVOutputStream *ost;
1201 AVFormatContext *oc;
1203 AVCodecContext *enc;
1204 int frame_number, vid, i;
1205 double bitrate, ti1, pts;
1206 static int64_t last_time = -1;
1207 static int qp_histogram[52];
1209 if (!is_last_report) {
1211 /* display the report every 0.5 seconds */
1212 cur_time = av_gettime();
1213 if (last_time == -1) {
1214 last_time = cur_time;
1217 if ((cur_time - last_time) < 500000)
1219 last_time = cur_time;
1223 oc = output_files[0];
1225 total_size = url_fsize(oc->pb);
1226 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1227 total_size= url_ftell(oc->pb);
1232 for(i=0;i<nb_ostreams;i++) {
1234 enc = ost->st->codec;
1235 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1236 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1237 !ost->st->stream_copy ?
1238 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1240 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1241 float t = (av_gettime()-timer_start) / 1000000.0;
1243 frame_number = ost->frame_number;
1244 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1245 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1246 !ost->st->stream_copy ?
1247 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1249 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1252 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1253 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1256 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1258 if (enc->flags&CODEC_FLAG_PSNR){
1260 double error, error_sum=0;
1261 double scale, scale_sum=0;
1262 char type[3]= {'Y','U','V'};
1263 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1266 error= enc->error[j];
1267 scale= enc->width*enc->height*255.0*255.0*frame_number;
1269 error= enc->coded_frame->error[j];
1270 scale= enc->width*enc->height*255.0*255.0;
1275 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1277 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1281 /* compute min output value */
1282 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1283 if ((pts < ti1) && (pts > 0))
1289 if (verbose || is_last_report) {
1290 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1292 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1293 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1294 (double)total_size / 1024, ti1, bitrate);
1296 if (nb_frames_dup || nb_frames_drop)
1297 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1298 nb_frames_dup, nb_frames_drop);
1301 fprintf(stderr, "%s \r", buf);
1306 if (is_last_report && verbose >= 0){
1307 int64_t raw= audio_size + video_size + extra_size;
1308 fprintf(stderr, "\n");
1309 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1313 100.0*(total_size - raw)/raw
1318 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1319 static int output_packet(AVInputStream *ist, int ist_index,
1320 AVOutputStream **ost_table, int nb_ostreams,
1321 const AVPacket *pkt)
1323 AVFormatContext *os;
1324 AVOutputStream *ost;
1328 void *buffer_to_free;
1329 static unsigned int samples_size= 0;
1330 AVSubtitle subtitle, *subtitle_to_free;
1333 int bps = av_get_bits_per_sample_format(ist->st->codec->sample_fmt)>>3;
1335 if(ist->next_pts == AV_NOPTS_VALUE)
1336 ist->next_pts= ist->pts;
1340 av_init_packet(&avpkt);
1348 if(pkt->dts != AV_NOPTS_VALUE)
1349 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1351 //while we have more to decode or while the decoder did output something on EOF
1352 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1353 uint8_t *data_buf, *decoded_data_buf;
1354 int data_size, decoded_data_size;
1356 ist->pts= ist->next_pts;
1358 if(avpkt.size && avpkt.size != pkt->size &&
1359 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1360 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1361 ist->showed_multi_packet_warning=1;
1364 /* decode the packet if needed */
1365 decoded_data_buf = NULL; /* fail safe */
1366 decoded_data_size= 0;
1367 data_buf = avpkt.data;
1368 data_size = avpkt.size;
1369 subtitle_to_free = NULL;
1370 if (ist->decoding_needed) {
1371 switch(ist->st->codec->codec_type) {
1372 case AVMEDIA_TYPE_AUDIO:{
1373 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1374 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1376 samples= av_malloc(samples_size);
1378 decoded_data_size= samples_size;
1379 /* XXX: could avoid copy if PCM 16 bits with same
1380 endianness as CPU */
1381 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1388 /* Some bug in mpeg audio decoder gives */
1389 /* decoded_data_size < 0, it seems they are overflows */
1390 if (decoded_data_size <= 0) {
1391 /* no audio frame */
1394 decoded_data_buf = (uint8_t *)samples;
1395 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1396 (ist->st->codec->sample_rate * ist->st->codec->channels);
1398 case AVMEDIA_TYPE_VIDEO:
1399 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1400 /* XXX: allocate picture correctly */
1401 avcodec_get_frame_defaults(&picture);
1403 ret = avcodec_decode_video2(ist->st->codec,
1404 &picture, &got_picture, &avpkt);
1405 ist->st->quality= picture.quality;
1409 /* no picture yet */
1410 goto discard_packet;
1412 if (ist->st->codec->time_base.num != 0) {
1413 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1414 ist->next_pts += ((int64_t)AV_TIME_BASE *
1415 ist->st->codec->time_base.num * ticks) /
1416 ist->st->codec->time_base.den;
1420 case AVMEDIA_TYPE_SUBTITLE:
1421 ret = avcodec_decode_subtitle2(ist->st->codec,
1422 &subtitle, &got_subtitle, &avpkt);
1425 if (!got_subtitle) {
1426 goto discard_packet;
1428 subtitle_to_free = &subtitle;
1435 switch(ist->st->codec->codec_type) {
1436 case AVMEDIA_TYPE_AUDIO:
1437 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1438 ist->st->codec->sample_rate;
1440 case AVMEDIA_TYPE_VIDEO:
1441 if (ist->st->codec->time_base.num != 0) {
1442 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1443 ist->next_pts += ((int64_t)AV_TIME_BASE *
1444 ist->st->codec->time_base.num * ticks) /
1445 ist->st->codec->time_base.den;
1453 buffer_to_free = NULL;
1454 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1455 pre_process_video_frame(ist, (AVPicture *)&picture,
1459 // preprocess audio (volume)
1460 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1461 if (audio_volume != 256) {
1464 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1465 int v = ((*volp) * audio_volume + 128) >> 8;
1466 if (v < -32768) v = -32768;
1467 if (v > 32767) v = 32767;
1473 /* frame rate emulation */
1475 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1476 int64_t now = av_gettime() - ist->start;
1481 /* if output time reached then transcode raw format,
1482 encode packets and output them */
1483 if (start_time == 0 || ist->pts >= start_time)
1484 for(i=0;i<nb_ostreams;i++) {
1488 if (ost->source_index == ist_index) {
1489 os = output_files[ost->file_index];
1491 /* set the input output pts pairs */
1492 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1494 if (ost->encoding_needed) {
1495 assert(ist->decoding_needed);
1496 switch(ost->st->codec->codec_type) {
1497 case AVMEDIA_TYPE_AUDIO:
1498 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1500 case AVMEDIA_TYPE_VIDEO:
1501 do_video_out(os, ost, ist, &picture, &frame_size);
1502 if (vstats_filename && frame_size)
1503 do_video_stats(os, ost, frame_size);
1505 case AVMEDIA_TYPE_SUBTITLE:
1506 do_subtitle_out(os, ost, ist, &subtitle,
1513 AVFrame avframe; //FIXME/XXX remove this
1515 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1517 av_init_packet(&opkt);
1519 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1522 /* no reencoding needed : output the packet directly */
1523 /* force the input stream PTS */
1525 avcodec_get_frame_defaults(&avframe);
1526 ost->st->codec->coded_frame= &avframe;
1527 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1529 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1530 audio_size += data_size;
1531 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1532 video_size += data_size;
1536 opkt.stream_index= ost->index;
1537 if(pkt->pts != AV_NOPTS_VALUE)
1538 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1540 opkt.pts= AV_NOPTS_VALUE;
1542 if (pkt->dts == AV_NOPTS_VALUE)
1543 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1545 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1546 opkt.dts -= ost_tb_start_time;
1548 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1549 opkt.flags= pkt->flags;
1551 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1552 if( ost->st->codec->codec_id != CODEC_ID_H264
1553 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1554 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1556 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1557 opkt.destruct= av_destruct_packet;
1559 opkt.data = data_buf;
1560 opkt.size = data_size;
1563 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][opkt.stream_index]);
1564 ost->st->codec->frame_number++;
1565 ost->frame_number++;
1566 av_free_packet(&opkt);
1570 av_free(buffer_to_free);
1571 /* XXX: allocate the subtitles in the codec ? */
1572 if (subtitle_to_free) {
1573 if (subtitle_to_free->rects != NULL) {
1574 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1575 av_freep(&subtitle_to_free->rects[i]->pict.data[0]);
1576 av_freep(&subtitle_to_free->rects[i]->pict.data[1]);
1577 av_freep(&subtitle_to_free->rects[i]);
1579 av_freep(&subtitle_to_free->rects);
1581 subtitle_to_free->num_rects = 0;
1582 subtitle_to_free = NULL;
1589 for(i=0;i<nb_ostreams;i++) {
1591 if (ost->source_index == ist_index) {
1592 AVCodecContext *enc= ost->st->codec;
1593 os = output_files[ost->file_index];
1595 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1597 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1600 if (ost->encoding_needed) {
1604 av_init_packet(&pkt);
1605 pkt.stream_index= ost->index;
1607 switch(ost->st->codec->codec_type) {
1608 case AVMEDIA_TYPE_AUDIO:
1609 fifo_bytes = av_fifo_size(ost->fifo);
1611 /* encode any samples remaining in fifo */
1612 if (fifo_bytes > 0) {
1613 int osize = av_get_bits_per_sample_format(enc->sample_fmt) >> 3;
1614 int fs_tmp = enc->frame_size;
1616 av_fifo_generic_read(ost->fifo, samples, fifo_bytes, NULL);
1617 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1618 enc->frame_size = fifo_bytes / (osize * enc->channels);
1620 int frame_bytes = enc->frame_size*osize*enc->channels;
1621 if (samples_size < frame_bytes)
1623 memset((uint8_t*)samples+fifo_bytes, 0, frame_bytes - fifo_bytes);
1626 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1627 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1628 ost->st->time_base.num, enc->sample_rate);
1629 enc->frame_size = fs_tmp;
1632 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1635 fprintf(stderr, "Audio encoding failed\n");
1639 pkt.flags |= AV_PKT_FLAG_KEY;
1641 case AVMEDIA_TYPE_VIDEO:
1642 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1644 fprintf(stderr, "Video encoding failed\n");
1648 if(enc->coded_frame && enc->coded_frame->key_frame)
1649 pkt.flags |= AV_PKT_FLAG_KEY;
1650 if (ost->logfile && enc->stats_out) {
1651 fprintf(ost->logfile, "%s", enc->stats_out);
1660 pkt.data= bit_buffer;
1662 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1663 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1664 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1676 static void print_sdp(AVFormatContext **avc, int n)
1680 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1681 printf("SDP:\n%s\n", sdp);
1685 static int copy_chapters(int infile, int outfile)
1687 AVFormatContext *is = input_files[infile];
1688 AVFormatContext *os = output_files[outfile];
1691 for (i = 0; i < is->nb_chapters; i++) {
1692 AVChapter *in_ch = is->chapters[i], *out_ch;
1693 AVMetadataTag *t = NULL;
1694 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1695 AV_TIME_BASE_Q, in_ch->time_base);
1696 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1697 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1700 if (in_ch->end < ts_off)
1702 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1705 out_ch = av_mallocz(sizeof(AVChapter));
1707 return AVERROR(ENOMEM);
1709 out_ch->id = in_ch->id;
1710 out_ch->time_base = in_ch->time_base;
1711 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1712 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1714 while ((t = av_metadata_get(in_ch->metadata, "", t, AV_METADATA_IGNORE_SUFFIX)))
1715 av_metadata_set2(&out_ch->metadata, t->key, t->value, 0);
1718 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1720 return AVERROR(ENOMEM);
1721 os->chapters[os->nb_chapters - 1] = out_ch;
1727 * The following code is the main loop of the file converter
1729 static int av_encode(AVFormatContext **output_files,
1730 int nb_output_files,
1731 AVFormatContext **input_files,
1733 AVStreamMap *stream_maps, int nb_stream_maps)
1735 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1736 AVFormatContext *is, *os;
1737 AVCodecContext *codec, *icodec;
1738 AVOutputStream *ost, **ost_table = NULL;
1739 AVInputStream *ist, **ist_table = NULL;
1740 AVInputFile *file_table;
1744 uint8_t no_packet[MAX_FILES]={0};
1745 int no_packet_count=0;
1747 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1751 /* input stream init */
1753 for(i=0;i<nb_input_files;i++) {
1754 is = input_files[i];
1755 file_table[i].ist_index = j;
1756 file_table[i].nb_streams = is->nb_streams;
1757 j += is->nb_streams;
1761 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1765 for(i=0;i<nb_istreams;i++) {
1766 ist = av_mallocz(sizeof(AVInputStream));
1772 for(i=0;i<nb_input_files;i++) {
1773 is = input_files[i];
1774 for(k=0;k<is->nb_streams;k++) {
1775 ist = ist_table[j++];
1776 ist->st = is->streams[k];
1777 ist->file_index = i;
1779 ist->discard = 1; /* the stream is discarded by default
1783 ist->start = av_gettime();
1788 /* output stream init */
1790 for(i=0;i<nb_output_files;i++) {
1791 os = output_files[i];
1792 if (!os->nb_streams) {
1793 dump_format(output_files[i], i, output_files[i]->filename, 1);
1794 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1797 nb_ostreams += os->nb_streams;
1799 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1800 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1804 /* Sanity check the mapping args -- do the input files & streams exist? */
1805 for(i=0;i<nb_stream_maps;i++) {
1806 int fi = stream_maps[i].file_index;
1807 int si = stream_maps[i].stream_index;
1809 if (fi < 0 || fi > nb_input_files - 1 ||
1810 si < 0 || si > file_table[fi].nb_streams - 1) {
1811 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1814 fi = stream_maps[i].sync_file_index;
1815 si = stream_maps[i].sync_stream_index;
1816 if (fi < 0 || fi > nb_input_files - 1 ||
1817 si < 0 || si > file_table[fi].nb_streams - 1) {
1818 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1823 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1826 for(i=0;i<nb_ostreams;i++) {
1827 ost = av_mallocz(sizeof(AVOutputStream));
1834 for(k=0;k<nb_output_files;k++) {
1835 os = output_files[k];
1836 for(i=0;i<os->nb_streams;i++,n++) {
1839 ost->file_index = k;
1841 ost->st = os->streams[i];
1842 if (nb_stream_maps > 0) {
1843 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
1844 stream_maps[n].stream_index;
1846 /* Sanity check that the stream types match */
1847 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1848 int i= ost->file_index;
1849 dump_format(output_files[i], i, output_files[i]->filename, 1);
1850 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1851 stream_maps[n].file_index, stream_maps[n].stream_index,
1852 ost->file_index, ost->index);
1857 int best_nb_frames=-1;
1858 /* get corresponding input stream index : we select the first one with the right type */
1860 for(j=0;j<nb_istreams;j++) {
1865 AVFormatContext *f= input_files[ ist->file_index ];
1867 for(pi=0; pi<f->nb_programs; pi++){
1868 AVProgram *p= f->programs[pi];
1869 if(p->id == opt_programid)
1870 for(si=0; si<p->nb_stream_indexes; si++){
1871 if(f->streams[ p->stream_index[si] ] == ist->st)
1876 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
1877 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1878 if(best_nb_frames < ist->st->codec_info_nb_frames){
1879 best_nb_frames= ist->st->codec_info_nb_frames;
1880 ost->source_index = j;
1887 if(! opt_programid) {
1888 /* try again and reuse existing stream */
1889 for(j=0;j<nb_istreams;j++) {
1891 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
1892 && ist->st->discard != AVDISCARD_ALL) {
1893 ost->source_index = j;
1899 int i= ost->file_index;
1900 dump_format(output_files[i], i, output_files[i]->filename, 1);
1901 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1902 ost->file_index, ost->index);
1907 ist = ist_table[ost->source_index];
1909 ost->sync_ist = (nb_stream_maps > 0) ?
1910 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
1911 stream_maps[n].sync_stream_index] : ist;
1915 /* for each output stream, we compute the right encoding parameters */
1916 for(i=0;i<nb_ostreams;i++) {
1917 AVMetadataTag *t = NULL, *lang = NULL;
1919 os = output_files[ost->file_index];
1920 ist = ist_table[ost->source_index];
1922 codec = ost->st->codec;
1923 icodec = ist->st->codec;
1925 if (av_metadata_get(ist->st->metadata, "language", NULL, 0))
1926 lang = av_metadata_get(ost->st->metadata, "language", NULL, 0);
1927 while ((t = av_metadata_get(ist->st->metadata, "", t, AV_METADATA_IGNORE_SUFFIX))) {
1928 if (lang && !strcmp(t->key, "language"))
1930 av_metadata_set2(&ost->st->metadata, t->key, t->value, 0);
1933 ost->st->disposition = ist->st->disposition;
1934 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1935 codec->chroma_sample_location = icodec->chroma_sample_location;
1937 if (ost->st->stream_copy) {
1938 /* if stream_copy is selected, no need to decode or encode */
1939 codec->codec_id = icodec->codec_id;
1940 codec->codec_type = icodec->codec_type;
1942 if(!codec->codec_tag){
1943 if( !os->oformat->codec_tag
1944 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1945 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1946 codec->codec_tag = icodec->codec_tag;
1949 codec->bit_rate = icodec->bit_rate;
1950 codec->extradata= icodec->extradata;
1951 codec->extradata_size= icodec->extradata_size;
1952 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){
1953 codec->time_base = icodec->time_base;
1954 codec->time_base.num *= icodec->ticks_per_frame;
1956 codec->time_base = ist->st->time_base;
1957 switch(codec->codec_type) {
1958 case AVMEDIA_TYPE_AUDIO:
1959 if(audio_volume != 256) {
1960 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1963 codec->channel_layout = icodec->channel_layout;
1964 codec->sample_rate = icodec->sample_rate;
1965 codec->channels = icodec->channels;
1966 codec->frame_size = icodec->frame_size;
1967 codec->block_align= icodec->block_align;
1968 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1969 codec->block_align= 0;
1970 if(codec->codec_id == CODEC_ID_AC3)
1971 codec->block_align= 0;
1973 case AVMEDIA_TYPE_VIDEO:
1974 codec->pix_fmt = icodec->pix_fmt;
1975 codec->width = icodec->width;
1976 codec->height = icodec->height;
1977 codec->has_b_frames = icodec->has_b_frames;
1979 case AVMEDIA_TYPE_SUBTITLE:
1980 codec->width = icodec->width;
1981 codec->height = icodec->height;
1987 switch(codec->codec_type) {
1988 case AVMEDIA_TYPE_AUDIO:
1989 ost->fifo= av_fifo_alloc(1024);
1992 ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
1993 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1994 icodec->request_channels = codec->channels;
1995 ist->decoding_needed = 1;
1996 ost->encoding_needed = 1;
1998 case AVMEDIA_TYPE_VIDEO:
1999 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2000 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2003 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
2004 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
2005 ost->video_resample = ((codec->width != icodec->width -
2006 (frame_leftBand + frame_rightBand) +
2007 (frame_padleft + frame_padright)) ||
2008 (codec->height != icodec->height -
2009 (frame_topBand + frame_bottomBand) +
2010 (frame_padtop + frame_padbottom)) ||
2011 (codec->pix_fmt != icodec->pix_fmt));
2012 if (ost->video_crop) {
2013 ost->topBand = ost->original_topBand = frame_topBand;
2014 ost->bottomBand = ost->original_bottomBand = frame_bottomBand;
2015 ost->leftBand = ost->original_leftBand = frame_leftBand;
2016 ost->rightBand = ost->original_rightBand = frame_rightBand;
2018 if (ost->video_pad) {
2019 ost->padtop = frame_padtop;
2020 ost->padleft = frame_padleft;
2021 ost->padbottom = frame_padbottom;
2022 ost->padright = frame_padright;
2023 if (!ost->video_resample) {
2024 avcodec_get_frame_defaults(&ost->pict_tmp);
2025 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2026 codec->width, codec->height))
2030 if (ost->video_resample) {
2031 avcodec_get_frame_defaults(&ost->pict_tmp);
2032 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2033 codec->width, codec->height)) {
2034 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2037 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
2038 ost->img_resample_ctx = sws_getContext(
2039 icodec->width - (frame_leftBand + frame_rightBand),
2040 icodec->height - (frame_topBand + frame_bottomBand),
2042 codec->width - (frame_padleft + frame_padright),
2043 codec->height - (frame_padtop + frame_padbottom),
2045 sws_flags, NULL, NULL, NULL);
2046 if (ost->img_resample_ctx == NULL) {
2047 fprintf(stderr, "Cannot get resampling context\n");
2051 ost->original_height = icodec->height;
2052 ost->original_width = icodec->width;
2054 codec->bits_per_raw_sample= 0;
2056 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
2057 ost->resample_width = icodec->width - (frame_leftBand + frame_rightBand);
2058 ost->resample_pix_fmt= icodec->pix_fmt;
2059 ost->encoding_needed = 1;
2060 ist->decoding_needed = 1;
2062 case AVMEDIA_TYPE_SUBTITLE:
2063 ost->encoding_needed = 1;
2064 ist->decoding_needed = 1;
2071 if (ost->encoding_needed &&
2072 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2073 char logfilename[1024];
2078 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2079 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2081 if (codec->flags & CODEC_FLAG_PASS1) {
2082 f = fopen(logfilename, "w");
2084 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2089 /* read the log file */
2090 f = fopen(logfilename, "r");
2092 fprintf(stderr, "Cannot read log file '%s' for pass-2 encoding: %s\n", logfilename, strerror(errno));
2095 fseek(f, 0, SEEK_END);
2097 fseek(f, 0, SEEK_SET);
2098 logbuffer = av_malloc(size + 1);
2100 fprintf(stderr, "Could not allocate log buffer\n");
2103 size = fread(logbuffer, 1, size, f);
2105 logbuffer[size] = '\0';
2106 codec->stats_in = logbuffer;
2110 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2111 int size= codec->width * codec->height;
2112 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2117 bit_buffer = av_malloc(bit_buffer_size);
2119 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2121 ret = AVERROR(ENOMEM);
2125 /* open each encoder */
2126 for(i=0;i<nb_ostreams;i++) {
2128 if (ost->encoding_needed) {
2129 AVCodec *codec = output_codecs[i];
2131 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2133 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2134 ost->st->codec->codec_id, ost->file_index, ost->index);
2135 ret = AVERROR(EINVAL);
2138 if (avcodec_open(ost->st->codec, codec) < 0) {
2139 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2140 ost->file_index, ost->index);
2141 ret = AVERROR(EINVAL);
2144 extra_size += ost->st->codec->extradata_size;
2148 /* open each decoder */
2149 for(i=0;i<nb_istreams;i++) {
2151 if (ist->decoding_needed) {
2152 AVCodec *codec = input_codecs[i];
2154 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2156 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2157 ist->st->codec->codec_id, ist->file_index, ist->index);
2158 ret = AVERROR(EINVAL);
2161 if (avcodec_open(ist->st->codec, codec) < 0) {
2162 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2163 ist->file_index, ist->index);
2164 ret = AVERROR(EINVAL);
2167 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2168 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2173 for(i=0;i<nb_istreams;i++) {
2177 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2178 ist->next_pts = AV_NOPTS_VALUE;
2182 /* set meta data information from input file if required */
2183 for (i=0;i<nb_meta_data_maps;i++) {
2184 AVFormatContext *out_file;
2185 AVFormatContext *in_file;
2186 AVMetadataTag *mtag;
2188 int out_file_index = meta_data_maps[i].out_file;
2189 int in_file_index = meta_data_maps[i].in_file;
2190 if (out_file_index < 0 || out_file_index >= nb_output_files) {
2191 snprintf(error, sizeof(error), "Invalid output file index %d map_meta_data(%d,%d)",
2192 out_file_index, out_file_index, in_file_index);
2193 ret = AVERROR(EINVAL);
2196 if (in_file_index < 0 || in_file_index >= nb_input_files) {
2197 snprintf(error, sizeof(error), "Invalid input file index %d map_meta_data(%d,%d)",
2198 in_file_index, out_file_index, in_file_index);
2199 ret = AVERROR(EINVAL);
2203 out_file = output_files[out_file_index];
2204 in_file = input_files[in_file_index];
2208 while((mtag=av_metadata_get(in_file->metadata, "", mtag, AV_METADATA_IGNORE_SUFFIX)))
2209 av_metadata_set(&out_file->metadata, mtag->key, mtag->value);
2210 av_metadata_conv(out_file, out_file->oformat->metadata_conv,
2211 in_file->iformat->metadata_conv);
2214 /* copy chapters from the first input file that has them*/
2215 for (i = 0; i < nb_input_files; i++) {
2216 if (!input_files[i]->nb_chapters)
2219 for (j = 0; j < nb_output_files; j++)
2220 if ((ret = copy_chapters(i, j)) < 0)
2224 /* open files and write file headers */
2225 for(i=0;i<nb_output_files;i++) {
2226 os = output_files[i];
2227 if (av_write_header(os) < 0) {
2228 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2229 ret = AVERROR(EINVAL);
2232 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2238 /* dump the file output parameters - cannot be done before in case
2240 for(i=0;i<nb_output_files;i++) {
2241 dump_format(output_files[i], i, output_files[i]->filename, 1);
2244 /* dump the stream mapping */
2246 fprintf(stderr, "Stream mapping:\n");
2247 for(i=0;i<nb_ostreams;i++) {
2249 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2250 ist_table[ost->source_index]->file_index,
2251 ist_table[ost->source_index]->index,
2254 if (ost->sync_ist != ist_table[ost->source_index])
2255 fprintf(stderr, " [sync #%d.%d]",
2256 ost->sync_ist->file_index,
2257 ost->sync_ist->index);
2258 fprintf(stderr, "\n");
2263 fprintf(stderr, "%s\n", error);
2268 print_sdp(output_files, nb_output_files);
2271 if (!using_stdin && verbose >= 0) {
2272 fprintf(stderr, "Press [q] to stop encoding\n");
2273 url_set_interrupt_cb(decode_interrupt_cb);
2277 timer_start = av_gettime();
2279 for(; received_sigterm == 0;) {
2280 int file_index, ist_index;
2288 /* if 'q' pressed, exits */
2292 /* read_key() returns 0 on EOF */
2298 /* select the stream that we must read now by looking at the
2299 smallest output pts */
2301 for(i=0;i<nb_ostreams;i++) {
2304 os = output_files[ost->file_index];
2305 ist = ist_table[ost->source_index];
2306 if(ist->is_past_recording_time || no_packet[ist->file_index])
2308 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2309 ipts = (double)ist->pts;
2310 if (!file_table[ist->file_index].eof_reached){
2311 if(ipts < ipts_min) {
2313 if(input_sync ) file_index = ist->file_index;
2315 if(opts < opts_min) {
2317 if(!input_sync) file_index = ist->file_index;
2320 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2325 /* if none, if is finished */
2326 if (file_index < 0) {
2327 if(no_packet_count){
2329 memset(no_packet, 0, sizeof(no_packet));
2336 /* finish if limit size exhausted */
2337 if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
2340 /* read a frame from it and output it in the fifo */
2341 is = input_files[file_index];
2342 ret= av_read_frame(is, &pkt);
2343 if(ret == AVERROR(EAGAIN)){
2344 no_packet[file_index]=1;
2349 file_table[file_index].eof_reached = 1;
2357 memset(no_packet, 0, sizeof(no_packet));
2360 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2362 /* the following test is needed in case new streams appear
2363 dynamically in stream : we ignore them */
2364 if (pkt.stream_index >= file_table[file_index].nb_streams)
2365 goto discard_packet;
2366 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2367 ist = ist_table[ist_index];
2369 goto discard_packet;
2371 if (pkt.dts != AV_NOPTS_VALUE)
2372 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2373 if (pkt.pts != AV_NOPTS_VALUE)
2374 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2376 if(input_files_ts_scale[file_index][pkt.stream_index]){
2377 if(pkt.pts != AV_NOPTS_VALUE)
2378 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2379 if(pkt.dts != AV_NOPTS_VALUE)
2380 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2383 // 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);
2384 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2385 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2386 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2387 int64_t delta= pkt_dts - ist->next_pts;
2388 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2389 input_files_ts_offset[ist->file_index]-= delta;
2391 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2392 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2393 if(pkt.pts != AV_NOPTS_VALUE)
2394 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2398 /* finish if recording time exhausted */
2399 if (recording_time != INT64_MAX &&
2400 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2401 ist->is_past_recording_time = 1;
2402 goto discard_packet;
2405 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2406 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2409 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2410 ist->file_index, ist->index);
2413 av_free_packet(&pkt);
2418 av_free_packet(&pkt);
2420 /* dump report by using the output first video and audio streams */
2421 print_report(output_files, ost_table, nb_ostreams, 0);
2424 /* at the end of stream, we must flush the decoder buffers */
2425 for(i=0;i<nb_istreams;i++) {
2427 if (ist->decoding_needed) {
2428 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2434 /* write the trailer if needed and close file */
2435 for(i=0;i<nb_output_files;i++) {
2436 os = output_files[i];
2437 av_write_trailer(os);
2440 /* dump report by using the first video and audio streams */
2441 print_report(output_files, ost_table, nb_ostreams, 1);
2443 /* close each encoder */
2444 for(i=0;i<nb_ostreams;i++) {
2446 if (ost->encoding_needed) {
2447 av_freep(&ost->st->codec->stats_in);
2448 avcodec_close(ost->st->codec);
2452 /* close each decoder */
2453 for(i=0;i<nb_istreams;i++) {
2455 if (ist->decoding_needed) {
2456 avcodec_close(ist->st->codec);
2464 av_freep(&bit_buffer);
2465 av_free(file_table);
2468 for(i=0;i<nb_istreams;i++) {
2475 for(i=0;i<nb_ostreams;i++) {
2479 fclose(ost->logfile);
2480 ost->logfile = NULL;
2482 av_fifo_free(ost->fifo); /* works even if fifo is not
2483 initialized but set to zero */
2484 av_free(ost->pict_tmp.data[0]);
2485 if (ost->video_resample)
2486 sws_freeContext(ost->img_resample_ctx);
2488 audio_resample_close(ost->resample);
2489 if (ost->reformat_ctx)
2490 av_audio_convert_free(ost->reformat_ctx);
2499 static void opt_format(const char *arg)
2501 /* compatibility stuff for pgmyuv */
2502 if (!strcmp(arg, "pgmyuv")) {
2503 pgmyuv_compatibility_hack=1;
2504 // opt_image_format(arg);
2506 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2509 last_asked_format = arg;
2512 static void opt_video_rc_override_string(const char *arg)
2514 video_rc_override_string = arg;
2517 static int opt_me_threshold(const char *opt, const char *arg)
2519 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2523 static int opt_verbose(const char *opt, const char *arg)
2525 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2529 static int opt_frame_rate(const char *opt, const char *arg)
2531 if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2532 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2538 static int opt_bitrate(const char *opt, const char *arg)
2540 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2542 opt_default(opt, arg);
2544 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2545 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2550 static void opt_frame_crop_top(const char *arg)
2552 frame_topBand = atoi(arg);
2553 if (frame_topBand < 0) {
2554 fprintf(stderr, "Incorrect top crop size\n");
2557 if ((frame_topBand) >= frame_height){
2558 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2561 frame_height -= frame_topBand;
2564 static void opt_frame_crop_bottom(const char *arg)
2566 frame_bottomBand = atoi(arg);
2567 if (frame_bottomBand < 0) {
2568 fprintf(stderr, "Incorrect bottom crop size\n");
2571 if ((frame_bottomBand) >= frame_height){
2572 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2575 frame_height -= frame_bottomBand;
2578 static void opt_frame_crop_left(const char *arg)
2580 frame_leftBand = atoi(arg);
2581 if (frame_leftBand < 0) {
2582 fprintf(stderr, "Incorrect left crop size\n");
2585 if ((frame_leftBand) >= frame_width){
2586 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2589 frame_width -= frame_leftBand;
2592 static void opt_frame_crop_right(const char *arg)
2594 frame_rightBand = atoi(arg);
2595 if (frame_rightBand < 0) {
2596 fprintf(stderr, "Incorrect right crop size\n");
2599 if ((frame_rightBand) >= frame_width){
2600 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2603 frame_width -= frame_rightBand;
2606 static void opt_frame_size(const char *arg)
2608 if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
2609 fprintf(stderr, "Incorrect frame size\n");
2614 static void opt_pad_color(const char *arg) {
2615 /* Input is expected to be six hex digits similar to
2616 how colors are expressed in html tags (but without the #) */
2617 int rgb = strtol(arg, NULL, 16);
2621 g = ((rgb >> 8) & 255);
2624 padcolor[0] = RGB_TO_Y(r,g,b);
2625 padcolor[1] = RGB_TO_U(r,g,b,0);
2626 padcolor[2] = RGB_TO_V(r,g,b,0);
2629 static void opt_frame_pad_top(const char *arg)
2631 frame_padtop = atoi(arg);
2632 if (frame_padtop < 0) {
2633 fprintf(stderr, "Incorrect top pad size\n");
2638 static void opt_frame_pad_bottom(const char *arg)
2640 frame_padbottom = atoi(arg);
2641 if (frame_padbottom < 0) {
2642 fprintf(stderr, "Incorrect bottom pad size\n");
2648 static void opt_frame_pad_left(const char *arg)
2650 frame_padleft = atoi(arg);
2651 if (frame_padleft < 0) {
2652 fprintf(stderr, "Incorrect left pad size\n");
2658 static void opt_frame_pad_right(const char *arg)
2660 frame_padright = atoi(arg);
2661 if (frame_padright < 0) {
2662 fprintf(stderr, "Incorrect right pad size\n");
2667 static void opt_frame_pix_fmt(const char *arg)
2669 if (strcmp(arg, "list")) {
2670 frame_pix_fmt = av_get_pix_fmt(arg);
2671 if (frame_pix_fmt == PIX_FMT_NONE) {
2672 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2681 static void opt_frame_aspect_ratio(const char *arg)
2688 p = strchr(arg, ':');
2690 x = strtol(arg, &end, 10);
2692 y = strtol(end+1, &end, 10);
2694 ar = (double)x / (double)y;
2696 ar = strtod(arg, NULL);
2699 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2702 frame_aspect_ratio = ar;
2705 static int opt_metadata(const char *opt, const char *arg)
2707 char *mid= strchr(arg, '=');
2710 fprintf(stderr, "Missing =\n");
2716 metadata= av_realloc(metadata, sizeof(*metadata)*metadata_count);
2717 metadata[metadata_count-1].key = av_strdup(arg);
2718 metadata[metadata_count-1].value= av_strdup(mid);
2723 static void opt_qscale(const char *arg)
2725 video_qscale = atof(arg);
2726 if (video_qscale <= 0 ||
2727 video_qscale > 255) {
2728 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2733 static void opt_top_field_first(const char *arg)
2735 top_field_first= atoi(arg);
2738 static int opt_thread_count(const char *opt, const char *arg)
2740 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2743 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2748 static void opt_audio_sample_fmt(const char *arg)
2750 if (strcmp(arg, "list"))
2751 audio_sample_fmt = avcodec_get_sample_fmt(arg);
2753 list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
2758 static int opt_audio_rate(const char *opt, const char *arg)
2760 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2764 static int opt_audio_channels(const char *opt, const char *arg)
2766 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2770 static void opt_video_channel(const char *arg)
2772 video_channel = strtol(arg, NULL, 0);
2775 static void opt_video_standard(const char *arg)
2777 video_standard = av_strdup(arg);
2780 static void opt_codec(int *pstream_copy, char **pcodec_name,
2781 int codec_type, const char *arg)
2783 av_freep(pcodec_name);
2784 if (!strcmp(arg, "copy")) {
2787 *pcodec_name = av_strdup(arg);
2791 static void opt_audio_codec(const char *arg)
2793 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2796 static void opt_audio_tag(const char *arg)
2799 audio_codec_tag= strtol(arg, &tail, 0);
2802 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2805 static void opt_video_tag(const char *arg)
2808 video_codec_tag= strtol(arg, &tail, 0);
2811 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2814 static void opt_video_codec(const char *arg)
2816 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2819 static void opt_subtitle_codec(const char *arg)
2821 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2824 static void opt_subtitle_tag(const char *arg)
2827 subtitle_codec_tag= strtol(arg, &tail, 0);
2830 subtitle_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2833 static void opt_map(const char *arg)
2838 m = &stream_maps[nb_stream_maps++];
2840 m->file_index = strtol(arg, &p, 0);
2844 m->stream_index = strtol(p, &p, 0);
2847 m->sync_file_index = strtol(p, &p, 0);
2850 m->sync_stream_index = strtol(p, &p, 0);
2852 m->sync_file_index = m->file_index;
2853 m->sync_stream_index = m->stream_index;
2857 static void opt_map_meta_data(const char *arg)
2862 m = &meta_data_maps[nb_meta_data_maps++];
2864 m->out_file = strtol(arg, &p, 0);
2868 m->in_file = strtol(p, &p, 0);
2871 static void opt_input_ts_scale(const char *arg)
2873 unsigned int stream;
2877 stream = strtol(arg, &p, 0);
2880 scale= strtod(p, &p);
2882 if(stream >= MAX_STREAMS)
2885 input_files_ts_scale[nb_input_files][stream]= scale;
2888 static int opt_recording_time(const char *opt, const char *arg)
2890 recording_time = parse_time_or_die(opt, arg, 1);
2894 static int opt_start_time(const char *opt, const char *arg)
2896 start_time = parse_time_or_die(opt, arg, 1);
2900 static int opt_rec_timestamp(const char *opt, const char *arg)
2902 rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
2906 static int opt_input_ts_offset(const char *opt, const char *arg)
2908 input_ts_offset = parse_time_or_die(opt, arg, 1);
2912 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
2914 const char *codec_string = encoder ? "encoder" : "decoder";
2918 return CODEC_ID_NONE;
2920 avcodec_find_encoder_by_name(name) :
2921 avcodec_find_decoder_by_name(name);
2923 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
2926 if(codec->type != type) {
2927 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
2933 static void opt_input_file(const char *filename)
2935 AVFormatContext *ic;
2936 AVFormatParameters params, *ap = ¶ms;
2937 AVInputFormat *file_iformat = NULL;
2938 int err, i, ret, rfps, rfps_base;
2941 if (last_asked_format) {
2942 if (!(file_iformat = av_find_input_format(last_asked_format))) {
2943 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
2946 last_asked_format = NULL;
2949 if (!strcmp(filename, "-"))
2952 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2953 !strcmp(filename, "/dev/stdin");
2955 /* get default parameters from command line */
2956 ic = avformat_alloc_context();
2958 print_error(filename, AVERROR(ENOMEM));
2962 memset(ap, 0, sizeof(*ap));
2963 ap->prealloced_context = 1;
2964 ap->sample_rate = audio_sample_rate;
2965 ap->channels = audio_channels;
2966 ap->time_base.den = frame_rate.num;
2967 ap->time_base.num = frame_rate.den;
2968 ap->width = frame_width + frame_padleft + frame_padright;
2969 ap->height = frame_height + frame_padtop + frame_padbottom;
2970 ap->pix_fmt = frame_pix_fmt;
2971 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
2972 ap->channel = video_channel;
2973 ap->standard = video_standard;
2975 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
2977 ic->video_codec_id = find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0);
2978 ic->audio_codec_id = find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0);
2979 ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0);
2980 ic->flags |= AVFMT_FLAG_NONBLOCK;
2982 if(pgmyuv_compatibility_hack)
2983 ic->video_codec_id= CODEC_ID_PGMYUV;
2985 /* open the input file with generic libav function */
2986 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2988 print_error(filename, err);
2994 for(i=0; i<ic->nb_streams; i++){
2995 ic->streams[i]->discard= AVDISCARD_ALL;
2997 for(i=0; i<ic->nb_programs; i++){
2998 AVProgram *p= ic->programs[i];
2999 if(p->id != opt_programid){
3000 p->discard = AVDISCARD_ALL;
3003 for(j=0; j<p->nb_stream_indexes; j++){
3004 ic->streams[p->stream_index[j]]->discard= 0;
3009 fprintf(stderr, "Specified program id not found\n");
3015 ic->loop_input = loop_input;
3017 /* If not enough info to get the stream parameters, we decode the
3018 first frames to get it. (used in mpeg case for example) */
3019 ret = av_find_stream_info(ic);
3020 if (ret < 0 && verbose >= 0) {
3021 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3025 timestamp = start_time;
3026 /* add the stream start time */
3027 if (ic->start_time != AV_NOPTS_VALUE)
3028 timestamp += ic->start_time;
3030 /* if seeking requested, we execute it */
3031 if (start_time != 0) {
3032 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3034 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3035 filename, (double)timestamp / AV_TIME_BASE);
3037 /* reset seek info */
3041 /* update the current parameters so that they match the one of the input stream */
3042 for(i=0;i<ic->nb_streams;i++) {
3043 AVStream *st = ic->streams[i];
3044 AVCodecContext *enc = st->codec;
3045 avcodec_thread_init(enc, thread_count);
3046 switch(enc->codec_type) {
3047 case AVMEDIA_TYPE_AUDIO:
3048 set_context_opts(enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
3049 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
3050 channel_layout = enc->channel_layout;
3051 audio_channels = enc->channels;
3052 audio_sample_rate = enc->sample_rate;
3053 audio_sample_fmt = enc->sample_fmt;
3054 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(audio_codec_name);
3056 st->discard= AVDISCARD_ALL;
3058 case AVMEDIA_TYPE_VIDEO:
3059 set_context_opts(enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
3060 frame_height = enc->height;
3061 frame_width = enc->width;
3062 if(ic->streams[i]->sample_aspect_ratio.num)
3063 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3065 frame_aspect_ratio=av_q2d(enc->sample_aspect_ratio);
3066 frame_aspect_ratio *= (float) enc->width / enc->height;
3067 frame_pix_fmt = enc->pix_fmt;
3068 rfps = ic->streams[i]->r_frame_rate.num;
3069 rfps_base = ic->streams[i]->r_frame_rate.den;
3071 enc->flags |= CODEC_FLAG_EMU_EDGE;
3072 frame_height >>= enc->lowres;
3073 frame_width >>= enc->lowres;
3076 enc->debug |= FF_DEBUG_MV;
3078 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
3081 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3082 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
3084 (float)rfps / rfps_base, rfps, rfps_base);
3086 /* update the current frame rate to match the stream frame rate */
3087 frame_rate.num = rfps;
3088 frame_rate.den = rfps_base;
3090 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(video_codec_name);
3092 st->discard= AVDISCARD_ALL;
3093 else if(video_discard)
3094 st->discard= video_discard;
3096 case AVMEDIA_TYPE_DATA:
3098 case AVMEDIA_TYPE_SUBTITLE:
3099 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(subtitle_codec_name);
3100 if(subtitle_disable)
3101 st->discard = AVDISCARD_ALL;
3103 case AVMEDIA_TYPE_ATTACHMENT:
3104 case AVMEDIA_TYPE_UNKNOWN:
3112 input_files[nb_input_files] = ic;
3113 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3114 /* dump the file content */
3116 dump_format(ic, nb_input_files, filename, 0);
3122 av_freep(&video_codec_name);
3123 av_freep(&audio_codec_name);
3124 av_freep(&subtitle_codec_name);
3127 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3128 int *has_subtitle_ptr)
3130 int has_video, has_audio, has_subtitle, i, j;
3131 AVFormatContext *ic;
3136 for(j=0;j<nb_input_files;j++) {
3137 ic = input_files[j];
3138 for(i=0;i<ic->nb_streams;i++) {
3139 AVCodecContext *enc = ic->streams[i]->codec;
3140 switch(enc->codec_type) {
3141 case AVMEDIA_TYPE_AUDIO:
3144 case AVMEDIA_TYPE_VIDEO:
3147 case AVMEDIA_TYPE_SUBTITLE:
3150 case AVMEDIA_TYPE_DATA:
3151 case AVMEDIA_TYPE_ATTACHMENT:
3152 case AVMEDIA_TYPE_UNKNOWN:
3159 *has_video_ptr = has_video;
3160 *has_audio_ptr = has_audio;
3161 *has_subtitle_ptr = has_subtitle;
3164 static void new_video_stream(AVFormatContext *oc)
3167 AVCodecContext *video_enc;
3168 enum CodecID codec_id;
3170 st = av_new_stream(oc, oc->nb_streams);
3172 fprintf(stderr, "Could not alloc stream\n");
3175 avcodec_get_context_defaults2(st->codec, AVMEDIA_TYPE_VIDEO);
3176 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
3177 video_bitstream_filters= NULL;
3179 avcodec_thread_init(st->codec, thread_count);
3181 video_enc = st->codec;
3184 video_enc->codec_tag= video_codec_tag;
3186 if( (video_global_header&1)
3187 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3188 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3189 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3191 if(video_global_header&2){
3192 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3193 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3196 if (video_stream_copy) {
3197 st->stream_copy = 1;
3198 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3199 video_enc->sample_aspect_ratio =
3200 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3205 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3207 if (video_codec_name) {
3208 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1);
3209 codec = avcodec_find_encoder_by_name(video_codec_name);
3210 output_codecs[nb_ocodecs] = codec;
3212 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3213 codec = avcodec_find_encoder(codec_id);
3216 video_enc->codec_id = codec_id;
3218 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3220 if (codec && codec->supported_framerates && !force_fps)
3221 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3222 video_enc->time_base.den = fps.num;
3223 video_enc->time_base.num = fps.den;
3225 video_enc->width = frame_width + frame_padright + frame_padleft;
3226 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3227 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3228 video_enc->pix_fmt = frame_pix_fmt;
3229 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3231 choose_pixel_fmt(st, codec);
3234 video_enc->gop_size = 0;
3235 if (video_qscale || same_quality) {
3236 video_enc->flags |= CODEC_FLAG_QSCALE;
3237 video_enc->global_quality=
3238 st->quality = FF_QP2LAMBDA * video_qscale;
3242 video_enc->intra_matrix = intra_matrix;
3244 video_enc->inter_matrix = inter_matrix;
3246 p= video_rc_override_string;
3249 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3251 fprintf(stderr, "error parsing rc_override\n");
3254 video_enc->rc_override=
3255 av_realloc(video_enc->rc_override,
3256 sizeof(RcOverride)*(i+1));
3257 video_enc->rc_override[i].start_frame= start;
3258 video_enc->rc_override[i].end_frame = end;
3260 video_enc->rc_override[i].qscale= q;
3261 video_enc->rc_override[i].quality_factor= 1.0;
3264 video_enc->rc_override[i].qscale= 0;
3265 video_enc->rc_override[i].quality_factor= -q/100.0;
3270 video_enc->rc_override_count=i;
3271 if (!video_enc->rc_initial_buffer_occupancy)
3272 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3273 video_enc->me_threshold= me_threshold;
3274 video_enc->intra_dc_precision= intra_dc_precision - 8;
3277 video_enc->flags|= CODEC_FLAG_PSNR;
3282 video_enc->flags |= CODEC_FLAG_PASS1;
3284 video_enc->flags |= CODEC_FLAG_PASS2;
3289 if (video_language) {
3290 av_metadata_set(&st->metadata, "language", video_language);
3291 av_freep(&video_language);
3294 /* reset some key parameters */
3296 av_freep(&video_codec_name);
3297 video_stream_copy = 0;
3298 frame_pix_fmt = PIX_FMT_NONE;
3301 static void new_audio_stream(AVFormatContext *oc)
3304 AVCodecContext *audio_enc;
3305 enum CodecID codec_id;
3307 st = av_new_stream(oc, oc->nb_streams);
3309 fprintf(stderr, "Could not alloc stream\n");
3312 avcodec_get_context_defaults2(st->codec, AVMEDIA_TYPE_AUDIO);
3314 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
3315 audio_bitstream_filters= NULL;
3317 avcodec_thread_init(st->codec, thread_count);
3319 audio_enc = st->codec;
3320 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3323 audio_enc->codec_tag= audio_codec_tag;
3325 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3326 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3327 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3329 if (audio_stream_copy) {
3330 st->stream_copy = 1;
3331 audio_enc->channels = audio_channels;
3335 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3337 if (audio_codec_name) {
3338 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1);
3339 codec = avcodec_find_encoder_by_name(audio_codec_name);
3340 output_codecs[nb_ocodecs] = codec;
3342 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3343 codec = avcodec_find_encoder(codec_id);
3345 audio_enc->codec_id = codec_id;
3347 if (audio_qscale > QSCALE_NONE) {
3348 audio_enc->flags |= CODEC_FLAG_QSCALE;
3349 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3351 audio_enc->channels = audio_channels;
3352 audio_enc->sample_fmt = audio_sample_fmt;
3353 audio_enc->channel_layout = channel_layout;
3354 if (avcodec_channel_layout_num_channels(channel_layout) != audio_channels)
3355 audio_enc->channel_layout = 0;
3356 choose_sample_fmt(st, codec);
3359 audio_enc->sample_rate = audio_sample_rate;
3360 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3361 if (audio_language) {
3362 av_metadata_set(&st->metadata, "language", audio_language);
3363 av_freep(&audio_language);
3366 /* reset some key parameters */
3368 av_freep(&audio_codec_name);
3369 audio_stream_copy = 0;
3372 static void new_subtitle_stream(AVFormatContext *oc)
3375 AVCodecContext *subtitle_enc;
3377 st = av_new_stream(oc, oc->nb_streams);
3379 fprintf(stderr, "Could not alloc stream\n");
3382 avcodec_get_context_defaults2(st->codec, AVMEDIA_TYPE_SUBTITLE);
3384 bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
3385 subtitle_bitstream_filters= NULL;
3387 subtitle_enc = st->codec;
3388 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3390 if(subtitle_codec_tag)
3391 subtitle_enc->codec_tag= subtitle_codec_tag;
3393 if (subtitle_stream_copy) {
3394 st->stream_copy = 1;
3396 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3397 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1);
3398 output_codecs[nb_ocodecs] = avcodec_find_encoder_by_name(subtitle_codec_name);
3402 if (subtitle_language) {
3403 av_metadata_set(&st->metadata, "language", subtitle_language);
3404 av_freep(&subtitle_language);
3407 subtitle_disable = 0;
3408 av_freep(&subtitle_codec_name);
3409 subtitle_stream_copy = 0;
3412 static void opt_new_audio_stream(void)
3414 AVFormatContext *oc;
3415 if (nb_output_files <= 0) {
3416 fprintf(stderr, "At least one output file must be specified\n");
3419 oc = output_files[nb_output_files - 1];
3420 new_audio_stream(oc);
3423 static void opt_new_video_stream(void)
3425 AVFormatContext *oc;
3426 if (nb_output_files <= 0) {
3427 fprintf(stderr, "At least one output file must be specified\n");
3430 oc = output_files[nb_output_files - 1];
3431 new_video_stream(oc);
3434 static void opt_new_subtitle_stream(void)
3436 AVFormatContext *oc;
3437 if (nb_output_files <= 0) {
3438 fprintf(stderr, "At least one output file must be specified\n");
3441 oc = output_files[nb_output_files - 1];
3442 new_subtitle_stream(oc);
3445 static void opt_output_file(const char *filename)
3447 AVFormatContext *oc;
3448 int use_video, use_audio, use_subtitle;
3449 int input_has_video, input_has_audio, input_has_subtitle;
3450 AVFormatParameters params, *ap = ¶ms;
3451 AVOutputFormat *file_oformat;
3453 if (!strcmp(filename, "-"))
3456 oc = avformat_alloc_context();
3458 print_error(filename, AVERROR(ENOMEM));
3462 if (last_asked_format) {
3463 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3464 if (!file_oformat) {
3465 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3468 last_asked_format = NULL;
3470 file_oformat = av_guess_format(NULL, filename, NULL);
3471 if (!file_oformat) {
3472 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3478 oc->oformat = file_oformat;
3479 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3481 if (!strcmp(file_oformat->name, "ffm") &&
3482 av_strstart(filename, "http:", NULL)) {
3483 /* special case for files sent to ffserver: we get the stream
3484 parameters from ffserver */
3485 int err = read_ffserver_streams(oc, filename);
3487 print_error(filename, err);
3491 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3492 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3493 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3495 /* disable if no corresponding type found and at least one
3497 if (nb_input_files > 0) {
3498 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3499 &input_has_subtitle);
3500 if (!input_has_video)
3502 if (!input_has_audio)
3504 if (!input_has_subtitle)
3508 /* manual disable */
3509 if (audio_disable) {
3512 if (video_disable) {
3515 if (subtitle_disable) {
3520 new_video_stream(oc);
3524 new_audio_stream(oc);
3528 new_subtitle_stream(oc);
3531 oc->timestamp = rec_timestamp;
3533 for(; metadata_count>0; metadata_count--){
3534 av_metadata_set(&oc->metadata, metadata[metadata_count-1].key,
3535 metadata[metadata_count-1].value);
3537 av_metadata_conv(oc, oc->oformat->metadata_conv, NULL);
3540 output_files[nb_output_files++] = oc;
3542 /* check filename in case of an image number is expected */
3543 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3544 if (!av_filename_number_test(oc->filename)) {
3545 print_error(oc->filename, AVERROR_NUMEXPECTED);
3550 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3551 /* test if it already exists to avoid loosing precious files */
3552 if (!file_overwrite &&
3553 (strchr(filename, ':') == NULL ||
3554 filename[1] == ':' ||
3555 av_strstart(filename, "file:", NULL))) {
3556 if (url_exist(filename)) {
3558 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3560 if (!read_yesno()) {
3561 fprintf(stderr, "Not overwriting - exiting\n");
3566 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3573 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3574 fprintf(stderr, "Could not open '%s'\n", filename);
3579 memset(ap, 0, sizeof(*ap));
3580 if (av_set_parameters(oc, ap) < 0) {
3581 fprintf(stderr, "%s: Invalid encoding parameters\n",
3586 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3587 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3588 oc->loop_output = loop_output;
3589 oc->flags |= AVFMT_FLAG_NONBLOCK;
3591 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
3594 /* same option as mencoder */
3595 static void opt_pass(const char *pass_str)
3598 pass = atoi(pass_str);
3599 if (pass != 1 && pass != 2) {
3600 fprintf(stderr, "pass number can be only 1 or 2\n");
3606 static int64_t getutime(void)
3609 struct rusage rusage;
3611 getrusage(RUSAGE_SELF, &rusage);
3612 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3613 #elif HAVE_GETPROCESSTIMES
3615 FILETIME c, e, k, u;
3616 proc = GetCurrentProcess();
3617 GetProcessTimes(proc, &c, &e, &k, &u);
3618 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3620 return av_gettime();
3624 static int64_t getmaxrss(void)
3626 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3627 struct rusage rusage;
3628 getrusage(RUSAGE_SELF, &rusage);
3629 return (int64_t)rusage.ru_maxrss * 1024;
3630 #elif HAVE_GETPROCESSMEMORYINFO
3632 PROCESS_MEMORY_COUNTERS memcounters;
3633 proc = GetCurrentProcess();
3634 memcounters.cb = sizeof(memcounters);
3635 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3636 return memcounters.PeakPagefileUsage;
3642 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3645 const char *p = str;
3652 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3659 static void opt_inter_matrix(const char *arg)
3661 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3662 parse_matrix_coeffs(inter_matrix, arg);
3665 static void opt_intra_matrix(const char *arg)
3667 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3668 parse_matrix_coeffs(intra_matrix, arg);
3672 * Trivial log callback.
3673 * Only suitable for show_help and similar since it lacks prefix handling.
3675 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
3677 vfprintf(stdout, fmt, vl);
3680 static void show_usage(void)
3682 printf("Hyper fast Audio and Video encoder\n");
3683 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3687 static void show_help(void)
3689 av_log_set_callback(log_callback_help);
3691 show_help_options(options, "Main options:\n",
3692 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3693 show_help_options(options, "\nAdvanced options:\n",
3694 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3696 show_help_options(options, "\nVideo options:\n",
3697 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3699 show_help_options(options, "\nAdvanced Video options:\n",
3700 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3701 OPT_VIDEO | OPT_EXPERT);
3702 show_help_options(options, "\nAudio options:\n",
3703 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3705 show_help_options(options, "\nAdvanced Audio options:\n",
3706 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3707 OPT_AUDIO | OPT_EXPERT);
3708 show_help_options(options, "\nSubtitle options:\n",
3709 OPT_SUBTITLE | OPT_GRAB,
3711 show_help_options(options, "\nAudio/Video grab options:\n",
3715 av_opt_show(avcodec_opts[0], NULL);
3717 av_opt_show(avformat_opts, NULL);
3719 av_opt_show(sws_opts, NULL);
3722 static void opt_target(const char *arg)
3724 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3725 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3727 if(!strncmp(arg, "pal-", 4)) {
3730 } else if(!strncmp(arg, "ntsc-", 5)) {
3733 } else if(!strncmp(arg, "film-", 5)) {
3738 /* Calculate FR via float to avoid int overflow */
3739 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3742 } else if((fr == 29970) || (fr == 23976)) {
3745 /* Try to determine PAL/NTSC by peeking in the input files */
3746 if(nb_input_files) {
3748 for(j = 0; j < nb_input_files; j++) {
3749 for(i = 0; i < input_files[j]->nb_streams; i++) {
3750 AVCodecContext *c = input_files[j]->streams[i]->codec;
3751 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3753 fr = c->time_base.den * 1000 / c->time_base.num;
3757 } else if((fr == 29970) || (fr == 23976)) {
3767 if(verbose && norm != UNKNOWN)
3768 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3771 if(norm == UNKNOWN) {
3772 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3773 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3774 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3778 if(!strcmp(arg, "vcd")) {
3780 opt_video_codec("mpeg1video");
3781 opt_audio_codec("mp2");
3784 opt_frame_size(norm == PAL ? "352x288" : "352x240");
3785 opt_frame_rate(NULL, frame_rates[norm]);
3786 opt_default("g", norm == PAL ? "15" : "18");
3788 opt_default("b", "1150000");
3789 opt_default("maxrate", "1150000");
3790 opt_default("minrate", "1150000");
3791 opt_default("bufsize", "327680"); // 40*1024*8;
3793 opt_default("ab", "224000");
3794 audio_sample_rate = 44100;
3797 opt_default("packetsize", "2324");
3798 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3800 /* We have to offset the PTS, so that it is consistent with the SCR.
3801 SCR starts at 36000, but the first two packs contain only padding
3802 and the first pack from the other stream, respectively, may also have
3803 been written before.
3804 So the real data starts at SCR 36000+3*1200. */
3805 mux_preload= (36000+3*1200) / 90000.0; //0.44
3806 } else if(!strcmp(arg, "svcd")) {
3808 opt_video_codec("mpeg2video");
3809 opt_audio_codec("mp2");
3812 opt_frame_size(norm == PAL ? "480x576" : "480x480");
3813 opt_frame_rate(NULL, frame_rates[norm]);
3814 opt_default("g", norm == PAL ? "15" : "18");
3816 opt_default("b", "2040000");
3817 opt_default("maxrate", "2516000");
3818 opt_default("minrate", "0"); //1145000;
3819 opt_default("bufsize", "1835008"); //224*1024*8;
3820 opt_default("flags", "+scan_offset");
3823 opt_default("ab", "224000");
3824 audio_sample_rate = 44100;
3826 opt_default("packetsize", "2324");
3828 } else if(!strcmp(arg, "dvd")) {
3830 opt_video_codec("mpeg2video");
3831 opt_audio_codec("ac3");
3834 opt_frame_size(norm == PAL ? "720x576" : "720x480");
3835 opt_frame_rate(NULL, frame_rates[norm]);
3836 opt_default("g", norm == PAL ? "15" : "18");
3838 opt_default("b", "6000000");
3839 opt_default("maxrate", "9000000");
3840 opt_default("minrate", "0"); //1500000;
3841 opt_default("bufsize", "1835008"); //224*1024*8;
3843 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3844 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3846 opt_default("ab", "448000");
3847 audio_sample_rate = 48000;
3849 } else if(!strncmp(arg, "dv", 2)) {
3853 opt_frame_size(norm == PAL ? "720x576" : "720x480");
3854 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3855 (norm == PAL ? "yuv420p" : "yuv411p"));
3856 opt_frame_rate(NULL, frame_rates[norm]);
3858 audio_sample_rate = 48000;
3862 fprintf(stderr, "Unknown target: %s\n", arg);
3867 static void opt_vstats_file (const char *arg)
3869 av_free (vstats_filename);
3870 vstats_filename=av_strdup (arg);
3873 static void opt_vstats (void)
3876 time_t today2 = time(NULL);
3877 struct tm *today = localtime(&today2);
3879 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3881 opt_vstats_file(filename);
3884 static int opt_bsf(const char *opt, const char *arg)
3886 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3887 AVBitStreamFilterContext **bsfp;
3890 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3894 bsfp= *opt == 'v' ? &video_bitstream_filters :
3895 *opt == 'a' ? &audio_bitstream_filters :
3896 &subtitle_bitstream_filters;
3898 bsfp= &(*bsfp)->next;
3905 static int opt_preset(const char *opt, const char *arg)
3908 char filename[1000], tmp[1000], tmp2[1000], line[1000];
3910 const char *base[2]= { getenv("HOME"),
3915 for(i=!base[0]; i<2 && !f; i++){
3916 snprintf(filename, sizeof(filename), "%s%s/%s.ffpreset", base[i], i ? "" : "/.ffmpeg", arg);
3917 f= fopen(filename, "r");
3919 char *codec_name= *opt == 'v' ? video_codec_name :
3920 *opt == 'a' ? audio_codec_name :
3921 subtitle_codec_name;
3922 snprintf(filename, sizeof(filename), "%s%s/%s-%s.ffpreset", base[i], i ? "" : "/.ffmpeg", codec_name, arg);
3923 f= fopen(filename, "r");
3927 av_strlcpy(filename, arg, sizeof(filename));
3928 f= fopen(filename, "r");
3932 fprintf(stderr, "File for preset '%s' not found\n", arg);
3937 int e= fscanf(f, "%999[^\n]\n", line) - 1;
3938 if(line[0] == '#' && !e)
3940 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
3942 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
3945 if(!strcmp(tmp, "acodec")){
3946 opt_audio_codec(tmp2);
3947 }else if(!strcmp(tmp, "vcodec")){
3948 opt_video_codec(tmp2);
3949 }else if(!strcmp(tmp, "scodec")){
3950 opt_subtitle_codec(tmp2);
3951 }else if(opt_default(tmp, tmp2) < 0){
3952 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
3962 static const OptionDef options[] = {
3964 #include "cmdutils_common_opts.h"
3965 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3966 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3967 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3968 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3969 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3970 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3971 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3972 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3973 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3974 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
3975 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_rec_timestamp}, "set the timestamp ('now' to set the current time)", "time" },
3976 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
3977 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
3978 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3979 "add timings for benchmarking" },
3980 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
3981 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3982 "dump each input packet" },
3983 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3984 "when dumping packets, also dump the payload" },
3985 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3986 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3987 { "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)", "" },
3988 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
3989 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3990 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3991 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3992 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3993 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3994 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3995 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3996 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3997 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3998 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3999 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4000 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4003 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4004 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4005 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4006 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4007 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4008 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4009 { "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" },
4010 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
4011 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
4012 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
4013 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
4014 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
4015 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
4016 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
4017 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
4018 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
4019 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4020 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4021 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4022 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4023 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4024 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4025 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4026 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4027 "use same video quality as source (implies VBR)" },
4028 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4029 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4030 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4031 "deinterlace pictures" },
4032 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4033 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4034 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4035 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4036 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4037 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4038 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4039 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4040 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
4041 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4042 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4043 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4046 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4047 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4048 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4049 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4050 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4051 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4052 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4053 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4054 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4055 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
4056 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4057 { "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" },
4059 /* subtitle options */
4060 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4061 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4062 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
4063 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4064 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4067 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4068 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4069 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4072 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4073 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4075 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4076 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4077 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4079 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4080 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4081 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4082 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4084 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4088 int main(int argc, char **argv)
4093 avcodec_register_all();
4094 avdevice_register_all();
4098 if(isatty(STDIN_FILENO))
4099 url_set_interrupt_cb(decode_interrupt_cb);
4102 for(i=0; i<AVMEDIA_TYPE_NB; i++){
4103 avcodec_opts[i]= avcodec_alloc_context2(i);
4105 avformat_opts = avformat_alloc_context();
4106 sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
4111 parse_options(argc, argv, options, opt_output_file);
4113 if(nb_output_files <= 0 && nb_input_files == 0) {
4115 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4119 /* file converter / grab */
4120 if (nb_output_files <= 0) {
4121 fprintf(stderr, "At least one output file must be specified\n");
4125 if (nb_input_files == 0) {
4126 fprintf(stderr, "At least one input file must be specified\n");
4131 if (av_encode(output_files, nb_output_files, input_files, nb_input_files,
4132 stream_maps, nb_stream_maps) < 0)
4134 ti = getutime() - ti;
4136 int maxrss = getmaxrss() / 1024;
4137 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);