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_codec_id = CODEC_ID_NONE;
140 static int video_codec_tag = 0;
141 static int same_quality = 0;
142 static int b_frames = 0;
143 static int mb_decision = FF_MB_DECISION_SIMPLE;
144 static int ildct_cmp = FF_CMP_VSAD;
145 static int mb_cmp = FF_CMP_SAD;
146 static int sub_cmp = FF_CMP_SAD;
147 static int cmp = FF_CMP_SAD;
148 static int pre_cmp = FF_CMP_SAD;
149 static int pre_me = 0;
150 static float lumi_mask = 0;
151 static float dark_mask = 0;
152 static float scplx_mask = 0;
153 static float tcplx_mask = 0;
154 static float p_mask = 0;
155 static int use_4mv = 0;
156 static int use_obmc = 0;
157 static int use_loop = 0;
158 static int use_aic = 0;
159 static int use_aiv = 0;
160 static int use_umv = 0;
161 static int use_ss = 0;
162 static int use_alt_scan = 0;
163 static int use_trell = 0;
164 static int use_scan_offset = 0;
165 static int use_qpel = 0;
166 static int use_qprd = 0;
167 static int use_cbprd = 0;
168 static int use_mv0 = 0;
169 static int do_normalize_aqp = 0;
171 static int closed_gop = 0;
172 static int strict_gop = 0;
173 static int no_output = 0;
174 static int do_deinterlace = 0;
175 static int do_interlace_dct = 0;
176 static int do_interlace_me = 0;
177 static int workaround_bugs = FF_BUG_AUTODETECT;
178 static int error_resilience = 2;
179 static int error_concealment = 3;
180 static int dct_algo = 0;
181 static int idct_algo = 0;
182 static int use_part = 0;
183 static int packet_size = 0;
184 static int error_rate = 0;
185 static int strict = 0;
186 static int top_field_first = -1;
187 static int noise_reduction = 0;
188 static int sc_threshold = 0;
189 static int debug = 0;
190 static int debug_mv = 0;
191 static int me_threshold = 0;
192 static int mb_threshold = 0;
193 static int intra_dc_precision = 8;
194 static int coder = 0;
195 static int context = 0;
196 static int predictor = 0;
197 static int video_profile = FF_PROFILE_UNKNOWN;
198 static int video_level = FF_LEVEL_UNKNOWN;
199 static int nsse_weight = 8;
200 static int subpel_quality= 8;
201 static int lowres= 0;
202 static int frame_skip_threshold= 0;
203 static int frame_skip_factor= 0;
204 static int frame_skip_exp= 0;
205 static int frame_skip_cmp= FF_CMP_DCTMAX;
206 extern int loop_input; /* currently a hack */
208 static int gop_size = 12;
209 static int intra_only = 0;
210 static int audio_sample_rate = 44100;
211 static int audio_bit_rate = 64000;
212 static int audio_disable = 0;
213 static int audio_channels = 1;
214 static int audio_codec_id = CODEC_ID_NONE;
215 static int audio_codec_tag = 0;
217 static int mux_rate= 0;
218 static int mux_packet_size= 0;
219 static float mux_preload= 0.5;
220 static float mux_max_delay= 0.7;
222 static int64_t recording_time = 0;
223 static int64_t start_time = 0;
224 static int64_t rec_timestamp = 0;
225 static int64_t input_ts_offset = 0;
226 static int file_overwrite = 0;
227 static char *str_title = NULL;
228 static char *str_author = NULL;
229 static char *str_copyright = NULL;
230 static char *str_comment = NULL;
231 static int do_benchmark = 0;
232 static int do_hex_dump = 0;
233 static int do_pkt_dump = 0;
234 static int do_psnr = 0;
235 static int do_vstats = 0;
236 static int do_pass = 0;
237 static int bitexact = 0;
238 static char *pass_logfilename = NULL;
239 static int audio_stream_copy = 0;
240 static int video_stream_copy = 0;
241 static int video_sync_method= 1;
242 static int audio_sync_method= 0;
243 static int copy_ts= 0;
245 static int rate_emu = 0;
247 static char *video_grab_format = "video4linux";
248 static char *video_device = NULL;
249 static char *grab_device = NULL;
250 static int video_channel = 0;
251 static char *video_standard = "ntsc";
253 static char *audio_grab_format = "audio_device";
254 static char *audio_device = NULL;
256 static int using_stdin = 0;
257 static int using_vhook = 0;
258 static int verbose = 1;
259 static int thread_count= 1;
260 static int q_pressed = 0;
261 static int me_range = 0;
262 static int64_t video_size = 0;
263 static int64_t audio_size = 0;
264 static int64_t extra_size = 0;
265 static int nb_frames_dup = 0;
266 static int nb_frames_drop = 0;
267 static int input_sync;
269 static int pgmyuv_compatibility_hack=0;
272 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
274 typedef struct AVOutputStream {
275 int file_index; /* file index */
276 int index; /* stream index in the output file */
277 int source_index; /* AVInputStream index */
278 AVStream *st; /* stream in the output file */
279 int encoding_needed; /* true if encoding needed for this stream */
281 /* input pts and corresponding output pts
283 double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
284 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
286 int video_resample; /* video_resample and video_crop are mutually exclusive */
287 AVFrame pict_tmp; /* temporary image for resampling */
288 ImgReSampleContext *img_resample_ctx; /* for image resampling */
290 int video_crop; /* video_resample and video_crop are mutually exclusive */
291 int topBand; /* cropping area sizes */
294 int video_pad; /* video_resample and video_pad are mutually exclusive */
295 int padtop; /* padding area sizes */
302 ReSampleContext *resample; /* for audio resampling */
303 FifoBuffer fifo; /* for compression: one audio fifo per codec */
307 typedef struct AVInputStream {
311 int discard; /* true if stream data should be discarded */
312 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
313 int64_t sample_index; /* current sample */
315 int64_t start; /* time when read started */
316 unsigned long frame; /* current frame */
317 int64_t next_pts; /* synthetic pts for cases where pkt.pts
319 int64_t pts; /* current pts */
320 int is_start; /* is 1 at the start and after a discontinuity */
323 typedef struct AVInputFile {
324 int eof_reached; /* true if eof reached */
325 int ist_index; /* index of first stream in ist_table */
326 int buffer_size; /* current total buffer size */
327 int buffer_size_max; /* buffer size at which we consider we can stop
329 int nb_streams; /* nb streams we are aware of */
334 /* init terminal so that we can grab keys */
335 static struct termios oldtty;
337 static void term_exit(void)
339 tcsetattr (0, TCSANOW, &oldtty);
342 static volatile sig_atomic_t received_sigterm = 0;
345 sigterm_handler(int sig)
347 received_sigterm = sig;
351 static void term_init(void)
358 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
359 |INLCR|IGNCR|ICRNL|IXON);
360 tty.c_oflag |= OPOST;
361 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
362 tty.c_cflag &= ~(CSIZE|PARENB);
367 tcsetattr (0, TCSANOW, &tty);
369 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
370 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
371 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
373 register a function to be called at normal program termination
376 #ifdef CONFIG_BEOS_NETSERVER
377 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
381 /* read a key without blocking */
382 static int read_key(void)
386 #ifndef CONFIG_BEOS_NETSERVER
394 n = select(1, &rfds, NULL, NULL, &tv);
406 static int decode_interrupt_cb(void)
408 return q_pressed || (q_pressed = read_key() == 'q');
413 static volatile int received_sigterm = 0;
415 /* no interactive support */
416 static void term_exit(void)
420 static void term_init(void)
424 static int read_key(void)
431 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
436 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
439 /* copy stream format */
440 s->nb_streams = ic->nb_streams;
441 for(i=0;i<ic->nb_streams;i++) {
444 st = av_mallocz(sizeof(AVStream));
445 memcpy(st, ic->streams[i], sizeof(AVStream));
449 av_close_input_file(ic);
453 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
455 static void do_audio_out(AVFormatContext *s,
458 unsigned char *buf, int size)
461 static uint8_t *audio_buf = NULL;
462 static uint8_t *audio_out = NULL;
463 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
465 int size_out, frame_bytes, ret;
466 AVCodecContext *enc= &ost->st->codec;
468 /* SC: dynamic allocation of buffers */
470 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
472 audio_out = av_malloc(audio_out_size);
473 if (!audio_buf || !audio_out)
474 return; /* Should signal an error ! */
476 if(audio_sync_method){
477 double delta = ost->sync_ipts * enc->sample_rate - ost->sync_opts
478 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2);
479 double idelta= delta*ist->st->codec.sample_rate / enc->sample_rate;
480 int byte_delta= ((int)idelta)*2*ist->st->codec.channels;
482 //FIXME resample delay
483 if(fabs(delta) > 50){
486 byte_delta= FFMAX(byte_delta, -size);
490 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
495 static uint8_t *input_tmp= NULL;
496 input_tmp= av_realloc(input_tmp, byte_delta + size);
498 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
501 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
503 memset(input_tmp, 0, byte_delta);
504 memcpy(input_tmp + byte_delta, buf, size);
508 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
510 }else if(audio_sync_method>1){
511 int comp= clip(delta, -audio_sync_method, audio_sync_method);
512 assert(ost->audio_resample);
514 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
515 // 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));
516 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
520 ost->sync_opts= lrintf(ost->sync_ipts * enc->sample_rate)
521 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2); //FIXME wrong
523 if (ost->audio_resample) {
525 size_out = audio_resample(ost->resample,
526 (short *)buftmp, (short *)buf,
527 size / (ist->st->codec.channels * 2));
528 size_out = size_out * enc->channels * 2;
534 /* now encode as many frames as possible */
535 if (enc->frame_size > 1) {
536 /* output resampled raw samples */
537 fifo_write(&ost->fifo, buftmp, size_out,
540 frame_bytes = enc->frame_size * 2 * enc->channels;
542 while (fifo_read(&ost->fifo, audio_buf, frame_bytes,
543 &ost->fifo.rptr) == 0) {
545 av_init_packet(&pkt);
547 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
550 pkt.stream_index= ost->index;
554 pkt.pts= enc->coded_frame->pts;
555 pkt.flags |= PKT_FLAG_KEY;
556 av_interleaved_write_frame(s, &pkt);
558 ost->sync_opts += enc->frame_size;
562 av_init_packet(&pkt);
564 ost->sync_opts += size_out / (2 * enc->channels);
566 /* output a pcm frame */
567 /* XXX: change encoding codec API to avoid this ? */
568 switch(enc->codec->id) {
569 case CODEC_ID_PCM_S16LE:
570 case CODEC_ID_PCM_S16BE:
571 case CODEC_ID_PCM_U16LE:
572 case CODEC_ID_PCM_U16BE:
575 size_out = size_out >> 1;
578 ret = avcodec_encode_audio(enc, audio_out, size_out,
581 pkt.stream_index= ost->index;
585 pkt.pts= enc->coded_frame->pts;
586 pkt.flags |= PKT_FLAG_KEY;
587 av_interleaved_write_frame(s, &pkt);
591 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
595 AVPicture picture_tmp;
598 dec = &ist->st->codec;
600 /* deinterlace : must be done before any resize */
601 if (do_deinterlace || using_vhook) {
604 /* create temporary picture */
605 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
606 buf = av_malloc(size);
610 picture2 = &picture_tmp;
611 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
614 if(avpicture_deinterlace(picture2, picture,
615 dec->pix_fmt, dec->width, dec->height) < 0) {
616 /* if error, do not deinterlace */
622 if (img_convert(picture2, dec->pix_fmt, picture,
623 dec->pix_fmt, dec->width, dec->height) < 0) {
624 /* if error, do not copy */
634 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
636 if (picture != picture2)
637 *picture = *picture2;
641 /* we begin to correct av delay at this threshold */
642 #define AV_DELAY_MAX 0.100
645 /* Expects img to be yuv420 */
646 static void fill_pad_region(AVPicture* img, int height, int width,
647 int padtop, int padbottom, int padleft, int padright, int *color) {
652 for (i = 0; i < 3; i++) {
653 shift = (i == 0) ? 0 : 1;
655 if (padtop || padleft) {
656 memset(img->data[i], color[i], (((img->linesize[i] * padtop) +
660 if (padleft || padright) {
661 optr = img->data[i] + (img->linesize[i] * (padtop >> shift)) +
662 (img->linesize[i] - (padright >> shift));
664 for (y = 0; y < ((height - (padtop + padbottom) - 1) >> shift); y++) {
665 memset(optr, color[i], (padleft + padright) >> shift);
666 optr += img->linesize[i];
670 if (padbottom || padright) {
671 optr = img->data[i] + (((img->linesize[i] * (height - padbottom)) - padright) >> shift);
672 memset(optr, color[i], (((img->linesize[i] * padbottom) + padright) >> shift));
677 static int bit_buffer_size= 1024*256;
678 static uint8_t *bit_buffer= NULL;
680 static void do_video_out(AVFormatContext *s,
686 int nb_frames, i, ret;
687 AVFrame *final_picture, *formatted_picture;
688 AVFrame picture_format_temp, picture_crop_temp;
689 uint8_t *buf = NULL, *buf1 = NULL;
690 AVCodecContext *enc, *dec;
691 enum PixelFormat target_pixfmt;
693 avcodec_get_frame_defaults(&picture_format_temp);
694 avcodec_get_frame_defaults(&picture_crop_temp);
696 enc = &ost->st->codec;
697 dec = &ist->st->codec;
699 /* by default, we output a single frame */
704 if(video_sync_method){
706 vdelta = ost->sync_ipts * enc->frame_rate / enc->frame_rate_base - ost->sync_opts;
707 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
710 else if (vdelta > 1.1)
711 nb_frames = lrintf(vdelta);
712 //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);
716 fprintf(stderr, "*** drop!\n");
717 }else if (nb_frames > 1) {
718 nb_frames_dup += nb_frames;
720 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
723 ost->sync_opts= lrintf(ost->sync_ipts * enc->frame_rate / enc->frame_rate_base);
725 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
729 /* convert pixel format if needed */
730 target_pixfmt = ost->video_resample || ost->video_pad
731 ? PIX_FMT_YUV420P : enc->pix_fmt;
732 if (dec->pix_fmt != target_pixfmt) {
735 /* create temporary picture */
736 size = avpicture_get_size(target_pixfmt, dec->width, dec->height);
737 buf = av_malloc(size);
740 formatted_picture = &picture_format_temp;
741 avpicture_fill((AVPicture*)formatted_picture, buf, target_pixfmt, dec->width, dec->height);
743 if (img_convert((AVPicture*)formatted_picture, target_pixfmt,
744 (AVPicture *)in_picture, dec->pix_fmt,
745 dec->width, dec->height) < 0) {
748 fprintf(stderr, "pixel format conversion not handled\n");
753 formatted_picture = in_picture;
756 /* XXX: resampling could be done before raw format conversion in
757 some cases to go faster */
758 /* XXX: only works for YUV420P */
759 if (ost->video_resample) {
760 final_picture = &ost->pict_tmp;
761 img_resample(ost->img_resample_ctx, (AVPicture*)final_picture, (AVPicture*)formatted_picture);
763 if (ost->padtop || ost->padbottom || ost->padleft || ost->padright) {
764 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
765 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
769 if (enc->pix_fmt != PIX_FMT_YUV420P) {
773 /* create temporary picture */
774 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
775 buf = av_malloc(size);
778 final_picture = &picture_format_temp;
779 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
781 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
782 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
783 enc->width, enc->height) < 0) {
786 fprintf(stderr, "pixel format conversion not handled\n");
791 } else if (ost->video_crop) {
792 picture_crop_temp.data[0] = formatted_picture->data[0] +
793 (ost->topBand * formatted_picture->linesize[0]) + ost->leftBand;
795 picture_crop_temp.data[1] = formatted_picture->data[1] +
796 ((ost->topBand >> 1) * formatted_picture->linesize[1]) +
797 (ost->leftBand >> 1);
799 picture_crop_temp.data[2] = formatted_picture->data[2] +
800 ((ost->topBand >> 1) * formatted_picture->linesize[2]) +
801 (ost->leftBand >> 1);
803 picture_crop_temp.linesize[0] = formatted_picture->linesize[0];
804 picture_crop_temp.linesize[1] = formatted_picture->linesize[1];
805 picture_crop_temp.linesize[2] = formatted_picture->linesize[2];
806 final_picture = &picture_crop_temp;
807 } else if (ost->video_pad) {
808 final_picture = &ost->pict_tmp;
810 for (i = 0; i < 3; i++) {
811 uint8_t *optr, *iptr;
812 int shift = (i == 0) ? 0 : 1;
815 /* set offset to start writing image into */
816 optr = final_picture->data[i] + (((final_picture->linesize[i] *
817 ost->padtop) + ost->padleft) >> shift);
818 iptr = formatted_picture->data[i];
820 yheight = (enc->height - ost->padtop - ost->padbottom) >> shift;
821 for (y = 0; y < yheight; y++) {
822 /* copy unpadded image row into padded image row */
823 memcpy(optr, iptr, formatted_picture->linesize[i]);
824 optr += final_picture->linesize[i];
825 iptr += formatted_picture->linesize[i];
829 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
830 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
833 if (enc->pix_fmt != PIX_FMT_YUV420P) {
837 /* create temporary picture */
838 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
839 buf = av_malloc(size);
842 final_picture = &picture_format_temp;
843 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
845 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
846 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
847 enc->width, enc->height) < 0) {
850 fprintf(stderr, "pixel format conversion not handled\n");
856 final_picture = formatted_picture;
858 /* duplicates frame if needed */
859 for(i=0;i<nb_frames;i++) {
861 av_init_packet(&pkt);
862 pkt.stream_index= ost->index;
864 if (s->oformat->flags & AVFMT_RAWPICTURE) {
865 /* raw pictures are written as AVPicture structure to
866 avoid any copies. We support temorarily the older
868 AVFrame* old_frame = enc->coded_frame;
869 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
870 pkt.data= (uint8_t *)final_picture;
871 pkt.size= sizeof(AVPicture);
873 pkt.pts= dec->coded_frame->pts;
874 if(dec->coded_frame && dec->coded_frame->key_frame)
875 pkt.flags |= PKT_FLAG_KEY;
877 av_interleaved_write_frame(s, &pkt);
878 enc->coded_frame = old_frame;
882 big_picture= *final_picture;
883 /* better than nothing: use input picture interlaced
885 big_picture.interlaced_frame = in_picture->interlaced_frame;
886 if(do_interlace_me || do_interlace_dct){
887 if(top_field_first == -1)
888 big_picture.top_field_first = in_picture->top_field_first;
890 big_picture.top_field_first = top_field_first;
893 /* handles sameq here. This is not correct because it may
894 not be a global option */
896 big_picture.quality = ist->st->quality;
898 big_picture.quality = ost->st->quality;
900 big_picture.pict_type = 0;
901 // big_picture.pts = AV_NOPTS_VALUE;
902 big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->frame_rate_base, enc->frame_rate);
903 //av_log(NULL, AV_LOG_DEBUG, "%lld -> encoder\n", ost->sync_opts);
904 ret = avcodec_encode_video(enc,
905 bit_buffer, bit_buffer_size,
907 //enc->frame_number = enc->real_pict_num;
909 pkt.data= bit_buffer;
912 pkt.pts= enc->coded_frame->pts;
913 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %lld/%lld\n",
914 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1,
915 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1);*/
917 if(enc->coded_frame && enc->coded_frame->key_frame)
918 pkt.flags |= PKT_FLAG_KEY;
919 av_interleaved_write_frame(s, &pkt);
921 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
922 // enc->frame_number-1, enc->real_pict_num, ret,
924 /* if two pass, output log */
925 if (ost->logfile && enc->stats_out) {
926 fprintf(ost->logfile, "%s", enc->stats_out);
938 static double psnr(double d){
939 if(d==0) return INFINITY;
940 return -10.0*log(d)/log(10.0);
943 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
946 static FILE *fvstats=NULL;
953 double ti1, bitrate, avg_bitrate;
957 today = localtime(&today2);
958 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour,
961 fvstats = fopen(filename,"w");
969 enc = &ost->st->codec;
970 if (enc->codec_type == CODEC_TYPE_VIDEO) {
971 frame_number = ost->frame_number;
972 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
973 if (enc->flags&CODEC_FLAG_PSNR)
974 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
976 fprintf(fvstats,"f_size= %6d ", frame_size);
977 /* compute pts value */
978 ti1 = (double)ost->sync_opts *enc->frame_rate_base / enc->frame_rate;
982 bitrate = (double)(frame_size * 8) * enc->frame_rate / enc->frame_rate_base / 1000.0;
983 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
984 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
985 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
986 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
990 static void print_report(AVFormatContext **output_files,
991 AVOutputStream **ost_table, int nb_ostreams,
996 AVFormatContext *oc, *os;
999 int frame_number, vid, i;
1000 double bitrate, ti1, pts;
1001 static int64_t last_time = -1;
1003 if (!is_last_report) {
1005 /* display the report every 0.5 seconds */
1006 cur_time = av_gettime();
1007 if (last_time == -1) {
1008 last_time = cur_time;
1011 if ((cur_time - last_time) < 500000)
1013 last_time = cur_time;
1017 oc = output_files[0];
1019 total_size = url_ftell(&oc->pb);
1024 for(i=0;i<nb_ostreams;i++) {
1026 os = output_files[ost->file_index];
1027 enc = &ost->st->codec;
1028 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1029 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1030 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1032 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1033 frame_number = ost->frame_number;
1034 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d q=%2.1f ",
1035 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : 0);
1037 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1038 if (enc->flags&CODEC_FLAG_PSNR){
1040 double error, error_sum=0;
1041 double scale, scale_sum=0;
1042 char type[3]= {'Y','U','V'};
1043 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1046 error= enc->error[j];
1047 scale= enc->width*enc->height*255.0*255.0*frame_number;
1049 error= enc->coded_frame->error[j];
1050 scale= enc->width*enc->height*255.0*255.0;
1055 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1057 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1061 /* compute min output value */
1062 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1063 if ((pts < ti1) && (pts > 0))
1069 if (verbose || is_last_report) {
1070 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1072 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1073 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
1074 (double)total_size / 1024, ti1, bitrate);
1077 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1078 nb_frames_dup, nb_frames_drop);
1081 fprintf(stderr, "%s \r", buf);
1086 if (is_last_report && verbose >= 0){
1087 int64_t raw= audio_size + video_size + extra_size;
1088 fprintf(stderr, "\n");
1089 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1093 100.0*(total_size - raw)/raw
1098 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1099 static int output_packet(AVInputStream *ist, int ist_index,
1100 AVOutputStream **ost_table, int nb_ostreams,
1101 const AVPacket *pkt)
1103 AVFormatContext *os;
1104 AVOutputStream *ost;
1108 int data_size, got_picture;
1110 void *buffer_to_free;
1111 static int samples_size= 0;
1112 static short *samples= NULL;
1115 ist->pts= ist->next_pts; // needed for last packet if vsync=0
1116 } else if (pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1117 ist->next_pts = ist->pts = pkt->dts;
1119 // assert(ist->pts == ist->next_pts);
1133 /* decode the packet if needed */
1134 data_buf = NULL; /* fail safe */
1136 if (ist->decoding_needed) {
1137 switch(ist->st->codec.codec_type) {
1138 case CODEC_TYPE_AUDIO:{
1140 samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE));
1141 /* XXX: could avoid copy if PCM 16 bits with same
1142 endianness as CPU */
1143 ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size,
1149 /* Some bug in mpeg audio decoder gives */
1150 /* data_size < 0, it seems they are overflows */
1151 if (data_size <= 0) {
1152 /* no audio frame */
1155 data_buf = (uint8_t *)samples;
1156 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1157 (ist->st->codec.sample_rate * ist->st->codec.channels);
1159 case CODEC_TYPE_VIDEO:
1160 data_size = (ist->st->codec.width * ist->st->codec.height * 3) / 2;
1161 /* XXX: allocate picture correctly */
1162 avcodec_get_frame_defaults(&picture);
1164 ret = avcodec_decode_video(&ist->st->codec,
1165 &picture, &got_picture, ptr, len);
1166 ist->st->quality= picture.quality;
1170 /* no picture yet */
1171 goto discard_packet;
1173 if (ist->st->codec.frame_rate_base != 0) {
1174 ist->next_pts += ((int64_t)AV_TIME_BASE *
1175 ist->st->codec.frame_rate_base) /
1176 ist->st->codec.frame_rate;
1184 switch(ist->st->codec.codec_type) {
1185 case CODEC_TYPE_AUDIO:
1186 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec.frame_size) /
1187 (ist->st->codec.sample_rate * ist->st->codec.channels);
1189 case CODEC_TYPE_VIDEO:
1190 if (ist->st->codec.frame_rate_base != 0) {
1191 ist->next_pts += ((int64_t)AV_TIME_BASE *
1192 ist->st->codec.frame_rate_base) /
1193 ist->st->codec.frame_rate;
1203 buffer_to_free = NULL;
1204 if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1205 pre_process_video_frame(ist, (AVPicture *)&picture,
1209 /* frame rate emulation */
1210 if (ist->st->codec.rate_emu) {
1211 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec.frame_rate_base, 1000000, ist->st->codec.frame_rate);
1212 int64_t now = av_gettime() - ist->start;
1220 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1221 is the one of the next displayed one */
1222 /* XXX: add mpeg4 too ? */
1223 if (ist->st->codec.codec_id == CODEC_ID_MPEG1VIDEO) {
1224 if (ist->st->codec.pict_type != B_TYPE) {
1226 tmp = ist->last_ip_pts;
1227 ist->last_ip_pts = ist->frac_pts.val;
1228 ist->frac_pts.val = tmp;
1232 /* if output time reached then transcode raw format,
1233 encode packets and output them */
1234 if (start_time == 0 || ist->pts >= start_time)
1235 for(i=0;i<nb_ostreams;i++) {
1239 if (ost->source_index == ist_index) {
1240 os = output_files[ost->file_index];
1243 printf("%d: got pts=%0.3f %0.3f\n", i,
1244 (double)pkt->pts / AV_TIME_BASE,
1245 ((double)ist->pts / AV_TIME_BASE) -
1246 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1248 /* set the input output pts pairs */
1249 ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index])/ AV_TIME_BASE;
1251 if (ost->encoding_needed) {
1252 switch(ost->st->codec.codec_type) {
1253 case CODEC_TYPE_AUDIO:
1254 do_audio_out(os, ost, ist, data_buf, data_size);
1256 case CODEC_TYPE_VIDEO:
1257 do_video_out(os, ost, ist, &picture, &frame_size);
1258 video_size += frame_size;
1259 if (do_vstats && frame_size)
1260 do_video_stats(os, ost, frame_size);
1266 AVFrame avframe; //FIXME/XXX remove this
1268 av_init_packet(&opkt);
1270 /* no reencoding needed : output the packet directly */
1271 /* force the input stream PTS */
1273 avcodec_get_frame_defaults(&avframe);
1274 ost->st->codec.coded_frame= &avframe;
1275 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1277 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO)
1278 audio_size += data_size;
1279 else if (ost->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1280 video_size += data_size;
1284 opkt.stream_index= ost->index;
1285 opkt.data= data_buf;
1286 opkt.size= data_size;
1287 if(pkt->pts != AV_NOPTS_VALUE)
1288 opkt.pts= pkt->pts + input_files_ts_offset[ist->file_index];
1290 opkt.pts= AV_NOPTS_VALUE;
1291 opkt.dts= pkt->dts + input_files_ts_offset[ist->file_index];
1292 opkt.flags= pkt->flags;
1294 av_interleaved_write_frame(os, &opkt);
1295 ost->st->codec.frame_number++;
1296 ost->frame_number++;
1300 av_free(buffer_to_free);
1306 for(i=0;i<nb_ostreams;i++) {
1308 if (ost->source_index == ist_index) {
1309 AVCodecContext *enc= &ost->st->codec;
1310 os = output_files[ost->file_index];
1312 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1314 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1317 if (ost->encoding_needed) {
1320 av_init_packet(&pkt);
1321 pkt.stream_index= ost->index;
1323 switch(ost->st->codec.codec_type) {
1324 case CODEC_TYPE_AUDIO:
1325 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1327 pkt.flags |= PKT_FLAG_KEY;
1329 case CODEC_TYPE_VIDEO:
1330 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1332 if(enc->coded_frame && enc->coded_frame->key_frame)
1333 pkt.flags |= PKT_FLAG_KEY;
1334 if (ost->logfile && enc->stats_out) {
1335 fprintf(ost->logfile, "%s", enc->stats_out);
1344 pkt.data= bit_buffer;
1346 if(enc->coded_frame)
1347 pkt.pts= enc->coded_frame->pts;
1348 av_interleaved_write_frame(os, &pkt);
1362 * The following code is the main loop of the file converter
1364 static int av_encode(AVFormatContext **output_files,
1365 int nb_output_files,
1366 AVFormatContext **input_files,
1368 AVStreamMap *stream_maps, int nb_stream_maps)
1370 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1371 AVFormatContext *is, *os;
1372 AVCodecContext *codec, *icodec;
1373 AVOutputStream *ost, **ost_table = NULL;
1374 AVInputStream *ist, **ist_table = NULL;
1375 AVInputFile *file_table;
1376 AVFormatContext *stream_no_data;
1379 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1383 /* input stream init */
1385 for(i=0;i<nb_input_files;i++) {
1386 is = input_files[i];
1387 file_table[i].ist_index = j;
1388 file_table[i].nb_streams = is->nb_streams;
1389 j += is->nb_streams;
1393 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1397 for(i=0;i<nb_istreams;i++) {
1398 ist = av_mallocz(sizeof(AVInputStream));
1404 for(i=0;i<nb_input_files;i++) {
1405 is = input_files[i];
1406 for(k=0;k<is->nb_streams;k++) {
1407 ist = ist_table[j++];
1408 ist->st = is->streams[k];
1409 ist->file_index = i;
1411 ist->discard = 1; /* the stream is discarded by default
1414 if (ist->st->codec.rate_emu) {
1415 ist->start = av_gettime();
1421 /* output stream init */
1423 for(i=0;i<nb_output_files;i++) {
1424 os = output_files[i];
1425 nb_ostreams += os->nb_streams;
1427 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1428 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1432 /* Sanity check the mapping args -- do the input files & streams exist? */
1433 for(i=0;i<nb_stream_maps;i++) {
1434 int fi = stream_maps[i].file_index;
1435 int si = stream_maps[i].stream_index;
1437 if (fi < 0 || fi > nb_input_files - 1 ||
1438 si < 0 || si > file_table[fi].nb_streams - 1) {
1439 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1444 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1447 for(i=0;i<nb_ostreams;i++) {
1448 ost = av_mallocz(sizeof(AVOutputStream));
1455 for(k=0;k<nb_output_files;k++) {
1456 os = output_files[k];
1457 for(i=0;i<os->nb_streams;i++) {
1459 ost = ost_table[n++];
1460 ost->file_index = k;
1462 ost->st = os->streams[i];
1463 if (nb_stream_maps > 0) {
1464 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1465 stream_maps[n-1].stream_index;
1467 /* Sanity check that the stream types match */
1468 if (ist_table[ost->source_index]->st->codec.codec_type != ost->st->codec.codec_type) {
1469 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1470 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1471 ost->file_index, ost->index);
1476 /* get corresponding input stream index : we select the first one with the right type */
1478 for(j=0;j<nb_istreams;j++) {
1481 ist->st->codec.codec_type == ost->st->codec.codec_type) {
1482 ost->source_index = j;
1489 /* try again and reuse existing stream */
1490 for(j=0;j<nb_istreams;j++) {
1492 if (ist->st->codec.codec_type == ost->st->codec.codec_type) {
1493 ost->source_index = j;
1498 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1499 ost->file_index, ost->index);
1504 ist = ist_table[ost->source_index];
1509 /* for each output stream, we compute the right encoding parameters */
1510 for(i=0;i<nb_ostreams;i++) {
1512 ist = ist_table[ost->source_index];
1514 codec = &ost->st->codec;
1515 icodec = &ist->st->codec;
1517 if (ost->st->stream_copy) {
1518 /* if stream_copy is selected, no need to decode or encode */
1519 codec->codec_id = icodec->codec_id;
1520 codec->codec_type = icodec->codec_type;
1521 if(!codec->codec_tag) codec->codec_tag = icodec->codec_tag;
1522 codec->bit_rate = icodec->bit_rate;
1523 switch(codec->codec_type) {
1524 case CODEC_TYPE_AUDIO:
1525 codec->sample_rate = icodec->sample_rate;
1526 codec->channels = icodec->channels;
1527 codec->frame_size = icodec->frame_size;
1528 codec->block_align= icodec->block_align;
1530 case CODEC_TYPE_VIDEO:
1531 codec->frame_rate = icodec->frame_rate;
1532 codec->frame_rate_base = icodec->frame_rate_base;
1533 codec->width = icodec->width;
1534 codec->height = icodec->height;
1540 switch(codec->codec_type) {
1541 case CODEC_TYPE_AUDIO:
1542 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1545 if (codec->channels == icodec->channels &&
1546 codec->sample_rate == icodec->sample_rate) {
1547 ost->audio_resample = 0;
1549 if (codec->channels != icodec->channels &&
1550 (icodec->codec_id == CODEC_ID_AC3 ||
1551 icodec->codec_id == CODEC_ID_DTS)) {
1552 /* Special case for 5:1 AC3 and DTS input */
1553 /* and mono or stereo output */
1554 /* Request specific number of channels */
1555 icodec->channels = codec->channels;
1556 if (codec->sample_rate == icodec->sample_rate)
1557 ost->audio_resample = 0;
1559 ost->audio_resample = 1;
1562 ost->audio_resample = 1;
1565 if(audio_sync_method>1)
1566 ost->audio_resample = 1;
1568 if(ost->audio_resample){
1569 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1570 codec->sample_rate, icodec->sample_rate);
1572 printf("Can't resample. Aborting.\n");
1576 ist->decoding_needed = 1;
1577 ost->encoding_needed = 1;
1579 case CODEC_TYPE_VIDEO:
1580 if (codec->width == icodec->width &&
1581 codec->height == icodec->height &&
1582 frame_topBand == 0 &&
1583 frame_bottomBand == 0 &&
1584 frame_leftBand == 0 &&
1585 frame_rightBand == 0 &&
1586 frame_padtop == 0 &&
1587 frame_padbottom == 0 &&
1588 frame_padleft == 0 &&
1589 frame_padright == 0)
1591 ost->video_resample = 0;
1592 ost->video_crop = 0;
1594 } else if ((codec->width == icodec->width -
1595 (frame_leftBand + frame_rightBand)) &&
1596 (codec->height == icodec->height -
1597 (frame_topBand + frame_bottomBand)))
1599 ost->video_resample = 0;
1600 ost->video_crop = 1;
1601 ost->topBand = frame_topBand;
1602 ost->leftBand = frame_leftBand;
1603 } else if ((codec->width == icodec->width +
1604 (frame_padleft + frame_padright)) &&
1605 (codec->height == icodec->height +
1606 (frame_padtop + frame_padbottom))) {
1607 ost->video_resample = 0;
1608 ost->video_crop = 0;
1610 ost->padtop = frame_padtop;
1611 ost->padleft = frame_padleft;
1612 ost->padbottom = frame_padbottom;
1613 ost->padright = frame_padright;
1614 avcodec_get_frame_defaults(&ost->pict_tmp);
1615 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1616 codec->width, codec->height ) )
1619 ost->video_resample = 1;
1620 ost->video_crop = 0; // cropping is handled as part of resample
1621 avcodec_get_frame_defaults(&ost->pict_tmp);
1622 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1623 codec->width, codec->height ) )
1626 ost->img_resample_ctx = img_resample_full_init(
1627 ost->st->codec.width, ost->st->codec.height,
1628 ist->st->codec.width, ist->st->codec.height,
1629 frame_topBand, frame_bottomBand,
1630 frame_leftBand, frame_rightBand,
1631 frame_padtop, frame_padbottom,
1632 frame_padleft, frame_padright);
1634 ost->padtop = frame_padtop;
1635 ost->padleft = frame_padleft;
1636 ost->padbottom = frame_padbottom;
1637 ost->padright = frame_padright;
1640 ost->encoding_needed = 1;
1641 ist->decoding_needed = 1;
1647 if (ost->encoding_needed &&
1648 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1649 char logfilename[1024];
1654 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1656 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1657 if (codec->flags & CODEC_FLAG_PASS1) {
1658 f = fopen(logfilename, "w");
1660 perror(logfilename);
1665 /* read the log file */
1666 f = fopen(logfilename, "r");
1668 perror(logfilename);
1671 fseek(f, 0, SEEK_END);
1673 fseek(f, 0, SEEK_SET);
1674 logbuffer = av_malloc(size + 1);
1676 fprintf(stderr, "Could not allocate log buffer\n");
1679 size = fread(logbuffer, 1, size, f);
1681 logbuffer[size] = '\0';
1682 codec->stats_in = logbuffer;
1686 if(codec->codec_type == CODEC_TYPE_VIDEO){
1687 int size= codec->width * codec->height;
1688 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1693 bit_buffer = av_malloc(bit_buffer_size);
1697 /* dump the file output parameters - cannot be done before in case
1699 for(i=0;i<nb_output_files;i++) {
1700 dump_format(output_files[i], i, output_files[i]->filename, 1);
1703 /* dump the stream mapping */
1705 fprintf(stderr, "Stream mapping:\n");
1706 for(i=0;i<nb_ostreams;i++) {
1708 fprintf(stderr, " Stream #%d.%d -> #%d.%d\n",
1709 ist_table[ost->source_index]->file_index,
1710 ist_table[ost->source_index]->index,
1716 /* open each encoder */
1717 for(i=0;i<nb_ostreams;i++) {
1719 if (ost->encoding_needed) {
1721 codec = avcodec_find_encoder(ost->st->codec.codec_id);
1723 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1724 ost->file_index, ost->index);
1727 if (avcodec_open(&ost->st->codec, codec) < 0) {
1728 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1729 ost->file_index, ost->index);
1732 extra_size += ost->st->codec.extradata_size;
1736 /* open each decoder */
1737 for(i=0;i<nb_istreams;i++) {
1739 if (ist->decoding_needed) {
1741 codec = avcodec_find_decoder(ist->st->codec.codec_id);
1743 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1744 ist->st->codec.codec_id, ist->file_index, ist->index);
1747 if (avcodec_open(&ist->st->codec, codec) < 0) {
1748 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1749 ist->file_index, ist->index);
1752 //if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO)
1753 // ist->st->codec.flags |= CODEC_FLAG_REPEAT_FIELD;
1758 for(i=0;i<nb_istreams;i++) {
1760 is = input_files[ist->file_index];
1762 ist->next_pts = ist->st->start_time;
1763 if(ist->next_pts == AV_NOPTS_VALUE)
1765 if(input_files_ts_offset[ist->file_index])
1766 ist->next_pts= AV_NOPTS_VALUE;
1770 /* compute buffer size max (should use a complete heuristic) */
1771 for(i=0;i<nb_input_files;i++) {
1772 file_table[i].buffer_size_max = 2048;
1775 /* set meta data information from input file if required */
1776 for (i=0;i<nb_meta_data_maps;i++) {
1777 AVFormatContext *out_file;
1778 AVFormatContext *in_file;
1780 int out_file_index = meta_data_maps[i].out_file;
1781 int in_file_index = meta_data_maps[i].in_file;
1782 if ( out_file_index < 0 || out_file_index >= nb_output_files ) {
1783 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1787 if ( in_file_index < 0 || in_file_index >= nb_input_files ) {
1788 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1793 out_file = output_files[out_file_index];
1794 in_file = input_files[in_file_index];
1796 strcpy(out_file->title, in_file->title);
1797 strcpy(out_file->author, in_file->author);
1798 strcpy(out_file->copyright, in_file->copyright);
1799 strcpy(out_file->comment, in_file->comment);
1800 strcpy(out_file->album, in_file->album);
1801 out_file->year = in_file->year;
1802 out_file->track = in_file->track;
1803 strcpy(out_file->genre, in_file->genre);
1806 /* open files and write file headers */
1807 for(i=0;i<nb_output_files;i++) {
1808 os = output_files[i];
1809 if (av_write_header(os) < 0) {
1810 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1816 #ifndef CONFIG_WIN32
1817 if ( !using_stdin && verbose >= 0) {
1818 fprintf(stderr, "Press [q] to stop encoding\n");
1819 url_set_interrupt_cb(decode_interrupt_cb);
1827 for(; received_sigterm == 0;) {
1828 int file_index, ist_index;
1836 /* if 'q' pressed, exits */
1840 /* read_key() returns 0 on EOF */
1846 /* select the stream that we must read now by looking at the
1847 smallest output pts */
1849 for(i=0;i<nb_ostreams;i++) {
1852 os = output_files[ost->file_index];
1853 ist = ist_table[ost->source_index];
1854 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1855 opts = (double)ost->sync_opts * ost->st->codec.frame_rate_base / ost->st->codec.frame_rate;
1857 opts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1858 ipts = (double)ist->pts;
1859 if (!file_table[ist->file_index].eof_reached){
1860 if(ipts < ipts_min) {
1862 if(input_sync ) file_index = ist->file_index;
1864 if(opts < opts_min) {
1866 if(!input_sync) file_index = ist->file_index;
1869 if(ost->frame_number >= max_frames[ost->st->codec.codec_type]){
1874 /* if none, if is finished */
1875 if (file_index < 0) {
1879 /* finish if recording time exhausted */
1880 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
1883 /* read a frame from it and output it in the fifo */
1884 is = input_files[file_index];
1885 if (av_read_frame(is, &pkt) < 0) {
1886 file_table[file_index].eof_reached = 1;
1891 stream_no_data = is;
1896 av_pkt_dump(stdout, &pkt, do_hex_dump);
1898 /* the following test is needed in case new streams appear
1899 dynamically in stream : we ignore them */
1900 if (pkt.stream_index >= file_table[file_index].nb_streams)
1901 goto discard_packet;
1902 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1903 ist = ist_table[ist_index];
1905 goto discard_packet;
1907 // 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);
1908 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
1909 int64_t delta= pkt.dts - ist->next_pts;
1910 if(ABS(delta) > 10LL*AV_TIME_BASE && !copy_ts){
1911 input_files_ts_offset[ist->file_index]-= delta;
1913 fprintf(stderr, "timestamp discontinuity %lld, new offset= %lld\n", delta, input_files_ts_offset[ist->file_index]);
1914 for(i=0; i<file_table[file_index].nb_streams; i++){
1915 int index= file_table[file_index].ist_index + i;
1916 ist_table[index]->next_pts += delta;
1917 ist_table[index]->is_start=1;
1922 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1923 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1926 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1927 ist->file_index, ist->index);
1929 av_free_packet(&pkt);
1934 av_free_packet(&pkt);
1936 /* dump report by using the output first video and audio streams */
1937 print_report(output_files, ost_table, nb_ostreams, 0);
1940 /* at the end of stream, we must flush the decoder buffers */
1941 for(i=0;i<nb_istreams;i++) {
1943 if (ist->decoding_needed) {
1944 output_packet(ist, i, ost_table, nb_ostreams, NULL);
1950 /* write the trailer if needed and close file */
1951 for(i=0;i<nb_output_files;i++) {
1952 os = output_files[i];
1953 av_write_trailer(os);
1956 /* dump report by using the first video and audio streams */
1957 print_report(output_files, ost_table, nb_ostreams, 1);
1959 /* close each encoder */
1960 for(i=0;i<nb_ostreams;i++) {
1962 if (ost->encoding_needed) {
1963 av_freep(&ost->st->codec.stats_in);
1964 avcodec_close(&ost->st->codec);
1968 /* close each decoder */
1969 for(i=0;i<nb_istreams;i++) {
1971 if (ist->decoding_needed) {
1972 avcodec_close(&ist->st->codec);
1980 av_freep(&bit_buffer);
1981 av_free(file_table);
1984 for(i=0;i<nb_istreams;i++) {
1991 for(i=0;i<nb_ostreams;i++) {
1995 fclose(ost->logfile);
1996 ost->logfile = NULL;
1998 fifo_free(&ost->fifo); /* works even if fifo is not
1999 initialized but set to zero */
2000 av_free(ost->pict_tmp.data[0]);
2001 if (ost->video_resample)
2002 img_resample_close(ost->img_resample_ctx);
2003 if (ost->audio_resample)
2004 audio_resample_close(ost->resample);
2017 int file_read(const char *filename)
2020 unsigned char buffer[1024];
2023 if (url_open(&h, filename, O_RDONLY) < 0) {
2024 printf("could not open '%s'\n", filename);
2028 len = url_read(h, buffer, sizeof(buffer));
2031 for(i=0;i<len;i++) putchar(buffer[i]);
2038 static void opt_image_format(const char *arg)
2042 for(f = first_image_format; f != NULL; f = f->next) {
2043 if (!strcmp(arg, f->name))
2047 fprintf(stderr, "Unknown image format: '%s'\n", arg);
2053 static void opt_format(const char *arg)
2055 /* compatibility stuff for pgmyuv */
2056 if (!strcmp(arg, "pgmyuv")) {
2057 pgmyuv_compatibility_hack=1;
2058 // opt_image_format(arg);
2062 file_iformat = av_find_input_format(arg);
2063 file_oformat = guess_format(arg, NULL, NULL);
2064 if (!file_iformat && !file_oformat) {
2065 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2070 static void opt_video_bitrate(const char *arg)
2072 video_bit_rate = atoi(arg) * 1000;
2075 static void opt_video_bitrate_tolerance(const char *arg)
2077 video_bit_rate_tolerance = atoi(arg) * 1000;
2080 static void opt_video_bitrate_max(const char *arg)
2082 video_rc_max_rate = atoi(arg) * 1000;
2085 static void opt_video_bitrate_min(const char *arg)
2087 video_rc_min_rate = atoi(arg) * 1000;
2090 static void opt_video_buffer_size(const char *arg)
2092 video_rc_buffer_size = atoi(arg) * 8*1024;
2095 static void opt_video_rc_eq(char *arg)
2100 static void opt_video_rc_override_string(char *arg)
2102 video_rc_override_string = arg;
2106 static void opt_workaround_bugs(const char *arg)
2108 workaround_bugs = atoi(arg);
2111 static void opt_dct_algo(const char *arg)
2113 dct_algo = atoi(arg);
2116 static void opt_idct_algo(const char *arg)
2118 idct_algo = atoi(arg);
2121 static void opt_me_threshold(const char *arg)
2123 me_threshold = atoi(arg);
2126 static void opt_mb_threshold(const char *arg)
2128 mb_threshold = atoi(arg);
2131 static void opt_error_resilience(const char *arg)
2133 error_resilience = atoi(arg);
2136 static void opt_error_concealment(const char *arg)
2138 error_concealment = atoi(arg);
2141 static void opt_debug(const char *arg)
2146 static void opt_vismv(const char *arg)
2148 debug_mv = atoi(arg);
2151 static void opt_verbose(const char *arg)
2153 verbose = atoi(arg);
2154 av_log_set_level(atoi(arg));
2157 static void opt_frame_rate(const char *arg)
2159 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
2160 fprintf(stderr, "Incorrect frame rate\n");
2165 static void opt_frame_crop_top(const char *arg)
2167 frame_topBand = atoi(arg);
2168 if (frame_topBand < 0) {
2169 fprintf(stderr, "Incorrect top crop size\n");
2172 if ((frame_topBand % 2) != 0) {
2173 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2176 if ((frame_topBand) >= frame_height){
2177 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2180 frame_height -= frame_topBand;
2183 static void opt_frame_crop_bottom(const char *arg)
2185 frame_bottomBand = atoi(arg);
2186 if (frame_bottomBand < 0) {
2187 fprintf(stderr, "Incorrect bottom crop size\n");
2190 if ((frame_bottomBand % 2) != 0) {
2191 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2194 if ((frame_bottomBand) >= frame_height){
2195 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2198 frame_height -= frame_bottomBand;
2201 static void opt_frame_crop_left(const char *arg)
2203 frame_leftBand = atoi(arg);
2204 if (frame_leftBand < 0) {
2205 fprintf(stderr, "Incorrect left crop size\n");
2208 if ((frame_leftBand % 2) != 0) {
2209 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2212 if ((frame_leftBand) >= frame_width){
2213 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2216 frame_width -= frame_leftBand;
2219 static void opt_frame_crop_right(const char *arg)
2221 frame_rightBand = atoi(arg);
2222 if (frame_rightBand < 0) {
2223 fprintf(stderr, "Incorrect right crop size\n");
2226 if ((frame_rightBand % 2) != 0) {
2227 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2230 if ((frame_rightBand) >= frame_width){
2231 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2234 frame_width -= frame_rightBand;
2237 static void opt_frame_size(const char *arg)
2239 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2240 fprintf(stderr, "Incorrect frame size\n");
2243 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2244 fprintf(stderr, "Frame size must be a multiple of 2\n");
2250 #define SCALEBITS 10
2251 #define ONE_HALF (1 << (SCALEBITS - 1))
2252 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2254 #define RGB_TO_Y(r, g, b) \
2255 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2256 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2258 #define RGB_TO_U(r1, g1, b1, shift)\
2259 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2260 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2262 #define RGB_TO_V(r1, g1, b1, shift)\
2263 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2264 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2266 static void opt_pad_color(const char *arg) {
2267 /* Input is expected to be six hex digits similar to
2268 how colors are expressed in html tags (but without the #) */
2269 int rgb = strtol(arg, NULL, 16);
2273 g = ((rgb >> 8) & 255);
2276 padcolor[0] = RGB_TO_Y(r,g,b);
2277 padcolor[1] = RGB_TO_U(r,g,b,0);
2278 padcolor[2] = RGB_TO_V(r,g,b,0);
2281 static void opt_frame_pad_top(const char *arg)
2283 frame_padtop = atoi(arg);
2284 if (frame_padtop < 0) {
2285 fprintf(stderr, "Incorrect top pad size\n");
2288 if ((frame_padtop % 2) != 0) {
2289 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2294 static void opt_frame_pad_bottom(const char *arg)
2296 frame_padbottom = atoi(arg);
2297 if (frame_padbottom < 0) {
2298 fprintf(stderr, "Incorrect bottom pad size\n");
2301 if ((frame_padbottom % 2) != 0) {
2302 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2308 static void opt_frame_pad_left(const char *arg)
2310 frame_padleft = atoi(arg);
2311 if (frame_padleft < 0) {
2312 fprintf(stderr, "Incorrect left pad size\n");
2315 if ((frame_padleft % 2) != 0) {
2316 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2322 static void opt_frame_pad_right(const char *arg)
2324 frame_padright = atoi(arg);
2325 if (frame_padright < 0) {
2326 fprintf(stderr, "Incorrect right pad size\n");
2329 if ((frame_padright % 2) != 0) {
2330 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2336 static void opt_frame_pix_fmt(const char *arg)
2338 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2341 static void opt_frame_aspect_ratio(const char *arg)
2347 p = strchr(arg, ':');
2349 x = strtol(arg, (char **)&arg, 10);
2351 y = strtol(arg+1, (char **)&arg, 10);
2353 ar = (double)x / (double)y;
2355 ar = strtod(arg, (char **)&arg);
2358 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2361 frame_aspect_ratio = ar;
2364 static void opt_gop_size(const char *arg)
2366 gop_size = atoi(arg);
2369 static void opt_b_frames(const char *arg)
2371 b_frames = atoi(arg);
2372 if (b_frames > FF_MAX_B_FRAMES) {
2373 fprintf(stderr, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES);
2375 } else if (b_frames < 1) {
2376 fprintf(stderr, "\nNumber of B frames must be higher than 0\n");
2381 static void opt_mb_decision(const char *arg)
2383 mb_decision = atoi(arg);
2386 static void opt_mb_cmp(const char *arg)
2391 static void opt_ildct_cmp(const char *arg)
2393 ildct_cmp = atoi(arg);
2396 static void opt_sub_cmp(const char *arg)
2398 sub_cmp = atoi(arg);
2401 static void opt_cmp(const char *arg)
2406 static void opt_pre_cmp(const char *arg)
2408 pre_cmp = atoi(arg);
2411 static void opt_pre_me(const char *arg)
2416 static void opt_lumi_mask(const char *arg)
2418 lumi_mask = atof(arg);
2421 static void opt_dark_mask(const char *arg)
2423 dark_mask = atof(arg);
2426 static void opt_scplx_mask(const char *arg)
2428 scplx_mask = atof(arg);
2431 static void opt_tcplx_mask(const char *arg)
2433 tcplx_mask = atof(arg);
2436 static void opt_p_mask(const char *arg)
2441 static void opt_qscale(const char *arg)
2443 video_qscale = atof(arg);
2444 if (video_qscale < 0.01 ||
2445 video_qscale > 255) {
2446 fprintf(stderr, "qscale must be >= 0.01 and <= 255\n");
2451 static void opt_qsquish(const char *arg)
2453 video_qsquish = atof(arg);
2454 if (video_qsquish < 0.0 ||
2455 video_qsquish > 99.0) {
2456 fprintf(stderr, "qsquish must be >= 0.0 and <= 99.0\n");
2461 static void opt_lelim(const char *arg)
2463 video_lelim = atoi(arg);
2464 if (video_lelim < -99 ||
2466 fprintf(stderr, "lelim must be >= -99 and <= 99\n");
2471 static void opt_celim(const char *arg)
2473 video_celim = atoi(arg);
2474 if (video_celim < -99 ||
2476 fprintf(stderr, "celim must be >= -99 and <= 99\n");
2481 static void opt_lmax(const char *arg)
2483 video_lmax = atof(arg)*FF_QP2LAMBDA;
2486 static void opt_lmin(const char *arg)
2488 video_lmin = atof(arg)*FF_QP2LAMBDA;
2491 static void opt_qmin(const char *arg)
2493 video_qmin = atoi(arg);
2494 if (video_qmin < 1 ||
2496 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2501 static void opt_qmax(const char *arg)
2503 video_qmax = atoi(arg);
2504 if (video_qmax < 1 ||
2506 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2511 static void opt_mb_lmin(const char *arg)
2513 video_mb_lmin = atof(arg)*FF_QP2LAMBDA;
2514 if (video_mb_lmin < 1 ||
2515 video_mb_lmin > FF_LAMBDA_MAX) {
2516 fprintf(stderr, "mblmin must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
2521 static void opt_mb_lmax(const char *arg)
2523 video_mb_lmax = atof(arg)*FF_QP2LAMBDA;
2524 if (video_mb_lmax < 1 ||
2525 video_mb_lmax > FF_LAMBDA_MAX) {
2526 fprintf(stderr, "mblmax must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
2531 static void opt_qdiff(const char *arg)
2533 video_qdiff = atoi(arg);
2534 if (video_qdiff < 0 ||
2536 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2541 static void opt_qblur(const char *arg)
2543 video_qblur = atof(arg);
2546 static void opt_qcomp(const char *arg)
2548 video_qcomp = atof(arg);
2551 static void opt_rc_initial_cplx(const char *arg)
2553 video_rc_initial_cplx = atof(arg);
2555 static void opt_b_qfactor(const char *arg)
2557 video_b_qfactor = atof(arg);
2559 static void opt_i_qfactor(const char *arg)
2561 video_i_qfactor = atof(arg);
2563 static void opt_b_qoffset(const char *arg)
2565 video_b_qoffset = atof(arg);
2567 static void opt_i_qoffset(const char *arg)
2569 video_i_qoffset = atof(arg);
2572 static void opt_ibias(const char *arg)
2574 video_intra_quant_bias = atoi(arg);
2576 static void opt_pbias(const char *arg)
2578 video_inter_quant_bias = atoi(arg);
2581 static void opt_packet_size(const char *arg)
2583 packet_size= atoi(arg);
2586 static void opt_error_rate(const char *arg)
2588 error_rate= atoi(arg);
2591 static void opt_strict(const char *arg)
2596 static void opt_top_field_first(const char *arg)
2598 top_field_first= atoi(arg);
2601 static void opt_noise_reduction(const char *arg)
2603 noise_reduction= atoi(arg);
2606 static void opt_qns(const char *arg)
2611 static void opt_sc_threshold(const char *arg)
2613 sc_threshold= atoi(arg);
2616 static void opt_me_range(const char *arg)
2618 me_range = atoi(arg);
2621 static void opt_thread_count(const char *arg)
2623 thread_count= atoi(arg);
2624 #if !defined(HAVE_THREADS)
2626 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2630 static void opt_audio_bitrate(const char *arg)
2632 audio_bit_rate = atoi(arg) * 1000;
2635 static void opt_audio_rate(const char *arg)
2637 audio_sample_rate = atoi(arg);
2640 static void opt_audio_channels(const char *arg)
2642 audio_channels = atoi(arg);
2645 static void opt_video_device(const char *arg)
2647 video_device = av_strdup(arg);
2650 static void opt_grab_device(const char *arg)
2652 grab_device = av_strdup(arg);
2655 static void opt_video_channel(const char *arg)
2657 video_channel = strtol(arg, NULL, 0);
2660 static void opt_video_standard(const char *arg)
2662 video_standard = av_strdup(arg);
2665 static void opt_audio_device(const char *arg)
2667 audio_device = av_strdup(arg);
2670 static void opt_audio_codec(const char *arg)
2674 if (!strcmp(arg, "copy")) {
2675 audio_stream_copy = 1;
2679 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_AUDIO)
2684 fprintf(stderr, "Unknown audio codec '%s'\n", arg);
2687 audio_codec_id = p->id;
2692 static void opt_audio_tag(const char *arg)
2695 audio_codec_tag= strtol(arg, &tail, 0);
2698 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2701 static void opt_video_tag(const char *arg)
2704 video_codec_tag= strtol(arg, &tail, 0);
2707 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2710 static void add_frame_hooker(const char *arg)
2715 char *args = av_strdup(arg);
2719 argv[0] = strtok(args, " ");
2720 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2723 i = frame_hook_add(argc, argv);
2726 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2731 const char *motion_str[] = {
2741 static void opt_motion_estimation(const char *arg)
2747 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2750 if (!strcmp(*p, arg))
2754 me_method = (p - motion_str) + 1;
2757 static void opt_video_codec(const char *arg)
2761 if (!strcmp(arg, "copy")) {
2762 video_stream_copy = 1;
2766 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_VIDEO)
2771 fprintf(stderr, "Unknown video codec '%s'\n", arg);
2774 video_codec_id = p->id;
2779 static void opt_map(const char *arg)
2785 m = &stream_maps[nb_stream_maps++];
2787 m->file_index = strtol(arg, (char **)&p, 0);
2791 m->stream_index = strtol(p, (char **)&p, 0);
2794 static void opt_map_meta_data(const char *arg)
2800 m = &meta_data_maps[nb_meta_data_maps++];
2802 m->out_file = strtol(arg, (char **)&p, 0);
2806 m->in_file = strtol(p, (char **)&p, 0);
2809 static void opt_recording_time(const char *arg)
2811 recording_time = parse_date(arg, 1);
2814 static void opt_start_time(const char *arg)
2816 start_time = parse_date(arg, 1);
2819 static void opt_rec_timestamp(const char *arg)
2821 rec_timestamp = parse_date(arg, 0) / 1000000;
2824 static void opt_input_ts_offset(const char *arg)
2826 input_ts_offset = parse_date(arg, 1);
2829 static void opt_input_file(const char *filename)
2831 AVFormatContext *ic;
2832 AVFormatParameters params, *ap = ¶ms;
2833 int err, i, ret, rfps, rfps_base;
2836 if (!strcmp(filename, "-"))
2839 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2840 !strcmp( filename, "/dev/stdin" );
2842 /* get default parameters from command line */
2843 memset(ap, 0, sizeof(*ap));
2844 ap->sample_rate = audio_sample_rate;
2845 ap->channels = audio_channels;
2846 ap->frame_rate = frame_rate;
2847 ap->frame_rate_base = frame_rate_base;
2848 ap->width = frame_width + frame_padleft + frame_padright;
2849 ap->height = frame_height + frame_padtop + frame_padbottom;
2850 ap->image_format = image_format;
2851 ap->pix_fmt = frame_pix_fmt;
2852 ap->device = grab_device;
2853 ap->channel = video_channel;
2854 ap->standard = video_standard;
2855 ap->video_codec_id = video_codec_id;
2856 ap->audio_codec_id = audio_codec_id;
2857 if(pgmyuv_compatibility_hack)
2858 ap->video_codec_id= CODEC_ID_PGMYUV;
2860 /* open the input file with generic libav function */
2861 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2863 print_error(filename, err);
2867 /* If not enough info to get the stream parameters, we decode the
2868 first frames to get it. (used in mpeg case for example) */
2869 ret = av_find_stream_info(ic);
2870 if (ret < 0 && verbose >= 0) {
2871 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2875 timestamp = start_time;
2876 /* add the stream start time */
2877 if (ic->start_time != AV_NOPTS_VALUE)
2878 timestamp += ic->start_time;
2880 /* if seeking requested, we execute it */
2881 if (start_time != 0) {
2882 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2884 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2885 filename, (double)timestamp / AV_TIME_BASE);
2887 /* reset seek info */
2891 /* update the current parameters so that they match the one of the input stream */
2892 for(i=0;i<ic->nb_streams;i++) {
2893 AVCodecContext *enc = &ic->streams[i]->codec;
2894 #if defined(HAVE_THREADS)
2896 avcodec_thread_init(enc, thread_count);
2898 enc->thread_count= thread_count;
2899 switch(enc->codec_type) {
2900 case CODEC_TYPE_AUDIO:
2901 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2902 audio_channels = enc->channels;
2903 audio_sample_rate = enc->sample_rate;
2905 ic->streams[i]->discard= 1;
2907 case CODEC_TYPE_VIDEO:
2908 frame_height = enc->height;
2909 frame_width = enc->width;
2910 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2911 frame_pix_fmt = enc->pix_fmt;
2912 rfps = ic->streams[i]->r_frame_rate;
2913 rfps_base = ic->streams[i]->r_frame_rate_base;
2914 enc->workaround_bugs = workaround_bugs;
2915 enc->error_resilience = error_resilience;
2916 enc->error_concealment = error_concealment;
2917 enc->idct_algo = idct_algo;
2919 enc->debug_mv = debug_mv;
2920 enc->lowres= lowres;
2922 enc->flags|= CODEC_FLAG_BITEXACT;
2924 enc->debug |= FF_DEBUG_MV;
2926 if (enc->frame_rate != rfps || enc->frame_rate_base != rfps_base) {
2929 fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2930 i, (float)enc->frame_rate / enc->frame_rate_base, enc->frame_rate, enc->frame_rate_base,
2932 (float)rfps / rfps_base, rfps, rfps_base);
2934 /* update the current frame rate to match the stream frame rate */
2936 frame_rate_base = rfps_base;
2938 enc->rate_emu = rate_emu;
2940 ic->streams[i]->discard= 1;
2942 case CODEC_TYPE_DATA:
2949 input_files[nb_input_files] = ic;
2950 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2951 /* dump the file content */
2953 dump_format(ic, nb_input_files, filename, 0);
2956 file_iformat = NULL;
2957 file_oformat = NULL;
2958 image_format = NULL;
2966 static void opt_grab(const char *arg)
2968 file_iformat = av_find_input_format(arg);
2972 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
2974 int has_video, has_audio, i, j;
2975 AVFormatContext *ic;
2979 for(j=0;j<nb_input_files;j++) {
2980 ic = input_files[j];
2981 for(i=0;i<ic->nb_streams;i++) {
2982 AVCodecContext *enc = &ic->streams[i]->codec;
2983 switch(enc->codec_type) {
2984 case CODEC_TYPE_AUDIO:
2987 case CODEC_TYPE_VIDEO:
2990 case CODEC_TYPE_DATA:
2997 *has_video_ptr = has_video;
2998 *has_audio_ptr = has_audio;
3001 static void opt_output_file(const char *filename)
3004 AVFormatContext *oc;
3005 int use_video, use_audio, nb_streams, input_has_video, input_has_audio;
3007 AVFormatParameters params, *ap = ¶ms;
3009 if (!strcmp(filename, "-"))
3012 oc = av_alloc_format_context();
3014 if (!file_oformat) {
3015 file_oformat = guess_format(NULL, filename, NULL);
3016 if (!file_oformat) {
3017 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
3023 oc->oformat = file_oformat;
3025 if (!strcmp(file_oformat->name, "ffm") &&
3026 strstart(filename, "http:", NULL)) {
3027 /* special case for files sent to ffserver: we get the stream
3028 parameters from ffserver */
3029 if (read_ffserver_streams(oc, filename) < 0) {
3030 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
3034 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy;
3035 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy;
3037 /* disable if no corresponding type found and at least one
3039 if (nb_input_files > 0) {
3040 check_audio_video_inputs(&input_has_video, &input_has_audio);
3041 if (!input_has_video)
3043 if (!input_has_audio)
3047 /* manual disable */
3048 if (audio_disable) {
3051 if (video_disable) {
3057 AVCodecContext *video_enc;
3059 st = av_new_stream(oc, nb_streams++);
3061 fprintf(stderr, "Could not alloc stream\n");
3064 #if defined(HAVE_THREADS)
3066 avcodec_thread_init(&st->codec, thread_count);
3069 video_enc = &st->codec;
3072 video_enc->codec_tag= video_codec_tag;
3074 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
3075 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3076 if (video_stream_copy) {
3077 st->stream_copy = 1;
3078 video_enc->codec_type = CODEC_TYPE_VIDEO;
3084 codec_id = av_guess_codec(file_oformat, NULL, filename, NULL, CODEC_TYPE_VIDEO);
3085 if (video_codec_id != CODEC_ID_NONE)
3086 codec_id = video_codec_id;
3088 video_enc->codec_id = codec_id;
3089 codec = avcodec_find_encoder(codec_id);
3091 video_enc->bit_rate = video_bit_rate;
3092 video_enc->bit_rate_tolerance = video_bit_rate_tolerance;
3093 video_enc->frame_rate = frame_rate;
3094 video_enc->frame_rate_base = frame_rate_base;
3095 if(codec && codec->supported_framerates){
3096 const AVRational *p= codec->supported_framerates;
3097 AVRational req= (AVRational){frame_rate, frame_rate_base};
3098 const AVRational *best=NULL;
3099 AVRational best_error= (AVRational){INT_MAX, 1};
3100 for(; p->den!=0; p++){
3101 AVRational error= av_sub_q(req, *p);
3102 if(error.num <0) error.num *= -1;
3103 if(av_cmp_q(error, best_error) < 0){
3108 video_enc->frame_rate = best->num;
3109 video_enc->frame_rate_base= best->den;
3112 video_enc->width = frame_width + frame_padright + frame_padleft;
3113 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3114 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3115 video_enc->pix_fmt = frame_pix_fmt;
3117 if(codec && codec->pix_fmts){
3118 const enum PixelFormat *p= codec->pix_fmts;
3120 if(*p == video_enc->pix_fmt)
3124 video_enc->pix_fmt = codec->pix_fmts[0];
3128 video_enc->gop_size = gop_size;
3130 video_enc->gop_size = 0;
3131 if (video_qscale || same_quality) {
3132 video_enc->flags |= CODEC_FLAG_QSCALE;
3133 st->quality = FF_QP2LAMBDA * video_qscale;
3137 video_enc->intra_matrix = intra_matrix;
3139 video_enc->inter_matrix = inter_matrix;
3142 video_enc->flags |= CODEC_FLAG_BITEXACT;
3144 video_enc->mb_decision = mb_decision;
3145 video_enc->mb_cmp = mb_cmp;
3146 video_enc->ildct_cmp = ildct_cmp;
3147 video_enc->me_sub_cmp = sub_cmp;
3148 video_enc->me_cmp = cmp;
3149 video_enc->me_pre_cmp = pre_cmp;
3150 video_enc->pre_me = pre_me;
3151 video_enc->lumi_masking = lumi_mask;
3152 video_enc->dark_masking = dark_mask;
3153 video_enc->spatial_cplx_masking = scplx_mask;
3154 video_enc->temporal_cplx_masking = tcplx_mask;
3155 video_enc->p_masking = p_mask;
3156 video_enc->quantizer_noise_shaping= qns;
3159 video_enc->flags |= CODEC_FLAG_H263P_UMV;
3162 video_enc->flags |= CODEC_FLAG_H263P_SLICE_STRUCT;
3165 video_enc->flags |= CODEC_FLAG_H263P_AIC;
3168 video_enc->flags |= CODEC_FLAG_H263P_AIV;
3171 video_enc->flags |= CODEC_FLAG_4MV;
3174 video_enc->flags |= CODEC_FLAG_OBMC;
3177 video_enc->flags |= CODEC_FLAG_LOOP_FILTER;
3181 video_enc->flags |= CODEC_FLAG_PART;
3184 video_enc->flags |= CODEC_FLAG_ALT_SCAN;
3187 video_enc->flags |= CODEC_FLAG_TRELLIS_QUANT;
3190 video_enc->flags |= CODEC_FLAG_MV0;
3192 if (do_normalize_aqp) {
3193 video_enc->flags |= CODEC_FLAG_NORMALIZE_AQP;
3195 if (use_scan_offset) {
3196 video_enc->flags |= CODEC_FLAG_SVCD_SCAN_OFFSET;
3199 video_enc->flags |= CODEC_FLAG_CLOSED_GOP;
3202 video_enc->flags2 |= CODEC_FLAG2_STRICT_GOP;
3205 video_enc->flags |= CODEC_FLAG_QPEL;
3208 video_enc->flags |= CODEC_FLAG_QP_RD;
3211 video_enc->flags |= CODEC_FLAG_CBP_RD;
3214 video_enc->max_b_frames = b_frames;
3215 video_enc->b_frame_strategy = 0;
3216 video_enc->b_quant_factor = 2.0;
3218 if (do_interlace_dct) {
3219 video_enc->flags |= CODEC_FLAG_INTERLACED_DCT;
3221 if (do_interlace_me) {
3222 video_enc->flags |= CODEC_FLAG_INTERLACED_ME;
3225 video_enc->flags2 |= CODEC_FLAG2_NO_OUTPUT;
3227 video_enc->qmin = video_qmin;
3228 video_enc->qmax = video_qmax;
3229 video_enc->lmin = video_lmin;
3230 video_enc->lmax = video_lmax;
3231 video_enc->rc_qsquish = video_qsquish;
3232 video_enc->luma_elim_threshold = video_lelim;
3233 video_enc->chroma_elim_threshold = video_celim;
3234 video_enc->mb_lmin = video_mb_lmin;
3235 video_enc->mb_lmax = video_mb_lmax;
3236 video_enc->max_qdiff = video_qdiff;
3237 video_enc->qblur = video_qblur;
3238 video_enc->qcompress = video_qcomp;
3239 video_enc->rc_eq = video_rc_eq;
3240 video_enc->debug = debug;
3241 video_enc->debug_mv = debug_mv;
3242 video_enc->thread_count = thread_count;
3243 p= video_rc_override_string;
3246 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3248 fprintf(stderr, "error parsing rc_override\n");
3251 video_enc->rc_override=
3252 av_realloc(video_enc->rc_override,
3253 sizeof(RcOverride)*(i+1));
3254 video_enc->rc_override[i].start_frame= start;
3255 video_enc->rc_override[i].end_frame = end;
3257 video_enc->rc_override[i].qscale= q;
3258 video_enc->rc_override[i].quality_factor= 1.0;
3261 video_enc->rc_override[i].qscale= 0;
3262 video_enc->rc_override[i].quality_factor= -q/100.0;
3267 video_enc->rc_override_count=i;
3269 video_enc->rc_max_rate = video_rc_max_rate;
3270 video_enc->rc_min_rate = video_rc_min_rate;
3271 video_enc->rc_buffer_size = video_rc_buffer_size;
3272 video_enc->rc_initial_buffer_occupancy = video_rc_buffer_size*3/4;
3273 video_enc->rc_buffer_aggressivity= video_rc_buffer_aggressivity;
3274 video_enc->rc_initial_cplx= video_rc_initial_cplx;
3275 video_enc->i_quant_factor = video_i_qfactor;
3276 video_enc->b_quant_factor = video_b_qfactor;
3277 video_enc->i_quant_offset = video_i_qoffset;
3278 video_enc->b_quant_offset = video_b_qoffset;
3279 video_enc->intra_quant_bias = video_intra_quant_bias;
3280 video_enc->inter_quant_bias = video_inter_quant_bias;
3281 video_enc->dct_algo = dct_algo;
3282 video_enc->idct_algo = idct_algo;
3283 video_enc->me_threshold= me_threshold;
3284 video_enc->mb_threshold= mb_threshold;
3285 video_enc->intra_dc_precision= intra_dc_precision - 8;
3286 video_enc->strict_std_compliance = strict;
3287 video_enc->error_rate = error_rate;
3288 video_enc->noise_reduction= noise_reduction;
3289 video_enc->scenechange_threshold= sc_threshold;
3290 video_enc->me_range = me_range;
3291 video_enc->coder_type= coder;
3292 video_enc->context_model= context;
3293 video_enc->prediction_method= predictor;
3294 video_enc->profile= video_profile;
3295 video_enc->level= video_level;
3296 video_enc->nsse_weight= nsse_weight;
3297 video_enc->me_subpel_quality= subpel_quality;
3298 video_enc->frame_skip_threshold= frame_skip_threshold;
3299 video_enc->frame_skip_factor= frame_skip_factor;
3300 video_enc->frame_skip_exp= frame_skip_exp;
3301 video_enc->frame_skip_cmp= frame_skip_cmp;
3304 video_enc->rtp_mode= 1;
3305 video_enc->rtp_payload_size= packet_size;
3309 video_enc->flags|= CODEC_FLAG_PSNR;
3311 video_enc->me_method = me_method;
3316 video_enc->flags |= CODEC_FLAG_PASS1;
3318 video_enc->flags |= CODEC_FLAG_PASS2;
3325 AVCodecContext *audio_enc;
3327 st = av_new_stream(oc, nb_streams++);
3329 fprintf(stderr, "Could not alloc stream\n");
3332 #if defined(HAVE_THREADS)
3334 avcodec_thread_init(&st->codec, thread_count);
3337 audio_enc = &st->codec;
3338 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3341 audio_enc->codec_tag= audio_codec_tag;
3343 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
3344 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3345 if (audio_stream_copy) {
3346 st->stream_copy = 1;
3347 audio_enc->channels = audio_channels;
3349 codec_id = av_guess_codec(file_oformat, NULL, filename, NULL, CODEC_TYPE_AUDIO);
3350 if (audio_codec_id != CODEC_ID_NONE)
3351 codec_id = audio_codec_id;
3352 audio_enc->codec_id = codec_id;
3354 audio_enc->bit_rate = audio_bit_rate;
3355 audio_enc->strict_std_compliance = strict;
3356 audio_enc->thread_count = thread_count;
3357 /* For audio codecs other than AC3 or DTS we limit */
3358 /* the number of coded channels to stereo */
3359 if (audio_channels > 2 && codec_id != CODEC_ID_AC3
3360 && codec_id != CODEC_ID_DTS) {
3361 audio_enc->channels = 2;
3363 audio_enc->channels = audio_channels;
3365 audio_enc->sample_rate = audio_sample_rate;
3368 oc->nb_streams = nb_streams;
3371 fprintf(stderr, "No audio or video streams available\n");
3375 oc->timestamp = rec_timestamp;
3378 pstrcpy(oc->title, sizeof(oc->title), str_title);
3380 pstrcpy(oc->author, sizeof(oc->author), str_author);
3382 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3384 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3387 output_files[nb_output_files++] = oc;
3389 pstrcpy(oc->filename, sizeof(oc->filename), filename);
3391 /* check filename in case of an image number is expected */
3392 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3393 if (filename_number_test(oc->filename) < 0) {
3394 print_error(oc->filename, AVERROR_NUMEXPECTED);
3399 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3400 /* test if it already exists to avoid loosing precious files */
3401 if (!file_overwrite &&
3402 (strchr(filename, ':') == NULL ||
3403 strstart(filename, "file:", NULL))) {
3404 if (url_exist(filename)) {
3407 if ( !using_stdin ) {
3408 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3411 if (toupper(c) != 'Y') {
3412 fprintf(stderr, "Not overwriting - exiting\n");
3417 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3424 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3425 fprintf(stderr, "Could not open '%s'\n", filename);
3430 memset(ap, 0, sizeof(*ap));
3431 ap->image_format = image_format;
3432 if (av_set_parameters(oc, ap) < 0) {
3433 fprintf(stderr, "%s: Invalid encoding parameters\n",
3438 oc->packet_size= mux_packet_size;
3439 oc->mux_rate= mux_rate;
3440 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3441 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3443 /* reset some options */
3444 file_oformat = NULL;
3445 file_iformat = NULL;
3446 image_format = NULL;
3449 audio_codec_id = CODEC_ID_NONE;
3450 video_codec_id = CODEC_ID_NONE;
3451 audio_stream_copy = 0;
3452 video_stream_copy = 0;
3455 /* prepare dummy protocols for grab */
3456 static void prepare_grab(void)
3458 int has_video, has_audio, i, j;
3459 AVFormatContext *oc;
3460 AVFormatContext *ic;
3461 AVFormatParameters vp1, *vp = &vp1;
3462 AVFormatParameters ap1, *ap = &ap1;
3464 /* see if audio/video inputs are needed */
3467 memset(ap, 0, sizeof(*ap));
3468 memset(vp, 0, sizeof(*vp));
3469 vp->frame_rate_base= 1;
3470 for(j=0;j<nb_output_files;j++) {
3471 oc = output_files[j];
3472 for(i=0;i<oc->nb_streams;i++) {
3473 AVCodecContext *enc = &oc->streams[i]->codec;
3474 switch(enc->codec_type) {
3475 case CODEC_TYPE_AUDIO:
3476 if (enc->sample_rate > ap->sample_rate)
3477 ap->sample_rate = enc->sample_rate;
3478 if (enc->channels > ap->channels)
3479 ap->channels = enc->channels;
3482 case CODEC_TYPE_VIDEO:
3483 if (enc->width > vp->width)
3484 vp->width = enc->width;
3485 if (enc->height > vp->height)
3486 vp->height = enc->height;
3488 if (vp->frame_rate_base*(int64_t)enc->frame_rate > enc->frame_rate_base*(int64_t)vp->frame_rate){
3489 vp->frame_rate = enc->frame_rate;
3490 vp->frame_rate_base = enc->frame_rate_base;
3500 if (has_video == 0 && has_audio == 0) {
3501 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3506 AVInputFormat *fmt1;
3507 fmt1 = av_find_input_format(video_grab_format);
3508 vp->device = video_device;
3509 vp->channel = video_channel;
3510 vp->standard = video_standard;
3511 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3512 fprintf(stderr, "Could not find video grab device\n");
3515 /* If not enough info to get the stream parameters, we decode the
3516 first frames to get it. */
3517 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3518 fprintf(stderr, "Could not find video grab parameters\n");
3521 /* by now video grab has one stream */
3522 ic->streams[0]->r_frame_rate = vp->frame_rate;
3523 ic->streams[0]->r_frame_rate_base = vp->frame_rate_base;
3524 input_files[nb_input_files] = ic;
3527 dump_format(ic, nb_input_files, "", 0);
3531 if (has_audio && audio_grab_format) {
3532 AVInputFormat *fmt1;
3533 fmt1 = av_find_input_format(audio_grab_format);
3534 ap->device = audio_device;
3535 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3536 fprintf(stderr, "Could not find audio grab device\n");
3539 input_files[nb_input_files] = ic;
3542 dump_format(ic, nb_input_files, "", 0);
3548 /* same option as mencoder */
3549 static void opt_pass(const char *pass_str)
3552 pass = atoi(pass_str);
3553 if (pass != 1 && pass != 2) {
3554 fprintf(stderr, "pass number can be only 1 or 2\n");
3560 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3561 static int64_t getutime(void)
3563 return av_gettime();
3566 static int64_t getutime(void)
3568 struct rusage rusage;
3570 getrusage(RUSAGE_SELF, &rusage);
3571 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3575 extern int ffm_nopts;
3577 static void opt_bitexact(void)
3580 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3584 static void show_formats(void)
3586 AVInputFormat *ifmt;
3587 AVOutputFormat *ofmt;
3588 AVImageFormat *image_fmt;
3591 const char **pp, *last_name;
3593 printf("File formats:\n");
3598 const char *name=NULL;
3599 const char *long_name=NULL;
3601 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3602 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3603 strcmp(ofmt->name, last_name)>0){
3605 long_name= ofmt->long_name;
3609 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3610 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3611 strcmp(ifmt->name, last_name)>0){
3613 long_name= ifmt->long_name;
3616 if(name && strcmp(ifmt->name, name)==0)
3628 long_name ? long_name:" ");
3632 printf("Image formats (filename extensions, if any, follow):\n");
3633 for(image_fmt = first_image_format; image_fmt != NULL;
3634 image_fmt = image_fmt->next) {
3637 image_fmt->img_read ? "D":" ",
3638 image_fmt->img_write ? "E":" ",
3640 image_fmt->extensions ? image_fmt->extensions:" ");
3644 printf("Codecs:\n");
3652 for(p = first_avcodec; p != NULL; p = p->next) {
3653 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3654 strcmp(p->name, last_name)>0){
3656 decode= encode= cap=0;
3658 if(p2 && strcmp(p->name, p2->name)==0){
3659 if(p->decode) decode=1;
3660 if(p->encode) encode=1;
3661 cap |= p->capabilities;
3666 last_name= p2->name;
3670 decode ? "D": (/*p2->decoder ? "d":*/" "),
3672 p2->type == CODEC_TYPE_AUDIO ? "A":"V",
3673 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3674 cap & CODEC_CAP_DR1 ? "D":" ",
3675 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3677 /* if(p2->decoder && decode==0)
3678 printf(" use %s for decoding", p2->decoder->name);*/
3683 printf("Supported file protocols:\n");
3684 for(up = first_protocol; up != NULL; up = up->next)
3685 printf(" %s:", up->name);
3688 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3689 printf("Motion estimation methods:\n");
3693 if ((pp - motion_str + 1) == ME_ZERO)
3694 printf("(fastest)");
3695 else if ((pp - motion_str + 1) == ME_FULL)
3696 printf("(slowest)");
3697 else if ((pp - motion_str + 1) == ME_EPZS)
3698 printf("(default)");
3703 "Note, the names of encoders and decoders dont always match, so there are\n"
3704 "several cases where the above table shows encoder only or decoder only entries\n"
3705 "even though both encoding and decoding are supported for example, the h263\n"
3706 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3711 void parse_matrix_coeffs(uint16_t *dest, const char *str)
3714 const char *p = str;
3721 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3728 void opt_inter_matrix(const char *arg)
3730 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3731 parse_matrix_coeffs(inter_matrix, arg);
3734 void opt_intra_matrix(const char *arg)
3736 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3737 parse_matrix_coeffs(intra_matrix, arg);
3740 static void opt_target(const char *arg)
3743 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3745 if(!strncmp(arg, "pal-", 4)) {
3748 } else if(!strncmp(arg, "ntsc-", 5)) {
3751 } else if(!strncmp(arg, "film-", 5)) {
3756 /* Calculate FR via float to avoid int overflow */
3757 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3760 } else if((fr == 29970) || (fr == 23976)) {
3763 /* Try to determine PAL/NTSC by peeking in the input files */
3764 if(nb_input_files) {
3766 for(j = 0; j < nb_input_files; j++) {
3767 for(i = 0; i < input_files[j]->nb_streams; i++) {
3768 AVCodecContext *c = &input_files[j]->streams[i]->codec;
3769 if(c->codec_type != CODEC_TYPE_VIDEO)
3771 fr = c->frame_rate * 1000 / c->frame_rate_base;
3775 } else if((fr == 29970) || (fr == 23976)) {
3785 if(verbose && norm >= 0)
3786 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3790 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3791 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3792 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3796 if(!strcmp(arg, "vcd")) {
3798 opt_video_codec("mpeg1video");
3799 opt_audio_codec("mp2");
3802 opt_frame_size(norm ? "352x240" : "352x288");
3803 opt_frame_rate(frame_rates[norm]);
3804 opt_gop_size(norm ? "18" : "15");
3806 video_bit_rate = 1150000;
3807 video_rc_max_rate = 1150000;
3808 video_rc_min_rate = 1150000;
3809 video_rc_buffer_size = 40*1024*8;
3811 audio_bit_rate = 224000;
3812 audio_sample_rate = 44100;
3814 mux_packet_size= 2324;
3815 mux_rate= 2352 * 75 * 8;
3817 /* We have to offset the PTS, so that it is consistent with the SCR.
3818 SCR starts at 36000, but the first two packs contain only padding
3819 and the first pack from the other stream, respectively, may also have
3820 been written before.
3821 So the real data starts at SCR 36000+3*1200. */
3822 mux_preload= (36000+3*1200) / 90000.0; //0.44
3823 } else if(!strcmp(arg, "svcd")) {
3825 opt_video_codec("mpeg2video");
3826 opt_audio_codec("mp2");
3829 opt_frame_size(norm ? "480x480" : "480x576");
3830 opt_frame_rate(frame_rates[norm]);
3831 opt_gop_size(norm ? "18" : "15");
3833 video_bit_rate = 2040000;
3834 video_rc_max_rate = 2516000;
3835 video_rc_min_rate = 0; //1145000;
3836 video_rc_buffer_size = 224*1024*8;
3837 use_scan_offset = 1;
3839 audio_bit_rate = 224000;
3840 audio_sample_rate = 44100;
3842 mux_packet_size= 2324;
3844 } else if(!strcmp(arg, "dvd")) {
3846 opt_video_codec("mpeg2video");
3847 opt_audio_codec("ac3");
3850 opt_frame_size(norm ? "720x480" : "720x576");
3851 opt_frame_rate(frame_rates[norm]);
3852 opt_gop_size(norm ? "18" : "15");
3854 video_bit_rate = 6000000;
3855 video_rc_max_rate = 9000000;
3856 video_rc_min_rate = 0; //1500000;
3857 video_rc_buffer_size = 224*1024*8;
3859 mux_packet_size= 2048; // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3860 mux_rate = 10080000; // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3862 audio_bit_rate = 448000;
3863 audio_sample_rate = 48000;
3865 } else if(!strcmp(arg, "dv")) {
3869 opt_frame_size(norm ? "720x480" : "720x576");
3870 opt_frame_rate(frame_rates[norm]);
3872 audio_sample_rate = 48000;
3876 fprintf(stderr, "Unknown target: %s\n", arg);
3881 static void show_version(void)
3883 fprintf(stderr, "ffmpeg " FFMPEG_VERSION "\n"
3886 avcodec_build(), LIBAVFORMAT_BUILD);
3890 const OptionDef options[] = {
3892 { "L", 0, {(void*)show_license}, "show license" },
3893 { "h", 0, {(void*)show_help}, "show help" },
3894 { "version", 0, {(void*)show_version}, "show version" },
3895 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3896 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3897 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
3898 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3899 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3900 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream" },
3901 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3902 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3903 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3904 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3905 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3906 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3907 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3908 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3909 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3910 { "debug", HAS_ARG | OPT_EXPERT, {(void*)opt_debug}, "print specific debug info", "" },
3911 { "vismv", HAS_ARG | OPT_EXPERT, {(void*)opt_vismv}, "visualize motion vectors", "" },
3912 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3913 "add timings for benchmarking" },
3914 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3915 "dump each input packet" },
3916 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3917 "when dumping packets, also dump the payload" },
3918 { "bitexact", OPT_EXPERT, {(void*)opt_bitexact}, "only use bit exact algorithms (for codec testing)" },
3919 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3920 { "loop", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3921 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3922 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3923 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3924 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3925 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3926 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3929 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
3930 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3931 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3932 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3933 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3934 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3935 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3936 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3937 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3938 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3939 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3940 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3941 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3942 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3943 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3944 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3945 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3946 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
3947 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3948 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3949 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
3950 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
3951 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
3952 { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
3953 { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
3954 { "mblmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmin}, "min macroblock quantiser scale (VBR)", "q" },
3955 { "mblmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmax}, "max macroblock quantiser scale (VBR)", "q" },
3956 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
3957 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
3958 { "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" },
3959 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
3960 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
3961 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
3962 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
3963 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
3964 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
3965 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
3966 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
3967 // { "b_strategy", HAS_ARG | OPT_EXPERT, {(void*)opt_b_strategy}, "dynamic b frame selection strategy", "strategy" },
3968 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3969 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3970 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
3971 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
3972 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
3973 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffer size (in kByte)", "size" },
3974 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3975 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
3977 { "dct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dct_algo}, "set dct algo", "algo" },
3978 { "idct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_idct_algo}, "set idct algo", "algo" },
3979 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
3980 { "mb_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_threshold}, "macroblock threshold", "" },
3981 { "er", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_resilience}, "set error resilience", "n" },
3982 { "ec", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_concealment}, "set error concealment", "bit_mask" },
3983 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
3984 { "hq", OPT_BOOL, {(void*)&mb_decision}, "activate high quality settings" },
3985 { "mbd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_decision}, "macroblock decision", "mode" },
3986 { "mbcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_cmp}, "macroblock compare function", "cmp function" },
3987 { "ildctcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ildct_cmp}, "ildct compare function", "cmp function" },
3988 { "subcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sub_cmp}, "subpel compare function", "cmp function" },
3989 { "cmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_cmp}, "fullpel compare function", "cmp function" },
3990 { "precmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_cmp}, "pre motion estimation compare function", "cmp function" },
3991 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
3992 { "lelim", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lelim}, "single coefficient elimination threshold for luminance (negative values also consider DC coefficient)", "elim" },
3993 { "celim", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_celim}, "single coefficient elimination threshold for chrominance (negative values also consider DC coefficient)", "elim" },
3994 { "lumi_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lumi_mask}, "luminance masking", "" },
3995 { "dark_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dark_mask}, "darkness masking", "" },
3996 { "scplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_scplx_mask}, "spatial complexity masking", "" },
3997 { "tcplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_tcplx_mask}, "temporal complexity masking", "" },
3998 { "p_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_p_mask}, "inter masking", "" },
3999 { "4mv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_4mv}, "use four motion vector by macroblock (MPEG4)" },
4000 { "obmc", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_obmc}, "use overlapped block motion compensation (h263+)" },
4001 { "lf", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_loop}, "use loop filter (h263+)" },
4002 { "part", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_part}, "use data partitioning (MPEG4)" },
4003 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
4004 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
4005 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
4006 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
4007 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4008 "use same video quality as source (implies VBR)" },
4009 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4010 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
4011 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4012 "deinterlace pictures" },
4013 { "ildct", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_dct},
4014 "force interlaced dct support in encoder (MPEG2/MPEG4)" },
4015 { "ilme", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_me},
4016 "force interlaced me support in encoder (MPEG2/MPEG4)" },
4017 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4018 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
4019 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
4020 { "aic", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aic}, "enable Advanced intra coding (h263+)" },
4021 { "aiv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aiv}, "enable Alternative inter vlc (h263+)" },
4022 { "umv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_umv}, "enable Unlimited Motion Vector (h263+)" },
4023 { "ssm", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_ss}, "enable Slice Structured mode (h263+)" },
4024 { "alt", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_alt_scan}, "enable alternate scantable (MPEG2/MPEG4)" },
4025 { "qprd", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qprd}, "" },
4026 { "cbp", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_cbprd}, "" },
4027 { "trell", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_trell}, "enable trellis quantization" },
4028 { "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)" },
4029 { "naq", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_normalize_aqp}, "normalize adaptive quantization" },
4030 { "cgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&closed_gop}, "closed gop" },
4031 { "sgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&strict_gop}, "strict gop" },
4032 { "noout", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&no_output}, "skip bitstream encoding" },
4033 { "scan_offset", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_scan_offset}, "enable SVCD Scan Offset placeholder" },
4034 { "qpel", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qpel}, "enable 1/4-pel" },
4035 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4036 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4037 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4038 { "nr", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_noise_reduction}, "noise reduction", "" },
4039 { "qns", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qns}, "quantization noise shaping", "" },
4040 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
4041 { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
4042 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4043 { "coder", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&coder}, "coder type", "" },
4044 { "context", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&context}, "context model", "" },
4045 { "pred", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&predictor}, "prediction method", "" },
4046 { "vprofile", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_profile}, "profile", "" },
4047 { "vlevel", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_level}, "level", "" },
4048 { "nssew", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&nsse_weight}, "weight", "" },
4049 { "subq", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&subpel_quality}, "", "" },
4050 { "lowres", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&lowres}, "", "" },
4051 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4052 { "skip_threshold", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_threshold}, "frame skip threshold", "threshold" },
4053 { "skip_factor", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_factor}, "frame skip factor", "factor" },
4054 { "skip_exp", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_exp}, "frame skip exponent", "exponent" },
4055 { "skip_cmp", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_cmp}, "frame skip compare function", "compare function" },
4058 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
4059 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4060 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4061 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4062 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4063 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4066 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
4067 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4068 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4069 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
4071 /* G.2 grab options */
4072 { "grab", HAS_ARG | OPT_EXPERT | OPT_GRAB, {(void*)opt_grab}, "request grabbing using", "format" },
4073 { "gd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_grab_device}, "set grab device", "device" },
4076 { "muxrate", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_rate}, "set mux rate", "rate" },
4077 { "packetsize", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_packet_size}, "set packet size", "size" },
4078 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4079 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4083 static void show_banner(void)
4085 fprintf(stderr, "ffmpeg version " FFMPEG_VERSION ", build %d, Copyright (c) 2000-2004 Fabrice Bellard\n",
4087 fprintf(stderr, " configuration: %s\n", FFMPEG_CONFIGURATION);
4088 fprintf(stderr, " built on " __DATE__ " " __TIME__);
4090 fprintf(stderr, ", gcc: %s\n", __VERSION__);
4092 fprintf(stderr, ", using a non-gcc compiler\n");
4096 static void show_license(void)
4101 "This program is free software; you can redistribute it and/or modify\n"
4102 "it under the terms of the GNU General Public License as published by\n"
4103 "the Free Software Foundation; either version 2 of the License, or\n"
4104 "(at your option) any later version.\n"
4106 "This program is distributed in the hope that it will be useful,\n"
4107 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
4108 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
4109 "GNU General Public License for more details.\n"
4111 "You should have received a copy of the GNU General Public License\n"
4112 "along with this program; if not, write to the Free Software\n"
4113 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
4117 "This library is free software; you can redistribute it and/or\n"
4118 "modify it under the terms of the GNU Lesser General Public\n"
4119 "License as published by the Free Software Foundation; either\n"
4120 "version 2 of the License, or (at your option) any later version.\n"
4122 "This library is distributed in the hope that it will be useful,\n"
4123 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
4124 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
4125 "Lesser General Public License for more details.\n"
4127 "You should have received a copy of the GNU Lesser General Public\n"
4128 "License along with this library; if not, write to the Free Software\n"
4129 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
4135 static void show_help(void)
4138 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
4139 "Hyper fast Audio and Video encoder\n");
4141 show_help_options(options, "Main options:\n",
4142 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
4143 show_help_options(options, "\nVideo options:\n",
4144 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4146 show_help_options(options, "\nAdvanced Video options:\n",
4147 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4148 OPT_VIDEO | OPT_EXPERT);
4149 show_help_options(options, "\nAudio options:\n",
4150 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4152 show_help_options(options, "\nAdvanced Audio options:\n",
4153 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4154 OPT_AUDIO | OPT_EXPERT);
4155 show_help_options(options, "\nAudio/Video grab options:\n",
4158 show_help_options(options, "\nAdvanced options:\n",
4159 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4164 void parse_arg_file(const char *filename)
4166 opt_output_file(filename);
4169 int main(int argc, char **argv)
4182 parse_options(argc, argv, options);
4184 /* file converter / grab */
4185 if (nb_output_files <= 0) {
4186 fprintf(stderr, "Must supply at least one output file\n");
4190 if (nb_input_files == 0) {
4196 av_encode(output_files, nb_output_files, input_files, nb_input_files,
4197 stream_maps, nb_stream_maps);
4198 ti = getutime() - ti;
4200 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
4204 for(i=0;i<nb_output_files;i++) {
4205 /* maybe av_close_output_file ??? */
4206 AVFormatContext *s = output_files[i];
4208 if (!(s->oformat->flags & AVFMT_NOFILE))
4210 for(j=0;j<s->nb_streams;j++)
4211 av_free(s->streams[j]);
4214 for(i=0;i<nb_input_files;i++)
4215 av_close_input_file(input_files[i]);
4220 av_free(intra_matrix);
4222 av_free(inter_matrix);
4224 #ifdef POWERPC_PERFORMANCE_REPORT
4225 extern void powerpc_display_perf_report(void);
4226 powerpc_display_perf_report();
4227 #endif /* POWERPC_PERFORMANCE_REPORT */
4229 #ifndef CONFIG_WIN32
4230 if (received_sigterm) {
4232 "Received signal %d: terminating.\n",
4233 (int) received_sigterm);
4237 exit(0); /* not all OS-es handle main() return value */