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_transcode(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];
2076 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2077 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2079 if (codec->flags & CODEC_FLAG_PASS1) {
2080 f = fopen(logfilename, "w");
2082 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2088 size_t logbuffer_size;
2089 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2090 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2093 codec->stats_in = logbuffer;
2097 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2098 int size= codec->width * codec->height;
2099 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2104 bit_buffer = av_malloc(bit_buffer_size);
2106 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2108 ret = AVERROR(ENOMEM);
2112 /* open each encoder */
2113 for(i=0;i<nb_ostreams;i++) {
2115 if (ost->encoding_needed) {
2116 AVCodec *codec = output_codecs[i];
2118 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2120 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2121 ost->st->codec->codec_id, ost->file_index, ost->index);
2122 ret = AVERROR(EINVAL);
2125 if (avcodec_open(ost->st->codec, codec) < 0) {
2126 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2127 ost->file_index, ost->index);
2128 ret = AVERROR(EINVAL);
2131 extra_size += ost->st->codec->extradata_size;
2135 /* open each decoder */
2136 for(i=0;i<nb_istreams;i++) {
2138 if (ist->decoding_needed) {
2139 AVCodec *codec = input_codecs[i];
2141 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2143 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2144 ist->st->codec->codec_id, ist->file_index, ist->index);
2145 ret = AVERROR(EINVAL);
2148 if (avcodec_open(ist->st->codec, codec) < 0) {
2149 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2150 ist->file_index, ist->index);
2151 ret = AVERROR(EINVAL);
2154 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2155 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2160 for(i=0;i<nb_istreams;i++) {
2164 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2165 ist->next_pts = AV_NOPTS_VALUE;
2169 /* set meta data information from input file if required */
2170 for (i=0;i<nb_meta_data_maps;i++) {
2171 AVFormatContext *out_file;
2172 AVFormatContext *in_file;
2173 AVMetadataTag *mtag;
2175 int out_file_index = meta_data_maps[i].out_file;
2176 int in_file_index = meta_data_maps[i].in_file;
2177 if (out_file_index < 0 || out_file_index >= nb_output_files) {
2178 snprintf(error, sizeof(error), "Invalid output file index %d map_meta_data(%d,%d)",
2179 out_file_index, out_file_index, in_file_index);
2180 ret = AVERROR(EINVAL);
2183 if (in_file_index < 0 || in_file_index >= nb_input_files) {
2184 snprintf(error, sizeof(error), "Invalid input file index %d map_meta_data(%d,%d)",
2185 in_file_index, out_file_index, in_file_index);
2186 ret = AVERROR(EINVAL);
2190 out_file = output_files[out_file_index];
2191 in_file = input_files[in_file_index];
2195 while((mtag=av_metadata_get(in_file->metadata, "", mtag, AV_METADATA_IGNORE_SUFFIX)))
2196 av_metadata_set2(&out_file->metadata, mtag->key, mtag->value, AV_METADATA_DONT_OVERWRITE);
2197 av_metadata_conv(out_file, out_file->oformat->metadata_conv,
2198 in_file->iformat->metadata_conv);
2201 /* copy chapters from the first input file that has them*/
2202 for (i = 0; i < nb_input_files; i++) {
2203 if (!input_files[i]->nb_chapters)
2206 for (j = 0; j < nb_output_files; j++)
2207 if ((ret = copy_chapters(i, j)) < 0)
2211 /* open files and write file headers */
2212 for(i=0;i<nb_output_files;i++) {
2213 os = output_files[i];
2214 if (av_write_header(os) < 0) {
2215 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2216 ret = AVERROR(EINVAL);
2219 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2225 /* dump the file output parameters - cannot be done before in case
2227 for(i=0;i<nb_output_files;i++) {
2228 dump_format(output_files[i], i, output_files[i]->filename, 1);
2231 /* dump the stream mapping */
2233 fprintf(stderr, "Stream mapping:\n");
2234 for(i=0;i<nb_ostreams;i++) {
2236 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2237 ist_table[ost->source_index]->file_index,
2238 ist_table[ost->source_index]->index,
2241 if (ost->sync_ist != ist_table[ost->source_index])
2242 fprintf(stderr, " [sync #%d.%d]",
2243 ost->sync_ist->file_index,
2244 ost->sync_ist->index);
2245 fprintf(stderr, "\n");
2250 fprintf(stderr, "%s\n", error);
2255 print_sdp(output_files, nb_output_files);
2258 if (!using_stdin && verbose >= 0) {
2259 fprintf(stderr, "Press [q] to stop encoding\n");
2260 url_set_interrupt_cb(decode_interrupt_cb);
2264 timer_start = av_gettime();
2266 for(; received_sigterm == 0;) {
2267 int file_index, ist_index;
2275 /* if 'q' pressed, exits */
2279 /* read_key() returns 0 on EOF */
2285 /* select the stream that we must read now by looking at the
2286 smallest output pts */
2288 for(i=0;i<nb_ostreams;i++) {
2291 os = output_files[ost->file_index];
2292 ist = ist_table[ost->source_index];
2293 if(ist->is_past_recording_time || no_packet[ist->file_index])
2295 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2296 ipts = (double)ist->pts;
2297 if (!file_table[ist->file_index].eof_reached){
2298 if(ipts < ipts_min) {
2300 if(input_sync ) file_index = ist->file_index;
2302 if(opts < opts_min) {
2304 if(!input_sync) file_index = ist->file_index;
2307 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2312 /* if none, if is finished */
2313 if (file_index < 0) {
2314 if(no_packet_count){
2316 memset(no_packet, 0, sizeof(no_packet));
2323 /* finish if limit size exhausted */
2324 if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
2327 /* read a frame from it and output it in the fifo */
2328 is = input_files[file_index];
2329 ret= av_read_frame(is, &pkt);
2330 if(ret == AVERROR(EAGAIN)){
2331 no_packet[file_index]=1;
2336 file_table[file_index].eof_reached = 1;
2344 memset(no_packet, 0, sizeof(no_packet));
2347 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2349 /* the following test is needed in case new streams appear
2350 dynamically in stream : we ignore them */
2351 if (pkt.stream_index >= file_table[file_index].nb_streams)
2352 goto discard_packet;
2353 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2354 ist = ist_table[ist_index];
2356 goto discard_packet;
2358 if (pkt.dts != AV_NOPTS_VALUE)
2359 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2360 if (pkt.pts != AV_NOPTS_VALUE)
2361 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2363 if(input_files_ts_scale[file_index][pkt.stream_index]){
2364 if(pkt.pts != AV_NOPTS_VALUE)
2365 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2366 if(pkt.dts != AV_NOPTS_VALUE)
2367 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2370 // 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);
2371 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2372 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2373 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2374 int64_t delta= pkt_dts - ist->next_pts;
2375 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2376 input_files_ts_offset[ist->file_index]-= delta;
2378 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2379 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2380 if(pkt.pts != AV_NOPTS_VALUE)
2381 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2385 /* finish if recording time exhausted */
2386 if (recording_time != INT64_MAX &&
2387 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2388 ist->is_past_recording_time = 1;
2389 goto discard_packet;
2392 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2393 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2396 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2397 ist->file_index, ist->index);
2400 av_free_packet(&pkt);
2405 av_free_packet(&pkt);
2407 /* dump report by using the output first video and audio streams */
2408 print_report(output_files, ost_table, nb_ostreams, 0);
2411 /* at the end of stream, we must flush the decoder buffers */
2412 for(i=0;i<nb_istreams;i++) {
2414 if (ist->decoding_needed) {
2415 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2421 /* write the trailer if needed and close file */
2422 for(i=0;i<nb_output_files;i++) {
2423 os = output_files[i];
2424 av_write_trailer(os);
2427 /* dump report by using the first video and audio streams */
2428 print_report(output_files, ost_table, nb_ostreams, 1);
2430 /* close each encoder */
2431 for(i=0;i<nb_ostreams;i++) {
2433 if (ost->encoding_needed) {
2434 av_freep(&ost->st->codec->stats_in);
2435 avcodec_close(ost->st->codec);
2439 /* close each decoder */
2440 for(i=0;i<nb_istreams;i++) {
2442 if (ist->decoding_needed) {
2443 avcodec_close(ist->st->codec);
2451 av_freep(&bit_buffer);
2452 av_free(file_table);
2455 for(i=0;i<nb_istreams;i++) {
2462 for(i=0;i<nb_ostreams;i++) {
2466 fclose(ost->logfile);
2467 ost->logfile = NULL;
2469 av_fifo_free(ost->fifo); /* works even if fifo is not
2470 initialized but set to zero */
2471 av_free(ost->pict_tmp.data[0]);
2472 if (ost->video_resample)
2473 sws_freeContext(ost->img_resample_ctx);
2475 audio_resample_close(ost->resample);
2476 if (ost->reformat_ctx)
2477 av_audio_convert_free(ost->reformat_ctx);
2486 static void opt_format(const char *arg)
2488 /* compatibility stuff for pgmyuv */
2489 if (!strcmp(arg, "pgmyuv")) {
2490 pgmyuv_compatibility_hack=1;
2491 // opt_image_format(arg);
2493 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2496 last_asked_format = arg;
2499 static void opt_video_rc_override_string(const char *arg)
2501 video_rc_override_string = arg;
2504 static int opt_me_threshold(const char *opt, const char *arg)
2506 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2510 static int opt_verbose(const char *opt, const char *arg)
2512 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2516 static int opt_frame_rate(const char *opt, const char *arg)
2518 if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2519 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2525 static int opt_bitrate(const char *opt, const char *arg)
2527 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2529 opt_default(opt, arg);
2531 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2532 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2537 static void opt_frame_crop_top(const char *arg)
2539 frame_topBand = atoi(arg);
2540 if (frame_topBand < 0) {
2541 fprintf(stderr, "Incorrect top crop size\n");
2544 if ((frame_topBand) >= frame_height){
2545 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2548 frame_height -= frame_topBand;
2551 static void opt_frame_crop_bottom(const char *arg)
2553 frame_bottomBand = atoi(arg);
2554 if (frame_bottomBand < 0) {
2555 fprintf(stderr, "Incorrect bottom crop size\n");
2558 if ((frame_bottomBand) >= frame_height){
2559 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2562 frame_height -= frame_bottomBand;
2565 static void opt_frame_crop_left(const char *arg)
2567 frame_leftBand = atoi(arg);
2568 if (frame_leftBand < 0) {
2569 fprintf(stderr, "Incorrect left crop size\n");
2572 if ((frame_leftBand) >= frame_width){
2573 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2576 frame_width -= frame_leftBand;
2579 static void opt_frame_crop_right(const char *arg)
2581 frame_rightBand = atoi(arg);
2582 if (frame_rightBand < 0) {
2583 fprintf(stderr, "Incorrect right crop size\n");
2586 if ((frame_rightBand) >= frame_width){
2587 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2590 frame_width -= frame_rightBand;
2593 static void opt_frame_size(const char *arg)
2595 if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
2596 fprintf(stderr, "Incorrect frame size\n");
2601 static void opt_pad_color(const char *arg) {
2602 /* Input is expected to be six hex digits similar to
2603 how colors are expressed in html tags (but without the #) */
2604 int rgb = strtol(arg, NULL, 16);
2608 g = ((rgb >> 8) & 255);
2611 padcolor[0] = RGB_TO_Y(r,g,b);
2612 padcolor[1] = RGB_TO_U(r,g,b,0);
2613 padcolor[2] = RGB_TO_V(r,g,b,0);
2616 static void opt_frame_pad_top(const char *arg)
2618 frame_padtop = atoi(arg);
2619 if (frame_padtop < 0) {
2620 fprintf(stderr, "Incorrect top pad size\n");
2625 static void opt_frame_pad_bottom(const char *arg)
2627 frame_padbottom = atoi(arg);
2628 if (frame_padbottom < 0) {
2629 fprintf(stderr, "Incorrect bottom pad size\n");
2635 static void opt_frame_pad_left(const char *arg)
2637 frame_padleft = atoi(arg);
2638 if (frame_padleft < 0) {
2639 fprintf(stderr, "Incorrect left pad size\n");
2645 static void opt_frame_pad_right(const char *arg)
2647 frame_padright = atoi(arg);
2648 if (frame_padright < 0) {
2649 fprintf(stderr, "Incorrect right pad size\n");
2654 static void opt_frame_pix_fmt(const char *arg)
2656 if (strcmp(arg, "list")) {
2657 frame_pix_fmt = av_get_pix_fmt(arg);
2658 if (frame_pix_fmt == PIX_FMT_NONE) {
2659 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2668 static void opt_frame_aspect_ratio(const char *arg)
2675 p = strchr(arg, ':');
2677 x = strtol(arg, &end, 10);
2679 y = strtol(end+1, &end, 10);
2681 ar = (double)x / (double)y;
2683 ar = strtod(arg, NULL);
2686 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2689 frame_aspect_ratio = ar;
2692 static int opt_metadata(const char *opt, const char *arg)
2694 char *mid= strchr(arg, '=');
2697 fprintf(stderr, "Missing =\n");
2703 metadata= av_realloc(metadata, sizeof(*metadata)*metadata_count);
2704 metadata[metadata_count-1].key = av_strdup(arg);
2705 metadata[metadata_count-1].value= av_strdup(mid);
2710 static void opt_qscale(const char *arg)
2712 video_qscale = atof(arg);
2713 if (video_qscale <= 0 ||
2714 video_qscale > 255) {
2715 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2720 static void opt_top_field_first(const char *arg)
2722 top_field_first= atoi(arg);
2725 static int opt_thread_count(const char *opt, const char *arg)
2727 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2730 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2735 static void opt_audio_sample_fmt(const char *arg)
2737 if (strcmp(arg, "list"))
2738 audio_sample_fmt = avcodec_get_sample_fmt(arg);
2740 list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
2745 static int opt_audio_rate(const char *opt, const char *arg)
2747 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2751 static int opt_audio_channels(const char *opt, const char *arg)
2753 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2757 static void opt_video_channel(const char *arg)
2759 video_channel = strtol(arg, NULL, 0);
2762 static void opt_video_standard(const char *arg)
2764 video_standard = av_strdup(arg);
2767 static void opt_codec(int *pstream_copy, char **pcodec_name,
2768 int codec_type, const char *arg)
2770 av_freep(pcodec_name);
2771 if (!strcmp(arg, "copy")) {
2774 *pcodec_name = av_strdup(arg);
2778 static void opt_audio_codec(const char *arg)
2780 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2783 static void opt_audio_tag(const char *arg)
2786 audio_codec_tag= strtol(arg, &tail, 0);
2789 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2792 static void opt_video_tag(const char *arg)
2795 video_codec_tag= strtol(arg, &tail, 0);
2798 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2801 static void opt_video_codec(const char *arg)
2803 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2806 static void opt_subtitle_codec(const char *arg)
2808 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2811 static void opt_subtitle_tag(const char *arg)
2814 subtitle_codec_tag= strtol(arg, &tail, 0);
2817 subtitle_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2820 static void opt_map(const char *arg)
2825 m = &stream_maps[nb_stream_maps++];
2827 m->file_index = strtol(arg, &p, 0);
2831 m->stream_index = strtol(p, &p, 0);
2834 m->sync_file_index = strtol(p, &p, 0);
2837 m->sync_stream_index = strtol(p, &p, 0);
2839 m->sync_file_index = m->file_index;
2840 m->sync_stream_index = m->stream_index;
2844 static void opt_map_meta_data(const char *arg)
2849 m = &meta_data_maps[nb_meta_data_maps++];
2851 m->out_file = strtol(arg, &p, 0);
2855 m->in_file = strtol(p, &p, 0);
2858 static void opt_input_ts_scale(const char *arg)
2860 unsigned int stream;
2864 stream = strtol(arg, &p, 0);
2867 scale= strtod(p, &p);
2869 if(stream >= MAX_STREAMS)
2872 input_files_ts_scale[nb_input_files][stream]= scale;
2875 static int opt_recording_time(const char *opt, const char *arg)
2877 recording_time = parse_time_or_die(opt, arg, 1);
2881 static int opt_start_time(const char *opt, const char *arg)
2883 start_time = parse_time_or_die(opt, arg, 1);
2887 static int opt_rec_timestamp(const char *opt, const char *arg)
2889 rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
2893 static int opt_input_ts_offset(const char *opt, const char *arg)
2895 input_ts_offset = parse_time_or_die(opt, arg, 1);
2899 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
2901 const char *codec_string = encoder ? "encoder" : "decoder";
2905 return CODEC_ID_NONE;
2907 avcodec_find_encoder_by_name(name) :
2908 avcodec_find_decoder_by_name(name);
2910 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
2913 if(codec->type != type) {
2914 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
2920 static void opt_input_file(const char *filename)
2922 AVFormatContext *ic;
2923 AVFormatParameters params, *ap = ¶ms;
2924 AVInputFormat *file_iformat = NULL;
2925 int err, i, ret, rfps, rfps_base;
2928 if (last_asked_format) {
2929 if (!(file_iformat = av_find_input_format(last_asked_format))) {
2930 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
2933 last_asked_format = NULL;
2936 if (!strcmp(filename, "-"))
2939 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2940 !strcmp(filename, "/dev/stdin");
2942 /* get default parameters from command line */
2943 ic = avformat_alloc_context();
2945 print_error(filename, AVERROR(ENOMEM));
2949 memset(ap, 0, sizeof(*ap));
2950 ap->prealloced_context = 1;
2951 ap->sample_rate = audio_sample_rate;
2952 ap->channels = audio_channels;
2953 ap->time_base.den = frame_rate.num;
2954 ap->time_base.num = frame_rate.den;
2955 ap->width = frame_width + frame_padleft + frame_padright;
2956 ap->height = frame_height + frame_padtop + frame_padbottom;
2957 ap->pix_fmt = frame_pix_fmt;
2958 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
2959 ap->channel = video_channel;
2960 ap->standard = video_standard;
2962 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
2964 ic->video_codec_id = find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0);
2965 ic->audio_codec_id = find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0);
2966 ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0);
2967 ic->flags |= AVFMT_FLAG_NONBLOCK;
2969 if(pgmyuv_compatibility_hack)
2970 ic->video_codec_id= CODEC_ID_PGMYUV;
2972 /* open the input file with generic libav function */
2973 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2975 print_error(filename, err);
2981 for(i=0; i<ic->nb_streams; i++){
2982 ic->streams[i]->discard= AVDISCARD_ALL;
2984 for(i=0; i<ic->nb_programs; i++){
2985 AVProgram *p= ic->programs[i];
2986 if(p->id != opt_programid){
2987 p->discard = AVDISCARD_ALL;
2990 for(j=0; j<p->nb_stream_indexes; j++){
2991 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
2996 fprintf(stderr, "Specified program id not found\n");
3002 ic->loop_input = loop_input;
3004 /* If not enough info to get the stream parameters, we decode the
3005 first frames to get it. (used in mpeg case for example) */
3006 ret = av_find_stream_info(ic);
3007 if (ret < 0 && verbose >= 0) {
3008 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3012 timestamp = start_time;
3013 /* add the stream start time */
3014 if (ic->start_time != AV_NOPTS_VALUE)
3015 timestamp += ic->start_time;
3017 /* if seeking requested, we execute it */
3018 if (start_time != 0) {
3019 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3021 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3022 filename, (double)timestamp / AV_TIME_BASE);
3024 /* reset seek info */
3028 /* update the current parameters so that they match the one of the input stream */
3029 for(i=0;i<ic->nb_streams;i++) {
3030 AVStream *st = ic->streams[i];
3031 AVCodecContext *enc = st->codec;
3032 avcodec_thread_init(enc, thread_count);
3033 switch(enc->codec_type) {
3034 case AVMEDIA_TYPE_AUDIO:
3035 set_context_opts(enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
3036 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
3037 channel_layout = enc->channel_layout;
3038 audio_channels = enc->channels;
3039 audio_sample_rate = enc->sample_rate;
3040 audio_sample_fmt = enc->sample_fmt;
3041 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(audio_codec_name);
3043 st->discard= AVDISCARD_ALL;
3045 case AVMEDIA_TYPE_VIDEO:
3046 set_context_opts(enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
3047 frame_height = enc->height;
3048 frame_width = enc->width;
3049 if(ic->streams[i]->sample_aspect_ratio.num)
3050 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3052 frame_aspect_ratio=av_q2d(enc->sample_aspect_ratio);
3053 frame_aspect_ratio *= (float) enc->width / enc->height;
3054 frame_pix_fmt = enc->pix_fmt;
3055 rfps = ic->streams[i]->r_frame_rate.num;
3056 rfps_base = ic->streams[i]->r_frame_rate.den;
3058 enc->flags |= CODEC_FLAG_EMU_EDGE;
3059 frame_height >>= enc->lowres;
3060 frame_width >>= enc->lowres;
3063 enc->debug |= FF_DEBUG_MV;
3065 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
3068 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3069 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
3071 (float)rfps / rfps_base, rfps, rfps_base);
3073 /* update the current frame rate to match the stream frame rate */
3074 frame_rate.num = rfps;
3075 frame_rate.den = rfps_base;
3077 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(video_codec_name);
3079 st->discard= AVDISCARD_ALL;
3080 else if(video_discard)
3081 st->discard= video_discard;
3083 case AVMEDIA_TYPE_DATA:
3085 case AVMEDIA_TYPE_SUBTITLE:
3086 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(subtitle_codec_name);
3087 if(subtitle_disable)
3088 st->discard = AVDISCARD_ALL;
3090 case AVMEDIA_TYPE_ATTACHMENT:
3091 case AVMEDIA_TYPE_UNKNOWN:
3099 input_files[nb_input_files] = ic;
3100 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3101 /* dump the file content */
3103 dump_format(ic, nb_input_files, filename, 0);
3109 av_freep(&video_codec_name);
3110 av_freep(&audio_codec_name);
3111 av_freep(&subtitle_codec_name);
3114 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3115 int *has_subtitle_ptr)
3117 int has_video, has_audio, has_subtitle, i, j;
3118 AVFormatContext *ic;
3123 for(j=0;j<nb_input_files;j++) {
3124 ic = input_files[j];
3125 for(i=0;i<ic->nb_streams;i++) {
3126 AVCodecContext *enc = ic->streams[i]->codec;
3127 switch(enc->codec_type) {
3128 case AVMEDIA_TYPE_AUDIO:
3131 case AVMEDIA_TYPE_VIDEO:
3134 case AVMEDIA_TYPE_SUBTITLE:
3137 case AVMEDIA_TYPE_DATA:
3138 case AVMEDIA_TYPE_ATTACHMENT:
3139 case AVMEDIA_TYPE_UNKNOWN:
3146 *has_video_ptr = has_video;
3147 *has_audio_ptr = has_audio;
3148 *has_subtitle_ptr = has_subtitle;
3151 static void new_video_stream(AVFormatContext *oc)
3154 AVCodecContext *video_enc;
3155 enum CodecID codec_id;
3157 st = av_new_stream(oc, oc->nb_streams);
3159 fprintf(stderr, "Could not alloc stream\n");
3162 avcodec_get_context_defaults2(st->codec, AVMEDIA_TYPE_VIDEO);
3163 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
3164 video_bitstream_filters= NULL;
3166 avcodec_thread_init(st->codec, thread_count);
3168 video_enc = st->codec;
3171 video_enc->codec_tag= video_codec_tag;
3173 if( (video_global_header&1)
3174 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3175 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3176 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3178 if(video_global_header&2){
3179 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3180 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3183 if (video_stream_copy) {
3184 st->stream_copy = 1;
3185 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3186 video_enc->sample_aspect_ratio =
3187 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3192 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3194 if (video_codec_name) {
3195 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1);
3196 codec = avcodec_find_encoder_by_name(video_codec_name);
3197 output_codecs[nb_ocodecs] = codec;
3199 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3200 codec = avcodec_find_encoder(codec_id);
3203 video_enc->codec_id = codec_id;
3205 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3207 if (codec && codec->supported_framerates && !force_fps)
3208 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3209 video_enc->time_base.den = fps.num;
3210 video_enc->time_base.num = fps.den;
3212 video_enc->width = frame_width + frame_padright + frame_padleft;
3213 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3214 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3215 video_enc->pix_fmt = frame_pix_fmt;
3216 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3218 choose_pixel_fmt(st, codec);
3221 video_enc->gop_size = 0;
3222 if (video_qscale || same_quality) {
3223 video_enc->flags |= CODEC_FLAG_QSCALE;
3224 video_enc->global_quality=
3225 st->quality = FF_QP2LAMBDA * video_qscale;
3229 video_enc->intra_matrix = intra_matrix;
3231 video_enc->inter_matrix = inter_matrix;
3233 p= video_rc_override_string;
3236 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3238 fprintf(stderr, "error parsing rc_override\n");
3241 video_enc->rc_override=
3242 av_realloc(video_enc->rc_override,
3243 sizeof(RcOverride)*(i+1));
3244 video_enc->rc_override[i].start_frame= start;
3245 video_enc->rc_override[i].end_frame = end;
3247 video_enc->rc_override[i].qscale= q;
3248 video_enc->rc_override[i].quality_factor= 1.0;
3251 video_enc->rc_override[i].qscale= 0;
3252 video_enc->rc_override[i].quality_factor= -q/100.0;
3257 video_enc->rc_override_count=i;
3258 if (!video_enc->rc_initial_buffer_occupancy)
3259 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3260 video_enc->me_threshold= me_threshold;
3261 video_enc->intra_dc_precision= intra_dc_precision - 8;
3264 video_enc->flags|= CODEC_FLAG_PSNR;
3269 video_enc->flags |= CODEC_FLAG_PASS1;
3271 video_enc->flags |= CODEC_FLAG_PASS2;
3276 if (video_language) {
3277 av_metadata_set(&st->metadata, "language", video_language);
3278 av_freep(&video_language);
3281 /* reset some key parameters */
3283 av_freep(&video_codec_name);
3284 video_stream_copy = 0;
3285 frame_pix_fmt = PIX_FMT_NONE;
3288 static void new_audio_stream(AVFormatContext *oc)
3291 AVCodecContext *audio_enc;
3292 enum CodecID codec_id;
3294 st = av_new_stream(oc, oc->nb_streams);
3296 fprintf(stderr, "Could not alloc stream\n");
3299 avcodec_get_context_defaults2(st->codec, AVMEDIA_TYPE_AUDIO);
3301 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
3302 audio_bitstream_filters= NULL;
3304 avcodec_thread_init(st->codec, thread_count);
3306 audio_enc = st->codec;
3307 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3310 audio_enc->codec_tag= audio_codec_tag;
3312 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3313 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3314 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3316 if (audio_stream_copy) {
3317 st->stream_copy = 1;
3318 audio_enc->channels = audio_channels;
3322 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3324 if (audio_codec_name) {
3325 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1);
3326 codec = avcodec_find_encoder_by_name(audio_codec_name);
3327 output_codecs[nb_ocodecs] = codec;
3329 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3330 codec = avcodec_find_encoder(codec_id);
3332 audio_enc->codec_id = codec_id;
3334 if (audio_qscale > QSCALE_NONE) {
3335 audio_enc->flags |= CODEC_FLAG_QSCALE;
3336 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3338 audio_enc->channels = audio_channels;
3339 audio_enc->sample_fmt = audio_sample_fmt;
3340 audio_enc->channel_layout = channel_layout;
3341 if (avcodec_channel_layout_num_channels(channel_layout) != audio_channels)
3342 audio_enc->channel_layout = 0;
3343 choose_sample_fmt(st, codec);
3346 audio_enc->sample_rate = audio_sample_rate;
3347 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3348 if (audio_language) {
3349 av_metadata_set(&st->metadata, "language", audio_language);
3350 av_freep(&audio_language);
3353 /* reset some key parameters */
3355 av_freep(&audio_codec_name);
3356 audio_stream_copy = 0;
3359 static void new_subtitle_stream(AVFormatContext *oc)
3362 AVCodecContext *subtitle_enc;
3364 st = av_new_stream(oc, oc->nb_streams);
3366 fprintf(stderr, "Could not alloc stream\n");
3369 avcodec_get_context_defaults2(st->codec, AVMEDIA_TYPE_SUBTITLE);
3371 bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
3372 subtitle_bitstream_filters= NULL;
3374 subtitle_enc = st->codec;
3375 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3377 if(subtitle_codec_tag)
3378 subtitle_enc->codec_tag= subtitle_codec_tag;
3380 if (subtitle_stream_copy) {
3381 st->stream_copy = 1;
3383 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3384 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1);
3385 output_codecs[nb_ocodecs] = avcodec_find_encoder_by_name(subtitle_codec_name);
3389 if (subtitle_language) {
3390 av_metadata_set(&st->metadata, "language", subtitle_language);
3391 av_freep(&subtitle_language);
3394 subtitle_disable = 0;
3395 av_freep(&subtitle_codec_name);
3396 subtitle_stream_copy = 0;
3399 static void opt_new_audio_stream(void)
3401 AVFormatContext *oc;
3402 if (nb_output_files <= 0) {
3403 fprintf(stderr, "At least one output file must be specified\n");
3406 oc = output_files[nb_output_files - 1];
3407 new_audio_stream(oc);
3410 static void opt_new_video_stream(void)
3412 AVFormatContext *oc;
3413 if (nb_output_files <= 0) {
3414 fprintf(stderr, "At least one output file must be specified\n");
3417 oc = output_files[nb_output_files - 1];
3418 new_video_stream(oc);
3421 static void opt_new_subtitle_stream(void)
3423 AVFormatContext *oc;
3424 if (nb_output_files <= 0) {
3425 fprintf(stderr, "At least one output file must be specified\n");
3428 oc = output_files[nb_output_files - 1];
3429 new_subtitle_stream(oc);
3432 static void opt_output_file(const char *filename)
3434 AVFormatContext *oc;
3435 int use_video, use_audio, use_subtitle;
3436 int input_has_video, input_has_audio, input_has_subtitle;
3437 AVFormatParameters params, *ap = ¶ms;
3438 AVOutputFormat *file_oformat;
3440 if (!strcmp(filename, "-"))
3443 oc = avformat_alloc_context();
3445 print_error(filename, AVERROR(ENOMEM));
3449 if (last_asked_format) {
3450 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3451 if (!file_oformat) {
3452 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3455 last_asked_format = NULL;
3457 file_oformat = av_guess_format(NULL, filename, NULL);
3458 if (!file_oformat) {
3459 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3465 oc->oformat = file_oformat;
3466 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3468 if (!strcmp(file_oformat->name, "ffm") &&
3469 av_strstart(filename, "http:", NULL)) {
3470 /* special case for files sent to ffserver: we get the stream
3471 parameters from ffserver */
3472 int err = read_ffserver_streams(oc, filename);
3474 print_error(filename, err);
3478 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3479 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3480 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3482 /* disable if no corresponding type found and at least one
3484 if (nb_input_files > 0) {
3485 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3486 &input_has_subtitle);
3487 if (!input_has_video)
3489 if (!input_has_audio)
3491 if (!input_has_subtitle)
3495 /* manual disable */
3496 if (audio_disable) {
3499 if (video_disable) {
3502 if (subtitle_disable) {
3507 new_video_stream(oc);
3511 new_audio_stream(oc);
3515 new_subtitle_stream(oc);
3518 oc->timestamp = rec_timestamp;
3520 for(; metadata_count>0; metadata_count--){
3521 av_metadata_set(&oc->metadata, metadata[metadata_count-1].key,
3522 metadata[metadata_count-1].value);
3524 av_metadata_conv(oc, oc->oformat->metadata_conv, NULL);
3527 output_files[nb_output_files++] = oc;
3529 /* check filename in case of an image number is expected */
3530 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3531 if (!av_filename_number_test(oc->filename)) {
3532 print_error(oc->filename, AVERROR_NUMEXPECTED);
3537 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3538 /* test if it already exists to avoid loosing precious files */
3539 if (!file_overwrite &&
3540 (strchr(filename, ':') == NULL ||
3541 filename[1] == ':' ||
3542 av_strstart(filename, "file:", NULL))) {
3543 if (url_exist(filename)) {
3545 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3547 if (!read_yesno()) {
3548 fprintf(stderr, "Not overwriting - exiting\n");
3553 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3560 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3561 fprintf(stderr, "Could not open '%s'\n", filename);
3566 memset(ap, 0, sizeof(*ap));
3567 if (av_set_parameters(oc, ap) < 0) {
3568 fprintf(stderr, "%s: Invalid encoding parameters\n",
3573 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3574 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3575 oc->loop_output = loop_output;
3576 oc->flags |= AVFMT_FLAG_NONBLOCK;
3578 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
3581 /* same option as mencoder */
3582 static void opt_pass(const char *pass_str)
3585 pass = atoi(pass_str);
3586 if (pass != 1 && pass != 2) {
3587 fprintf(stderr, "pass number can be only 1 or 2\n");
3593 static int64_t getutime(void)
3596 struct rusage rusage;
3598 getrusage(RUSAGE_SELF, &rusage);
3599 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3600 #elif HAVE_GETPROCESSTIMES
3602 FILETIME c, e, k, u;
3603 proc = GetCurrentProcess();
3604 GetProcessTimes(proc, &c, &e, &k, &u);
3605 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3607 return av_gettime();
3611 static int64_t getmaxrss(void)
3613 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3614 struct rusage rusage;
3615 getrusage(RUSAGE_SELF, &rusage);
3616 return (int64_t)rusage.ru_maxrss * 1024;
3617 #elif HAVE_GETPROCESSMEMORYINFO
3619 PROCESS_MEMORY_COUNTERS memcounters;
3620 proc = GetCurrentProcess();
3621 memcounters.cb = sizeof(memcounters);
3622 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3623 return memcounters.PeakPagefileUsage;
3629 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3632 const char *p = str;
3639 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3646 static void opt_inter_matrix(const char *arg)
3648 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3649 parse_matrix_coeffs(inter_matrix, arg);
3652 static void opt_intra_matrix(const char *arg)
3654 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3655 parse_matrix_coeffs(intra_matrix, arg);
3659 * Trivial log callback.
3660 * Only suitable for show_help and similar since it lacks prefix handling.
3662 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
3664 vfprintf(stdout, fmt, vl);
3667 static void show_usage(void)
3669 printf("Hyper fast Audio and Video encoder\n");
3670 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3674 static void show_help(void)
3676 av_log_set_callback(log_callback_help);
3678 show_help_options(options, "Main options:\n",
3679 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3680 show_help_options(options, "\nAdvanced options:\n",
3681 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3683 show_help_options(options, "\nVideo options:\n",
3684 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3686 show_help_options(options, "\nAdvanced Video options:\n",
3687 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3688 OPT_VIDEO | OPT_EXPERT);
3689 show_help_options(options, "\nAudio options:\n",
3690 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3692 show_help_options(options, "\nAdvanced Audio options:\n",
3693 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3694 OPT_AUDIO | OPT_EXPERT);
3695 show_help_options(options, "\nSubtitle options:\n",
3696 OPT_SUBTITLE | OPT_GRAB,
3698 show_help_options(options, "\nAudio/Video grab options:\n",
3702 av_opt_show(avcodec_opts[0], NULL);
3704 av_opt_show(avformat_opts, NULL);
3706 av_opt_show(sws_opts, NULL);
3709 static void opt_target(const char *arg)
3711 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3712 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3714 if(!strncmp(arg, "pal-", 4)) {
3717 } else if(!strncmp(arg, "ntsc-", 5)) {
3720 } else if(!strncmp(arg, "film-", 5)) {
3725 /* Calculate FR via float to avoid int overflow */
3726 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3729 } else if((fr == 29970) || (fr == 23976)) {
3732 /* Try to determine PAL/NTSC by peeking in the input files */
3733 if(nb_input_files) {
3735 for(j = 0; j < nb_input_files; j++) {
3736 for(i = 0; i < input_files[j]->nb_streams; i++) {
3737 AVCodecContext *c = input_files[j]->streams[i]->codec;
3738 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3740 fr = c->time_base.den * 1000 / c->time_base.num;
3744 } else if((fr == 29970) || (fr == 23976)) {
3754 if(verbose && norm != UNKNOWN)
3755 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3758 if(norm == UNKNOWN) {
3759 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3760 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3761 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3765 if(!strcmp(arg, "vcd")) {
3767 opt_video_codec("mpeg1video");
3768 opt_audio_codec("mp2");
3771 opt_frame_size(norm == PAL ? "352x288" : "352x240");
3772 opt_frame_rate(NULL, frame_rates[norm]);
3773 opt_default("g", norm == PAL ? "15" : "18");
3775 opt_default("b", "1150000");
3776 opt_default("maxrate", "1150000");
3777 opt_default("minrate", "1150000");
3778 opt_default("bufsize", "327680"); // 40*1024*8;
3780 opt_default("ab", "224000");
3781 audio_sample_rate = 44100;
3784 opt_default("packetsize", "2324");
3785 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3787 /* We have to offset the PTS, so that it is consistent with the SCR.
3788 SCR starts at 36000, but the first two packs contain only padding
3789 and the first pack from the other stream, respectively, may also have
3790 been written before.
3791 So the real data starts at SCR 36000+3*1200. */
3792 mux_preload= (36000+3*1200) / 90000.0; //0.44
3793 } else if(!strcmp(arg, "svcd")) {
3795 opt_video_codec("mpeg2video");
3796 opt_audio_codec("mp2");
3799 opt_frame_size(norm == PAL ? "480x576" : "480x480");
3800 opt_frame_rate(NULL, frame_rates[norm]);
3801 opt_default("g", norm == PAL ? "15" : "18");
3803 opt_default("b", "2040000");
3804 opt_default("maxrate", "2516000");
3805 opt_default("minrate", "0"); //1145000;
3806 opt_default("bufsize", "1835008"); //224*1024*8;
3807 opt_default("flags", "+scan_offset");
3810 opt_default("ab", "224000");
3811 audio_sample_rate = 44100;
3813 opt_default("packetsize", "2324");
3815 } else if(!strcmp(arg, "dvd")) {
3817 opt_video_codec("mpeg2video");
3818 opt_audio_codec("ac3");
3821 opt_frame_size(norm == PAL ? "720x576" : "720x480");
3822 opt_frame_rate(NULL, frame_rates[norm]);
3823 opt_default("g", norm == PAL ? "15" : "18");
3825 opt_default("b", "6000000");
3826 opt_default("maxrate", "9000000");
3827 opt_default("minrate", "0"); //1500000;
3828 opt_default("bufsize", "1835008"); //224*1024*8;
3830 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3831 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3833 opt_default("ab", "448000");
3834 audio_sample_rate = 48000;
3836 } else if(!strncmp(arg, "dv", 2)) {
3840 opt_frame_size(norm == PAL ? "720x576" : "720x480");
3841 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3842 (norm == PAL ? "yuv420p" : "yuv411p"));
3843 opt_frame_rate(NULL, frame_rates[norm]);
3845 audio_sample_rate = 48000;
3849 fprintf(stderr, "Unknown target: %s\n", arg);
3854 static void opt_vstats_file (const char *arg)
3856 av_free (vstats_filename);
3857 vstats_filename=av_strdup (arg);
3860 static void opt_vstats (void)
3863 time_t today2 = time(NULL);
3864 struct tm *today = localtime(&today2);
3866 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3868 opt_vstats_file(filename);
3871 static int opt_bsf(const char *opt, const char *arg)
3873 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3874 AVBitStreamFilterContext **bsfp;
3877 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3881 bsfp= *opt == 'v' ? &video_bitstream_filters :
3882 *opt == 'a' ? &audio_bitstream_filters :
3883 &subtitle_bitstream_filters;
3885 bsfp= &(*bsfp)->next;
3892 static int opt_preset(const char *opt, const char *arg)
3895 char filename[1000], tmp[1000], tmp2[1000], line[1000];
3897 const char *base[2]= { getenv("HOME"),
3902 for(i=!base[0]; i<2 && !f; i++){
3903 snprintf(filename, sizeof(filename), "%s%s/%s.ffpreset", base[i], i ? "" : "/.ffmpeg", arg);
3904 f= fopen(filename, "r");
3906 char *codec_name= *opt == 'v' ? video_codec_name :
3907 *opt == 'a' ? audio_codec_name :
3908 subtitle_codec_name;
3909 snprintf(filename, sizeof(filename), "%s%s/%s-%s.ffpreset", base[i], i ? "" : "/.ffmpeg", codec_name, arg);
3910 f= fopen(filename, "r");
3914 av_strlcpy(filename, arg, sizeof(filename));
3915 f= fopen(filename, "r");
3919 fprintf(stderr, "File for preset '%s' not found\n", arg);
3924 int e= fscanf(f, "%999[^\n]\n", line) - 1;
3925 if(line[0] == '#' && !e)
3927 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
3929 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
3932 if(!strcmp(tmp, "acodec")){
3933 opt_audio_codec(tmp2);
3934 }else if(!strcmp(tmp, "vcodec")){
3935 opt_video_codec(tmp2);
3936 }else if(!strcmp(tmp, "scodec")){
3937 opt_subtitle_codec(tmp2);
3938 }else if(opt_default(tmp, tmp2) < 0){
3939 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
3949 static const OptionDef options[] = {
3951 #include "cmdutils_common_opts.h"
3952 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3953 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3954 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3955 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3956 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3957 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3958 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3959 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3960 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3961 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
3962 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_rec_timestamp}, "set the timestamp ('now' to set the current time)", "time" },
3963 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
3964 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
3965 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3966 "add timings for benchmarking" },
3967 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
3968 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3969 "dump each input packet" },
3970 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3971 "when dumping packets, also dump the payload" },
3972 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3973 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3974 { "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)", "" },
3975 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
3976 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3977 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3978 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3979 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3980 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3981 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3982 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3983 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3984 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3985 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3986 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
3987 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
3990 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3991 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3992 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3993 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3994 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3995 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3996 { "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" },
3997 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3998 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3999 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
4000 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
4001 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
4002 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
4003 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
4004 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
4005 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
4006 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4007 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4008 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4009 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4010 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4011 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4012 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4013 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4014 "use same video quality as source (implies VBR)" },
4015 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4016 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4017 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4018 "deinterlace pictures" },
4019 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4020 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4021 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4022 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4023 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4024 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4025 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4026 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4027 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
4028 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4029 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4030 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4033 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4034 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4035 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4036 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4037 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4038 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4039 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4040 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4041 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4042 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
4043 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4044 { "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" },
4046 /* subtitle options */
4047 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4048 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4049 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
4050 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4051 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4054 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4055 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4056 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4059 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4060 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4062 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4063 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4064 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4066 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4067 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4068 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4069 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4071 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4075 int main(int argc, char **argv)
4080 avcodec_register_all();
4081 avdevice_register_all();
4085 if(isatty(STDIN_FILENO))
4086 url_set_interrupt_cb(decode_interrupt_cb);
4089 for(i=0; i<AVMEDIA_TYPE_NB; i++){
4090 avcodec_opts[i]= avcodec_alloc_context2(i);
4092 avformat_opts = avformat_alloc_context();
4093 sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
4098 parse_options(argc, argv, options, opt_output_file);
4100 if(nb_output_files <= 0 && nb_input_files == 0) {
4102 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4106 /* file converter / grab */
4107 if (nb_output_files <= 0) {
4108 fprintf(stderr, "At least one output file must be specified\n");
4112 if (nb_input_files == 0) {
4113 fprintf(stderr, "At least one input file must be specified\n");
4118 if (av_transcode(output_files, nb_output_files, input_files, nb_input_files,
4119 stream_maps, nb_stream_maps) < 0)
4121 ti = getutime() - ti;
4123 int maxrss = getmaxrss() / 1024;
4124 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);