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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #define HAVE_AV_CONFIG_H
22 #include "framehook.h"
28 #include <sys/ioctl.h>
31 #include <sys/resource.h>
35 #include <sys/types.h>
36 #include <sys/select.h>
39 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
47 #if !defined(INFINITY) && defined(HUGE_VAL)
48 #define INFINITY HUGE_VAL
51 /* select an input stream for an output stream */
52 typedef struct AVStreamMap {
57 /** select an input file for an output file */
58 typedef struct AVMetaDataMap {
63 extern const OptionDef options[];
65 static void show_help(void);
66 static void show_license(void);
70 static AVFormatContext *input_files[MAX_FILES];
71 static int64_t input_files_ts_offset[MAX_FILES];
72 static int nb_input_files = 0;
74 static AVFormatContext *output_files[MAX_FILES];
75 static int nb_output_files = 0;
77 static AVStreamMap stream_maps[MAX_FILES];
78 static int nb_stream_maps;
80 static AVMetaDataMap meta_data_maps[MAX_FILES];
81 static int nb_meta_data_maps;
83 static AVInputFormat *file_iformat;
84 static AVOutputFormat *file_oformat;
85 static AVImageFormat *image_format;
86 static int frame_width = 0;
87 static int frame_height = 0;
88 static float frame_aspect_ratio = 0;
89 static enum PixelFormat frame_pix_fmt = PIX_FMT_YUV420P;
90 static int frame_padtop = 0;
91 static int frame_padbottom = 0;
92 static int frame_padleft = 0;
93 static int frame_padright = 0;
94 static int padcolor[3] = {16,128,128}; /* default to black */
95 static int frame_topBand = 0;
96 static int frame_bottomBand = 0;
97 static int frame_leftBand = 0;
98 static int frame_rightBand = 0;
99 static int max_frames[3] = {INT_MAX, INT_MAX, INT_MAX};
100 static int frame_rate = 25;
101 static int frame_rate_base = 1;
102 static int video_bit_rate = 200*1000;
103 static int video_bit_rate_tolerance = 4000*1000;
104 static float video_qscale = 0;
105 static int video_qmin = 2;
106 static int video_qmax = 31;
107 static int video_lmin = 2*FF_QP2LAMBDA;
108 static int video_lmax = 31*FF_QP2LAMBDA;
109 static int video_mb_lmin = 2*FF_QP2LAMBDA;
110 static int video_mb_lmax = 31*FF_QP2LAMBDA;
111 static int video_qdiff = 3;
112 static int video_lelim = 0;
113 static int video_celim = 0;
114 static float video_qblur = 0.5;
115 static float video_qsquish = 0.0;
116 static float video_qcomp = 0.5;
117 static uint16_t *intra_matrix = NULL;
118 static uint16_t *inter_matrix = NULL;
119 #if 0 //experimental, (can be removed)
120 static float video_rc_qsquish=1.0;
121 static float video_rc_qmod_amp=0;
122 static int video_rc_qmod_freq=0;
124 static char *video_rc_override_string=NULL;
125 static char *video_rc_eq="tex^qComp";
126 static int video_rc_buffer_size=0;
127 static float video_rc_buffer_aggressivity=1.0;
128 static int video_rc_max_rate=0;
129 static int video_rc_min_rate=0;
130 static float video_rc_initial_cplx=0;
131 static float video_b_qfactor = 1.25;
132 static float video_b_qoffset = 1.25;
133 static float video_i_qfactor = -0.8;
134 static float video_i_qoffset = 0.0;
135 static int video_intra_quant_bias= FF_DEFAULT_QUANT_BIAS;
136 static int video_inter_quant_bias= FF_DEFAULT_QUANT_BIAS;
137 static int me_method = ME_EPZS;
138 static int video_disable = 0;
139 static int video_discard = 0;
140 static int video_codec_id = CODEC_ID_NONE;
141 static int video_codec_tag = 0;
142 static int same_quality = 0;
143 static int b_frames = 0;
144 static int mb_decision = FF_MB_DECISION_SIMPLE;
145 static int ildct_cmp = FF_CMP_VSAD;
146 static int mb_cmp = FF_CMP_SAD;
147 static int sub_cmp = FF_CMP_SAD;
148 static int cmp = FF_CMP_SAD;
149 static int pre_cmp = FF_CMP_SAD;
150 static int pre_me = 0;
151 static float lumi_mask = 0;
152 static float dark_mask = 0;
153 static float scplx_mask = 0;
154 static float tcplx_mask = 0;
155 static float p_mask = 0;
156 static int use_4mv = 0;
157 static int use_obmc = 0;
158 static int use_loop = 0;
159 static int use_aic = 0;
160 static int use_aiv = 0;
161 static int use_umv = 0;
162 static int use_ss = 0;
163 static int use_alt_scan = 0;
164 static int use_trell = 0;
165 static int use_scan_offset = 0;
166 static int use_qpel = 0;
167 static int use_qprd = 0;
168 static int use_cbprd = 0;
169 static int use_mv0 = 0;
170 static int do_normalize_aqp = 0;
172 static int closed_gop = 0;
173 static int strict_gop = 0;
174 static int no_output = 0;
175 static int do_deinterlace = 0;
176 static int do_interlace_dct = 0;
177 static int do_interlace_me = 0;
178 static int workaround_bugs = FF_BUG_AUTODETECT;
179 static int error_resilience = 2;
180 static int error_concealment = 3;
181 static int dct_algo = 0;
182 static int idct_algo = 0;
183 static int use_part = 0;
184 static int packet_size = 0;
185 static int error_rate = 0;
186 static int strict = 0;
187 static int top_field_first = -1;
188 static int noise_reduction = 0;
189 static int sc_threshold = 0;
190 static int debug = 0;
191 static int debug_mv = 0;
192 static int me_threshold = 0;
193 static int mb_threshold = 0;
194 static int intra_dc_precision = 8;
195 static int coder = 0;
196 static int context = 0;
197 static int predictor = 0;
198 static int video_profile = FF_PROFILE_UNKNOWN;
199 static int video_level = FF_LEVEL_UNKNOWN;
200 static int nsse_weight = 8;
201 static int subpel_quality= 8;
202 static int lowres= 0;
203 static int frame_skip_threshold= 0;
204 static int frame_skip_factor= 0;
205 static int frame_skip_exp= 0;
206 static int frame_skip_cmp= FF_CMP_DCTMAX;
207 extern int loop_input; /* currently a hack */
209 static int gop_size = 12;
210 static int intra_only = 0;
211 static int audio_sample_rate = 44100;
212 static int audio_bit_rate = 64000;
213 static int audio_disable = 0;
214 static int audio_channels = 1;
215 static int audio_codec_id = CODEC_ID_NONE;
216 static int audio_codec_tag = 0;
218 static int mux_rate= 0;
219 static int mux_packet_size= 0;
220 static float mux_preload= 0.5;
221 static float mux_max_delay= 0.7;
223 static int64_t recording_time = 0;
224 static int64_t start_time = 0;
225 static int64_t rec_timestamp = 0;
226 static int64_t input_ts_offset = 0;
227 static int file_overwrite = 0;
228 static char *str_title = NULL;
229 static char *str_author = NULL;
230 static char *str_copyright = NULL;
231 static char *str_comment = NULL;
232 static int do_benchmark = 0;
233 static int do_hex_dump = 0;
234 static int do_pkt_dump = 0;
235 static int do_psnr = 0;
236 static int do_vstats = 0;
237 static int do_pass = 0;
238 static int bitexact = 0;
239 static char *pass_logfilename = NULL;
240 static int audio_stream_copy = 0;
241 static int video_stream_copy = 0;
242 static int video_sync_method= 1;
243 static int audio_sync_method= 0;
244 static int copy_ts= 0;
245 static int opt_shortest = 0; //
247 static int rate_emu = 0;
249 static char *video_grab_format = "video4linux";
250 static char *video_device = NULL;
251 static char *grab_device = NULL;
252 static int video_channel = 0;
253 static char *video_standard = "ntsc";
255 static char *audio_grab_format = "audio_device";
256 static char *audio_device = NULL;
257 static int audio_volume = 100; //
259 static int using_stdin = 0;
260 static int using_vhook = 0;
261 static int verbose = 1;
262 static int thread_count= 1;
263 static int q_pressed = 0;
264 static int me_range = 0;
265 static int64_t video_size = 0;
266 static int64_t audio_size = 0;
267 static int64_t extra_size = 0;
268 static int nb_frames_dup = 0;
269 static int nb_frames_drop = 0;
270 static int input_sync;
271 static int limit_filesize = 0; //
273 static int pgmyuv_compatibility_hack=0;
276 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
278 typedef struct AVOutputStream {
279 int file_index; /* file index */
280 int index; /* stream index in the output file */
281 int source_index; /* AVInputStream index */
282 AVStream *st; /* stream in the output file */
283 int encoding_needed; /* true if encoding needed for this stream */
285 /* input pts and corresponding output pts
287 double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
288 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
290 int video_resample; /* video_resample and video_crop are mutually exclusive */
291 AVFrame pict_tmp; /* temporary image for resampling */
292 ImgReSampleContext *img_resample_ctx; /* for image resampling */
294 int video_crop; /* video_resample and video_crop are mutually exclusive */
295 int topBand; /* cropping area sizes */
298 int video_pad; /* video_resample and video_pad are mutually exclusive */
299 int padtop; /* padding area sizes */
306 ReSampleContext *resample; /* for audio resampling */
307 FifoBuffer fifo; /* for compression: one audio fifo per codec */
311 typedef struct AVInputStream {
315 int discard; /* true if stream data should be discarded */
316 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
317 int64_t sample_index; /* current sample */
319 int64_t start; /* time when read started */
320 unsigned long frame; /* current frame */
321 int64_t next_pts; /* synthetic pts for cases where pkt.pts
323 int64_t pts; /* current pts */
324 int is_start; /* is 1 at the start and after a discontinuity */
327 typedef struct AVInputFile {
328 int eof_reached; /* true if eof reached */
329 int ist_index; /* index of first stream in ist_table */
330 int buffer_size; /* current total buffer size */
331 int buffer_size_max; /* buffer size at which we consider we can stop
333 int nb_streams; /* nb streams we are aware of */
338 /* init terminal so that we can grab keys */
339 static struct termios oldtty;
341 static void term_exit(void)
343 tcsetattr (0, TCSANOW, &oldtty);
346 static volatile sig_atomic_t received_sigterm = 0;
349 sigterm_handler(int sig)
351 received_sigterm = sig;
355 static void term_init(void)
362 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
363 |INLCR|IGNCR|ICRNL|IXON);
364 tty.c_oflag |= OPOST;
365 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
366 tty.c_cflag &= ~(CSIZE|PARENB);
371 tcsetattr (0, TCSANOW, &tty);
373 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
374 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
375 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
377 register a function to be called at normal program termination
380 #ifdef CONFIG_BEOS_NETSERVER
381 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
385 /* read a key without blocking */
386 static int read_key(void)
390 #ifndef CONFIG_BEOS_NETSERVER
398 n = select(1, &rfds, NULL, NULL, &tv);
410 static int decode_interrupt_cb(void)
412 return q_pressed || (q_pressed = read_key() == 'q');
417 static volatile int received_sigterm = 0;
419 /* no interactive support */
420 static void term_exit(void)
424 static void term_init(void)
428 static int read_key(void)
435 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
440 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
443 /* copy stream format */
444 s->nb_streams = ic->nb_streams;
445 for(i=0;i<ic->nb_streams;i++) {
448 st = av_mallocz(sizeof(AVStream));
449 memcpy(st, ic->streams[i], sizeof(AVStream));
453 av_close_input_file(ic);
457 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
459 static void do_audio_out(AVFormatContext *s,
462 unsigned char *buf, int size)
465 static uint8_t *audio_buf = NULL;
466 static uint8_t *audio_out = NULL;
467 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
469 int size_out, frame_bytes, ret;
470 AVCodecContext *enc= &ost->st->codec;
472 /* SC: dynamic allocation of buffers */
474 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
476 audio_out = av_malloc(audio_out_size);
477 if (!audio_buf || !audio_out)
478 return; /* Should signal an error ! */
480 if(audio_sync_method){
481 double delta = ost->sync_ipts * enc->sample_rate - ost->sync_opts
482 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2);
483 double idelta= delta*ist->st->codec.sample_rate / enc->sample_rate;
484 int byte_delta= ((int)idelta)*2*ist->st->codec.channels;
486 //FIXME resample delay
487 if(fabs(delta) > 50){
490 byte_delta= FFMAX(byte_delta, -size);
494 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
499 static uint8_t *input_tmp= NULL;
500 input_tmp= av_realloc(input_tmp, byte_delta + size);
502 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
505 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
507 memset(input_tmp, 0, byte_delta);
508 memcpy(input_tmp + byte_delta, buf, size);
512 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
514 }else if(audio_sync_method>1){
515 int comp= clip(delta, -audio_sync_method, audio_sync_method);
516 assert(ost->audio_resample);
518 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
519 // fprintf(stderr, "drift:%f len:%d opts:%lld ipts:%lld fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(ost->sync_ipts * enc->sample_rate), fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2));
520 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
524 ost->sync_opts= lrintf(ost->sync_ipts * enc->sample_rate)
525 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2); //FIXME wrong
527 if (ost->audio_resample) {
529 size_out = audio_resample(ost->resample,
530 (short *)buftmp, (short *)buf,
531 size / (ist->st->codec.channels * 2));
532 size_out = size_out * enc->channels * 2;
538 /* now encode as many frames as possible */
539 if (enc->frame_size > 1) {
540 /* output resampled raw samples */
541 fifo_write(&ost->fifo, buftmp, size_out,
544 frame_bytes = enc->frame_size * 2 * enc->channels;
546 while (fifo_read(&ost->fifo, audio_buf, frame_bytes,
547 &ost->fifo.rptr) == 0) {
549 av_init_packet(&pkt);
551 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
554 pkt.stream_index= ost->index;
558 pkt.pts= enc->coded_frame->pts;
559 pkt.flags |= PKT_FLAG_KEY;
560 av_interleaved_write_frame(s, &pkt);
562 ost->sync_opts += enc->frame_size;
566 av_init_packet(&pkt);
568 ost->sync_opts += size_out / (2 * enc->channels);
570 /* output a pcm frame */
571 /* XXX: change encoding codec API to avoid this ? */
572 switch(enc->codec->id) {
573 case CODEC_ID_PCM_S16LE:
574 case CODEC_ID_PCM_S16BE:
575 case CODEC_ID_PCM_U16LE:
576 case CODEC_ID_PCM_U16BE:
579 size_out = size_out >> 1;
582 ret = avcodec_encode_audio(enc, audio_out, size_out,
585 pkt.stream_index= ost->index;
589 pkt.pts= enc->coded_frame->pts;
590 pkt.flags |= PKT_FLAG_KEY;
591 av_interleaved_write_frame(s, &pkt);
595 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
599 AVPicture picture_tmp;
602 dec = &ist->st->codec;
604 /* deinterlace : must be done before any resize */
605 if (do_deinterlace || using_vhook) {
608 /* create temporary picture */
609 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
610 buf = av_malloc(size);
614 picture2 = &picture_tmp;
615 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
618 if(avpicture_deinterlace(picture2, picture,
619 dec->pix_fmt, dec->width, dec->height) < 0) {
620 /* if error, do not deinterlace */
626 if (img_convert(picture2, dec->pix_fmt, picture,
627 dec->pix_fmt, dec->width, dec->height) < 0) {
628 /* if error, do not copy */
638 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
640 if (picture != picture2)
641 *picture = *picture2;
645 /* we begin to correct av delay at this threshold */
646 #define AV_DELAY_MAX 0.100
649 /* Expects img to be yuv420 */
650 static void fill_pad_region(AVPicture* img, int height, int width,
651 int padtop, int padbottom, int padleft, int padright, int *color) {
656 for (i = 0; i < 3; i++) {
657 shift = (i == 0) ? 0 : 1;
659 if (padtop || padleft) {
660 memset(img->data[i], color[i], (((img->linesize[i] * padtop) +
664 if (padleft || padright) {
665 optr = img->data[i] + (img->linesize[i] * (padtop >> shift)) +
666 (img->linesize[i] - (padright >> shift));
668 for (y = 0; y < ((height - (padtop + padbottom) - 1) >> shift); y++) {
669 memset(optr, color[i], (padleft + padright) >> shift);
670 optr += img->linesize[i];
674 if (padbottom || padright) {
675 optr = img->data[i] + (((img->linesize[i] * (height - padbottom)) - padright) >> shift);
676 memset(optr, color[i], (((img->linesize[i] * padbottom) + padright) >> shift));
681 static int bit_buffer_size= 1024*256;
682 static uint8_t *bit_buffer= NULL;
684 static void do_video_out(AVFormatContext *s,
690 int nb_frames, i, ret;
691 AVFrame *final_picture, *formatted_picture;
692 AVFrame picture_format_temp, picture_crop_temp;
693 uint8_t *buf = NULL, *buf1 = NULL;
694 AVCodecContext *enc, *dec;
695 enum PixelFormat target_pixfmt;
697 avcodec_get_frame_defaults(&picture_format_temp);
698 avcodec_get_frame_defaults(&picture_crop_temp);
700 enc = &ost->st->codec;
701 dec = &ist->st->codec;
703 /* by default, we output a single frame */
708 if(video_sync_method){
710 vdelta = ost->sync_ipts * enc->frame_rate / enc->frame_rate_base - ost->sync_opts;
711 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
714 else if (vdelta > 1.1)
715 nb_frames = lrintf(vdelta);
716 //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);
720 fprintf(stderr, "*** drop!\n");
721 }else if (nb_frames > 1) {
722 nb_frames_dup += nb_frames;
724 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
727 ost->sync_opts= lrintf(ost->sync_ipts * enc->frame_rate / enc->frame_rate_base);
729 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
733 /* convert pixel format if needed */
734 target_pixfmt = ost->video_resample || ost->video_pad
735 ? PIX_FMT_YUV420P : enc->pix_fmt;
736 if (dec->pix_fmt != target_pixfmt) {
739 /* create temporary picture */
740 size = avpicture_get_size(target_pixfmt, dec->width, dec->height);
741 buf = av_malloc(size);
744 formatted_picture = &picture_format_temp;
745 avpicture_fill((AVPicture*)formatted_picture, buf, target_pixfmt, dec->width, dec->height);
747 if (img_convert((AVPicture*)formatted_picture, target_pixfmt,
748 (AVPicture *)in_picture, dec->pix_fmt,
749 dec->width, dec->height) < 0) {
752 fprintf(stderr, "pixel format conversion not handled\n");
757 formatted_picture = in_picture;
760 /* XXX: resampling could be done before raw format conversion in
761 some cases to go faster */
762 /* XXX: only works for YUV420P */
763 if (ost->video_resample) {
764 final_picture = &ost->pict_tmp;
765 img_resample(ost->img_resample_ctx, (AVPicture*)final_picture, (AVPicture*)formatted_picture);
767 if (ost->padtop || ost->padbottom || ost->padleft || ost->padright) {
768 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
769 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
773 if (enc->pix_fmt != PIX_FMT_YUV420P) {
777 /* create temporary picture */
778 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
779 buf = av_malloc(size);
782 final_picture = &picture_format_temp;
783 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
785 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
786 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
787 enc->width, enc->height) < 0) {
790 fprintf(stderr, "pixel format conversion not handled\n");
795 } else if (ost->video_crop) {
796 picture_crop_temp.data[0] = formatted_picture->data[0] +
797 (ost->topBand * formatted_picture->linesize[0]) + ost->leftBand;
799 picture_crop_temp.data[1] = formatted_picture->data[1] +
800 ((ost->topBand >> 1) * formatted_picture->linesize[1]) +
801 (ost->leftBand >> 1);
803 picture_crop_temp.data[2] = formatted_picture->data[2] +
804 ((ost->topBand >> 1) * formatted_picture->linesize[2]) +
805 (ost->leftBand >> 1);
807 picture_crop_temp.linesize[0] = formatted_picture->linesize[0];
808 picture_crop_temp.linesize[1] = formatted_picture->linesize[1];
809 picture_crop_temp.linesize[2] = formatted_picture->linesize[2];
810 final_picture = &picture_crop_temp;
811 } else if (ost->video_pad) {
812 final_picture = &ost->pict_tmp;
814 for (i = 0; i < 3; i++) {
815 uint8_t *optr, *iptr;
816 int shift = (i == 0) ? 0 : 1;
819 /* set offset to start writing image into */
820 optr = final_picture->data[i] + (((final_picture->linesize[i] *
821 ost->padtop) + ost->padleft) >> shift);
822 iptr = formatted_picture->data[i];
824 yheight = (enc->height - ost->padtop - ost->padbottom) >> shift;
825 for (y = 0; y < yheight; y++) {
826 /* copy unpadded image row into padded image row */
827 memcpy(optr, iptr, formatted_picture->linesize[i]);
828 optr += final_picture->linesize[i];
829 iptr += formatted_picture->linesize[i];
833 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
834 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
837 if (enc->pix_fmt != PIX_FMT_YUV420P) {
841 /* create temporary picture */
842 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
843 buf = av_malloc(size);
846 final_picture = &picture_format_temp;
847 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
849 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
850 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
851 enc->width, enc->height) < 0) {
854 fprintf(stderr, "pixel format conversion not handled\n");
860 final_picture = formatted_picture;
862 /* duplicates frame if needed */
863 for(i=0;i<nb_frames;i++) {
865 av_init_packet(&pkt);
866 pkt.stream_index= ost->index;
868 if (s->oformat->flags & AVFMT_RAWPICTURE) {
869 /* raw pictures are written as AVPicture structure to
870 avoid any copies. We support temorarily the older
872 AVFrame* old_frame = enc->coded_frame;
873 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
874 pkt.data= (uint8_t *)final_picture;
875 pkt.size= sizeof(AVPicture);
877 pkt.pts= dec->coded_frame->pts;
878 if(dec->coded_frame && dec->coded_frame->key_frame)
879 pkt.flags |= PKT_FLAG_KEY;
881 av_interleaved_write_frame(s, &pkt);
882 enc->coded_frame = old_frame;
886 big_picture= *final_picture;
887 /* better than nothing: use input picture interlaced
889 big_picture.interlaced_frame = in_picture->interlaced_frame;
890 if(do_interlace_me || do_interlace_dct){
891 if(top_field_first == -1)
892 big_picture.top_field_first = in_picture->top_field_first;
894 big_picture.top_field_first = top_field_first;
897 /* handles sameq here. This is not correct because it may
898 not be a global option */
900 big_picture.quality = ist->st->quality;
902 big_picture.quality = ost->st->quality;
904 big_picture.pict_type = 0;
905 // big_picture.pts = AV_NOPTS_VALUE;
906 big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->frame_rate_base, enc->frame_rate);
907 //av_log(NULL, AV_LOG_DEBUG, "%lld -> encoder\n", ost->sync_opts);
908 ret = avcodec_encode_video(enc,
909 bit_buffer, bit_buffer_size,
911 //enc->frame_number = enc->real_pict_num;
913 pkt.data= bit_buffer;
916 pkt.pts= enc->coded_frame->pts;
917 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %lld/%lld\n",
918 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1,
919 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1);*/
921 if(enc->coded_frame && enc->coded_frame->key_frame)
922 pkt.flags |= PKT_FLAG_KEY;
923 av_interleaved_write_frame(s, &pkt);
925 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
926 // enc->frame_number-1, enc->real_pict_num, ret,
928 /* if two pass, output log */
929 if (ost->logfile && enc->stats_out) {
930 fprintf(ost->logfile, "%s", enc->stats_out);
942 static double psnr(double d){
943 if(d==0) return INFINITY;
944 return -10.0*log(d)/log(10.0);
947 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
950 static FILE *fvstats=NULL;
957 double ti1, bitrate, avg_bitrate;
961 today = localtime(&today2);
962 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour,
965 fvstats = fopen(filename,"w");
973 enc = &ost->st->codec;
974 if (enc->codec_type == CODEC_TYPE_VIDEO) {
975 frame_number = ost->frame_number;
976 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
977 if (enc->flags&CODEC_FLAG_PSNR)
978 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
980 fprintf(fvstats,"f_size= %6d ", frame_size);
981 /* compute pts value */
982 ti1 = (double)ost->sync_opts *enc->frame_rate_base / enc->frame_rate;
986 bitrate = (double)(frame_size * 8) * enc->frame_rate / enc->frame_rate_base / 1000.0;
987 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
988 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
989 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
990 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
994 static void print_report(AVFormatContext **output_files,
995 AVOutputStream **ost_table, int nb_ostreams,
1000 AVFormatContext *oc, *os;
1002 AVCodecContext *enc;
1003 int frame_number, vid, i;
1004 double bitrate, ti1, pts;
1005 static int64_t last_time = -1;
1007 if (!is_last_report) {
1009 /* display the report every 0.5 seconds */
1010 cur_time = av_gettime();
1011 if (last_time == -1) {
1012 last_time = cur_time;
1015 if ((cur_time - last_time) < 500000)
1017 last_time = cur_time;
1021 oc = output_files[0];
1023 total_size = url_ftell(&oc->pb);
1028 for(i=0;i<nb_ostreams;i++) {
1030 os = output_files[ost->file_index];
1031 enc = &ost->st->codec;
1032 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1033 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1034 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1036 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1037 frame_number = ost->frame_number;
1038 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d q=%2.1f ",
1039 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : 0);
1041 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1042 if (enc->flags&CODEC_FLAG_PSNR){
1044 double error, error_sum=0;
1045 double scale, scale_sum=0;
1046 char type[3]= {'Y','U','V'};
1047 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1050 error= enc->error[j];
1051 scale= enc->width*enc->height*255.0*255.0*frame_number;
1053 error= enc->coded_frame->error[j];
1054 scale= enc->width*enc->height*255.0*255.0;
1059 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1061 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1065 /* compute min output value */
1066 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1067 if ((pts < ti1) && (pts > 0))
1073 if (verbose || is_last_report) {
1074 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1076 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1077 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
1078 (double)total_size / 1024, ti1, bitrate);
1081 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1082 nb_frames_dup, nb_frames_drop);
1085 fprintf(stderr, "%s \r", buf);
1090 if (is_last_report && verbose >= 0){
1091 int64_t raw= audio_size + video_size + extra_size;
1092 fprintf(stderr, "\n");
1093 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1097 100.0*(total_size - raw)/raw
1102 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1103 static int output_packet(AVInputStream *ist, int ist_index,
1104 AVOutputStream **ost_table, int nb_ostreams,
1105 const AVPacket *pkt)
1107 AVFormatContext *os;
1108 AVOutputStream *ost;
1112 int data_size, got_picture;
1114 void *buffer_to_free;
1115 static int samples_size= 0;
1116 static short *samples= NULL;
1119 ist->pts= ist->next_pts; // needed for last packet if vsync=0
1120 } else if (pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1121 ist->next_pts = ist->pts = pkt->dts;
1123 // assert(ist->pts == ist->next_pts);
1137 /* decode the packet if needed */
1138 data_buf = NULL; /* fail safe */
1140 if (ist->decoding_needed) {
1141 switch(ist->st->codec.codec_type) {
1142 case CODEC_TYPE_AUDIO:{
1144 samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE));
1145 /* XXX: could avoid copy if PCM 16 bits with same
1146 endianness as CPU */
1147 ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size,
1153 /* Some bug in mpeg audio decoder gives */
1154 /* data_size < 0, it seems they are overflows */
1155 if (data_size <= 0) {
1156 /* no audio frame */
1159 data_buf = (uint8_t *)samples;
1160 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1161 (ist->st->codec.sample_rate * ist->st->codec.channels);
1163 case CODEC_TYPE_VIDEO:
1164 data_size = (ist->st->codec.width * ist->st->codec.height * 3) / 2;
1165 /* XXX: allocate picture correctly */
1166 avcodec_get_frame_defaults(&picture);
1168 ret = avcodec_decode_video(&ist->st->codec,
1169 &picture, &got_picture, ptr, len);
1170 ist->st->quality= picture.quality;
1174 /* no picture yet */
1175 goto discard_packet;
1177 if (ist->st->codec.frame_rate_base != 0) {
1178 ist->next_pts += ((int64_t)AV_TIME_BASE *
1179 ist->st->codec.frame_rate_base) /
1180 ist->st->codec.frame_rate;
1188 switch(ist->st->codec.codec_type) {
1189 case CODEC_TYPE_AUDIO:
1190 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec.frame_size) /
1191 (ist->st->codec.sample_rate * ist->st->codec.channels);
1193 case CODEC_TYPE_VIDEO:
1194 if (ist->st->codec.frame_rate_base != 0) {
1195 ist->next_pts += ((int64_t)AV_TIME_BASE *
1196 ist->st->codec.frame_rate_base) /
1197 ist->st->codec.frame_rate;
1207 buffer_to_free = NULL;
1208 if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1209 pre_process_video_frame(ist, (AVPicture *)&picture,
1213 // preprocess audio (volume)
1214 if (ist->st->codec.codec_type == CODEC_TYPE_AUDIO) {
1215 if (audio_volume != 100) {
1219 for(i=0;i<(data_size / sizeof(short));i++) {
1220 v = (*volp) * audio_volume / 100;
1221 if (v < -32768) v = -32768;
1222 if (v > 32767) v = 32767;
1228 /* frame rate emulation */
1229 if (ist->st->codec.rate_emu) {
1230 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec.frame_rate_base, 1000000, ist->st->codec.frame_rate);
1231 int64_t now = av_gettime() - ist->start;
1239 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1240 is the one of the next displayed one */
1241 /* XXX: add mpeg4 too ? */
1242 if (ist->st->codec.codec_id == CODEC_ID_MPEG1VIDEO) {
1243 if (ist->st->codec.pict_type != B_TYPE) {
1245 tmp = ist->last_ip_pts;
1246 ist->last_ip_pts = ist->frac_pts.val;
1247 ist->frac_pts.val = tmp;
1251 /* if output time reached then transcode raw format,
1252 encode packets and output them */
1253 if (start_time == 0 || ist->pts >= start_time)
1254 for(i=0;i<nb_ostreams;i++) {
1258 if (ost->source_index == ist_index) {
1259 os = output_files[ost->file_index];
1262 printf("%d: got pts=%0.3f %0.3f\n", i,
1263 (double)pkt->pts / AV_TIME_BASE,
1264 ((double)ist->pts / AV_TIME_BASE) -
1265 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1267 /* set the input output pts pairs */
1268 ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index])/ AV_TIME_BASE;
1270 if (ost->encoding_needed) {
1271 switch(ost->st->codec.codec_type) {
1272 case CODEC_TYPE_AUDIO:
1273 do_audio_out(os, ost, ist, data_buf, data_size);
1275 case CODEC_TYPE_VIDEO:
1276 do_video_out(os, ost, ist, &picture, &frame_size);
1277 video_size += frame_size;
1278 if (do_vstats && frame_size)
1279 do_video_stats(os, ost, frame_size);
1285 AVFrame avframe; //FIXME/XXX remove this
1287 av_init_packet(&opkt);
1289 /* no reencoding needed : output the packet directly */
1290 /* force the input stream PTS */
1292 avcodec_get_frame_defaults(&avframe);
1293 ost->st->codec.coded_frame= &avframe;
1294 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1296 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO)
1297 audio_size += data_size;
1298 else if (ost->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1299 video_size += data_size;
1303 opkt.stream_index= ost->index;
1304 opkt.data= data_buf;
1305 opkt.size= data_size;
1306 if(pkt->pts != AV_NOPTS_VALUE)
1307 opkt.pts= pkt->pts + input_files_ts_offset[ist->file_index];
1309 opkt.pts= AV_NOPTS_VALUE;
1310 opkt.dts= pkt->dts + input_files_ts_offset[ist->file_index];
1311 opkt.flags= pkt->flags;
1313 av_interleaved_write_frame(os, &opkt);
1314 ost->st->codec.frame_number++;
1315 ost->frame_number++;
1319 av_free(buffer_to_free);
1325 for(i=0;i<nb_ostreams;i++) {
1327 if (ost->source_index == ist_index) {
1328 AVCodecContext *enc= &ost->st->codec;
1329 os = output_files[ost->file_index];
1331 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1333 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1336 if (ost->encoding_needed) {
1339 av_init_packet(&pkt);
1340 pkt.stream_index= ost->index;
1342 switch(ost->st->codec.codec_type) {
1343 case CODEC_TYPE_AUDIO:
1344 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1346 pkt.flags |= PKT_FLAG_KEY;
1348 case CODEC_TYPE_VIDEO:
1349 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1351 if(enc->coded_frame && enc->coded_frame->key_frame)
1352 pkt.flags |= PKT_FLAG_KEY;
1353 if (ost->logfile && enc->stats_out) {
1354 fprintf(ost->logfile, "%s", enc->stats_out);
1363 pkt.data= bit_buffer;
1365 if(enc->coded_frame)
1366 pkt.pts= enc->coded_frame->pts;
1367 av_interleaved_write_frame(os, &pkt);
1381 * The following code is the main loop of the file converter
1383 static int av_encode(AVFormatContext **output_files,
1384 int nb_output_files,
1385 AVFormatContext **input_files,
1387 AVStreamMap *stream_maps, int nb_stream_maps)
1389 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1390 AVFormatContext *is, *os;
1391 AVCodecContext *codec, *icodec;
1392 AVOutputStream *ost, **ost_table = NULL;
1393 AVInputStream *ist, **ist_table = NULL;
1394 AVInputFile *file_table;
1395 AVFormatContext *stream_no_data;
1398 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1402 /* input stream init */
1404 for(i=0;i<nb_input_files;i++) {
1405 is = input_files[i];
1406 file_table[i].ist_index = j;
1407 file_table[i].nb_streams = is->nb_streams;
1408 j += is->nb_streams;
1412 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1416 for(i=0;i<nb_istreams;i++) {
1417 ist = av_mallocz(sizeof(AVInputStream));
1423 for(i=0;i<nb_input_files;i++) {
1424 is = input_files[i];
1425 for(k=0;k<is->nb_streams;k++) {
1426 ist = ist_table[j++];
1427 ist->st = is->streams[k];
1428 ist->file_index = i;
1430 ist->discard = 1; /* the stream is discarded by default
1433 if (ist->st->codec.rate_emu) {
1434 ist->start = av_gettime();
1440 /* output stream init */
1442 for(i=0;i<nb_output_files;i++) {
1443 os = output_files[i];
1444 nb_ostreams += os->nb_streams;
1446 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1447 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1451 /* Sanity check the mapping args -- do the input files & streams exist? */
1452 for(i=0;i<nb_stream_maps;i++) {
1453 int fi = stream_maps[i].file_index;
1454 int si = stream_maps[i].stream_index;
1456 if (fi < 0 || fi > nb_input_files - 1 ||
1457 si < 0 || si > file_table[fi].nb_streams - 1) {
1458 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1463 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1466 for(i=0;i<nb_ostreams;i++) {
1467 ost = av_mallocz(sizeof(AVOutputStream));
1474 for(k=0;k<nb_output_files;k++) {
1475 os = output_files[k];
1476 for(i=0;i<os->nb_streams;i++) {
1478 ost = ost_table[n++];
1479 ost->file_index = k;
1481 ost->st = os->streams[i];
1482 if (nb_stream_maps > 0) {
1483 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1484 stream_maps[n-1].stream_index;
1486 /* Sanity check that the stream types match */
1487 if (ist_table[ost->source_index]->st->codec.codec_type != ost->st->codec.codec_type) {
1488 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1489 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1490 ost->file_index, ost->index);
1495 /* get corresponding input stream index : we select the first one with the right type */
1497 for(j=0;j<nb_istreams;j++) {
1500 ist->st->codec.codec_type == ost->st->codec.codec_type) {
1501 ost->source_index = j;
1508 /* try again and reuse existing stream */
1509 for(j=0;j<nb_istreams;j++) {
1511 if (ist->st->codec.codec_type == ost->st->codec.codec_type) {
1512 ost->source_index = j;
1517 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1518 ost->file_index, ost->index);
1523 ist = ist_table[ost->source_index];
1528 /* for each output stream, we compute the right encoding parameters */
1529 for(i=0;i<nb_ostreams;i++) {
1531 ist = ist_table[ost->source_index];
1533 codec = &ost->st->codec;
1534 icodec = &ist->st->codec;
1536 if (ost->st->stream_copy) {
1537 /* if stream_copy is selected, no need to decode or encode */
1538 codec->codec_id = icodec->codec_id;
1539 codec->codec_type = icodec->codec_type;
1540 if(!codec->codec_tag) codec->codec_tag = icodec->codec_tag;
1541 codec->bit_rate = icodec->bit_rate;
1542 switch(codec->codec_type) {
1543 case CODEC_TYPE_AUDIO:
1544 codec->sample_rate = icodec->sample_rate;
1545 codec->channels = icodec->channels;
1546 codec->frame_size = icodec->frame_size;
1547 codec->block_align= icodec->block_align;
1549 case CODEC_TYPE_VIDEO:
1550 codec->frame_rate = icodec->frame_rate;
1551 codec->frame_rate_base = icodec->frame_rate_base;
1552 codec->width = icodec->width;
1553 codec->height = icodec->height;
1554 codec->has_b_frames = icodec->has_b_frames;
1560 switch(codec->codec_type) {
1561 case CODEC_TYPE_AUDIO:
1562 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1565 if (codec->channels == icodec->channels &&
1566 codec->sample_rate == icodec->sample_rate) {
1567 ost->audio_resample = 0;
1569 if (codec->channels != icodec->channels &&
1570 (icodec->codec_id == CODEC_ID_AC3 ||
1571 icodec->codec_id == CODEC_ID_DTS)) {
1572 /* Special case for 5:1 AC3 and DTS input */
1573 /* and mono or stereo output */
1574 /* Request specific number of channels */
1575 icodec->channels = codec->channels;
1576 if (codec->sample_rate == icodec->sample_rate)
1577 ost->audio_resample = 0;
1579 ost->audio_resample = 1;
1582 ost->audio_resample = 1;
1585 if(audio_sync_method>1)
1586 ost->audio_resample = 1;
1588 if(ost->audio_resample){
1589 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1590 codec->sample_rate, icodec->sample_rate);
1592 printf("Can't resample. Aborting.\n");
1596 ist->decoding_needed = 1;
1597 ost->encoding_needed = 1;
1599 case CODEC_TYPE_VIDEO:
1600 if (codec->width == icodec->width &&
1601 codec->height == icodec->height &&
1602 frame_topBand == 0 &&
1603 frame_bottomBand == 0 &&
1604 frame_leftBand == 0 &&
1605 frame_rightBand == 0 &&
1606 frame_padtop == 0 &&
1607 frame_padbottom == 0 &&
1608 frame_padleft == 0 &&
1609 frame_padright == 0)
1611 ost->video_resample = 0;
1612 ost->video_crop = 0;
1614 } else if ((codec->width == icodec->width -
1615 (frame_leftBand + frame_rightBand)) &&
1616 (codec->height == icodec->height -
1617 (frame_topBand + frame_bottomBand)))
1619 ost->video_resample = 0;
1620 ost->video_crop = 1;
1621 ost->topBand = frame_topBand;
1622 ost->leftBand = frame_leftBand;
1623 } else if ((codec->width == icodec->width +
1624 (frame_padleft + frame_padright)) &&
1625 (codec->height == icodec->height +
1626 (frame_padtop + frame_padbottom))) {
1627 ost->video_resample = 0;
1628 ost->video_crop = 0;
1630 ost->padtop = frame_padtop;
1631 ost->padleft = frame_padleft;
1632 ost->padbottom = frame_padbottom;
1633 ost->padright = frame_padright;
1634 avcodec_get_frame_defaults(&ost->pict_tmp);
1635 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1636 codec->width, codec->height ) )
1639 ost->video_resample = 1;
1640 ost->video_crop = 0; // cropping is handled as part of resample
1641 avcodec_get_frame_defaults(&ost->pict_tmp);
1642 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1643 codec->width, codec->height ) )
1646 ost->img_resample_ctx = img_resample_full_init(
1647 ost->st->codec.width, ost->st->codec.height,
1648 ist->st->codec.width, ist->st->codec.height,
1649 frame_topBand, frame_bottomBand,
1650 frame_leftBand, frame_rightBand,
1651 frame_padtop, frame_padbottom,
1652 frame_padleft, frame_padright);
1654 ost->padtop = frame_padtop;
1655 ost->padleft = frame_padleft;
1656 ost->padbottom = frame_padbottom;
1657 ost->padright = frame_padright;
1660 ost->encoding_needed = 1;
1661 ist->decoding_needed = 1;
1667 if (ost->encoding_needed &&
1668 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1669 char logfilename[1024];
1674 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1676 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1677 if (codec->flags & CODEC_FLAG_PASS1) {
1678 f = fopen(logfilename, "w");
1680 perror(logfilename);
1685 /* read the log file */
1686 f = fopen(logfilename, "r");
1688 perror(logfilename);
1691 fseek(f, 0, SEEK_END);
1693 fseek(f, 0, SEEK_SET);
1694 logbuffer = av_malloc(size + 1);
1696 fprintf(stderr, "Could not allocate log buffer\n");
1699 size = fread(logbuffer, 1, size, f);
1701 logbuffer[size] = '\0';
1702 codec->stats_in = logbuffer;
1706 if(codec->codec_type == CODEC_TYPE_VIDEO){
1707 int size= codec->width * codec->height;
1708 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1713 bit_buffer = av_malloc(bit_buffer_size);
1717 /* dump the file output parameters - cannot be done before in case
1719 for(i=0;i<nb_output_files;i++) {
1720 dump_format(output_files[i], i, output_files[i]->filename, 1);
1723 /* dump the stream mapping */
1725 fprintf(stderr, "Stream mapping:\n");
1726 for(i=0;i<nb_ostreams;i++) {
1728 fprintf(stderr, " Stream #%d.%d -> #%d.%d\n",
1729 ist_table[ost->source_index]->file_index,
1730 ist_table[ost->source_index]->index,
1736 /* open each encoder */
1737 for(i=0;i<nb_ostreams;i++) {
1739 if (ost->encoding_needed) {
1741 codec = avcodec_find_encoder(ost->st->codec.codec_id);
1743 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1744 ost->file_index, ost->index);
1747 if (avcodec_open(&ost->st->codec, codec) < 0) {
1748 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1749 ost->file_index, ost->index);
1752 extra_size += ost->st->codec.extradata_size;
1756 /* open each decoder */
1757 for(i=0;i<nb_istreams;i++) {
1759 if (ist->decoding_needed) {
1761 codec = avcodec_find_decoder(ist->st->codec.codec_id);
1763 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1764 ist->st->codec.codec_id, ist->file_index, ist->index);
1767 if (avcodec_open(&ist->st->codec, codec) < 0) {
1768 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1769 ist->file_index, ist->index);
1772 //if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO)
1773 // ist->st->codec.flags |= CODEC_FLAG_REPEAT_FIELD;
1778 for(i=0;i<nb_istreams;i++) {
1780 is = input_files[ist->file_index];
1782 ist->next_pts = ist->st->start_time;
1783 if(ist->next_pts == AV_NOPTS_VALUE)
1785 if(input_files_ts_offset[ist->file_index])
1786 ist->next_pts= AV_NOPTS_VALUE;
1790 /* compute buffer size max (should use a complete heuristic) */
1791 for(i=0;i<nb_input_files;i++) {
1792 file_table[i].buffer_size_max = 2048;
1795 /* set meta data information from input file if required */
1796 for (i=0;i<nb_meta_data_maps;i++) {
1797 AVFormatContext *out_file;
1798 AVFormatContext *in_file;
1800 int out_file_index = meta_data_maps[i].out_file;
1801 int in_file_index = meta_data_maps[i].in_file;
1802 if ( out_file_index < 0 || out_file_index >= nb_output_files ) {
1803 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1807 if ( in_file_index < 0 || in_file_index >= nb_input_files ) {
1808 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1813 out_file = output_files[out_file_index];
1814 in_file = input_files[in_file_index];
1816 strcpy(out_file->title, in_file->title);
1817 strcpy(out_file->author, in_file->author);
1818 strcpy(out_file->copyright, in_file->copyright);
1819 strcpy(out_file->comment, in_file->comment);
1820 strcpy(out_file->album, in_file->album);
1821 out_file->year = in_file->year;
1822 out_file->track = in_file->track;
1823 strcpy(out_file->genre, in_file->genre);
1826 /* open files and write file headers */
1827 for(i=0;i<nb_output_files;i++) {
1828 os = output_files[i];
1829 if (av_write_header(os) < 0) {
1830 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1836 #ifndef CONFIG_WIN32
1837 if ( !using_stdin && verbose >= 0) {
1838 fprintf(stderr, "Press [q] to stop encoding\n");
1839 url_set_interrupt_cb(decode_interrupt_cb);
1847 for(; received_sigterm == 0;) {
1848 int file_index, ist_index;
1856 /* if 'q' pressed, exits */
1860 /* read_key() returns 0 on EOF */
1866 /* select the stream that we must read now by looking at the
1867 smallest output pts */
1869 for(i=0;i<nb_ostreams;i++) {
1872 os = output_files[ost->file_index];
1873 ist = ist_table[ost->source_index];
1874 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1875 opts = (double)ost->sync_opts * ost->st->codec.frame_rate_base / ost->st->codec.frame_rate;
1877 opts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1878 ipts = (double)ist->pts;
1879 if (!file_table[ist->file_index].eof_reached){
1880 if(ipts < ipts_min) {
1882 if(input_sync ) file_index = ist->file_index;
1884 if(opts < opts_min) {
1886 if(!input_sync) file_index = ist->file_index;
1889 if(ost->frame_number >= max_frames[ost->st->codec.codec_type]){
1894 /* if none, if is finished */
1895 if (file_index < 0) {
1899 /* finish if recording time exhausted */
1900 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
1903 /* finish if limit size exhausted */
1904 if (limit_filesize != 0 && (limit_filesize * 1024) < url_ftell(&output_files[0]->pb))
1907 /* read a frame from it and output it in the fifo */
1908 is = input_files[file_index];
1909 if (av_read_frame(is, &pkt) < 0) {
1910 file_table[file_index].eof_reached = 1;
1911 if (opt_shortest) break; else continue; //
1915 stream_no_data = is;
1920 av_pkt_dump(stdout, &pkt, do_hex_dump);
1922 /* the following test is needed in case new streams appear
1923 dynamically in stream : we ignore them */
1924 if (pkt.stream_index >= file_table[file_index].nb_streams)
1925 goto discard_packet;
1926 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1927 ist = ist_table[ist_index];
1929 goto discard_packet;
1931 // 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);
1932 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
1933 int64_t delta= pkt.dts - ist->next_pts;
1934 if(ABS(delta) > 10LL*AV_TIME_BASE && !copy_ts){
1935 input_files_ts_offset[ist->file_index]-= delta;
1937 fprintf(stderr, "timestamp discontinuity %lld, new offset= %lld\n", delta, input_files_ts_offset[ist->file_index]);
1938 for(i=0; i<file_table[file_index].nb_streams; i++){
1939 int index= file_table[file_index].ist_index + i;
1940 ist_table[index]->next_pts += delta;
1941 ist_table[index]->is_start=1;
1946 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1947 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1950 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1951 ist->file_index, ist->index);
1953 av_free_packet(&pkt);
1958 av_free_packet(&pkt);
1960 /* dump report by using the output first video and audio streams */
1961 print_report(output_files, ost_table, nb_ostreams, 0);
1964 /* at the end of stream, we must flush the decoder buffers */
1965 for(i=0;i<nb_istreams;i++) {
1967 if (ist->decoding_needed) {
1968 output_packet(ist, i, ost_table, nb_ostreams, NULL);
1974 /* write the trailer if needed and close file */
1975 for(i=0;i<nb_output_files;i++) {
1976 os = output_files[i];
1977 av_write_trailer(os);
1980 /* dump report by using the first video and audio streams */
1981 print_report(output_files, ost_table, nb_ostreams, 1);
1983 /* close each encoder */
1984 for(i=0;i<nb_ostreams;i++) {
1986 if (ost->encoding_needed) {
1987 av_freep(&ost->st->codec.stats_in);
1988 avcodec_close(&ost->st->codec);
1992 /* close each decoder */
1993 for(i=0;i<nb_istreams;i++) {
1995 if (ist->decoding_needed) {
1996 avcodec_close(&ist->st->codec);
2004 av_freep(&bit_buffer);
2005 av_free(file_table);
2008 for(i=0;i<nb_istreams;i++) {
2015 for(i=0;i<nb_ostreams;i++) {
2019 fclose(ost->logfile);
2020 ost->logfile = NULL;
2022 fifo_free(&ost->fifo); /* works even if fifo is not
2023 initialized but set to zero */
2024 av_free(ost->pict_tmp.data[0]);
2025 if (ost->video_resample)
2026 img_resample_close(ost->img_resample_ctx);
2027 if (ost->audio_resample)
2028 audio_resample_close(ost->resample);
2041 int file_read(const char *filename)
2044 unsigned char buffer[1024];
2047 if (url_open(&h, filename, O_RDONLY) < 0) {
2048 printf("could not open '%s'\n", filename);
2052 len = url_read(h, buffer, sizeof(buffer));
2055 for(i=0;i<len;i++) putchar(buffer[i]);
2062 static void opt_image_format(const char *arg)
2066 for(f = first_image_format; f != NULL; f = f->next) {
2067 if (!strcmp(arg, f->name))
2071 fprintf(stderr, "Unknown image format: '%s'\n", arg);
2077 static void opt_format(const char *arg)
2079 /* compatibility stuff for pgmyuv */
2080 if (!strcmp(arg, "pgmyuv")) {
2081 pgmyuv_compatibility_hack=1;
2082 // opt_image_format(arg);
2086 file_iformat = av_find_input_format(arg);
2087 file_oformat = guess_format(arg, NULL, NULL);
2088 if (!file_iformat && !file_oformat) {
2089 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2094 static void opt_video_bitrate(const char *arg)
2096 video_bit_rate = atoi(arg) * 1000;
2099 static void opt_video_bitrate_tolerance(const char *arg)
2101 video_bit_rate_tolerance = atoi(arg) * 1000;
2104 static void opt_video_bitrate_max(const char *arg)
2106 video_rc_max_rate = atoi(arg) * 1000;
2109 static void opt_video_bitrate_min(const char *arg)
2111 video_rc_min_rate = atoi(arg) * 1000;
2114 static void opt_video_buffer_size(const char *arg)
2116 video_rc_buffer_size = atoi(arg) * 8*1024;
2119 static void opt_video_rc_eq(char *arg)
2124 static void opt_video_rc_override_string(char *arg)
2126 video_rc_override_string = arg;
2130 static void opt_workaround_bugs(const char *arg)
2132 workaround_bugs = atoi(arg);
2135 static void opt_dct_algo(const char *arg)
2137 dct_algo = atoi(arg);
2140 static void opt_idct_algo(const char *arg)
2142 idct_algo = atoi(arg);
2145 static void opt_me_threshold(const char *arg)
2147 me_threshold = atoi(arg);
2150 static void opt_mb_threshold(const char *arg)
2152 mb_threshold = atoi(arg);
2155 static void opt_error_resilience(const char *arg)
2157 error_resilience = atoi(arg);
2160 static void opt_error_concealment(const char *arg)
2162 error_concealment = atoi(arg);
2165 static void opt_debug(const char *arg)
2170 static void opt_vismv(const char *arg)
2172 debug_mv = atoi(arg);
2175 static void opt_verbose(const char *arg)
2177 verbose = atoi(arg);
2178 av_log_set_level(atoi(arg));
2181 static void opt_frame_rate(const char *arg)
2183 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
2184 fprintf(stderr, "Incorrect frame rate\n");
2189 static void opt_frame_crop_top(const char *arg)
2191 frame_topBand = atoi(arg);
2192 if (frame_topBand < 0) {
2193 fprintf(stderr, "Incorrect top crop size\n");
2196 if ((frame_topBand % 2) != 0) {
2197 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2200 if ((frame_topBand) >= frame_height){
2201 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2204 frame_height -= frame_topBand;
2207 static void opt_frame_crop_bottom(const char *arg)
2209 frame_bottomBand = atoi(arg);
2210 if (frame_bottomBand < 0) {
2211 fprintf(stderr, "Incorrect bottom crop size\n");
2214 if ((frame_bottomBand % 2) != 0) {
2215 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2218 if ((frame_bottomBand) >= frame_height){
2219 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2222 frame_height -= frame_bottomBand;
2225 static void opt_frame_crop_left(const char *arg)
2227 frame_leftBand = atoi(arg);
2228 if (frame_leftBand < 0) {
2229 fprintf(stderr, "Incorrect left crop size\n");
2232 if ((frame_leftBand % 2) != 0) {
2233 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2236 if ((frame_leftBand) >= frame_width){
2237 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2240 frame_width -= frame_leftBand;
2243 static void opt_frame_crop_right(const char *arg)
2245 frame_rightBand = atoi(arg);
2246 if (frame_rightBand < 0) {
2247 fprintf(stderr, "Incorrect right crop size\n");
2250 if ((frame_rightBand % 2) != 0) {
2251 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2254 if ((frame_rightBand) >= frame_width){
2255 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2258 frame_width -= frame_rightBand;
2261 static void opt_frame_size(const char *arg)
2263 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2264 fprintf(stderr, "Incorrect frame size\n");
2267 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2268 fprintf(stderr, "Frame size must be a multiple of 2\n");
2274 #define SCALEBITS 10
2275 #define ONE_HALF (1 << (SCALEBITS - 1))
2276 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2278 #define RGB_TO_Y(r, g, b) \
2279 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2280 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2282 #define RGB_TO_U(r1, g1, b1, shift)\
2283 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2284 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2286 #define RGB_TO_V(r1, g1, b1, shift)\
2287 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2288 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2290 static void opt_pad_color(const char *arg) {
2291 /* Input is expected to be six hex digits similar to
2292 how colors are expressed in html tags (but without the #) */
2293 int rgb = strtol(arg, NULL, 16);
2297 g = ((rgb >> 8) & 255);
2300 padcolor[0] = RGB_TO_Y(r,g,b);
2301 padcolor[1] = RGB_TO_U(r,g,b,0);
2302 padcolor[2] = RGB_TO_V(r,g,b,0);
2305 static void opt_frame_pad_top(const char *arg)
2307 frame_padtop = atoi(arg);
2308 if (frame_padtop < 0) {
2309 fprintf(stderr, "Incorrect top pad size\n");
2312 if ((frame_padtop % 2) != 0) {
2313 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2318 static void opt_frame_pad_bottom(const char *arg)
2320 frame_padbottom = atoi(arg);
2321 if (frame_padbottom < 0) {
2322 fprintf(stderr, "Incorrect bottom pad size\n");
2325 if ((frame_padbottom % 2) != 0) {
2326 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2332 static void opt_frame_pad_left(const char *arg)
2334 frame_padleft = atoi(arg);
2335 if (frame_padleft < 0) {
2336 fprintf(stderr, "Incorrect left pad size\n");
2339 if ((frame_padleft % 2) != 0) {
2340 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2346 static void opt_frame_pad_right(const char *arg)
2348 frame_padright = atoi(arg);
2349 if (frame_padright < 0) {
2350 fprintf(stderr, "Incorrect right pad size\n");
2353 if ((frame_padright % 2) != 0) {
2354 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2360 static void opt_frame_pix_fmt(const char *arg)
2362 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2365 static void opt_frame_aspect_ratio(const char *arg)
2371 p = strchr(arg, ':');
2373 x = strtol(arg, (char **)&arg, 10);
2375 y = strtol(arg+1, (char **)&arg, 10);
2377 ar = (double)x / (double)y;
2379 ar = strtod(arg, (char **)&arg);
2382 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2385 frame_aspect_ratio = ar;
2388 static void opt_gop_size(const char *arg)
2390 gop_size = atoi(arg);
2393 static void opt_b_frames(const char *arg)
2395 b_frames = atoi(arg);
2396 if (b_frames > FF_MAX_B_FRAMES) {
2397 fprintf(stderr, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES);
2399 } else if (b_frames < 1) {
2400 fprintf(stderr, "\nNumber of B frames must be higher than 0\n");
2405 static void opt_mb_decision(const char *arg)
2407 mb_decision = atoi(arg);
2410 static void opt_mb_cmp(const char *arg)
2415 static void opt_ildct_cmp(const char *arg)
2417 ildct_cmp = atoi(arg);
2420 static void opt_sub_cmp(const char *arg)
2422 sub_cmp = atoi(arg);
2425 static void opt_cmp(const char *arg)
2430 static void opt_pre_cmp(const char *arg)
2432 pre_cmp = atoi(arg);
2435 static void opt_pre_me(const char *arg)
2440 static void opt_lumi_mask(const char *arg)
2442 lumi_mask = atof(arg);
2445 static void opt_dark_mask(const char *arg)
2447 dark_mask = atof(arg);
2450 static void opt_scplx_mask(const char *arg)
2452 scplx_mask = atof(arg);
2455 static void opt_tcplx_mask(const char *arg)
2457 tcplx_mask = atof(arg);
2460 static void opt_p_mask(const char *arg)
2465 static void opt_qscale(const char *arg)
2467 video_qscale = atof(arg);
2468 if (video_qscale < 0.01 ||
2469 video_qscale > 255) {
2470 fprintf(stderr, "qscale must be >= 0.01 and <= 255\n");
2475 static void opt_qsquish(const char *arg)
2477 video_qsquish = atof(arg);
2478 if (video_qsquish < 0.0 ||
2479 video_qsquish > 99.0) {
2480 fprintf(stderr, "qsquish must be >= 0.0 and <= 99.0\n");
2485 static void opt_lelim(const char *arg)
2487 video_lelim = atoi(arg);
2488 if (video_lelim < -99 ||
2490 fprintf(stderr, "lelim must be >= -99 and <= 99\n");
2495 static void opt_celim(const char *arg)
2497 video_celim = atoi(arg);
2498 if (video_celim < -99 ||
2500 fprintf(stderr, "celim must be >= -99 and <= 99\n");
2505 static void opt_lmax(const char *arg)
2507 video_lmax = atof(arg)*FF_QP2LAMBDA;
2510 static void opt_lmin(const char *arg)
2512 video_lmin = atof(arg)*FF_QP2LAMBDA;
2515 static void opt_qmin(const char *arg)
2517 video_qmin = atoi(arg);
2518 if (video_qmin < 1 ||
2520 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2525 static void opt_qmax(const char *arg)
2527 video_qmax = atoi(arg);
2528 if (video_qmax < 1 ||
2530 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2535 static void opt_mb_lmin(const char *arg)
2537 video_mb_lmin = atof(arg)*FF_QP2LAMBDA;
2538 if (video_mb_lmin < 1 ||
2539 video_mb_lmin > FF_LAMBDA_MAX) {
2540 fprintf(stderr, "mblmin must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
2545 static void opt_mb_lmax(const char *arg)
2547 video_mb_lmax = atof(arg)*FF_QP2LAMBDA;
2548 if (video_mb_lmax < 1 ||
2549 video_mb_lmax > FF_LAMBDA_MAX) {
2550 fprintf(stderr, "mblmax must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
2555 static void opt_qdiff(const char *arg)
2557 video_qdiff = atoi(arg);
2558 if (video_qdiff < 0 ||
2560 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2565 static void opt_qblur(const char *arg)
2567 video_qblur = atof(arg);
2570 static void opt_qcomp(const char *arg)
2572 video_qcomp = atof(arg);
2575 static void opt_rc_initial_cplx(const char *arg)
2577 video_rc_initial_cplx = atof(arg);
2579 static void opt_b_qfactor(const char *arg)
2581 video_b_qfactor = atof(arg);
2583 static void opt_i_qfactor(const char *arg)
2585 video_i_qfactor = atof(arg);
2587 static void opt_b_qoffset(const char *arg)
2589 video_b_qoffset = atof(arg);
2591 static void opt_i_qoffset(const char *arg)
2593 video_i_qoffset = atof(arg);
2596 static void opt_ibias(const char *arg)
2598 video_intra_quant_bias = atoi(arg);
2600 static void opt_pbias(const char *arg)
2602 video_inter_quant_bias = atoi(arg);
2605 static void opt_packet_size(const char *arg)
2607 packet_size= atoi(arg);
2610 static void opt_error_rate(const char *arg)
2612 error_rate= atoi(arg);
2615 static void opt_strict(const char *arg)
2620 static void opt_top_field_first(const char *arg)
2622 top_field_first= atoi(arg);
2625 static void opt_noise_reduction(const char *arg)
2627 noise_reduction= atoi(arg);
2630 static void opt_qns(const char *arg)
2635 static void opt_sc_threshold(const char *arg)
2637 sc_threshold= atoi(arg);
2640 static void opt_me_range(const char *arg)
2642 me_range = atoi(arg);
2645 static void opt_thread_count(const char *arg)
2647 thread_count= atoi(arg);
2648 #if !defined(HAVE_THREADS)
2650 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2654 static void opt_audio_bitrate(const char *arg)
2656 audio_bit_rate = atoi(arg) * 1000;
2659 static void opt_audio_rate(const char *arg)
2661 audio_sample_rate = atoi(arg);
2664 static void opt_audio_channels(const char *arg)
2666 audio_channels = atoi(arg);
2669 static void opt_video_device(const char *arg)
2671 video_device = av_strdup(arg);
2674 static void opt_grab_device(const char *arg)
2676 grab_device = av_strdup(arg);
2679 static void opt_video_channel(const char *arg)
2681 video_channel = strtol(arg, NULL, 0);
2684 static void opt_video_standard(const char *arg)
2686 video_standard = av_strdup(arg);
2689 static void opt_audio_device(const char *arg)
2691 audio_device = av_strdup(arg);
2694 static void opt_audio_codec(const char *arg)
2698 if (!strcmp(arg, "copy")) {
2699 audio_stream_copy = 1;
2703 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_AUDIO)
2708 fprintf(stderr, "Unknown audio codec '%s'\n", arg);
2711 audio_codec_id = p->id;
2716 static void opt_audio_tag(const char *arg)
2719 audio_codec_tag= strtol(arg, &tail, 0);
2722 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2725 static void opt_video_tag(const char *arg)
2728 video_codec_tag= strtol(arg, &tail, 0);
2731 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2734 static void add_frame_hooker(const char *arg)
2739 char *args = av_strdup(arg);
2743 argv[0] = strtok(args, " ");
2744 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2747 i = frame_hook_add(argc, argv);
2750 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2755 const char *motion_str[] = {
2765 static void opt_motion_estimation(const char *arg)
2771 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2774 if (!strcmp(*p, arg))
2778 me_method = (p - motion_str) + 1;
2781 static void opt_video_codec(const char *arg)
2785 if (!strcmp(arg, "copy")) {
2786 video_stream_copy = 1;
2790 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_VIDEO)
2795 fprintf(stderr, "Unknown video codec '%s'\n", arg);
2798 video_codec_id = p->id;
2803 static void opt_map(const char *arg)
2809 m = &stream_maps[nb_stream_maps++];
2811 m->file_index = strtol(arg, (char **)&p, 0);
2815 m->stream_index = strtol(p, (char **)&p, 0);
2818 static void opt_map_meta_data(const char *arg)
2824 m = &meta_data_maps[nb_meta_data_maps++];
2826 m->out_file = strtol(arg, (char **)&p, 0);
2830 m->in_file = strtol(p, (char **)&p, 0);
2833 static void opt_recording_time(const char *arg)
2835 recording_time = parse_date(arg, 1);
2838 static void opt_start_time(const char *arg)
2840 start_time = parse_date(arg, 1);
2843 static void opt_rec_timestamp(const char *arg)
2845 rec_timestamp = parse_date(arg, 0) / 1000000;
2848 static void opt_input_ts_offset(const char *arg)
2850 input_ts_offset = parse_date(arg, 1);
2853 static void opt_input_file(const char *filename)
2855 AVFormatContext *ic;
2856 AVFormatParameters params, *ap = ¶ms;
2857 int err, i, ret, rfps, rfps_base;
2860 if (!strcmp(filename, "-"))
2863 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2864 !strcmp( filename, "/dev/stdin" );
2866 /* get default parameters from command line */
2867 memset(ap, 0, sizeof(*ap));
2868 ap->sample_rate = audio_sample_rate;
2869 ap->channels = audio_channels;
2870 ap->frame_rate = frame_rate;
2871 ap->frame_rate_base = frame_rate_base;
2872 ap->width = frame_width + frame_padleft + frame_padright;
2873 ap->height = frame_height + frame_padtop + frame_padbottom;
2874 ap->image_format = image_format;
2875 ap->pix_fmt = frame_pix_fmt;
2876 ap->device = grab_device;
2877 ap->channel = video_channel;
2878 ap->standard = video_standard;
2879 ap->video_codec_id = video_codec_id;
2880 ap->audio_codec_id = audio_codec_id;
2881 if(pgmyuv_compatibility_hack)
2882 ap->video_codec_id= CODEC_ID_PGMYUV;
2884 /* open the input file with generic libav function */
2885 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2887 print_error(filename, err);
2891 /* If not enough info to get the stream parameters, we decode the
2892 first frames to get it. (used in mpeg case for example) */
2893 ret = av_find_stream_info(ic);
2894 if (ret < 0 && verbose >= 0) {
2895 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2899 timestamp = start_time;
2900 /* add the stream start time */
2901 if (ic->start_time != AV_NOPTS_VALUE)
2902 timestamp += ic->start_time;
2904 /* if seeking requested, we execute it */
2905 if (start_time != 0) {
2906 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2908 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2909 filename, (double)timestamp / AV_TIME_BASE);
2911 /* reset seek info */
2915 /* update the current parameters so that they match the one of the input stream */
2916 for(i=0;i<ic->nb_streams;i++) {
2917 AVCodecContext *enc = &ic->streams[i]->codec;
2918 #if defined(HAVE_THREADS)
2920 avcodec_thread_init(enc, thread_count);
2922 enc->thread_count= thread_count;
2923 switch(enc->codec_type) {
2924 case CODEC_TYPE_AUDIO:
2925 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2926 audio_channels = enc->channels;
2927 audio_sample_rate = enc->sample_rate;
2929 ic->streams[i]->discard= AVDISCARD_ALL;
2931 case CODEC_TYPE_VIDEO:
2932 frame_height = enc->height;
2933 frame_width = enc->width;
2934 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2935 frame_pix_fmt = enc->pix_fmt;
2936 rfps = ic->streams[i]->r_frame_rate;
2937 rfps_base = ic->streams[i]->r_frame_rate_base;
2938 enc->workaround_bugs = workaround_bugs;
2939 enc->error_resilience = error_resilience;
2940 enc->error_concealment = error_concealment;
2941 enc->idct_algo = idct_algo;
2943 enc->debug_mv = debug_mv;
2944 enc->lowres= lowres;
2946 enc->flags|= CODEC_FLAG_BITEXACT;
2948 enc->debug |= FF_DEBUG_MV;
2950 if (enc->frame_rate != rfps || enc->frame_rate_base != rfps_base) {
2953 fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2954 i, (float)enc->frame_rate / enc->frame_rate_base, enc->frame_rate, enc->frame_rate_base,
2956 (float)rfps / rfps_base, rfps, rfps_base);
2958 /* update the current frame rate to match the stream frame rate */
2960 frame_rate_base = rfps_base;
2962 enc->rate_emu = rate_emu;
2964 ic->streams[i]->discard= AVDISCARD_ALL;
2965 else if(video_discard)
2966 ic->streams[i]->discard= video_discard;
2968 case CODEC_TYPE_DATA:
2975 input_files[nb_input_files] = ic;
2976 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2977 /* dump the file content */
2979 dump_format(ic, nb_input_files, filename, 0);
2982 file_iformat = NULL;
2983 file_oformat = NULL;
2984 image_format = NULL;
2992 static void opt_grab(const char *arg)
2994 file_iformat = av_find_input_format(arg);
2998 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
3000 int has_video, has_audio, i, j;
3001 AVFormatContext *ic;
3005 for(j=0;j<nb_input_files;j++) {
3006 ic = input_files[j];
3007 for(i=0;i<ic->nb_streams;i++) {
3008 AVCodecContext *enc = &ic->streams[i]->codec;
3009 switch(enc->codec_type) {
3010 case CODEC_TYPE_AUDIO:
3013 case CODEC_TYPE_VIDEO:
3016 case CODEC_TYPE_DATA:
3023 *has_video_ptr = has_video;
3024 *has_audio_ptr = has_audio;
3027 static void opt_output_file(const char *filename)
3030 AVFormatContext *oc;
3031 int use_video, use_audio, nb_streams, input_has_video, input_has_audio;
3033 AVFormatParameters params, *ap = ¶ms;
3035 if (!strcmp(filename, "-"))
3038 oc = av_alloc_format_context();
3040 if (!file_oformat) {
3041 file_oformat = guess_format(NULL, filename, NULL);
3042 if (!file_oformat) {
3043 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
3049 oc->oformat = file_oformat;
3051 if (!strcmp(file_oformat->name, "ffm") &&
3052 strstart(filename, "http:", NULL)) {
3053 /* special case for files sent to ffserver: we get the stream
3054 parameters from ffserver */
3055 if (read_ffserver_streams(oc, filename) < 0) {
3056 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
3060 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy;
3061 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy;
3063 /* disable if no corresponding type found and at least one
3065 if (nb_input_files > 0) {
3066 check_audio_video_inputs(&input_has_video, &input_has_audio);
3067 if (!input_has_video)
3069 if (!input_has_audio)
3073 /* manual disable */
3074 if (audio_disable) {
3077 if (video_disable) {
3083 AVCodecContext *video_enc;
3085 st = av_new_stream(oc, nb_streams++);
3087 fprintf(stderr, "Could not alloc stream\n");
3090 #if defined(HAVE_THREADS)
3092 avcodec_thread_init(&st->codec, thread_count);
3095 video_enc = &st->codec;
3098 video_enc->codec_tag= video_codec_tag;
3100 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
3101 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3102 if (video_stream_copy) {
3103 st->stream_copy = 1;
3104 video_enc->codec_type = CODEC_TYPE_VIDEO;
3110 codec_id = av_guess_codec(file_oformat, NULL, filename, NULL, CODEC_TYPE_VIDEO);
3111 if (video_codec_id != CODEC_ID_NONE)
3112 codec_id = video_codec_id;
3114 video_enc->codec_id = codec_id;
3115 codec = avcodec_find_encoder(codec_id);
3117 video_enc->bit_rate = video_bit_rate;
3118 video_enc->bit_rate_tolerance = video_bit_rate_tolerance;
3119 video_enc->frame_rate = frame_rate;
3120 video_enc->frame_rate_base = frame_rate_base;
3121 if(codec && codec->supported_framerates){
3122 const AVRational *p= codec->supported_framerates;
3123 AVRational req= (AVRational){frame_rate, frame_rate_base};
3124 const AVRational *best=NULL;
3125 AVRational best_error= (AVRational){INT_MAX, 1};
3126 for(; p->den!=0; p++){
3127 AVRational error= av_sub_q(req, *p);
3128 if(error.num <0) error.num *= -1;
3129 if(av_cmp_q(error, best_error) < 0){
3134 video_enc->frame_rate = best->num;
3135 video_enc->frame_rate_base= best->den;
3138 video_enc->width = frame_width + frame_padright + frame_padleft;
3139 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3140 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3141 video_enc->pix_fmt = frame_pix_fmt;
3143 if(codec && codec->pix_fmts){
3144 const enum PixelFormat *p= codec->pix_fmts;
3146 if(*p == video_enc->pix_fmt)
3150 video_enc->pix_fmt = codec->pix_fmts[0];
3154 video_enc->gop_size = gop_size;
3156 video_enc->gop_size = 0;
3157 if (video_qscale || same_quality) {
3158 video_enc->flags |= CODEC_FLAG_QSCALE;
3159 video_enc->global_quality=
3160 st->quality = FF_QP2LAMBDA * video_qscale;
3164 video_enc->intra_matrix = intra_matrix;
3166 video_enc->inter_matrix = inter_matrix;
3169 video_enc->flags |= CODEC_FLAG_BITEXACT;
3171 video_enc->mb_decision = mb_decision;
3172 video_enc->mb_cmp = mb_cmp;
3173 video_enc->ildct_cmp = ildct_cmp;
3174 video_enc->me_sub_cmp = sub_cmp;
3175 video_enc->me_cmp = cmp;
3176 video_enc->me_pre_cmp = pre_cmp;
3177 video_enc->pre_me = pre_me;
3178 video_enc->lumi_masking = lumi_mask;
3179 video_enc->dark_masking = dark_mask;
3180 video_enc->spatial_cplx_masking = scplx_mask;
3181 video_enc->temporal_cplx_masking = tcplx_mask;
3182 video_enc->p_masking = p_mask;
3183 video_enc->quantizer_noise_shaping= qns;
3186 video_enc->flags |= CODEC_FLAG_H263P_UMV;
3189 video_enc->flags |= CODEC_FLAG_H263P_SLICE_STRUCT;
3192 video_enc->flags |= CODEC_FLAG_H263P_AIC;
3195 video_enc->flags |= CODEC_FLAG_H263P_AIV;
3198 video_enc->flags |= CODEC_FLAG_4MV;
3201 video_enc->flags |= CODEC_FLAG_OBMC;
3204 video_enc->flags |= CODEC_FLAG_LOOP_FILTER;
3208 video_enc->flags |= CODEC_FLAG_PART;
3211 video_enc->flags |= CODEC_FLAG_ALT_SCAN;
3214 video_enc->flags |= CODEC_FLAG_TRELLIS_QUANT;
3217 video_enc->flags |= CODEC_FLAG_MV0;
3219 if (do_normalize_aqp) {
3220 video_enc->flags |= CODEC_FLAG_NORMALIZE_AQP;
3222 if (use_scan_offset) {
3223 video_enc->flags |= CODEC_FLAG_SVCD_SCAN_OFFSET;
3226 video_enc->flags |= CODEC_FLAG_CLOSED_GOP;
3229 video_enc->flags2 |= CODEC_FLAG2_STRICT_GOP;
3232 video_enc->flags |= CODEC_FLAG_QPEL;
3235 video_enc->flags |= CODEC_FLAG_QP_RD;
3238 video_enc->flags |= CODEC_FLAG_CBP_RD;
3241 video_enc->max_b_frames = b_frames;
3242 video_enc->b_frame_strategy = 0;
3243 video_enc->b_quant_factor = 2.0;
3245 if (do_interlace_dct) {
3246 video_enc->flags |= CODEC_FLAG_INTERLACED_DCT;
3248 if (do_interlace_me) {
3249 video_enc->flags |= CODEC_FLAG_INTERLACED_ME;
3252 video_enc->flags2 |= CODEC_FLAG2_NO_OUTPUT;
3254 video_enc->qmin = video_qmin;
3255 video_enc->qmax = video_qmax;
3256 video_enc->lmin = video_lmin;
3257 video_enc->lmax = video_lmax;
3258 video_enc->rc_qsquish = video_qsquish;
3259 video_enc->luma_elim_threshold = video_lelim;
3260 video_enc->chroma_elim_threshold = video_celim;
3261 video_enc->mb_lmin = video_mb_lmin;
3262 video_enc->mb_lmax = video_mb_lmax;
3263 video_enc->max_qdiff = video_qdiff;
3264 video_enc->qblur = video_qblur;
3265 video_enc->qcompress = video_qcomp;
3266 video_enc->rc_eq = video_rc_eq;
3267 video_enc->debug = debug;
3268 video_enc->debug_mv = debug_mv;
3269 video_enc->thread_count = thread_count;
3270 p= video_rc_override_string;
3273 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3275 fprintf(stderr, "error parsing rc_override\n");
3278 video_enc->rc_override=
3279 av_realloc(video_enc->rc_override,
3280 sizeof(RcOverride)*(i+1));
3281 video_enc->rc_override[i].start_frame= start;
3282 video_enc->rc_override[i].end_frame = end;
3284 video_enc->rc_override[i].qscale= q;
3285 video_enc->rc_override[i].quality_factor= 1.0;
3288 video_enc->rc_override[i].qscale= 0;
3289 video_enc->rc_override[i].quality_factor= -q/100.0;
3294 video_enc->rc_override_count=i;
3296 video_enc->rc_max_rate = video_rc_max_rate;
3297 video_enc->rc_min_rate = video_rc_min_rate;
3298 video_enc->rc_buffer_size = video_rc_buffer_size;
3299 video_enc->rc_initial_buffer_occupancy = video_rc_buffer_size*3/4;
3300 video_enc->rc_buffer_aggressivity= video_rc_buffer_aggressivity;
3301 video_enc->rc_initial_cplx= video_rc_initial_cplx;
3302 video_enc->i_quant_factor = video_i_qfactor;
3303 video_enc->b_quant_factor = video_b_qfactor;
3304 video_enc->i_quant_offset = video_i_qoffset;
3305 video_enc->b_quant_offset = video_b_qoffset;
3306 video_enc->intra_quant_bias = video_intra_quant_bias;
3307 video_enc->inter_quant_bias = video_inter_quant_bias;
3308 video_enc->dct_algo = dct_algo;
3309 video_enc->idct_algo = idct_algo;
3310 video_enc->me_threshold= me_threshold;
3311 video_enc->mb_threshold= mb_threshold;
3312 video_enc->intra_dc_precision= intra_dc_precision - 8;
3313 video_enc->strict_std_compliance = strict;
3314 video_enc->error_rate = error_rate;
3315 video_enc->noise_reduction= noise_reduction;
3316 video_enc->scenechange_threshold= sc_threshold;
3317 video_enc->me_range = me_range;
3318 video_enc->coder_type= coder;
3319 video_enc->context_model= context;
3320 video_enc->prediction_method= predictor;
3321 video_enc->profile= video_profile;
3322 video_enc->level= video_level;
3323 video_enc->nsse_weight= nsse_weight;
3324 video_enc->me_subpel_quality= subpel_quality;
3325 video_enc->frame_skip_threshold= frame_skip_threshold;
3326 video_enc->frame_skip_factor= frame_skip_factor;
3327 video_enc->frame_skip_exp= frame_skip_exp;
3328 video_enc->frame_skip_cmp= frame_skip_cmp;
3331 video_enc->rtp_mode= 1;
3332 video_enc->rtp_payload_size= packet_size;
3336 video_enc->flags|= CODEC_FLAG_PSNR;
3338 video_enc->me_method = me_method;
3343 video_enc->flags |= CODEC_FLAG_PASS1;
3345 video_enc->flags |= CODEC_FLAG_PASS2;
3352 AVCodecContext *audio_enc;
3354 st = av_new_stream(oc, nb_streams++);
3356 fprintf(stderr, "Could not alloc stream\n");
3359 #if defined(HAVE_THREADS)
3361 avcodec_thread_init(&st->codec, thread_count);
3364 audio_enc = &st->codec;
3365 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3368 audio_enc->codec_tag= audio_codec_tag;
3370 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
3371 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3372 if (audio_stream_copy) {
3373 st->stream_copy = 1;
3374 audio_enc->channels = audio_channels;
3376 codec_id = av_guess_codec(file_oformat, NULL, filename, NULL, CODEC_TYPE_AUDIO);
3377 if (audio_codec_id != CODEC_ID_NONE)
3378 codec_id = audio_codec_id;
3379 audio_enc->codec_id = codec_id;
3381 audio_enc->bit_rate = audio_bit_rate;
3382 audio_enc->strict_std_compliance = strict;
3383 audio_enc->thread_count = thread_count;
3384 /* For audio codecs other than AC3 or DTS we limit */
3385 /* the number of coded channels to stereo */
3386 if (audio_channels > 2 && codec_id != CODEC_ID_AC3
3387 && codec_id != CODEC_ID_DTS) {
3388 audio_enc->channels = 2;
3390 audio_enc->channels = audio_channels;
3392 audio_enc->sample_rate = audio_sample_rate;
3395 oc->nb_streams = nb_streams;
3398 fprintf(stderr, "No audio or video streams available\n");
3402 oc->timestamp = rec_timestamp;
3405 pstrcpy(oc->title, sizeof(oc->title), str_title);
3407 pstrcpy(oc->author, sizeof(oc->author), str_author);
3409 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3411 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3414 output_files[nb_output_files++] = oc;
3416 pstrcpy(oc->filename, sizeof(oc->filename), filename);
3418 /* check filename in case of an image number is expected */
3419 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3420 if (filename_number_test(oc->filename) < 0) {
3421 print_error(oc->filename, AVERROR_NUMEXPECTED);
3426 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3427 /* test if it already exists to avoid loosing precious files */
3428 if (!file_overwrite &&
3429 (strchr(filename, ':') == NULL ||
3430 strstart(filename, "file:", NULL))) {
3431 if (url_exist(filename)) {
3434 if ( !using_stdin ) {
3435 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3438 if (toupper(c) != 'Y') {
3439 fprintf(stderr, "Not overwriting - exiting\n");
3444 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3451 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3452 fprintf(stderr, "Could not open '%s'\n", filename);
3457 memset(ap, 0, sizeof(*ap));
3458 ap->image_format = image_format;
3459 if (av_set_parameters(oc, ap) < 0) {
3460 fprintf(stderr, "%s: Invalid encoding parameters\n",
3465 oc->packet_size= mux_packet_size;
3466 oc->mux_rate= mux_rate;
3467 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3468 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3470 /* reset some options */
3471 file_oformat = NULL;
3472 file_iformat = NULL;
3473 image_format = NULL;
3476 audio_codec_id = CODEC_ID_NONE;
3477 video_codec_id = CODEC_ID_NONE;
3478 audio_stream_copy = 0;
3479 video_stream_copy = 0;
3482 /* prepare dummy protocols for grab */
3483 static void prepare_grab(void)
3485 int has_video, has_audio, i, j;
3486 AVFormatContext *oc;
3487 AVFormatContext *ic;
3488 AVFormatParameters vp1, *vp = &vp1;
3489 AVFormatParameters ap1, *ap = &ap1;
3491 /* see if audio/video inputs are needed */
3494 memset(ap, 0, sizeof(*ap));
3495 memset(vp, 0, sizeof(*vp));
3496 vp->frame_rate_base= 1;
3497 for(j=0;j<nb_output_files;j++) {
3498 oc = output_files[j];
3499 for(i=0;i<oc->nb_streams;i++) {
3500 AVCodecContext *enc = &oc->streams[i]->codec;
3501 switch(enc->codec_type) {
3502 case CODEC_TYPE_AUDIO:
3503 if (enc->sample_rate > ap->sample_rate)
3504 ap->sample_rate = enc->sample_rate;
3505 if (enc->channels > ap->channels)
3506 ap->channels = enc->channels;
3509 case CODEC_TYPE_VIDEO:
3510 if (enc->width > vp->width)
3511 vp->width = enc->width;
3512 if (enc->height > vp->height)
3513 vp->height = enc->height;
3515 if (vp->frame_rate_base*(int64_t)enc->frame_rate > enc->frame_rate_base*(int64_t)vp->frame_rate){
3516 vp->frame_rate = enc->frame_rate;
3517 vp->frame_rate_base = enc->frame_rate_base;
3527 if (has_video == 0 && has_audio == 0) {
3528 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3533 AVInputFormat *fmt1;
3534 fmt1 = av_find_input_format(video_grab_format);
3535 vp->device = video_device;
3536 vp->channel = video_channel;
3537 vp->standard = video_standard;
3538 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3539 fprintf(stderr, "Could not find video grab device\n");
3542 /* If not enough info to get the stream parameters, we decode the
3543 first frames to get it. */
3544 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3545 fprintf(stderr, "Could not find video grab parameters\n");
3548 /* by now video grab has one stream */
3549 ic->streams[0]->r_frame_rate = vp->frame_rate;
3550 ic->streams[0]->r_frame_rate_base = vp->frame_rate_base;
3551 input_files[nb_input_files] = ic;
3554 dump_format(ic, nb_input_files, "", 0);
3558 if (has_audio && audio_grab_format) {
3559 AVInputFormat *fmt1;
3560 fmt1 = av_find_input_format(audio_grab_format);
3561 ap->device = audio_device;
3562 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3563 fprintf(stderr, "Could not find audio grab device\n");
3566 input_files[nb_input_files] = ic;
3569 dump_format(ic, nb_input_files, "", 0);
3575 /* same option as mencoder */
3576 static void opt_pass(const char *pass_str)
3579 pass = atoi(pass_str);
3580 if (pass != 1 && pass != 2) {
3581 fprintf(stderr, "pass number can be only 1 or 2\n");
3587 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3588 static int64_t getutime(void)
3590 return av_gettime();
3593 static int64_t getutime(void)
3595 struct rusage rusage;
3597 getrusage(RUSAGE_SELF, &rusage);
3598 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3602 extern int ffm_nopts;
3604 static void opt_bitexact(void)
3607 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3611 static void show_formats(void)
3613 AVInputFormat *ifmt;
3614 AVOutputFormat *ofmt;
3615 AVImageFormat *image_fmt;
3618 const char **pp, *last_name;
3620 printf("File formats:\n");
3625 const char *name=NULL;
3626 const char *long_name=NULL;
3628 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3629 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3630 strcmp(ofmt->name, last_name)>0){
3632 long_name= ofmt->long_name;
3636 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3637 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3638 strcmp(ifmt->name, last_name)>0){
3640 long_name= ifmt->long_name;
3643 if(name && strcmp(ifmt->name, name)==0)
3655 long_name ? long_name:" ");
3659 printf("Image formats (filename extensions, if any, follow):\n");
3660 for(image_fmt = first_image_format; image_fmt != NULL;
3661 image_fmt = image_fmt->next) {
3664 image_fmt->img_read ? "D":" ",
3665 image_fmt->img_write ? "E":" ",
3667 image_fmt->extensions ? image_fmt->extensions:" ");
3671 printf("Codecs:\n");
3679 for(p = first_avcodec; p != NULL; p = p->next) {
3680 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3681 strcmp(p->name, last_name)>0){
3683 decode= encode= cap=0;
3685 if(p2 && strcmp(p->name, p2->name)==0){
3686 if(p->decode) decode=1;
3687 if(p->encode) encode=1;
3688 cap |= p->capabilities;
3693 last_name= p2->name;
3697 decode ? "D": (/*p2->decoder ? "d":*/" "),
3699 p2->type == CODEC_TYPE_AUDIO ? "A":"V",
3700 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3701 cap & CODEC_CAP_DR1 ? "D":" ",
3702 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3704 /* if(p2->decoder && decode==0)
3705 printf(" use %s for decoding", p2->decoder->name);*/
3710 printf("Supported file protocols:\n");
3711 for(up = first_protocol; up != NULL; up = up->next)
3712 printf(" %s:", up->name);
3715 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3716 printf("Motion estimation methods:\n");
3720 if ((pp - motion_str + 1) == ME_ZERO)
3721 printf("(fastest)");
3722 else if ((pp - motion_str + 1) == ME_FULL)
3723 printf("(slowest)");
3724 else if ((pp - motion_str + 1) == ME_EPZS)
3725 printf("(default)");
3730 "Note, the names of encoders and decoders dont always match, so there are\n"
3731 "several cases where the above table shows encoder only or decoder only entries\n"
3732 "even though both encoding and decoding are supported for example, the h263\n"
3733 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3738 void parse_matrix_coeffs(uint16_t *dest, const char *str)
3741 const char *p = str;
3748 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3755 void opt_inter_matrix(const char *arg)
3757 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3758 parse_matrix_coeffs(inter_matrix, arg);
3761 void opt_intra_matrix(const char *arg)
3763 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3764 parse_matrix_coeffs(intra_matrix, arg);
3767 static void opt_target(const char *arg)
3770 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3772 if(!strncmp(arg, "pal-", 4)) {
3775 } else if(!strncmp(arg, "ntsc-", 5)) {
3778 } else if(!strncmp(arg, "film-", 5)) {
3783 /* Calculate FR via float to avoid int overflow */
3784 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3787 } else if((fr == 29970) || (fr == 23976)) {
3790 /* Try to determine PAL/NTSC by peeking in the input files */
3791 if(nb_input_files) {
3793 for(j = 0; j < nb_input_files; j++) {
3794 for(i = 0; i < input_files[j]->nb_streams; i++) {
3795 AVCodecContext *c = &input_files[j]->streams[i]->codec;
3796 if(c->codec_type != CODEC_TYPE_VIDEO)
3798 fr = c->frame_rate * 1000 / c->frame_rate_base;
3802 } else if((fr == 29970) || (fr == 23976)) {
3812 if(verbose && norm >= 0)
3813 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3817 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3818 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3819 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3823 if(!strcmp(arg, "vcd")) {
3825 opt_video_codec("mpeg1video");
3826 opt_audio_codec("mp2");
3829 opt_frame_size(norm ? "352x240" : "352x288");
3830 opt_frame_rate(frame_rates[norm]);
3831 opt_gop_size(norm ? "18" : "15");
3833 video_bit_rate = 1150000;
3834 video_rc_max_rate = 1150000;
3835 video_rc_min_rate = 1150000;
3836 video_rc_buffer_size = 40*1024*8;
3838 audio_bit_rate = 224000;
3839 audio_sample_rate = 44100;
3841 mux_packet_size= 2324;
3842 mux_rate= 2352 * 75 * 8;
3844 /* We have to offset the PTS, so that it is consistent with the SCR.
3845 SCR starts at 36000, but the first two packs contain only padding
3846 and the first pack from the other stream, respectively, may also have
3847 been written before.
3848 So the real data starts at SCR 36000+3*1200. */
3849 mux_preload= (36000+3*1200) / 90000.0; //0.44
3850 } else if(!strcmp(arg, "svcd")) {
3852 opt_video_codec("mpeg2video");
3853 opt_audio_codec("mp2");
3856 opt_frame_size(norm ? "480x480" : "480x576");
3857 opt_frame_rate(frame_rates[norm]);
3858 opt_gop_size(norm ? "18" : "15");
3860 video_bit_rate = 2040000;
3861 video_rc_max_rate = 2516000;
3862 video_rc_min_rate = 0; //1145000;
3863 video_rc_buffer_size = 224*1024*8;
3864 use_scan_offset = 1;
3866 audio_bit_rate = 224000;
3867 audio_sample_rate = 44100;
3869 mux_packet_size= 2324;
3871 } else if(!strcmp(arg, "dvd")) {
3873 opt_video_codec("mpeg2video");
3874 opt_audio_codec("ac3");
3877 opt_frame_size(norm ? "720x480" : "720x576");
3878 opt_frame_rate(frame_rates[norm]);
3879 opt_gop_size(norm ? "18" : "15");
3881 video_bit_rate = 6000000;
3882 video_rc_max_rate = 9000000;
3883 video_rc_min_rate = 0; //1500000;
3884 video_rc_buffer_size = 224*1024*8;
3886 mux_packet_size= 2048; // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3887 mux_rate = 10080000; // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3889 audio_bit_rate = 448000;
3890 audio_sample_rate = 48000;
3892 } else if(!strcmp(arg, "dv")) {
3896 opt_frame_size(norm ? "720x480" : "720x576");
3897 opt_frame_rate(frame_rates[norm]);
3899 audio_sample_rate = 48000;
3903 fprintf(stderr, "Unknown target: %s\n", arg);
3908 static void show_version(void)
3910 fprintf(stderr, "ffmpeg " FFMPEG_VERSION "\n"
3913 avcodec_build(), LIBAVFORMAT_BUILD);
3917 const OptionDef options[] = {
3919 { "L", 0, {(void*)show_license}, "show license" },
3920 { "h", 0, {(void*)show_help}, "show help" },
3921 { "version", 0, {(void*)show_version}, "show version" },
3922 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3923 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3924 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
3925 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3926 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3927 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream" },
3928 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3929 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3930 { "fs", HAS_ARG | OPT_INT, {(void*)&limit_filesize}, "set the limit file size", "limit_size" }, //
3931 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3932 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3933 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3934 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3935 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3936 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3937 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3938 { "debug", HAS_ARG | OPT_EXPERT, {(void*)opt_debug}, "print specific debug info", "" },
3939 { "vismv", HAS_ARG | OPT_EXPERT, {(void*)opt_vismv}, "visualize motion vectors", "" },
3940 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3941 "add timings for benchmarking" },
3942 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3943 "dump each input packet" },
3944 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3945 "when dumping packets, also dump the payload" },
3946 { "bitexact", OPT_EXPERT, {(void*)opt_bitexact}, "only use bit exact algorithms (for codec testing)" },
3947 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3948 { "loop", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3949 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3950 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3951 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3952 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3953 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3954 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3955 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3958 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
3959 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3960 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3961 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3962 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3963 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3964 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3965 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3966 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3967 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3968 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3969 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3970 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3971 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3972 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3973 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3974 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3975 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
3976 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3977 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3978 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3979 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
3980 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
3981 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
3982 { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
3983 { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
3984 { "mblmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmin}, "min macroblock quantiser scale (VBR)", "q" },
3985 { "mblmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmax}, "max macroblock quantiser scale (VBR)", "q" },
3986 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
3987 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
3988 { "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" },
3989 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
3990 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
3991 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
3992 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
3993 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
3994 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
3995 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
3996 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
3997 // { "b_strategy", HAS_ARG | OPT_EXPERT, {(void*)opt_b_strategy}, "dynamic b frame selection strategy", "strategy" },
3998 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3999 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4000 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
4001 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
4002 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
4003 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffer size (in kByte)", "size" },
4004 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4005 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
4007 { "dct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dct_algo}, "set dct algo", "algo" },
4008 { "idct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_idct_algo}, "set idct algo", "algo" },
4009 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
4010 { "mb_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_threshold}, "macroblock threshold", "" },
4011 { "er", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_resilience}, "set error resilience", "n" },
4012 { "ec", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_concealment}, "set error concealment", "bit_mask" },
4013 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
4014 { "hq", OPT_BOOL, {(void*)&mb_decision}, "activate high quality settings" },
4015 { "mbd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_decision}, "macroblock decision", "mode" },
4016 { "mbcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_cmp}, "macroblock compare function", "cmp function" },
4017 { "ildctcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ildct_cmp}, "ildct compare function", "cmp function" },
4018 { "subcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sub_cmp}, "subpel compare function", "cmp function" },
4019 { "cmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_cmp}, "fullpel compare function", "cmp function" },
4020 { "precmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_cmp}, "pre motion estimation compare function", "cmp function" },
4021 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
4022 { "lelim", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lelim}, "single coefficient elimination threshold for luminance (negative values also consider DC coefficient)", "elim" },
4023 { "celim", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_celim}, "single coefficient elimination threshold for chrominance (negative values also consider DC coefficient)", "elim" },
4024 { "lumi_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lumi_mask}, "luminance masking", "" },
4025 { "dark_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dark_mask}, "darkness masking", "" },
4026 { "scplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_scplx_mask}, "spatial complexity masking", "" },
4027 { "tcplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_tcplx_mask}, "temporal complexity masking", "" },
4028 { "p_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_p_mask}, "inter masking", "" },
4029 { "4mv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_4mv}, "use four motion vector by macroblock (MPEG4)" },
4030 { "obmc", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_obmc}, "use overlapped block motion compensation (h263+)" },
4031 { "lf", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_loop}, "use loop filter (h263+)" },
4032 { "part", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_part}, "use data partitioning (MPEG4)" },
4033 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
4034 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
4035 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
4036 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
4037 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4038 "use same video quality as source (implies VBR)" },
4039 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4040 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
4041 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4042 "deinterlace pictures" },
4043 { "ildct", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_dct},
4044 "force interlaced dct support in encoder (MPEG2/MPEG4)" },
4045 { "ilme", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_me},
4046 "force interlaced me support in encoder (MPEG2/MPEG4)" },
4047 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4048 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
4049 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
4050 { "aic", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aic}, "enable Advanced intra coding (h263+)" },
4051 { "aiv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aiv}, "enable Alternative inter vlc (h263+)" },
4052 { "umv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_umv}, "enable Unlimited Motion Vector (h263+)" },
4053 { "ssm", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_ss}, "enable Slice Structured mode (h263+)" },
4054 { "alt", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_alt_scan}, "enable alternate scantable (MPEG2/MPEG4)" },
4055 { "qprd", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qprd}, "" },
4056 { "cbp", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_cbprd}, "" },
4057 { "trell", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_trell}, "enable trellis quantization" },
4058 { "mv0", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_mv0}, "try to encode each MB with MV=<0,0> and choose the better one (has no effect if mbd=0)" },
4059 { "naq", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_normalize_aqp}, "normalize adaptive quantization" },
4060 { "cgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&closed_gop}, "closed gop" },
4061 { "sgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&strict_gop}, "strict gop" },
4062 { "noout", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&no_output}, "skip bitstream encoding" },
4063 { "scan_offset", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_scan_offset}, "enable SVCD Scan Offset placeholder" },
4064 { "qpel", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qpel}, "enable 1/4-pel" },
4065 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4066 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4067 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4068 { "nr", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_noise_reduction}, "noise reduction", "" },
4069 { "qns", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qns}, "quantization noise shaping", "" },
4070 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
4071 { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
4072 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4073 { "coder", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&coder}, "coder type", "" },
4074 { "context", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&context}, "context model", "" },
4075 { "pred", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&predictor}, "prediction method", "" },
4076 { "vprofile", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_profile}, "profile", "" },
4077 { "vlevel", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_level}, "level", "" },
4078 { "nssew", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&nsse_weight}, "weight", "" },
4079 { "subq", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&subpel_quality}, "", "" },
4080 { "lowres", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&lowres}, "", "" },
4081 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4082 { "skip_threshold", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_threshold}, "frame skip threshold", "threshold" },
4083 { "skip_factor", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_factor}, "frame skip factor", "factor" },
4084 { "skip_exp", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_exp}, "frame skip exponent", "exponent" },
4085 { "skip_cmp", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_cmp}, "frame skip compare function", "compare function" },
4088 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
4089 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4090 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4091 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4092 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4093 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4094 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (100=normal)" , "volume" }, //
4097 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
4098 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4099 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4100 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
4102 /* G.2 grab options */
4103 { "grab", HAS_ARG | OPT_EXPERT | OPT_GRAB, {(void*)opt_grab}, "request grabbing using", "format" },
4104 { "gd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_grab_device}, "set grab device", "device" },
4107 { "muxrate", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_rate}, "set mux rate", "rate" },
4108 { "packetsize", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_packet_size}, "set packet size", "size" },
4109 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4110 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4114 static void show_banner(void)
4116 fprintf(stderr, "ffmpeg version " FFMPEG_VERSION ", build %d, Copyright (c) 2000-2004 Fabrice Bellard\n",
4118 fprintf(stderr, " configuration: %s\n", FFMPEG_CONFIGURATION);
4119 fprintf(stderr, " built on " __DATE__ " " __TIME__);
4121 fprintf(stderr, ", gcc: %s\n", __VERSION__);
4123 fprintf(stderr, ", using a non-gcc compiler\n");
4127 static void show_license(void)
4132 "This program is free software; you can redistribute it and/or modify\n"
4133 "it under the terms of the GNU General Public License as published by\n"
4134 "the Free Software Foundation; either version 2 of the License, or\n"
4135 "(at your option) any later version.\n"
4137 "This program is distributed in the hope that it will be useful,\n"
4138 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
4139 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
4140 "GNU General Public License for more details.\n"
4142 "You should have received a copy of the GNU General Public License\n"
4143 "along with this program; if not, write to the Free Software\n"
4144 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
4148 "This library is free software; you can redistribute it and/or\n"
4149 "modify it under the terms of the GNU Lesser General Public\n"
4150 "License as published by the Free Software Foundation; either\n"
4151 "version 2 of the License, or (at your option) any later version.\n"
4153 "This library is distributed in the hope that it will be useful,\n"
4154 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
4155 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
4156 "Lesser General Public License for more details.\n"
4158 "You should have received a copy of the GNU Lesser General Public\n"
4159 "License along with this library; if not, write to the Free Software\n"
4160 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
4166 static void show_help(void)
4169 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
4170 "Hyper fast Audio and Video encoder\n");
4172 show_help_options(options, "Main options:\n",
4173 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
4174 show_help_options(options, "\nVideo options:\n",
4175 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4177 show_help_options(options, "\nAdvanced Video options:\n",
4178 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4179 OPT_VIDEO | OPT_EXPERT);
4180 show_help_options(options, "\nAudio options:\n",
4181 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4183 show_help_options(options, "\nAdvanced Audio options:\n",
4184 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4185 OPT_AUDIO | OPT_EXPERT);
4186 show_help_options(options, "\nAudio/Video grab options:\n",
4189 show_help_options(options, "\nAdvanced options:\n",
4190 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4195 void parse_arg_file(const char *filename)
4197 opt_output_file(filename);
4200 int main(int argc, char **argv)
4213 parse_options(argc, argv, options);
4215 /* file converter / grab */
4216 if (nb_output_files <= 0) {
4217 fprintf(stderr, "Must supply at least one output file\n");
4221 if (nb_input_files == 0) {
4227 av_encode(output_files, nb_output_files, input_files, nb_input_files,
4228 stream_maps, nb_stream_maps);
4229 ti = getutime() - ti;
4231 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
4235 for(i=0;i<nb_output_files;i++) {
4236 /* maybe av_close_output_file ??? */
4237 AVFormatContext *s = output_files[i];
4239 if (!(s->oformat->flags & AVFMT_NOFILE))
4241 for(j=0;j<s->nb_streams;j++)
4242 av_free(s->streams[j]);
4245 for(i=0;i<nb_input_files;i++)
4246 av_close_input_file(input_files[i]);
4251 av_free(intra_matrix);
4253 av_free(inter_matrix);
4255 #ifdef POWERPC_PERFORMANCE_REPORT
4256 extern void powerpc_display_perf_report(void);
4257 powerpc_display_perf_report();
4258 #endif /* POWERPC_PERFORMANCE_REPORT */
4260 #ifndef CONFIG_WIN32
4261 if (received_sigterm) {
4263 "Received signal %d: terminating.\n",
4264 (int) received_sigterm);
4268 exit(0); /* not all OS-es handle main() return value */