3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 #define HAVE_AV_CONFIG_H
22 #include "framehook.h"
29 #include <sys/ioctl.h>
32 #include <sys/resource.h>
36 #include <sys/types.h>
37 #include <sys/select.h>
40 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
49 #if !defined(INFINITY) && defined(HUGE_VAL)
50 #define INFINITY HUGE_VAL
53 /* select an input stream for an output stream */
54 typedef struct AVStreamMap {
58 int sync_stream_index;
61 /** select an input file for an output file */
62 typedef struct AVMetaDataMap {
67 extern const OptionDef options[];
69 static void show_help(void);
70 static void show_license(void);
71 static int opt_default(const char *opt, const char *arg);
75 static AVFormatContext *input_files[MAX_FILES];
76 static int64_t input_files_ts_offset[MAX_FILES];
77 static int nb_input_files = 0;
79 static AVFormatContext *output_files[MAX_FILES];
80 static int nb_output_files = 0;
82 static AVStreamMap stream_maps[MAX_FILES];
83 static int nb_stream_maps;
85 static AVMetaDataMap meta_data_maps[MAX_FILES];
86 static int nb_meta_data_maps;
88 static AVInputFormat *file_iformat;
89 static AVOutputFormat *file_oformat;
90 static AVImageFormat *image_format;
91 static int frame_width = 0;
92 static int frame_height = 0;
93 static float frame_aspect_ratio = 0;
94 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
95 static int frame_padtop = 0;
96 static int frame_padbottom = 0;
97 static int frame_padleft = 0;
98 static int frame_padright = 0;
99 static int padcolor[3] = {16,128,128}; /* default to black */
100 static int frame_topBand = 0;
101 static int frame_bottomBand = 0;
102 static int frame_leftBand = 0;
103 static int frame_rightBand = 0;
104 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
105 static int frame_rate = 25;
106 static int frame_rate_base = 1;
107 static int video_bit_rate = 200*1000;
108 static int video_bit_rate_tolerance = 4000*1000;
109 static float video_qscale = 0;
110 static int video_qmin = 2;
111 static int video_qmax = 31;
112 static int video_lmin = 2*FF_QP2LAMBDA;
113 static int video_lmax = 31*FF_QP2LAMBDA;
114 static int video_mb_lmin = 2*FF_QP2LAMBDA;
115 static int video_mb_lmax = 31*FF_QP2LAMBDA;
116 static int video_qdiff = 3;
117 static float video_qblur = 0.5;
118 static float video_qsquish = 0.0;
119 static float video_qcomp = 0.5;
120 static uint16_t *intra_matrix = NULL;
121 static uint16_t *inter_matrix = NULL;
122 #if 0 //experimental, (can be removed)
123 static float video_rc_qsquish=1.0;
124 static float video_rc_qmod_amp=0;
125 static int video_rc_qmod_freq=0;
127 static char *video_rc_override_string=NULL;
128 static char *video_rc_eq="tex^qComp";
129 static int video_rc_buffer_size=0;
130 static float video_rc_buffer_aggressivity=1.0;
131 static int video_rc_max_rate=0;
132 static int video_rc_min_rate=0;
133 static float video_rc_initial_cplx=0;
134 static float video_b_qfactor = 1.25;
135 static float video_b_qoffset = 1.25;
136 static float video_i_qfactor = -0.8;
137 static float video_i_qoffset = 0.0;
138 static int video_intra_quant_bias= FF_DEFAULT_QUANT_BIAS;
139 static int video_inter_quant_bias= FF_DEFAULT_QUANT_BIAS;
140 static int me_method = ME_EPZS;
141 static int video_disable = 0;
142 static int video_discard = 0;
143 static int video_codec_id = CODEC_ID_NONE;
144 static int video_codec_tag = 0;
145 static int same_quality = 0;
146 static int b_frames = 0;
147 static int pre_me = 0;
148 static int do_deinterlace = 0;
149 static int workaround_bugs = FF_BUG_AUTODETECT;
150 static int packet_size = 0;
151 static int error_rate = 0;
152 static int strict = 0;
153 static int top_field_first = -1;
154 static int sc_threshold = 0;
155 static int me_threshold = 0;
156 static int mb_threshold = 0;
157 static int intra_dc_precision = 8;
158 static int me_penalty_compensation= 256;
159 static int frame_skip_threshold= 0;
160 static int frame_skip_factor= 0;
161 static int frame_skip_exp= 0;
162 extern int loop_input; /* currently a hack */
163 static int loop_output = AVFMT_NOOUTPUTLOOP;
164 static int genpts = 0;
165 static int qp_hist = 0;
167 static int gop_size = 12;
168 static int intra_only = 0;
169 static int audio_sample_rate = 44100;
170 static int audio_bit_rate = 64000;
171 #define QSCALE_NONE -99999
172 static float audio_qscale = QSCALE_NONE;
173 static int audio_disable = 0;
174 static int audio_channels = 1;
175 static int audio_codec_id = CODEC_ID_NONE;
176 static int audio_codec_tag = 0;
177 static char *audio_language = NULL;
179 static int subtitle_codec_id = CODEC_ID_NONE;
180 static char *subtitle_language = NULL;
182 static int mux_rate= 0;
183 static int mux_packet_size= 0;
184 static float mux_preload= 0.5;
185 static float mux_max_delay= 0.7;
187 static int64_t recording_time = 0;
188 static int64_t start_time = 0;
189 static int64_t rec_timestamp = 0;
190 static int64_t input_ts_offset = 0;
191 static int file_overwrite = 0;
192 static char *str_title = NULL;
193 static char *str_author = NULL;
194 static char *str_copyright = NULL;
195 static char *str_comment = NULL;
196 static int do_benchmark = 0;
197 static int do_hex_dump = 0;
198 static int do_pkt_dump = 0;
199 static int do_psnr = 0;
200 static int do_vstats = 0;
201 static int do_pass = 0;
202 static char *pass_logfilename = NULL;
203 static int audio_stream_copy = 0;
204 static int video_stream_copy = 0;
205 static int subtitle_stream_copy = 0;
206 static int video_sync_method= 1;
207 static int audio_sync_method= 0;
208 static int copy_ts= 0;
209 static int opt_shortest = 0; //
210 static int video_global_header = 0;
212 static int rate_emu = 0;
215 static const char *video_grab_format = "bktr";
217 #ifdef CONFIG_VIDEO4LINUX2
218 static const char *video_grab_format = "video4linux2";
220 static const char *video_grab_format = "video4linux";
223 static char *video_device = NULL;
224 static char *grab_device = NULL;
225 static int video_channel = 0;
226 static char *video_standard = "ntsc";
228 static const char *audio_grab_format = "audio_device";
229 static char *audio_device = NULL;
230 static int audio_volume = 256;
232 static int using_stdin = 0;
233 static int using_vhook = 0;
234 static int verbose = 1;
235 static int thread_count= 1;
236 static int q_pressed = 0;
237 static int me_range = 0;
238 static int64_t video_size = 0;
239 static int64_t audio_size = 0;
240 static int64_t extra_size = 0;
241 static int nb_frames_dup = 0;
242 static int nb_frames_drop = 0;
243 static int input_sync;
244 static int limit_filesize = 0; //
246 static int pgmyuv_compatibility_hack=0;
247 static int dts_delta_threshold = 10;
249 const char **opt_names=NULL;
250 int opt_name_count=0;
251 AVCodecContext *avctx_opts;
254 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
256 struct AVInputStream;
258 typedef struct AVOutputStream {
259 int file_index; /* file index */
260 int index; /* stream index in the output file */
261 int source_index; /* AVInputStream index */
262 AVStream *st; /* stream in the output file */
263 int encoding_needed; /* true if encoding needed for this stream */
265 /* input pts and corresponding output pts
267 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
268 struct AVInputStream *sync_ist; /* input stream to sync against */
269 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
272 AVFrame pict_tmp; /* temporary image for resampling */
273 ImgReSampleContext *img_resample_ctx; /* for image resampling */
276 int topBand; /* cropping area sizes */
280 int padtop; /* padding area sizes */
287 ReSampleContext *resample; /* for audio resampling */
288 FifoBuffer fifo; /* for compression: one audio fifo per codec */
292 typedef struct AVInputStream {
296 int discard; /* true if stream data should be discarded */
297 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
298 int64_t sample_index; /* current sample */
300 int64_t start; /* time when read started */
301 unsigned long frame; /* current frame */
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 */
308 typedef struct AVInputFile {
309 int eof_reached; /* true if eof reached */
310 int ist_index; /* index of first stream in ist_table */
311 int buffer_size; /* current total buffer size */
312 int buffer_size_max; /* buffer size at which we consider we can stop
314 int nb_streams; /* nb streams we are aware of */
319 /* init terminal so that we can grab keys */
320 static struct termios oldtty;
322 static void term_exit(void)
324 tcsetattr (0, TCSANOW, &oldtty);
327 static volatile sig_atomic_t received_sigterm = 0;
330 sigterm_handler(int sig)
332 received_sigterm = sig;
336 static void term_init(void)
343 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
344 |INLCR|IGNCR|ICRNL|IXON);
345 tty.c_oflag |= OPOST;
346 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
347 tty.c_cflag &= ~(CSIZE|PARENB);
352 tcsetattr (0, TCSANOW, &tty);
354 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
355 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
356 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
358 register a function to be called at normal program termination
361 #ifdef CONFIG_BEOS_NETSERVER
362 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
366 /* read a key without blocking */
367 static int read_key(void)
371 #ifndef CONFIG_BEOS_NETSERVER
379 n = select(1, &rfds, NULL, NULL, &tv);
391 static int decode_interrupt_cb(void)
393 return q_pressed || (q_pressed = read_key() == 'q');
398 static volatile int received_sigterm = 0;
400 /* no interactive support */
401 static void term_exit(void)
405 static void term_init(void)
409 static int read_key(void)
416 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
421 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
424 /* copy stream format */
425 s->nb_streams = ic->nb_streams;
426 for(i=0;i<ic->nb_streams;i++) {
429 // FIXME: a more elegant solution is needed
430 st = av_mallocz(sizeof(AVStream));
431 memcpy(st, ic->streams[i], sizeof(AVStream));
432 st->codec = avcodec_alloc_context();
433 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
437 av_close_input_file(ic);
442 get_sync_ipts(const AVOutputStream *ost)
444 const AVInputStream *ist = ost->sync_ist;
445 return (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/AV_TIME_BASE;
448 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
450 static void do_audio_out(AVFormatContext *s,
453 unsigned char *buf, int size)
456 static uint8_t *audio_buf = NULL;
457 static uint8_t *audio_out = NULL;
458 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
460 int size_out, frame_bytes, ret;
461 AVCodecContext *enc= ost->st->codec;
463 /* SC: dynamic allocation of buffers */
465 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
467 audio_out = av_malloc(audio_out_size);
468 if (!audio_buf || !audio_out)
469 return; /* Should signal an error ! */
471 if(audio_sync_method){
472 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
473 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec->channels * 2);
474 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
475 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
477 //FIXME resample delay
478 if(fabs(delta) > 50){
481 byte_delta= FFMAX(byte_delta, -size);
485 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
490 static uint8_t *input_tmp= NULL;
491 input_tmp= av_realloc(input_tmp, byte_delta + size);
493 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
496 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
498 memset(input_tmp, 0, byte_delta);
499 memcpy(input_tmp + byte_delta, buf, size);
503 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
505 }else if(audio_sync_method>1){
506 int comp= clip(delta, -audio_sync_method, audio_sync_method);
507 assert(ost->audio_resample);
509 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
510 // fprintf(stderr, "drift:%f len:%d opts:%lld ipts:%lld fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(get_sync_ipts(ost) * enc->sample_rate), fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec->channels * 2));
511 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
515 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
516 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec->channels * 2); //FIXME wrong
518 if (ost->audio_resample) {
520 size_out = audio_resample(ost->resample,
521 (short *)buftmp, (short *)buf,
522 size / (ist->st->codec->channels * 2));
523 size_out = size_out * enc->channels * 2;
529 /* now encode as many frames as possible */
530 if (enc->frame_size > 1) {
531 /* output resampled raw samples */
532 fifo_write(&ost->fifo, buftmp, size_out,
535 frame_bytes = enc->frame_size * 2 * enc->channels;
537 while (fifo_read(&ost->fifo, audio_buf, frame_bytes,
538 &ost->fifo.rptr) == 0) {
540 av_init_packet(&pkt);
542 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
545 pkt.stream_index= ost->index;
548 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
549 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
550 pkt.flags |= PKT_FLAG_KEY;
551 av_interleaved_write_frame(s, &pkt);
553 ost->sync_opts += enc->frame_size;
557 av_init_packet(&pkt);
559 ost->sync_opts += size_out / (2 * enc->channels);
561 /* output a pcm frame */
562 /* XXX: change encoding codec API to avoid this ? */
563 switch(enc->codec->id) {
564 case CODEC_ID_PCM_S32LE:
565 case CODEC_ID_PCM_S32BE:
566 case CODEC_ID_PCM_U32LE:
567 case CODEC_ID_PCM_U32BE:
568 size_out = size_out << 1;
570 case CODEC_ID_PCM_S24LE:
571 case CODEC_ID_PCM_S24BE:
572 case CODEC_ID_PCM_U24LE:
573 case CODEC_ID_PCM_U24BE:
574 case CODEC_ID_PCM_S24DAUD:
575 size_out = size_out / 2 * 3;
577 case CODEC_ID_PCM_S16LE:
578 case CODEC_ID_PCM_S16BE:
579 case CODEC_ID_PCM_U16LE:
580 case CODEC_ID_PCM_U16BE:
583 size_out = size_out >> 1;
586 ret = avcodec_encode_audio(enc, audio_out, size_out,
589 pkt.stream_index= ost->index;
592 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
593 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
594 pkt.flags |= PKT_FLAG_KEY;
595 av_interleaved_write_frame(s, &pkt);
599 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
603 AVPicture picture_tmp;
606 dec = ist->st->codec;
608 /* deinterlace : must be done before any resize */
609 if (do_deinterlace || using_vhook) {
612 /* create temporary picture */
613 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
614 buf = av_malloc(size);
618 picture2 = &picture_tmp;
619 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
622 if(avpicture_deinterlace(picture2, picture,
623 dec->pix_fmt, dec->width, dec->height) < 0) {
624 /* if error, do not deinterlace */
630 img_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
636 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
638 if (picture != picture2)
639 *picture = *picture2;
643 /* we begin to correct av delay at this threshold */
644 #define AV_DELAY_MAX 0.100
646 static void do_subtitle_out(AVFormatContext *s,
652 static uint8_t *subtitle_out = NULL;
653 int subtitle_out_max_size = 65536;
654 int subtitle_out_size, nb, i;
658 if (pts == AV_NOPTS_VALUE) {
659 fprintf(stderr, "Subtitle packets must have a pts\n");
663 enc = ost->st->codec;
666 subtitle_out = av_malloc(subtitle_out_max_size);
669 /* Note: DVB subtitle need one packet to draw them and one other
670 packet to clear them */
671 /* XXX: signal it in the codec context ? */
672 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
677 for(i = 0; i < nb; i++) {
678 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
679 subtitle_out_max_size, sub);
681 av_init_packet(&pkt);
682 pkt.stream_index = ost->index;
683 pkt.data = subtitle_out;
684 pkt.size = subtitle_out_size;
685 pkt.pts = av_rescale_q(av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q) + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
686 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
687 /* XXX: the pts correction is handled here. Maybe handling
688 it in the codec would be better */
690 pkt.pts += 90 * sub->start_display_time;
692 pkt.pts += 90 * sub->end_display_time;
694 av_interleaved_write_frame(s, &pkt);
698 static int bit_buffer_size= 1024*256;
699 static uint8_t *bit_buffer= NULL;
701 static void do_video_out(AVFormatContext *s,
707 int nb_frames, i, ret;
708 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
709 AVFrame picture_format_temp, picture_crop_temp, picture_pad_temp;
710 uint8_t *buf = NULL, *buf1 = NULL;
711 AVCodecContext *enc, *dec;
712 enum PixelFormat target_pixfmt;
714 avcodec_get_frame_defaults(&picture_format_temp);
715 avcodec_get_frame_defaults(&picture_crop_temp);
716 avcodec_get_frame_defaults(&picture_pad_temp);
718 enc = ost->st->codec;
719 dec = ist->st->codec;
721 /* by default, we output a single frame */
726 if(video_sync_method){
728 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
729 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
732 else if (vdelta > 1.1)
733 nb_frames = lrintf(vdelta);
734 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%lld, ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, ost->sync_ipts, nb_frames);
738 fprintf(stderr, "*** drop!\n");
739 }else if (nb_frames > 1) {
740 nb_frames_dup += nb_frames;
742 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
745 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
747 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
751 /* convert pixel format if needed */
752 target_pixfmt = ost->video_resample ? PIX_FMT_YUV420P : enc->pix_fmt;
753 if (dec->pix_fmt != target_pixfmt) {
756 /* create temporary picture */
757 size = avpicture_get_size(target_pixfmt, dec->width, dec->height);
758 buf = av_malloc(size);
761 formatted_picture = &picture_format_temp;
762 avpicture_fill((AVPicture*)formatted_picture, buf, target_pixfmt, dec->width, dec->height);
764 if (img_convert((AVPicture*)formatted_picture, target_pixfmt,
765 (AVPicture *)in_picture, dec->pix_fmt,
766 dec->width, dec->height) < 0) {
769 fprintf(stderr, "pixel format conversion not handled\n");
774 formatted_picture = in_picture;
777 if (ost->video_crop) {
778 if (img_crop((AVPicture *)&picture_crop_temp, (AVPicture *)formatted_picture, target_pixfmt, ost->topBand, ost->leftBand) < 0) {
779 av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
782 formatted_picture = &picture_crop_temp;
785 final_picture = formatted_picture;
786 padding_src = formatted_picture;
787 resampling_dst = &ost->pict_tmp;
788 if (ost->video_pad) {
789 final_picture = &ost->pict_tmp;
790 if (ost->video_resample) {
791 if (img_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, target_pixfmt, ost->padtop, ost->padleft) < 0) {
792 av_log(NULL, AV_LOG_ERROR, "error padding picture\n");
795 resampling_dst = &picture_pad_temp;
799 /* XXX: resampling could be done before raw format conversion in
800 some cases to go faster */
801 /* XXX: only works for YUV420P */
802 if (ost->video_resample) {
804 final_picture = &ost->pict_tmp;
805 img_resample(ost->img_resample_ctx, (AVPicture *)resampling_dst, (AVPicture*)formatted_picture);
808 if (enc->pix_fmt != target_pixfmt) {
812 /* create temporary picture */
813 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
814 buf = av_malloc(size);
817 final_picture = &picture_format_temp;
818 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
820 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
821 (AVPicture*)&ost->pict_tmp, target_pixfmt,
822 enc->width, enc->height) < 0) {
825 fprintf(stderr, "pixel format conversion not handled\n");
831 if (ost->video_pad) {
832 img_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
833 enc->height, enc->width, enc->pix_fmt,
834 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
837 /* duplicates frame if needed */
838 for(i=0;i<nb_frames;i++) {
840 av_init_packet(&pkt);
841 pkt.stream_index= ost->index;
843 if (s->oformat->flags & AVFMT_RAWPICTURE) {
844 /* raw pictures are written as AVPicture structure to
845 avoid any copies. We support temorarily the older
847 AVFrame* old_frame = enc->coded_frame;
848 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
849 pkt.data= (uint8_t *)final_picture;
850 pkt.size= sizeof(AVPicture);
851 if(dec->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
852 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
853 if(dec->coded_frame && dec->coded_frame->key_frame)
854 pkt.flags |= PKT_FLAG_KEY;
856 av_interleaved_write_frame(s, &pkt);
857 enc->coded_frame = old_frame;
861 big_picture= *final_picture;
862 /* better than nothing: use input picture interlaced
864 big_picture.interlaced_frame = in_picture->interlaced_frame;
865 if(avctx_opts->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
866 if(top_field_first == -1)
867 big_picture.top_field_first = in_picture->top_field_first;
869 big_picture.top_field_first = top_field_first;
872 /* handles sameq here. This is not correct because it may
873 not be a global option */
875 big_picture.quality = ist->st->quality;
877 big_picture.quality = ost->st->quality;
879 big_picture.pict_type = 0;
880 // big_picture.pts = AV_NOPTS_VALUE;
881 big_picture.pts= ost->sync_opts;
882 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
883 //av_log(NULL, AV_LOG_DEBUG, "%lld -> encoder\n", ost->sync_opts);
884 ret = avcodec_encode_video(enc,
885 bit_buffer, bit_buffer_size,
887 //enc->frame_number = enc->real_pict_num;
889 pkt.data= bit_buffer;
891 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
892 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
893 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %lld/%lld\n",
894 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
895 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
897 if(enc->coded_frame && enc->coded_frame->key_frame)
898 pkt.flags |= PKT_FLAG_KEY;
899 av_interleaved_write_frame(s, &pkt);
901 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
902 // enc->frame_number-1, enc->real_pict_num, ret,
904 /* if two pass, output log */
905 if (ost->logfile && enc->stats_out) {
906 fprintf(ost->logfile, "%s", enc->stats_out);
918 static double psnr(double d){
919 if(d==0) return INFINITY;
920 return -10.0*log(d)/log(10.0);
923 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
926 static FILE *fvstats=NULL;
933 double ti1, bitrate, avg_bitrate;
937 today = localtime(&today2);
938 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour,
941 fvstats = fopen(filename,"w");
949 enc = ost->st->codec;
950 if (enc->codec_type == CODEC_TYPE_VIDEO) {
951 frame_number = ost->frame_number;
952 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
953 if (enc->flags&CODEC_FLAG_PSNR)
954 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
956 fprintf(fvstats,"f_size= %6d ", frame_size);
957 /* compute pts value */
958 ti1 = ost->sync_opts * av_q2d(enc->time_base);
962 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
963 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
964 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
965 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
966 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
970 static void print_report(AVFormatContext **output_files,
971 AVOutputStream **ost_table, int nb_ostreams,
976 AVFormatContext *oc, *os;
979 int frame_number, vid, i;
980 double bitrate, ti1, pts;
981 static int64_t last_time = -1;
982 static int qp_histogram[52];
984 if (!is_last_report) {
986 /* display the report every 0.5 seconds */
987 cur_time = av_gettime();
988 if (last_time == -1) {
989 last_time = cur_time;
992 if ((cur_time - last_time) < 500000)
994 last_time = cur_time;
998 oc = output_files[0];
1000 total_size = url_ftell(&oc->pb);
1005 for(i=0;i<nb_ostreams;i++) {
1007 os = output_files[ost->file_index];
1008 enc = ost->st->codec;
1009 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1010 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1011 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1013 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1014 frame_number = ost->frame_number;
1015 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d q=%3.1f ",
1016 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1018 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1019 if(qp_hist && enc->coded_frame){
1021 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1022 if(qp>=0 && qp<sizeof(qp_histogram)/sizeof(int))
1025 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1027 if (enc->flags&CODEC_FLAG_PSNR){
1029 double error, error_sum=0;
1030 double scale, scale_sum=0;
1031 char type[3]= {'Y','U','V'};
1032 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1035 error= enc->error[j];
1036 scale= enc->width*enc->height*255.0*255.0*frame_number;
1038 error= enc->coded_frame->error[j];
1039 scale= enc->width*enc->height*255.0*255.0;
1044 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1046 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1050 /* compute min output value */
1051 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1052 if ((pts < ti1) && (pts > 0))
1058 if (verbose || is_last_report) {
1059 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1061 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1062 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
1063 (double)total_size / 1024, ti1, bitrate);
1066 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1067 nb_frames_dup, nb_frames_drop);
1070 fprintf(stderr, "%s \r", buf);
1075 if (is_last_report && verbose >= 0){
1076 int64_t raw= audio_size + video_size + extra_size;
1077 fprintf(stderr, "\n");
1078 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1082 100.0*(total_size - raw)/raw
1087 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1088 static int output_packet(AVInputStream *ist, int ist_index,
1089 AVOutputStream **ost_table, int nb_ostreams,
1090 const AVPacket *pkt)
1092 AVFormatContext *os;
1093 AVOutputStream *ost;
1097 int data_size, got_picture;
1099 void *buffer_to_free;
1100 static unsigned int samples_size= 0;
1101 static short *samples= NULL;
1102 AVSubtitle subtitle, *subtitle_to_free;
1106 ist->pts= ist->next_pts; // needed for last packet if vsync=0
1107 } else if (pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1108 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1110 // assert(ist->pts == ist->next_pts);
1124 /* decode the packet if needed */
1125 data_buf = NULL; /* fail safe */
1127 subtitle_to_free = NULL;
1128 if (ist->decoding_needed) {
1129 switch(ist->st->codec->codec_type) {
1130 case CODEC_TYPE_AUDIO:{
1132 samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE));
1133 /* XXX: could avoid copy if PCM 16 bits with same
1134 endianness as CPU */
1135 ret = avcodec_decode_audio(ist->st->codec, samples, &data_size,
1141 /* Some bug in mpeg audio decoder gives */
1142 /* data_size < 0, it seems they are overflows */
1143 if (data_size <= 0) {
1144 /* no audio frame */
1147 data_buf = (uint8_t *)samples;
1148 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1149 (ist->st->codec->sample_rate * ist->st->codec->channels);
1151 case CODEC_TYPE_VIDEO:
1152 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1153 /* XXX: allocate picture correctly */
1154 avcodec_get_frame_defaults(&picture);
1156 ret = avcodec_decode_video(ist->st->codec,
1157 &picture, &got_picture, ptr, len);
1158 ist->st->quality= picture.quality;
1162 /* no picture yet */
1163 goto discard_packet;
1165 if (ist->st->codec->time_base.num != 0) {
1166 ist->next_pts += ((int64_t)AV_TIME_BASE *
1167 ist->st->codec->time_base.num) /
1168 ist->st->codec->time_base.den;
1172 case CODEC_TYPE_SUBTITLE:
1173 ret = avcodec_decode_subtitle(ist->st->codec,
1174 &subtitle, &got_subtitle, ptr, len);
1177 if (!got_subtitle) {
1178 goto discard_packet;
1180 subtitle_to_free = &subtitle;
1187 switch(ist->st->codec->codec_type) {
1188 case CODEC_TYPE_AUDIO:
1189 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1190 (ist->st->codec->sample_rate * ist->st->codec->channels);
1192 case CODEC_TYPE_VIDEO:
1193 if (ist->st->codec->time_base.num != 0) {
1194 ist->next_pts += ((int64_t)AV_TIME_BASE *
1195 ist->st->codec->time_base.num) /
1196 ist->st->codec->time_base.den;
1206 buffer_to_free = NULL;
1207 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1208 pre_process_video_frame(ist, (AVPicture *)&picture,
1212 // preprocess audio (volume)
1213 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1214 if (audio_volume != 256) {
1217 for(i=0;i<(data_size / sizeof(short));i++) {
1218 int v = ((*volp) * audio_volume + 128) >> 8;
1219 if (v < -32768) v = -32768;
1220 if (v > 32767) v = 32767;
1226 /* frame rate emulation */
1227 if (ist->st->codec->rate_emu) {
1228 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
1229 int64_t now = av_gettime() - ist->start;
1237 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1238 is the one of the next displayed one */
1239 /* XXX: add mpeg4 too ? */
1240 if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
1241 if (ist->st->codec->pict_type != B_TYPE) {
1243 tmp = ist->last_ip_pts;
1244 ist->last_ip_pts = ist->frac_pts.val;
1245 ist->frac_pts.val = tmp;
1249 /* if output time reached then transcode raw format,
1250 encode packets and output them */
1251 if (start_time == 0 || ist->pts >= start_time)
1252 for(i=0;i<nb_ostreams;i++) {
1256 if (ost->source_index == ist_index) {
1257 os = output_files[ost->file_index];
1260 printf("%d: got pts=%0.3f %0.3f\n", i,
1261 (double)pkt->pts / AV_TIME_BASE,
1262 ((double)ist->pts / AV_TIME_BASE) -
1263 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1265 /* set the input output pts pairs */
1266 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1268 if (ost->encoding_needed) {
1269 switch(ost->st->codec->codec_type) {
1270 case CODEC_TYPE_AUDIO:
1271 do_audio_out(os, ost, ist, data_buf, data_size);
1273 case CODEC_TYPE_VIDEO:
1274 do_video_out(os, ost, ist, &picture, &frame_size);
1275 video_size += frame_size;
1276 if (do_vstats && frame_size)
1277 do_video_stats(os, ost, frame_size);
1279 case CODEC_TYPE_SUBTITLE:
1280 do_subtitle_out(os, ost, ist, &subtitle,
1287 AVFrame avframe; //FIXME/XXX remove this
1289 av_init_packet(&opkt);
1291 /* no reencoding needed : output the packet directly */
1292 /* force the input stream PTS */
1294 avcodec_get_frame_defaults(&avframe);
1295 ost->st->codec->coded_frame= &avframe;
1296 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1298 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1299 audio_size += data_size;
1300 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1301 video_size += data_size;
1305 opkt.stream_index= ost->index;
1306 if(pkt->pts != AV_NOPTS_VALUE)
1307 opkt.pts= av_rescale_q(av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q) + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
1309 opkt.pts= AV_NOPTS_VALUE;
1313 if (pkt->dts == AV_NOPTS_VALUE)
1314 dts = ist->next_pts;
1316 dts= av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1317 opkt.dts= av_rescale_q(dts + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
1319 opkt.flags= pkt->flags;
1320 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1321 opkt.destruct= av_destruct_packet;
1322 av_interleaved_write_frame(os, &opkt);
1323 ost->st->codec->frame_number++;
1324 ost->frame_number++;
1325 av_free_packet(&opkt);
1329 av_free(buffer_to_free);
1330 /* XXX: allocate the subtitles in the codec ? */
1331 if (subtitle_to_free) {
1332 if (subtitle_to_free->rects != NULL) {
1333 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1334 av_free(subtitle_to_free->rects[i].bitmap);
1335 av_free(subtitle_to_free->rects[i].rgba_palette);
1337 av_freep(&subtitle_to_free->rects);
1339 subtitle_to_free->num_rects = 0;
1340 subtitle_to_free = NULL;
1347 for(i=0;i<nb_ostreams;i++) {
1349 if (ost->source_index == ist_index) {
1350 AVCodecContext *enc= ost->st->codec;
1351 os = output_files[ost->file_index];
1353 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1355 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1358 if (ost->encoding_needed) {
1362 av_init_packet(&pkt);
1363 pkt.stream_index= ost->index;
1365 switch(ost->st->codec->codec_type) {
1366 case CODEC_TYPE_AUDIO:
1367 fifo_bytes = fifo_size(&ost->fifo, NULL);
1369 /* encode any samples remaining in fifo */
1370 if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1371 int fs_tmp = enc->frame_size;
1372 enc->frame_size = fifo_bytes / (2 * enc->channels);
1373 if(fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes,
1374 &ost->fifo.rptr) == 0) {
1375 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1377 enc->frame_size = fs_tmp;
1379 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1382 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1385 pkt.flags |= PKT_FLAG_KEY;
1387 case CODEC_TYPE_VIDEO:
1388 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1390 if(enc->coded_frame && enc->coded_frame->key_frame)
1391 pkt.flags |= PKT_FLAG_KEY;
1392 if (ost->logfile && enc->stats_out) {
1393 fprintf(ost->logfile, "%s", enc->stats_out);
1402 pkt.data= bit_buffer;
1404 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1405 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1406 av_interleaved_write_frame(os, &pkt);
1420 * The following code is the main loop of the file converter
1422 static int av_encode(AVFormatContext **output_files,
1423 int nb_output_files,
1424 AVFormatContext **input_files,
1426 AVStreamMap *stream_maps, int nb_stream_maps)
1428 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1429 AVFormatContext *is, *os;
1430 AVCodecContext *codec, *icodec;
1431 AVOutputStream *ost, **ost_table = NULL;
1432 AVInputStream *ist, **ist_table = NULL;
1433 AVInputFile *file_table;
1434 AVFormatContext *stream_no_data;
1437 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1441 /* input stream init */
1443 for(i=0;i<nb_input_files;i++) {
1444 is = input_files[i];
1445 file_table[i].ist_index = j;
1446 file_table[i].nb_streams = is->nb_streams;
1447 j += is->nb_streams;
1451 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1455 for(i=0;i<nb_istreams;i++) {
1456 ist = av_mallocz(sizeof(AVInputStream));
1462 for(i=0;i<nb_input_files;i++) {
1463 is = input_files[i];
1464 for(k=0;k<is->nb_streams;k++) {
1465 ist = ist_table[j++];
1466 ist->st = is->streams[k];
1467 ist->file_index = i;
1469 ist->discard = 1; /* the stream is discarded by default
1472 if (ist->st->codec->rate_emu) {
1473 ist->start = av_gettime();
1479 /* output stream init */
1481 for(i=0;i<nb_output_files;i++) {
1482 os = output_files[i];
1483 nb_ostreams += os->nb_streams;
1485 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1486 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1490 /* Sanity check the mapping args -- do the input files & streams exist? */
1491 for(i=0;i<nb_stream_maps;i++) {
1492 int fi = stream_maps[i].file_index;
1493 int si = stream_maps[i].stream_index;
1495 if (fi < 0 || fi > nb_input_files - 1 ||
1496 si < 0 || si > file_table[fi].nb_streams - 1) {
1497 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1500 fi = stream_maps[i].sync_file_index;
1501 si = stream_maps[i].sync_stream_index;
1502 if (fi < 0 || fi > nb_input_files - 1 ||
1503 si < 0 || si > file_table[fi].nb_streams - 1) {
1504 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1509 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1512 for(i=0;i<nb_ostreams;i++) {
1513 ost = av_mallocz(sizeof(AVOutputStream));
1520 for(k=0;k<nb_output_files;k++) {
1521 os = output_files[k];
1522 for(i=0;i<os->nb_streams;i++) {
1524 ost = ost_table[n++];
1525 ost->file_index = k;
1527 ost->st = os->streams[i];
1528 if (nb_stream_maps > 0) {
1529 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1530 stream_maps[n-1].stream_index;
1532 /* Sanity check that the stream types match */
1533 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1534 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1535 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1536 ost->file_index, ost->index);
1541 /* get corresponding input stream index : we select the first one with the right type */
1543 for(j=0;j<nb_istreams;j++) {
1546 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1547 ost->source_index = j;
1554 /* try again and reuse existing stream */
1555 for(j=0;j<nb_istreams;j++) {
1557 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1558 ost->source_index = j;
1563 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1564 ost->file_index, ost->index);
1569 ist = ist_table[ost->source_index];
1571 ost->sync_ist = (nb_stream_maps > 0) ?
1572 ist_table[file_table[stream_maps[n-1].sync_file_index].ist_index +
1573 stream_maps[n-1].sync_stream_index] : ist;
1577 /* for each output stream, we compute the right encoding parameters */
1578 for(i=0;i<nb_ostreams;i++) {
1580 ist = ist_table[ost->source_index];
1582 codec = ost->st->codec;
1583 icodec = ist->st->codec;
1585 if (ost->st->stream_copy) {
1586 /* if stream_copy is selected, no need to decode or encode */
1587 codec->codec_id = icodec->codec_id;
1588 codec->codec_type = icodec->codec_type;
1589 if(!codec->codec_tag) codec->codec_tag = icodec->codec_tag;
1590 codec->bit_rate = icodec->bit_rate;
1591 codec->extradata= icodec->extradata;
1592 codec->extradata_size= icodec->extradata_size;
1593 codec->time_base = icodec->time_base;
1594 switch(codec->codec_type) {
1595 case CODEC_TYPE_AUDIO:
1596 codec->sample_rate = icodec->sample_rate;
1597 codec->channels = icodec->channels;
1598 codec->frame_size = icodec->frame_size;
1599 codec->block_align= icodec->block_align;
1601 case CODEC_TYPE_VIDEO:
1602 codec->pix_fmt = icodec->pix_fmt;
1603 codec->width = icodec->width;
1604 codec->height = icodec->height;
1605 codec->has_b_frames = icodec->has_b_frames;
1607 case CODEC_TYPE_SUBTITLE:
1613 switch(codec->codec_type) {
1614 case CODEC_TYPE_AUDIO:
1615 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1618 if (codec->channels == icodec->channels &&
1619 codec->sample_rate == icodec->sample_rate) {
1620 ost->audio_resample = 0;
1622 if (codec->channels != icodec->channels &&
1623 (icodec->codec_id == CODEC_ID_AC3 ||
1624 icodec->codec_id == CODEC_ID_DTS)) {
1625 /* Special case for 5:1 AC3 and DTS input */
1626 /* and mono or stereo output */
1627 /* Request specific number of channels */
1628 icodec->channels = codec->channels;
1629 if (codec->sample_rate == icodec->sample_rate)
1630 ost->audio_resample = 0;
1632 ost->audio_resample = 1;
1635 ost->audio_resample = 1;
1638 if(audio_sync_method>1)
1639 ost->audio_resample = 1;
1641 if(ost->audio_resample){
1642 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1643 codec->sample_rate, icodec->sample_rate);
1645 printf("Can't resample. Aborting.\n");
1649 ist->decoding_needed = 1;
1650 ost->encoding_needed = 1;
1652 case CODEC_TYPE_VIDEO:
1653 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1654 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1655 ost->video_resample = ((codec->width != icodec->width -
1656 (frame_leftBand + frame_rightBand) +
1657 (frame_padleft + frame_padright)) ||
1658 (codec->height != icodec->height -
1659 (frame_topBand + frame_bottomBand) +
1660 (frame_padtop + frame_padbottom)));
1661 if (ost->video_crop) {
1662 ost->topBand = frame_topBand;
1663 ost->leftBand = frame_leftBand;
1665 if (ost->video_pad) {
1666 ost->padtop = frame_padtop;
1667 ost->padleft = frame_padleft;
1668 ost->padbottom = frame_padbottom;
1669 ost->padright = frame_padright;
1670 if (!ost->video_resample) {
1671 avcodec_get_frame_defaults(&ost->pict_tmp);
1672 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1673 codec->width, codec->height ) )
1677 if (ost->video_resample) {
1678 avcodec_get_frame_defaults(&ost->pict_tmp);
1679 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1680 codec->width, codec->height ) )
1683 ost->img_resample_ctx = img_resample_init(
1684 codec->width - (frame_padleft + frame_padright),
1685 codec->height - (frame_padtop + frame_padbottom),
1686 icodec->width - (frame_leftBand + frame_rightBand),
1687 icodec->height - (frame_topBand + frame_bottomBand));
1690 ost->encoding_needed = 1;
1691 ist->decoding_needed = 1;
1693 case CODEC_TYPE_SUBTITLE:
1694 ost->encoding_needed = 1;
1695 ist->decoding_needed = 1;
1702 if (ost->encoding_needed &&
1703 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1704 char logfilename[1024];
1709 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1711 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1712 if (codec->flags & CODEC_FLAG_PASS1) {
1713 f = fopen(logfilename, "w");
1715 perror(logfilename);
1720 /* read the log file */
1721 f = fopen(logfilename, "r");
1723 perror(logfilename);
1726 fseek(f, 0, SEEK_END);
1728 fseek(f, 0, SEEK_SET);
1729 logbuffer = av_malloc(size + 1);
1731 fprintf(stderr, "Could not allocate log buffer\n");
1734 size = fread(logbuffer, 1, size, f);
1736 logbuffer[size] = '\0';
1737 codec->stats_in = logbuffer;
1741 if(codec->codec_type == CODEC_TYPE_VIDEO){
1742 int size= codec->width * codec->height;
1743 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1748 bit_buffer = av_malloc(bit_buffer_size);
1752 /* dump the file output parameters - cannot be done before in case
1754 for(i=0;i<nb_output_files;i++) {
1755 dump_format(output_files[i], i, output_files[i]->filename, 1);
1758 /* dump the stream mapping */
1760 fprintf(stderr, "Stream mapping:\n");
1761 for(i=0;i<nb_ostreams;i++) {
1763 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1764 ist_table[ost->source_index]->file_index,
1765 ist_table[ost->source_index]->index,
1768 if (ost->sync_ist != ist_table[ost->source_index])
1769 fprintf(stderr, " [sync #%d.%d]",
1770 ost->sync_ist->file_index,
1771 ost->sync_ist->index);
1772 fprintf(stderr, "\n");
1776 /* open each encoder */
1777 for(i=0;i<nb_ostreams;i++) {
1779 if (ost->encoding_needed) {
1781 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1783 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1784 ost->file_index, ost->index);
1787 if (avcodec_open(ost->st->codec, codec) < 0) {
1788 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1789 ost->file_index, ost->index);
1792 extra_size += ost->st->codec->extradata_size;
1796 /* open each decoder */
1797 for(i=0;i<nb_istreams;i++) {
1799 if (ist->decoding_needed) {
1801 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1803 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1804 ist->st->codec->codec_id, ist->file_index, ist->index);
1807 if (avcodec_open(ist->st->codec, codec) < 0) {
1808 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1809 ist->file_index, ist->index);
1812 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1813 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1818 for(i=0;i<nb_istreams;i++) {
1820 is = input_files[ist->file_index];
1822 ist->next_pts = av_rescale_q(ist->st->start_time, ist->st->time_base, AV_TIME_BASE_Q);
1823 if(ist->st->start_time == AV_NOPTS_VALUE)
1825 if(input_files_ts_offset[ist->file_index])
1826 ist->next_pts= AV_NOPTS_VALUE;
1830 /* compute buffer size max (should use a complete heuristic) */
1831 for(i=0;i<nb_input_files;i++) {
1832 file_table[i].buffer_size_max = 2048;
1835 /* set meta data information from input file if required */
1836 for (i=0;i<nb_meta_data_maps;i++) {
1837 AVFormatContext *out_file;
1838 AVFormatContext *in_file;
1840 int out_file_index = meta_data_maps[i].out_file;
1841 int in_file_index = meta_data_maps[i].in_file;
1842 if ( out_file_index < 0 || out_file_index >= nb_output_files ) {
1843 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1847 if ( in_file_index < 0 || in_file_index >= nb_input_files ) {
1848 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1853 out_file = output_files[out_file_index];
1854 in_file = input_files[in_file_index];
1856 strcpy(out_file->title, in_file->title);
1857 strcpy(out_file->author, in_file->author);
1858 strcpy(out_file->copyright, in_file->copyright);
1859 strcpy(out_file->comment, in_file->comment);
1860 strcpy(out_file->album, in_file->album);
1861 out_file->year = in_file->year;
1862 out_file->track = in_file->track;
1863 strcpy(out_file->genre, in_file->genre);
1866 /* open files and write file headers */
1867 for(i=0;i<nb_output_files;i++) {
1868 os = output_files[i];
1869 if (av_write_header(os) < 0) {
1870 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1876 #ifndef CONFIG_WIN32
1877 if ( !using_stdin && verbose >= 0) {
1878 fprintf(stderr, "Press [q] to stop encoding\n");
1879 url_set_interrupt_cb(decode_interrupt_cb);
1887 for(; received_sigterm == 0;) {
1888 int file_index, ist_index;
1896 /* if 'q' pressed, exits */
1900 /* read_key() returns 0 on EOF */
1906 /* select the stream that we must read now by looking at the
1907 smallest output pts */
1909 for(i=0;i<nb_ostreams;i++) {
1912 os = output_files[ost->file_index];
1913 ist = ist_table[ost->source_index];
1914 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
1915 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
1917 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
1918 ipts = (double)ist->pts;
1919 if (!file_table[ist->file_index].eof_reached){
1920 if(ipts < ipts_min) {
1922 if(input_sync ) file_index = ist->file_index;
1924 if(opts < opts_min) {
1926 if(!input_sync) file_index = ist->file_index;
1929 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
1934 /* if none, if is finished */
1935 if (file_index < 0) {
1939 /* finish if recording time exhausted */
1940 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
1943 /* finish if limit size exhausted */
1944 if (limit_filesize != 0 && (limit_filesize * 1024) < url_ftell(&output_files[0]->pb))
1947 /* read a frame from it and output it in the fifo */
1948 is = input_files[file_index];
1949 if (av_read_frame(is, &pkt) < 0) {
1950 file_table[file_index].eof_reached = 1;
1951 if (opt_shortest) break; else continue; //
1955 stream_no_data = is;
1960 av_pkt_dump(stdout, &pkt, do_hex_dump);
1962 /* the following test is needed in case new streams appear
1963 dynamically in stream : we ignore them */
1964 if (pkt.stream_index >= file_table[file_index].nb_streams)
1965 goto discard_packet;
1966 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1967 ist = ist_table[ist_index];
1969 goto discard_packet;
1971 // fprintf(stderr, "next:%lld dts:%lld off:%lld %d\n", ist->next_pts, pkt.dts, input_files_ts_offset[ist->file_index], ist->st->codec->codec_type);
1972 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
1973 int64_t delta= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q) - ist->next_pts;
1974 if(ABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE && !copy_ts){
1975 input_files_ts_offset[ist->file_index]-= delta;
1977 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
1978 for(i=0; i<file_table[file_index].nb_streams; i++){
1979 int index= file_table[file_index].ist_index + i;
1980 ist_table[index]->next_pts += delta;
1981 ist_table[index]->is_start=1;
1986 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1987 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1990 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1991 ist->file_index, ist->index);
1993 av_free_packet(&pkt);
1998 av_free_packet(&pkt);
2000 /* dump report by using the output first video and audio streams */
2001 print_report(output_files, ost_table, nb_ostreams, 0);
2004 /* at the end of stream, we must flush the decoder buffers */
2005 for(i=0;i<nb_istreams;i++) {
2007 if (ist->decoding_needed) {
2008 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2014 /* write the trailer if needed and close file */
2015 for(i=0;i<nb_output_files;i++) {
2016 os = output_files[i];
2017 av_write_trailer(os);
2020 /* dump report by using the first video and audio streams */
2021 print_report(output_files, ost_table, nb_ostreams, 1);
2023 /* close each encoder */
2024 for(i=0;i<nb_ostreams;i++) {
2026 if (ost->encoding_needed) {
2027 av_freep(&ost->st->codec->stats_in);
2028 avcodec_close(ost->st->codec);
2032 /* close each decoder */
2033 for(i=0;i<nb_istreams;i++) {
2035 if (ist->decoding_needed) {
2036 avcodec_close(ist->st->codec);
2044 av_freep(&bit_buffer);
2045 av_free(file_table);
2048 for(i=0;i<nb_istreams;i++) {
2055 for(i=0;i<nb_ostreams;i++) {
2059 fclose(ost->logfile);
2060 ost->logfile = NULL;
2062 fifo_free(&ost->fifo); /* works even if fifo is not
2063 initialized but set to zero */
2064 av_free(ost->pict_tmp.data[0]);
2065 if (ost->video_resample)
2066 img_resample_close(ost->img_resample_ctx);
2067 if (ost->audio_resample)
2068 audio_resample_close(ost->resample);
2081 int file_read(const char *filename)
2084 unsigned char buffer[1024];
2087 if (url_open(&h, filename, O_RDONLY) < 0) {
2088 printf("could not open '%s'\n", filename);
2092 len = url_read(h, buffer, sizeof(buffer));
2095 for(i=0;i<len;i++) putchar(buffer[i]);
2102 static void opt_image_format(const char *arg)
2106 for(f = first_image_format; f != NULL; f = f->next) {
2107 if (!strcmp(arg, f->name))
2111 fprintf(stderr, "Unknown image format: '%s'\n", arg);
2117 static void opt_format(const char *arg)
2119 /* compatibility stuff for pgmyuv */
2120 if (!strcmp(arg, "pgmyuv")) {
2121 pgmyuv_compatibility_hack=1;
2122 // opt_image_format(arg);
2126 file_iformat = av_find_input_format(arg);
2127 file_oformat = guess_format(arg, NULL, NULL);
2128 if (!file_iformat && !file_oformat) {
2129 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2134 static void opt_video_bitrate(const char *arg)
2136 video_bit_rate = atoi(arg) * 1000;
2139 static void opt_video_bitrate_tolerance(const char *arg)
2141 video_bit_rate_tolerance = atoi(arg) * 1000;
2144 static void opt_video_bitrate_max(const char *arg)
2146 video_rc_max_rate = atoi(arg) * 1000;
2149 static void opt_video_bitrate_min(const char *arg)
2151 video_rc_min_rate = atoi(arg) * 1000;
2154 static void opt_video_buffer_size(const char *arg)
2156 video_rc_buffer_size = atoi(arg) * 8*1024;
2159 static void opt_video_rc_eq(char *arg)
2164 static void opt_video_rc_override_string(char *arg)
2166 video_rc_override_string = arg;
2170 static void opt_workaround_bugs(const char *arg)
2172 workaround_bugs = atoi(arg);
2175 static void opt_me_threshold(const char *arg)
2177 me_threshold = atoi(arg);
2180 static void opt_mb_threshold(const char *arg)
2182 mb_threshold = atoi(arg);
2185 static void opt_verbose(const char *arg)
2187 verbose = atoi(arg);
2188 av_log_set_level(atoi(arg));
2191 static void opt_frame_rate(const char *arg)
2193 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
2194 fprintf(stderr, "Incorrect frame rate\n");
2199 static void opt_frame_crop_top(const char *arg)
2201 frame_topBand = atoi(arg);
2202 if (frame_topBand < 0) {
2203 fprintf(stderr, "Incorrect top crop size\n");
2206 if ((frame_topBand % 2) != 0) {
2207 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2210 if ((frame_topBand) >= frame_height){
2211 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2214 frame_height -= frame_topBand;
2217 static void opt_frame_crop_bottom(const char *arg)
2219 frame_bottomBand = atoi(arg);
2220 if (frame_bottomBand < 0) {
2221 fprintf(stderr, "Incorrect bottom crop size\n");
2224 if ((frame_bottomBand % 2) != 0) {
2225 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2228 if ((frame_bottomBand) >= frame_height){
2229 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2232 frame_height -= frame_bottomBand;
2235 static void opt_frame_crop_left(const char *arg)
2237 frame_leftBand = atoi(arg);
2238 if (frame_leftBand < 0) {
2239 fprintf(stderr, "Incorrect left crop size\n");
2242 if ((frame_leftBand % 2) != 0) {
2243 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2246 if ((frame_leftBand) >= frame_width){
2247 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2250 frame_width -= frame_leftBand;
2253 static void opt_frame_crop_right(const char *arg)
2255 frame_rightBand = atoi(arg);
2256 if (frame_rightBand < 0) {
2257 fprintf(stderr, "Incorrect right crop size\n");
2260 if ((frame_rightBand % 2) != 0) {
2261 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2264 if ((frame_rightBand) >= frame_width){
2265 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2268 frame_width -= frame_rightBand;
2271 static void opt_frame_size(const char *arg)
2273 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2274 fprintf(stderr, "Incorrect frame size\n");
2277 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2278 fprintf(stderr, "Frame size must be a multiple of 2\n");
2284 #define SCALEBITS 10
2285 #define ONE_HALF (1 << (SCALEBITS - 1))
2286 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2288 #define RGB_TO_Y(r, g, b) \
2289 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2290 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2292 #define RGB_TO_U(r1, g1, b1, shift)\
2293 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2294 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2296 #define RGB_TO_V(r1, g1, b1, shift)\
2297 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2298 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2300 static void opt_pad_color(const char *arg) {
2301 /* Input is expected to be six hex digits similar to
2302 how colors are expressed in html tags (but without the #) */
2303 int rgb = strtol(arg, NULL, 16);
2307 g = ((rgb >> 8) & 255);
2310 padcolor[0] = RGB_TO_Y(r,g,b);
2311 padcolor[1] = RGB_TO_U(r,g,b,0);
2312 padcolor[2] = RGB_TO_V(r,g,b,0);
2315 static void opt_frame_pad_top(const char *arg)
2317 frame_padtop = atoi(arg);
2318 if (frame_padtop < 0) {
2319 fprintf(stderr, "Incorrect top pad size\n");
2322 if ((frame_padtop % 2) != 0) {
2323 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2328 static void opt_frame_pad_bottom(const char *arg)
2330 frame_padbottom = atoi(arg);
2331 if (frame_padbottom < 0) {
2332 fprintf(stderr, "Incorrect bottom pad size\n");
2335 if ((frame_padbottom % 2) != 0) {
2336 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2342 static void opt_frame_pad_left(const char *arg)
2344 frame_padleft = atoi(arg);
2345 if (frame_padleft < 0) {
2346 fprintf(stderr, "Incorrect left pad size\n");
2349 if ((frame_padleft % 2) != 0) {
2350 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2356 static void opt_frame_pad_right(const char *arg)
2358 frame_padright = atoi(arg);
2359 if (frame_padright < 0) {
2360 fprintf(stderr, "Incorrect right pad size\n");
2363 if ((frame_padright % 2) != 0) {
2364 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2370 static void opt_frame_pix_fmt(const char *arg)
2372 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2375 static void opt_frame_aspect_ratio(const char *arg)
2381 p = strchr(arg, ':');
2383 x = strtol(arg, (char **)&arg, 10);
2385 y = strtol(arg+1, (char **)&arg, 10);
2387 ar = (double)x / (double)y;
2389 ar = strtod(arg, (char **)&arg);
2392 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2395 frame_aspect_ratio = ar;
2398 static void opt_gop_size(const char *arg)
2400 gop_size = atoi(arg);
2403 static void opt_b_frames(const char *arg)
2405 b_frames = atoi(arg);
2406 if (b_frames > FF_MAX_B_FRAMES) {
2407 fprintf(stderr, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES);
2409 } else if (b_frames < 1) {
2410 fprintf(stderr, "\nNumber of B frames must be higher than 0\n");
2415 static void opt_pre_me(const char *arg)
2420 static void opt_qscale(const char *arg)
2422 video_qscale = atof(arg);
2423 if (video_qscale <= 0 ||
2424 video_qscale > 255) {
2425 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2430 static void opt_qsquish(const char *arg)
2432 video_qsquish = atof(arg);
2433 if (video_qsquish < 0.0 ||
2434 video_qsquish > 99.0) {
2435 fprintf(stderr, "qsquish must be >= 0.0 and <= 99.0\n");
2440 static void opt_lmax(const char *arg)
2442 video_lmax = atof(arg)*FF_QP2LAMBDA;
2445 static void opt_lmin(const char *arg)
2447 video_lmin = atof(arg)*FF_QP2LAMBDA;
2450 static void opt_qmin(const char *arg)
2452 video_qmin = atoi(arg);
2453 if (video_qmin < 1 ||
2455 fprintf(stderr, "qmin must be >= 1 and <= 51\n");
2460 static void opt_qmax(const char *arg)
2462 video_qmax = atoi(arg);
2463 if (video_qmax < 1 ||
2465 fprintf(stderr, "qmax must be >= 1 and <= 51\n");
2470 static void opt_mb_lmin(const char *arg)
2472 video_mb_lmin = atof(arg)*FF_QP2LAMBDA;
2473 if (video_mb_lmin < 1 ||
2474 video_mb_lmin > FF_LAMBDA_MAX) {
2475 fprintf(stderr, "mblmin must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
2480 static void opt_mb_lmax(const char *arg)
2482 video_mb_lmax = atof(arg)*FF_QP2LAMBDA;
2483 if (video_mb_lmax < 1 ||
2484 video_mb_lmax > FF_LAMBDA_MAX) {
2485 fprintf(stderr, "mblmax must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
2490 static void opt_qdiff(const char *arg)
2492 video_qdiff = atoi(arg);
2493 if (video_qdiff < 0 ||
2495 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2500 static void opt_qblur(const char *arg)
2502 video_qblur = atof(arg);
2505 static void opt_qcomp(const char *arg)
2507 video_qcomp = atof(arg);
2510 static void opt_rc_initial_cplx(const char *arg)
2512 video_rc_initial_cplx = atof(arg);
2514 static void opt_b_qfactor(const char *arg)
2516 video_b_qfactor = atof(arg);
2518 static void opt_i_qfactor(const char *arg)
2520 video_i_qfactor = atof(arg);
2522 static void opt_b_qoffset(const char *arg)
2524 video_b_qoffset = atof(arg);
2526 static void opt_i_qoffset(const char *arg)
2528 video_i_qoffset = atof(arg);
2531 static void opt_ibias(const char *arg)
2533 video_intra_quant_bias = atoi(arg);
2535 static void opt_pbias(const char *arg)
2537 video_inter_quant_bias = atoi(arg);
2540 static void opt_packet_size(const char *arg)
2542 packet_size= atoi(arg);
2545 static void opt_error_rate(const char *arg)
2547 error_rate= atoi(arg);
2550 static void opt_strict(const char *arg)
2555 static void opt_top_field_first(const char *arg)
2557 top_field_first= atoi(arg);
2560 static void opt_sc_threshold(const char *arg)
2562 sc_threshold= atoi(arg);
2565 static void opt_me_range(const char *arg)
2567 me_range = atoi(arg);
2570 static void opt_thread_count(const char *arg)
2572 thread_count= atoi(arg);
2573 #if !defined(HAVE_THREADS)
2575 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2579 static void opt_audio_bitrate(const char *arg)
2581 audio_bit_rate = atoi(arg) * 1000;
2584 static void opt_audio_rate(const char *arg)
2586 audio_sample_rate = atoi(arg);
2589 static void opt_audio_channels(const char *arg)
2591 audio_channels = atoi(arg);
2594 static void opt_video_device(const char *arg)
2596 video_device = av_strdup(arg);
2599 static void opt_grab_device(const char *arg)
2601 grab_device = av_strdup(arg);
2604 static void opt_video_channel(const char *arg)
2606 video_channel = strtol(arg, NULL, 0);
2609 static void opt_video_standard(const char *arg)
2611 video_standard = av_strdup(arg);
2614 static void opt_audio_device(const char *arg)
2616 audio_device = av_strdup(arg);
2619 static void opt_codec(int *pstream_copy, int *pcodec_id,
2620 int codec_type, const char *arg)
2624 if (!strcmp(arg, "copy")) {
2629 if (!strcmp(p->name, arg) && p->type == codec_type)
2634 fprintf(stderr, "Unknown codec '%s'\n", arg);
2642 static void opt_audio_codec(const char *arg)
2644 opt_codec(&audio_stream_copy, &audio_codec_id, CODEC_TYPE_AUDIO, arg);
2647 static void opt_audio_tag(const char *arg)
2650 audio_codec_tag= strtol(arg, &tail, 0);
2653 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2656 static void opt_video_tag(const char *arg)
2659 video_codec_tag= strtol(arg, &tail, 0);
2662 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2665 static void add_frame_hooker(const char *arg)
2670 char *args = av_strdup(arg);
2674 argv[0] = strtok(args, " ");
2675 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2678 i = frame_hook_add(argc, argv);
2681 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2686 const char *motion_str[] = {
2699 static void opt_motion_estimation(const char *arg)
2705 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2708 if (!strcmp(*p, arg))
2712 me_method = (p - motion_str) + 1;
2715 static void opt_video_codec(const char *arg)
2717 opt_codec(&video_stream_copy, &video_codec_id, CODEC_TYPE_VIDEO, arg);
2720 static void opt_subtitle_codec(const char *arg)
2722 opt_codec(&subtitle_stream_copy, &subtitle_codec_id, CODEC_TYPE_SUBTITLE, arg);
2725 static void opt_map(const char *arg)
2731 m = &stream_maps[nb_stream_maps++];
2733 m->file_index = strtol(arg, (char **)&p, 0);
2737 m->stream_index = strtol(p, (char **)&p, 0);
2740 m->sync_file_index = strtol(p, (char **)&p, 0);
2743 m->sync_stream_index = strtol(p, (char **)&p, 0);
2745 m->sync_file_index = m->file_index;
2746 m->sync_stream_index = m->stream_index;
2750 static void opt_map_meta_data(const char *arg)
2756 m = &meta_data_maps[nb_meta_data_maps++];
2758 m->out_file = strtol(arg, (char **)&p, 0);
2762 m->in_file = strtol(p, (char **)&p, 0);
2765 static void opt_recording_time(const char *arg)
2767 recording_time = parse_date(arg, 1);
2770 static void opt_start_time(const char *arg)
2772 start_time = parse_date(arg, 1);
2775 static void opt_rec_timestamp(const char *arg)
2777 rec_timestamp = parse_date(arg, 0) / 1000000;
2780 static void opt_input_ts_offset(const char *arg)
2782 input_ts_offset = parse_date(arg, 1);
2785 static void opt_input_file(const char *filename)
2787 AVFormatContext *ic;
2788 AVFormatParameters params, *ap = ¶ms;
2789 int err, i, ret, rfps, rfps_base;
2792 if (!strcmp(filename, "-"))
2795 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2796 !strcmp( filename, "/dev/stdin" );
2798 /* get default parameters from command line */
2799 memset(ap, 0, sizeof(*ap));
2800 ap->sample_rate = audio_sample_rate;
2801 ap->channels = audio_channels;
2802 ap->time_base.den = frame_rate;
2803 ap->time_base.num = frame_rate_base;
2804 ap->width = frame_width + frame_padleft + frame_padright;
2805 ap->height = frame_height + frame_padtop + frame_padbottom;
2806 ap->image_format = image_format;
2807 ap->pix_fmt = frame_pix_fmt;
2808 ap->device = grab_device;
2809 ap->channel = video_channel;
2810 ap->standard = video_standard;
2811 ap->video_codec_id = video_codec_id;
2812 ap->audio_codec_id = audio_codec_id;
2813 if(pgmyuv_compatibility_hack)
2814 ap->video_codec_id= CODEC_ID_PGMYUV;
2816 /* open the input file with generic libav function */
2817 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2819 print_error(filename, err);
2824 ic->flags|= AVFMT_FLAG_GENPTS;
2826 /* If not enough info to get the stream parameters, we decode the
2827 first frames to get it. (used in mpeg case for example) */
2828 ret = av_find_stream_info(ic);
2829 if (ret < 0 && verbose >= 0) {
2830 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2834 timestamp = start_time;
2835 /* add the stream start time */
2836 if (ic->start_time != AV_NOPTS_VALUE)
2837 timestamp += ic->start_time;
2839 /* if seeking requested, we execute it */
2840 if (start_time != 0) {
2841 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2843 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2844 filename, (double)timestamp / AV_TIME_BASE);
2846 /* reset seek info */
2850 /* update the current parameters so that they match the one of the input stream */
2851 for(i=0;i<ic->nb_streams;i++) {
2853 AVCodecContext *enc = ic->streams[i]->codec;
2854 #if defined(HAVE_THREADS)
2856 avcodec_thread_init(enc, thread_count);
2858 enc->thread_count= thread_count;
2859 switch(enc->codec_type) {
2860 case CODEC_TYPE_AUDIO:
2861 for(j=0; j<opt_name_count; j++){
2863 double d= av_get_double(avctx_opts, opt_names[j], &opt);
2864 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2865 av_set_double(enc, opt_names[j], d);
2867 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2868 audio_channels = enc->channels;
2869 audio_sample_rate = enc->sample_rate;
2871 ic->streams[i]->discard= AVDISCARD_ALL;
2873 case CODEC_TYPE_VIDEO:
2874 for(j=0; j<opt_name_count; j++){
2876 double d= av_get_double(avctx_opts, opt_names[j], &opt);
2877 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2878 av_set_double(enc, opt_names[j], d);
2880 frame_height = enc->height;
2881 frame_width = enc->width;
2882 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2883 frame_pix_fmt = enc->pix_fmt;
2884 rfps = ic->streams[i]->r_frame_rate.num;
2885 rfps_base = ic->streams[i]->r_frame_rate.den;
2886 enc->workaround_bugs = workaround_bugs;
2887 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2889 enc->debug |= FF_DEBUG_MV;
2891 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2894 fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2895 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2897 (float)rfps / rfps_base, rfps, rfps_base);
2899 /* update the current frame rate to match the stream frame rate */
2901 frame_rate_base = rfps_base;
2903 enc->rate_emu = rate_emu;
2905 ic->streams[i]->discard= AVDISCARD_ALL;
2906 else if(video_discard)
2907 ic->streams[i]->discard= video_discard;
2909 case CODEC_TYPE_DATA:
2911 case CODEC_TYPE_SUBTITLE:
2913 case CODEC_TYPE_UNKNOWN:
2920 input_files[nb_input_files] = ic;
2921 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2922 /* dump the file content */
2924 dump_format(ic, nb_input_files, filename, 0);
2927 file_iformat = NULL;
2928 file_oformat = NULL;
2929 image_format = NULL;
2937 static void opt_grab(const char *arg)
2939 file_iformat = av_find_input_format(arg);
2943 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
2945 int has_video, has_audio, i, j;
2946 AVFormatContext *ic;
2950 for(j=0;j<nb_input_files;j++) {
2951 ic = input_files[j];
2952 for(i=0;i<ic->nb_streams;i++) {
2953 AVCodecContext *enc = ic->streams[i]->codec;
2954 switch(enc->codec_type) {
2955 case CODEC_TYPE_AUDIO:
2958 case CODEC_TYPE_VIDEO:
2961 case CODEC_TYPE_DATA:
2962 case CODEC_TYPE_UNKNOWN:
2963 case CODEC_TYPE_SUBTITLE:
2970 *has_video_ptr = has_video;
2971 *has_audio_ptr = has_audio;
2974 static void new_video_stream(AVFormatContext *oc)
2977 AVCodecContext *video_enc;
2980 st = av_new_stream(oc, oc->nb_streams);
2982 fprintf(stderr, "Could not alloc stream\n");
2985 #if defined(HAVE_THREADS)
2987 avcodec_thread_init(st->codec, thread_count);
2990 video_enc = st->codec;
2993 video_enc->codec_tag= video_codec_tag;
2995 if( (video_global_header&1)
2996 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
2997 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2998 avctx_opts->flags|= CODEC_FLAG_GLOBAL_HEADER;
3000 if(video_global_header&2){
3001 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3002 avctx_opts->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3005 if (video_stream_copy) {
3006 st->stream_copy = 1;
3007 video_enc->codec_type = CODEC_TYPE_VIDEO;
3013 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
3014 if (video_codec_id != CODEC_ID_NONE)
3015 codec_id = video_codec_id;
3017 video_enc->codec_id = codec_id;
3018 codec = avcodec_find_encoder(codec_id);
3020 for(i=0; i<opt_name_count; i++){
3022 double d= av_get_double(avctx_opts, opt_names[i], &opt);
3023 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3024 av_set_double(video_enc, opt_names[i], d);
3027 video_enc->bit_rate = video_bit_rate;
3028 video_enc->bit_rate_tolerance = video_bit_rate_tolerance;
3029 video_enc->time_base.den = frame_rate;
3030 video_enc->time_base.num = frame_rate_base;
3031 if(codec && codec->supported_framerates){
3032 const AVRational *p= codec->supported_framerates;
3033 AVRational req= (AVRational){frame_rate, frame_rate_base};
3034 const AVRational *best=NULL;
3035 AVRational best_error= (AVRational){INT_MAX, 1};
3036 for(; p->den!=0; p++){
3037 AVRational error= av_sub_q(req, *p);
3038 if(error.num <0) error.num *= -1;
3039 if(av_cmp_q(error, best_error) < 0){
3044 video_enc->time_base.den= best->num;
3045 video_enc->time_base.num= best->den;
3048 video_enc->width = frame_width + frame_padright + frame_padleft;
3049 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3050 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3051 video_enc->pix_fmt = frame_pix_fmt;
3053 if(codec && codec->pix_fmts){
3054 const enum PixelFormat *p= codec->pix_fmts;
3056 if(*p == video_enc->pix_fmt)
3060 video_enc->pix_fmt = codec->pix_fmts[0];
3064 video_enc->gop_size = gop_size;
3066 video_enc->gop_size = 0;
3067 if (video_qscale || same_quality) {
3068 video_enc->flags |= CODEC_FLAG_QSCALE;
3069 video_enc->global_quality=
3070 st->quality = FF_QP2LAMBDA * video_qscale;
3074 video_enc->intra_matrix = intra_matrix;
3076 video_enc->inter_matrix = inter_matrix;
3078 video_enc->pre_me = pre_me;
3081 video_enc->max_b_frames = b_frames;
3082 video_enc->b_quant_factor = 2.0;
3084 video_enc->qmin = video_qmin;
3085 video_enc->qmax = video_qmax;
3086 video_enc->lmin = video_lmin;
3087 video_enc->lmax = video_lmax;
3088 video_enc->rc_qsquish = video_qsquish;
3089 video_enc->mb_lmin = video_mb_lmin;
3090 video_enc->mb_lmax = video_mb_lmax;
3091 video_enc->max_qdiff = video_qdiff;
3092 video_enc->qblur = video_qblur;
3093 video_enc->qcompress = video_qcomp;
3094 video_enc->rc_eq = video_rc_eq;
3095 video_enc->workaround_bugs = workaround_bugs;
3096 video_enc->thread_count = thread_count;
3097 p= video_rc_override_string;
3100 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3102 fprintf(stderr, "error parsing rc_override\n");
3105 video_enc->rc_override=
3106 av_realloc(video_enc->rc_override,
3107 sizeof(RcOverride)*(i+1));
3108 video_enc->rc_override[i].start_frame= start;
3109 video_enc->rc_override[i].end_frame = end;
3111 video_enc->rc_override[i].qscale= q;
3112 video_enc->rc_override[i].quality_factor= 1.0;
3115 video_enc->rc_override[i].qscale= 0;
3116 video_enc->rc_override[i].quality_factor= -q/100.0;
3121 video_enc->rc_override_count=i;
3123 video_enc->rc_max_rate = video_rc_max_rate;
3124 video_enc->rc_min_rate = video_rc_min_rate;
3125 video_enc->rc_buffer_size = video_rc_buffer_size;
3126 video_enc->rc_initial_buffer_occupancy = video_rc_buffer_size*3/4;
3127 video_enc->rc_buffer_aggressivity= video_rc_buffer_aggressivity;
3128 video_enc->rc_initial_cplx= video_rc_initial_cplx;
3129 video_enc->i_quant_factor = video_i_qfactor;
3130 video_enc->b_quant_factor = video_b_qfactor;
3131 video_enc->i_quant_offset = video_i_qoffset;
3132 video_enc->b_quant_offset = video_b_qoffset;
3133 video_enc->intra_quant_bias = video_intra_quant_bias;
3134 video_enc->inter_quant_bias = video_inter_quant_bias;
3135 video_enc->me_threshold= me_threshold;
3136 video_enc->mb_threshold= mb_threshold;
3137 video_enc->intra_dc_precision= intra_dc_precision - 8;
3138 video_enc->strict_std_compliance = strict;
3139 video_enc->error_rate = error_rate;
3140 video_enc->scenechange_threshold= sc_threshold;
3141 video_enc->me_range = me_range;
3142 video_enc->me_penalty_compensation= me_penalty_compensation;
3143 video_enc->frame_skip_threshold= frame_skip_threshold;
3144 video_enc->frame_skip_factor= frame_skip_factor;
3145 video_enc->frame_skip_exp= frame_skip_exp;
3148 video_enc->rtp_mode= 1;
3149 video_enc->rtp_payload_size= packet_size;
3153 video_enc->flags|= CODEC_FLAG_PSNR;
3155 video_enc->me_method = me_method;
3160 video_enc->flags |= CODEC_FLAG_PASS1;
3162 video_enc->flags |= CODEC_FLAG_PASS2;
3167 /* reset some key parameters */
3169 video_codec_id = CODEC_ID_NONE;
3170 video_stream_copy = 0;
3173 static void new_audio_stream(AVFormatContext *oc)
3176 AVCodecContext *audio_enc;
3179 st = av_new_stream(oc, oc->nb_streams);
3181 fprintf(stderr, "Could not alloc stream\n");
3184 #if defined(HAVE_THREADS)
3186 avcodec_thread_init(st->codec, thread_count);
3189 audio_enc = st->codec;
3190 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3193 audio_enc->codec_tag= audio_codec_tag;
3195 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3196 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3197 avctx_opts->flags|= CODEC_FLAG_GLOBAL_HEADER;
3199 if (audio_stream_copy) {
3200 st->stream_copy = 1;
3201 audio_enc->channels = audio_channels;
3203 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3205 for(i=0; i<opt_name_count; i++){
3207 double d= av_get_double(avctx_opts, opt_names[i], &opt);
3208 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3209 av_set_double(audio_enc, opt_names[i], d);
3212 if (audio_codec_id != CODEC_ID_NONE)
3213 codec_id = audio_codec_id;
3214 audio_enc->codec_id = codec_id;
3216 audio_enc->bit_rate = audio_bit_rate;
3217 if (audio_qscale > QSCALE_NONE) {
3218 audio_enc->flags |= CODEC_FLAG_QSCALE;
3219 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3221 audio_enc->strict_std_compliance = strict;
3222 audio_enc->thread_count = thread_count;
3223 /* For audio codecs other than AC3 or DTS we limit */
3224 /* the number of coded channels to stereo */
3225 if (audio_channels > 2 && codec_id != CODEC_ID_AC3
3226 && codec_id != CODEC_ID_DTS) {
3227 audio_enc->channels = 2;
3229 audio_enc->channels = audio_channels;
3231 audio_enc->sample_rate = audio_sample_rate;
3232 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3233 if (audio_language) {
3234 pstrcpy(st->language, sizeof(st->language), audio_language);
3235 av_free(audio_language);
3236 audio_language = NULL;
3239 /* reset some key parameters */
3241 audio_codec_id = CODEC_ID_NONE;
3242 audio_stream_copy = 0;
3245 static void opt_new_subtitle_stream(void)
3247 AVFormatContext *oc;
3249 AVCodecContext *subtitle_enc;
3252 if (nb_output_files <= 0) {
3253 fprintf(stderr, "At least one output file must be specified\n");
3256 oc = output_files[nb_output_files - 1];
3258 st = av_new_stream(oc, oc->nb_streams);
3260 fprintf(stderr, "Could not alloc stream\n");
3264 subtitle_enc = st->codec;
3265 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3266 if (subtitle_stream_copy) {
3267 st->stream_copy = 1;
3269 for(i=0; i<opt_name_count; i++){
3271 double d= av_get_double(avctx_opts, opt_names[i], &opt);
3272 if(d==d && (opt->flags&AV_OPT_FLAG_SUBTITLE_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3273 av_set_double(subtitle_enc, opt_names[i], d);
3275 subtitle_enc->codec_id = subtitle_codec_id;
3278 if (subtitle_language) {
3279 pstrcpy(st->language, sizeof(st->language), subtitle_language);
3280 av_free(subtitle_language);
3281 subtitle_language = NULL;
3284 subtitle_codec_id = CODEC_ID_NONE;
3285 subtitle_stream_copy = 0;
3288 static void opt_new_audio_stream(void)
3290 AVFormatContext *oc;
3291 if (nb_output_files <= 0) {
3292 fprintf(stderr, "At least one output file must be specified\n");
3295 oc = output_files[nb_output_files - 1];
3296 new_audio_stream(oc);
3299 static void opt_new_video_stream(void)
3301 AVFormatContext *oc;
3302 if (nb_output_files <= 0) {
3303 fprintf(stderr, "At least one output file must be specified\n");
3306 oc = output_files[nb_output_files - 1];
3307 new_video_stream(oc);
3310 static void opt_output_file(const char *filename)
3312 AVFormatContext *oc;
3313 int use_video, use_audio, input_has_video, input_has_audio;
3314 AVFormatParameters params, *ap = ¶ms;
3316 if (!strcmp(filename, "-"))
3319 oc = av_alloc_format_context();
3321 if (!file_oformat) {
3322 file_oformat = guess_format(NULL, filename, NULL);
3323 if (!file_oformat) {
3324 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
3330 oc->oformat = file_oformat;
3331 pstrcpy(oc->filename, sizeof(oc->filename), filename);
3333 if (!strcmp(file_oformat->name, "ffm") &&
3334 strstart(filename, "http:", NULL)) {
3335 /* special case for files sent to ffserver: we get the stream
3336 parameters from ffserver */
3337 if (read_ffserver_streams(oc, filename) < 0) {
3338 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
3342 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_id != CODEC_ID_NONE;
3343 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_id != CODEC_ID_NONE;
3345 /* disable if no corresponding type found and at least one
3347 if (nb_input_files > 0) {
3348 check_audio_video_inputs(&input_has_video, &input_has_audio);
3349 if (!input_has_video)
3351 if (!input_has_audio)
3355 /* manual disable */
3356 if (audio_disable) {
3359 if (video_disable) {
3364 new_video_stream(oc);
3368 new_audio_stream(oc);
3371 if (!oc->nb_streams) {
3372 fprintf(stderr, "No audio or video streams available\n");
3376 oc->timestamp = rec_timestamp;
3379 pstrcpy(oc->title, sizeof(oc->title), str_title);
3381 pstrcpy(oc->author, sizeof(oc->author), str_author);
3383 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3385 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3388 output_files[nb_output_files++] = oc;
3390 /* check filename in case of an image number is expected */
3391 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3392 if (filename_number_test(oc->filename) < 0) {
3393 print_error(oc->filename, AVERROR_NUMEXPECTED);
3398 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3399 /* test if it already exists to avoid loosing precious files */
3400 if (!file_overwrite &&
3401 (strchr(filename, ':') == NULL ||
3402 strstart(filename, "file:", NULL))) {
3403 if (url_exist(filename)) {
3406 if ( !using_stdin ) {
3407 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3410 if (toupper(c) != 'Y') {
3411 fprintf(stderr, "Not overwriting - exiting\n");
3416 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3423 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3424 fprintf(stderr, "Could not open '%s'\n", filename);
3429 memset(ap, 0, sizeof(*ap));
3430 ap->image_format = image_format;
3431 if (av_set_parameters(oc, ap) < 0) {
3432 fprintf(stderr, "%s: Invalid encoding parameters\n",
3437 oc->packet_size= mux_packet_size;
3438 oc->mux_rate= mux_rate;
3439 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3440 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3441 oc->loop_output = loop_output;
3443 /* reset some options */
3444 file_oformat = NULL;
3445 file_iformat = NULL;
3446 image_format = NULL;
3449 /* prepare dummy protocols for grab */
3450 static void prepare_grab(void)
3452 int has_video, has_audio, i, j;
3453 AVFormatContext *oc;
3454 AVFormatContext *ic;
3455 AVFormatParameters vp1, *vp = &vp1;
3456 AVFormatParameters ap1, *ap = &ap1;
3458 /* see if audio/video inputs are needed */
3461 memset(ap, 0, sizeof(*ap));
3462 memset(vp, 0, sizeof(*vp));
3463 vp->time_base.num= 1;
3464 for(j=0;j<nb_output_files;j++) {
3465 oc = output_files[j];
3466 for(i=0;i<oc->nb_streams;i++) {
3467 AVCodecContext *enc = oc->streams[i]->codec;
3468 switch(enc->codec_type) {
3469 case CODEC_TYPE_AUDIO:
3470 if (enc->sample_rate > ap->sample_rate)
3471 ap->sample_rate = enc->sample_rate;
3472 if (enc->channels > ap->channels)
3473 ap->channels = enc->channels;
3476 case CODEC_TYPE_VIDEO:
3477 if (enc->width > vp->width)
3478 vp->width = enc->width;
3479 if (enc->height > vp->height)
3480 vp->height = enc->height;
3482 if (vp->time_base.num*(int64_t)enc->time_base.den > enc->time_base.num*(int64_t)vp->time_base.den){
3483 vp->time_base = enc->time_base;
3484 vp->width += frame_leftBand + frame_rightBand;
3485 vp->width -= (frame_padleft + frame_padright);
3486 vp->height += frame_topBand + frame_bottomBand;
3487 vp->height -= (frame_padtop + frame_padbottom);
3497 if (has_video == 0 && has_audio == 0) {
3498 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3503 AVInputFormat *fmt1;
3504 fmt1 = av_find_input_format(video_grab_format);
3505 vp->device = video_device;
3506 vp->channel = video_channel;
3507 vp->standard = video_standard;
3508 vp->pix_fmt = frame_pix_fmt;
3509 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3510 fprintf(stderr, "Could not find video grab device\n");
3513 /* If not enough info to get the stream parameters, we decode the
3514 first frames to get it. */
3515 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3516 fprintf(stderr, "Could not find video grab parameters\n");
3519 /* by now video grab has one stream */
3520 ic->streams[0]->r_frame_rate.num = vp->time_base.den;
3521 ic->streams[0]->r_frame_rate.den = vp->time_base.num;
3522 input_files[nb_input_files] = ic;
3525 dump_format(ic, nb_input_files, "", 0);
3529 if (has_audio && audio_grab_format) {
3530 AVInputFormat *fmt1;
3531 fmt1 = av_find_input_format(audio_grab_format);
3532 ap->device = audio_device;
3533 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3534 fprintf(stderr, "Could not find audio grab device\n");
3537 input_files[nb_input_files] = ic;
3540 dump_format(ic, nb_input_files, "", 0);
3546 /* same option as mencoder */
3547 static void opt_pass(const char *pass_str)
3550 pass = atoi(pass_str);
3551 if (pass != 1 && pass != 2) {
3552 fprintf(stderr, "pass number can be only 1 or 2\n");
3558 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3559 static int64_t getutime(void)
3561 return av_gettime();
3564 static int64_t getutime(void)
3566 struct rusage rusage;
3568 getrusage(RUSAGE_SELF, &rusage);
3569 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3573 extern int ffm_nopts;
3575 static void show_formats(void)
3577 AVInputFormat *ifmt;
3578 AVOutputFormat *ofmt;
3579 AVImageFormat *image_fmt;
3582 const char **pp, *last_name;
3584 printf("File formats:\n");
3589 const char *name=NULL;
3590 const char *long_name=NULL;
3592 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3593 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3594 strcmp(ofmt->name, last_name)>0){
3596 long_name= ofmt->long_name;
3600 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3601 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3602 strcmp(ifmt->name, last_name)>0){
3604 long_name= ifmt->long_name;
3607 if(name && strcmp(ifmt->name, name)==0)
3619 long_name ? long_name:" ");
3623 printf("Image formats (filename extensions, if any, follow):\n");
3624 for(image_fmt = first_image_format; image_fmt != NULL;
3625 image_fmt = image_fmt->next) {
3628 image_fmt->img_read ? "D":" ",
3629 image_fmt->img_write ? "E":" ",
3631 image_fmt->extensions ? image_fmt->extensions:" ");
3635 printf("Codecs:\n");
3641 const char *type_str;
3644 for(p = first_avcodec; p != NULL; p = p->next) {
3645 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3646 strcmp(p->name, last_name)>0){
3648 decode= encode= cap=0;
3650 if(p2 && strcmp(p->name, p2->name)==0){
3651 if(p->decode) decode=1;
3652 if(p->encode) encode=1;
3653 cap |= p->capabilities;
3658 last_name= p2->name;
3661 case CODEC_TYPE_VIDEO:
3664 case CODEC_TYPE_AUDIO:
3667 case CODEC_TYPE_SUBTITLE:
3676 decode ? "D": (/*p2->decoder ? "d":*/" "),
3679 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3680 cap & CODEC_CAP_DR1 ? "D":" ",
3681 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3683 /* if(p2->decoder && decode==0)
3684 printf(" use %s for decoding", p2->decoder->name);*/
3689 printf("Supported file protocols:\n");
3690 for(up = first_protocol; up != NULL; up = up->next)
3691 printf(" %s:", up->name);
3694 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3695 printf("Motion estimation methods:\n");
3699 if ((pp - motion_str + 1) == ME_ZERO)
3700 printf("(fastest)");
3701 else if ((pp - motion_str + 1) == ME_FULL)
3702 printf("(slowest)");
3703 else if ((pp - motion_str + 1) == ME_EPZS)
3704 printf("(default)");
3709 "Note, the names of encoders and decoders dont always match, so there are\n"
3710 "several cases where the above table shows encoder only or decoder only entries\n"
3711 "even though both encoding and decoding are supported for example, the h263\n"
3712 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3717 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3720 const char *p = str;
3727 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3734 static void opt_inter_matrix(const char *arg)
3736 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3737 parse_matrix_coeffs(inter_matrix, arg);
3740 static void opt_intra_matrix(const char *arg)
3742 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3743 parse_matrix_coeffs(intra_matrix, arg);
3746 static void opt_target(const char *arg)
3749 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3751 if(!strncmp(arg, "pal-", 4)) {
3754 } else if(!strncmp(arg, "ntsc-", 5)) {
3757 } else if(!strncmp(arg, "film-", 5)) {
3762 /* Calculate FR via float to avoid int overflow */
3763 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3766 } else if((fr == 29970) || (fr == 23976)) {
3769 /* Try to determine PAL/NTSC by peeking in the input files */
3770 if(nb_input_files) {
3772 for(j = 0; j < nb_input_files; j++) {
3773 for(i = 0; i < input_files[j]->nb_streams; i++) {
3774 AVCodecContext *c = input_files[j]->streams[i]->codec;
3775 if(c->codec_type != CODEC_TYPE_VIDEO)
3777 fr = c->time_base.den * 1000 / c->time_base.num;
3781 } else if((fr == 29970) || (fr == 23976)) {
3791 if(verbose && norm >= 0)
3792 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3796 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3797 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3798 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3802 if(!strcmp(arg, "vcd")) {
3804 opt_video_codec("mpeg1video");
3805 opt_audio_codec("mp2");
3808 opt_frame_size(norm ? "352x240" : "352x288");
3809 opt_frame_rate(frame_rates[norm]);
3810 opt_gop_size(norm ? "18" : "15");
3812 video_bit_rate = 1150000;
3813 video_rc_max_rate = 1150000;
3814 video_rc_min_rate = 1150000;
3815 video_rc_buffer_size = 40*1024*8;
3817 audio_bit_rate = 224000;
3818 audio_sample_rate = 44100;
3820 mux_packet_size= 2324;
3821 mux_rate= 2352 * 75 * 8;
3823 /* We have to offset the PTS, so that it is consistent with the SCR.
3824 SCR starts at 36000, but the first two packs contain only padding
3825 and the first pack from the other stream, respectively, may also have
3826 been written before.
3827 So the real data starts at SCR 36000+3*1200. */
3828 mux_preload= (36000+3*1200) / 90000.0; //0.44
3829 } else if(!strcmp(arg, "svcd")) {
3831 opt_video_codec("mpeg2video");
3832 opt_audio_codec("mp2");
3835 opt_frame_size(norm ? "480x480" : "480x576");
3836 opt_frame_rate(frame_rates[norm]);
3837 opt_gop_size(norm ? "18" : "15");
3839 video_bit_rate = 2040000;
3840 video_rc_max_rate = 2516000;
3841 video_rc_min_rate = 0; //1145000;
3842 video_rc_buffer_size = 224*1024*8;
3843 opt_default("flags", "+SCAN_OFFSET");
3846 audio_bit_rate = 224000;
3847 audio_sample_rate = 44100;
3849 mux_packet_size= 2324;
3851 } else if(!strcmp(arg, "dvd")) {
3853 opt_video_codec("mpeg2video");
3854 opt_audio_codec("ac3");
3857 opt_frame_size(norm ? "720x480" : "720x576");
3858 opt_frame_rate(frame_rates[norm]);
3859 opt_gop_size(norm ? "18" : "15");
3861 video_bit_rate = 6000000;
3862 video_rc_max_rate = 9000000;
3863 video_rc_min_rate = 0; //1500000;
3864 video_rc_buffer_size = 224*1024*8;
3866 mux_packet_size= 2048; // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3867 mux_rate = 10080000; // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3869 audio_bit_rate = 448000;
3870 audio_sample_rate = 48000;
3872 } else if(!strncmp(arg, "dv", 2)) {
3876 opt_frame_size(norm ? "720x480" : "720x576");
3877 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3878 (norm ? "yuv411p" : "yuv420p"));
3879 opt_frame_rate(frame_rates[norm]);
3881 audio_sample_rate = 48000;
3885 fprintf(stderr, "Unknown target: %s\n", arg);
3890 static void show_version(void)
3892 /* TODO: add function interface to avutil and avformat */
3893 fprintf(stderr, "ffmpeg " FFMPEG_VERSION "\n"
3897 LIBAVUTIL_BUILD, avcodec_build(), LIBAVFORMAT_BUILD);
3901 static int opt_default(const char *opt, const char *arg){
3902 AVOption *o= av_set_string(avctx_opts, opt, arg);
3906 // av_log(NULL, AV_LOG_ERROR, "%s:%s: %f 0x%0X\n", opt, arg, av_get_double(avctx_opts, opt, NULL), (int)av_get_int(avctx_opts, opt, NULL));
3908 //FIXME we should always use avctx_opts, ... for storing options so there wont be any need to keep track of whats set over this
3909 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
3910 opt_names[opt_name_count++]= o->name;
3912 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3913 if(avctx_opts->flags & CODEC_FLAG_BITEXACT)
3916 if(avctx_opts->debug)
3917 av_log_set_level(AV_LOG_DEBUG);
3921 const OptionDef options[] = {
3923 { "L", 0, {(void*)show_license}, "show license" },
3924 { "h", 0, {(void*)show_help}, "show help" },
3925 { "version", 0, {(void*)show_version}, "show version" },
3926 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3927 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3928 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
3929 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3930 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3931 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3932 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3933 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3934 { "fs", HAS_ARG | OPT_INT, {(void*)&limit_filesize}, "set the limit file size", "limit_size" }, //
3935 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3936 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3937 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3938 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3939 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3940 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3941 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3942 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3943 "add timings for benchmarking" },
3944 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3945 "dump each input packet" },
3946 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3947 "when dumping packets, also dump the payload" },
3948 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3949 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3950 { "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)", "" },
3951 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3952 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3953 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3954 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3955 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3956 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3957 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3958 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3959 { "dts_delta_threshold", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "" },
3962 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
3963 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3964 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3965 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3966 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3967 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3968 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3969 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3970 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3971 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3972 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3973 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3974 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3975 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3976 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3977 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3978 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3979 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
3980 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3981 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3982 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3983 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
3984 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
3985 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
3986 { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
3987 { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
3988 { "mblmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmin}, "min macroblock quantiser scale (VBR)", "q" },
3989 { "mblmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmax}, "max macroblock quantiser scale (VBR)", "q" },
3990 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
3991 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
3992 { "qsquish", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qsquish}, "how to keep quantiser between qmin and qmax (0 = clip, 1 = use differentiable function)", "squish" },
3993 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
3994 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
3995 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
3996 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
3997 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
3998 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
3999 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
4000 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
4001 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
4002 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4003 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
4004 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
4005 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
4006 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffer size (in kByte)", "size" },
4007 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4008 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
4010 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
4011 { "mb_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_threshold}, "macroblock threshold", "" },
4012 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
4013 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
4014 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
4015 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
4016 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
4017 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
4018 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4019 "use same video quality as source (implies VBR)" },
4020 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4021 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
4022 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4023 "deinterlace pictures" },
4024 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4025 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
4026 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
4027 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4028 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4029 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4030 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
4031 { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
4032 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4033 { "mepc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&me_penalty_compensation}, "motion estimation bitrate penalty compensation", "factor (1.0 = 256)" },
4034 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4035 { "skip_threshold", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_threshold}, "frame skip threshold", "threshold" },
4036 { "skip_factor", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_factor}, "frame skip factor", "factor" },
4037 { "skip_exp", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_exp}, "frame skip exponent", "exponent" },
4038 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
4039 { "genpts", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&genpts }, "generate pts" },
4040 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4043 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
4044 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4045 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4046 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4047 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4048 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4049 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4050 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4051 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
4052 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4054 /* subtitle options */
4055 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4056 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
4057 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4060 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
4061 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4062 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4063 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
4065 /* G.2 grab options */
4066 { "grab", HAS_ARG | OPT_EXPERT | OPT_GRAB, {(void*)opt_grab}, "request grabbing using", "format" },
4067 { "gd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_grab_device}, "set grab device", "device" },
4070 { "muxrate", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_rate}, "set mux rate", "rate" },
4071 { "packetsize", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_packet_size}, "set packet size", "size" },
4072 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4073 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4074 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4078 static void show_banner(void)
4080 fprintf(stderr, "FFmpeg version " FFMPEG_VERSION ", Copyright (c) 2000-2004 Fabrice Bellard\n");
4081 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
4082 fprintf(stderr, " libavutil version: " AV_STRINGIFY(LIBAVUTIL_VERSION) "\n");
4083 fprintf(stderr, " libavcodec version: " AV_STRINGIFY(LIBAVCODEC_VERSION) "\n");
4084 fprintf(stderr, " libavformat version: " AV_STRINGIFY(LIBAVFORMAT_VERSION) "\n");
4085 fprintf(stderr, " built on " __DATE__ " " __TIME__);
4087 fprintf(stderr, ", gcc: " __VERSION__ "\n");
4089 fprintf(stderr, ", using a non-gcc compiler\n");
4093 static void show_license(void)
4098 "This program is free software; you can redistribute it and/or modify\n"
4099 "it under the terms of the GNU General Public License as published by\n"
4100 "the Free Software Foundation; either version 2 of the License, or\n"
4101 "(at your option) any later version.\n"
4103 "This program is distributed in the hope that it will be useful,\n"
4104 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
4105 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
4106 "GNU General Public License for more details.\n"
4108 "You should have received a copy of the GNU General Public License\n"
4109 "along with this program; if not, write to the Free Software\n"
4110 "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
4114 "This library is free software; you can redistribute it and/or\n"
4115 "modify it under the terms of the GNU Lesser General Public\n"
4116 "License as published by the Free Software Foundation; either\n"
4117 "version 2 of the License, or (at your option) any later version.\n"
4119 "This library is distributed in the hope that it will be useful,\n"
4120 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
4121 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
4122 "Lesser General Public License for more details.\n"
4124 "You should have received a copy of the GNU Lesser General Public\n"
4125 "License along with this library; if not, write to the Free Software\n"
4126 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
4132 static void show_help(void)
4135 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
4136 "Hyper fast Audio and Video encoder\n");
4138 show_help_options(options, "Main options:\n",
4139 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
4140 show_help_options(options, "\nVideo options:\n",
4141 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4143 show_help_options(options, "\nAdvanced Video options:\n",
4144 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4145 OPT_VIDEO | OPT_EXPERT);
4146 show_help_options(options, "\nAudio options:\n",
4147 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4149 show_help_options(options, "\nAdvanced Audio options:\n",
4150 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4151 OPT_AUDIO | OPT_EXPERT);
4152 show_help_options(options, "\nSubtitle options:\n",
4153 OPT_SUBTITLE | OPT_GRAB,
4155 show_help_options(options, "\nAudio/Video grab options:\n",
4158 show_help_options(options, "\nAdvanced options:\n",
4159 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4161 av_opt_show(avctx_opts, NULL);
4166 void parse_arg_file(const char *filename)
4168 opt_output_file(filename);
4171 int main(int argc, char **argv)
4178 avctx_opts= avcodec_alloc_context();
4186 parse_options(argc, argv, options);
4188 /* file converter / grab */
4189 if (nb_output_files <= 0) {
4190 fprintf(stderr, "Must supply at least one output file\n");
4194 if (nb_input_files == 0) {
4200 av_encode(output_files, nb_output_files, input_files, nb_input_files,
4201 stream_maps, nb_stream_maps);
4202 ti = getutime() - ti;
4204 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
4208 for(i=0;i<nb_output_files;i++) {
4209 /* maybe av_close_output_file ??? */
4210 AVFormatContext *s = output_files[i];
4212 if (!(s->oformat->flags & AVFMT_NOFILE))
4214 for(j=0;j<s->nb_streams;j++)
4215 av_free(s->streams[j]);
4218 for(i=0;i<nb_input_files;i++)
4219 av_close_input_file(input_files[i]);
4224 av_free(intra_matrix);
4226 av_free(inter_matrix);
4228 #ifdef POWERPC_PERFORMANCE_REPORT
4229 extern void powerpc_display_perf_report(void);
4230 powerpc_display_perf_report();
4231 #endif /* POWERPC_PERFORMANCE_REPORT */
4233 #ifndef CONFIG_WIN32
4234 if (received_sigterm) {
4236 "Received signal %d: terminating.\n",
4237 (int) received_sigterm);
4241 exit(0); /* not all OS-es handle main() return value */