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 = 160;
87 static int frame_height = 128;
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 frame_rate = 25;
100 static int frame_rate_base = 1;
101 static int video_bit_rate = 200*1000;
102 static int video_bit_rate_tolerance = 4000*1000;
103 static float video_qscale = 0;
104 static int video_qmin = 2;
105 static int video_qmax = 31;
106 static int video_lmin = 2*FF_QP2LAMBDA;
107 static int video_lmax = 31*FF_QP2LAMBDA;
108 static int video_mb_qmin = 2;
109 static int video_mb_qmax = 31;
110 static int video_qdiff = 3;
111 static float video_qblur = 0.5;
112 static float video_qcomp = 0.5;
113 static uint16_t *intra_matrix = NULL;
114 static uint16_t *inter_matrix = NULL;
115 #if 0 //experimental, (can be removed)
116 static float video_rc_qsquish=1.0;
117 static float video_rc_qmod_amp=0;
118 static int video_rc_qmod_freq=0;
120 static char *video_rc_override_string=NULL;
121 static char *video_rc_eq="tex^qComp";
122 static int video_rc_buffer_size=0;
123 static float video_rc_buffer_aggressivity=1.0;
124 static int video_rc_max_rate=0;
125 static int video_rc_min_rate=0;
126 static float video_rc_initial_cplx=0;
127 static float video_b_qfactor = 1.25;
128 static float video_b_qoffset = 1.25;
129 static float video_i_qfactor = -0.8;
130 static float video_i_qoffset = 0.0;
131 static int video_intra_quant_bias= FF_DEFAULT_QUANT_BIAS;
132 static int video_inter_quant_bias= FF_DEFAULT_QUANT_BIAS;
133 static int me_method = ME_EPZS;
134 static int video_disable = 0;
135 static int video_codec_id = CODEC_ID_NONE;
136 static int same_quality = 0;
137 static int b_frames = 0;
138 static int mb_decision = FF_MB_DECISION_SIMPLE;
139 static int ildct_cmp = FF_CMP_VSAD;
140 static int mb_cmp = FF_CMP_SAD;
141 static int sub_cmp = FF_CMP_SAD;
142 static int cmp = FF_CMP_SAD;
143 static int pre_cmp = FF_CMP_SAD;
144 static int pre_me = 0;
145 static float lumi_mask = 0;
146 static float dark_mask = 0;
147 static float scplx_mask = 0;
148 static float tcplx_mask = 0;
149 static float p_mask = 0;
150 static int use_4mv = 0;
151 static int use_obmc = 0;
152 static int use_loop = 0;
153 static int use_aic = 0;
154 static int use_aiv = 0;
155 static int use_umv = 0;
156 static int use_ss = 0;
157 static int use_alt_scan = 0;
158 static int use_trell = 0;
159 static int use_scan_offset = 0;
160 static int use_qpel = 0;
161 static int use_qprd = 0;
162 static int use_cbprd = 0;
164 static int closed_gop = 0;
165 static int do_deinterlace = 0;
166 static int do_interlace_dct = 0;
167 static int do_interlace_me = 0;
168 static int workaround_bugs = FF_BUG_AUTODETECT;
169 static int error_resilience = 2;
170 static int error_concealment = 3;
171 static int dct_algo = 0;
172 static int idct_algo = 0;
173 static int use_part = 0;
174 static int packet_size = 0;
175 static int error_rate = 0;
176 static int strict = 0;
177 static int top_field_first = -1;
178 static int noise_reduction = 0;
179 static int sc_threshold = 0;
180 static int debug = 0;
181 static int debug_mv = 0;
182 static int me_threshold = 0;
183 static int mb_threshold = 0;
184 static int intra_dc_precision = 8;
185 static int coder = 0;
186 static int context = 0;
187 static int predictor = 0;
188 static int video_profile = FF_PROFILE_UNKNOWN;
189 static int video_level = FF_LEVEL_UNKNOWN;
190 static int nsse_weight = 8;
191 extern int loop_input; /* currently a hack */
193 static int gop_size = 12;
194 static int intra_only = 0;
195 static int audio_sample_rate = 44100;
196 static int audio_bit_rate = 64000;
197 static int audio_disable = 0;
198 static int audio_channels = 1;
199 static int audio_codec_id = CODEC_ID_NONE;
201 static int64_t recording_time = 0;
202 static int64_t start_time = 0;
203 static int64_t rec_timestamp = 0;
204 static int64_t input_ts_offset = 0;
205 static int file_overwrite = 0;
206 static char *str_title = NULL;
207 static char *str_author = NULL;
208 static char *str_copyright = NULL;
209 static char *str_comment = NULL;
210 static int do_benchmark = 0;
211 static int do_hex_dump = 0;
212 static int do_pkt_dump = 0;
213 static int do_psnr = 0;
214 static int do_vstats = 0;
215 static int do_pass = 0;
216 static int bitexact = 0;
217 static char *pass_logfilename = NULL;
218 static int audio_stream_copy = 0;
219 static int video_stream_copy = 0;
220 static int video_sync_method= 1;
221 static int audio_sync_method= 0;
222 static int copy_ts= 0;
224 static int rate_emu = 0;
226 static char *video_grab_format = "video4linux";
227 static char *video_device = NULL;
228 static int video_channel = 0;
229 static char *video_standard = "ntsc";
231 static char *audio_grab_format = "audio_device";
232 static char *audio_device = NULL;
234 static int using_stdin = 0;
235 static int using_vhook = 0;
236 static int verbose = 1;
237 static int thread_count= 1;
238 static int q_pressed = 0;
239 static int me_range = 0;
240 static int64_t video_size = 0;
241 static int64_t audio_size = 0;
242 static int64_t extra_size = 0;
243 static int nb_frames_dup = 0;
244 static int nb_frames_drop = 0;
245 static int input_sync;
247 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
249 typedef struct AVOutputStream {
250 int file_index; /* file index */
251 int index; /* stream index in the output file */
252 int source_index; /* AVInputStream index */
253 AVStream *st; /* stream in the output file */
254 int encoding_needed; /* true if encoding needed for this stream */
256 /* input pts and corresponding output pts
258 double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
259 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
261 int video_resample; /* video_resample and video_crop are mutually exclusive */
262 AVFrame pict_tmp; /* temporary image for resampling */
263 ImgReSampleContext *img_resample_ctx; /* for image resampling */
265 int video_crop; /* video_resample and video_crop are mutually exclusive */
266 int topBand; /* cropping area sizes */
269 int video_pad; /* video_resample and video_pad are mutually exclusive */
270 int padtop; /* padding area sizes */
277 ReSampleContext *resample; /* for audio resampling */
278 FifoBuffer fifo; /* for compression: one audio fifo per codec */
282 typedef struct AVInputStream {
286 int discard; /* true if stream data should be discarded */
287 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
288 int64_t sample_index; /* current sample */
290 int64_t start; /* time when read started */
291 unsigned long frame; /* current frame */
292 int64_t next_pts; /* synthetic pts for cases where pkt.pts
294 int64_t pts; /* current pts */
295 int is_start; /* is 1 at the start and after a discontinuity */
298 typedef struct AVInputFile {
299 int eof_reached; /* true if eof reached */
300 int ist_index; /* index of first stream in ist_table */
301 int buffer_size; /* current total buffer size */
302 int buffer_size_max; /* buffer size at which we consider we can stop
304 int nb_streams; /* nb streams we are aware of */
309 /* init terminal so that we can grab keys */
310 static struct termios oldtty;
312 static void term_exit(void)
314 tcsetattr (0, TCSANOW, &oldtty);
317 static volatile sig_atomic_t received_sigterm = 0;
320 sigterm_handler(int sig)
322 received_sigterm = sig;
326 static void term_init(void)
333 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
334 |INLCR|IGNCR|ICRNL|IXON);
335 tty.c_oflag |= OPOST;
336 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
337 tty.c_cflag &= ~(CSIZE|PARENB);
342 tcsetattr (0, TCSANOW, &tty);
344 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
345 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
346 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
348 register a function to be called at normal program termination
351 #ifdef CONFIG_BEOS_NETSERVER
352 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
356 /* read a key without blocking */
357 static int read_key(void)
361 #ifndef CONFIG_BEOS_NETSERVER
369 n = select(1, &rfds, NULL, NULL, &tv);
381 static int decode_interrupt_cb(void)
383 return q_pressed || (q_pressed = read_key() == 'q');
388 static volatile int received_sigterm = 0;
390 /* no interactive support */
391 static void term_exit(void)
395 static void term_init(void)
399 static int read_key(void)
406 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
411 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
414 /* copy stream format */
415 s->nb_streams = ic->nb_streams;
416 for(i=0;i<ic->nb_streams;i++) {
419 st = av_mallocz(sizeof(AVStream));
420 memcpy(st, ic->streams[i], sizeof(AVStream));
424 av_close_input_file(ic);
428 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
430 static void do_audio_out(AVFormatContext *s,
433 unsigned char *buf, int size)
436 static uint8_t *audio_buf = NULL;
437 static uint8_t *audio_out = NULL;
438 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
440 int size_out, frame_bytes, ret;
441 AVCodecContext *enc= &ost->st->codec;
443 /* SC: dynamic allocation of buffers */
445 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
447 audio_out = av_malloc(audio_out_size);
448 if (!audio_buf || !audio_out)
449 return; /* Should signal an error ! */
451 if(audio_sync_method){
452 double delta = ost->sync_ipts * enc->sample_rate - ost->sync_opts
453 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2);
454 double idelta= delta*ist->st->codec.sample_rate / enc->sample_rate;
455 int byte_delta= ((int)idelta)*2*ist->st->codec.channels;
457 //FIXME resample delay
458 if(fabs(delta) > 50){
461 byte_delta= FFMAX(byte_delta, -size);
465 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
470 static uint8_t *input_tmp= NULL;
471 input_tmp= av_realloc(input_tmp, byte_delta + size);
473 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
476 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
478 memset(input_tmp, 0, byte_delta);
479 memcpy(input_tmp + byte_delta, buf, size);
483 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
485 }else if(audio_sync_method>1){
486 int comp= clip(delta, -audio_sync_method, audio_sync_method);
487 assert(ost->audio_resample);
489 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
490 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));
491 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
495 ost->sync_opts= lrintf(ost->sync_ipts * enc->sample_rate)
496 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2); //FIXME wrong
498 if (ost->audio_resample) {
500 size_out = audio_resample(ost->resample,
501 (short *)buftmp, (short *)buf,
502 size / (ist->st->codec.channels * 2));
503 size_out = size_out * enc->channels * 2;
509 /* now encode as many frames as possible */
510 if (enc->frame_size > 1) {
511 /* output resampled raw samples */
512 fifo_write(&ost->fifo, buftmp, size_out,
515 frame_bytes = enc->frame_size * 2 * enc->channels;
517 while (fifo_read(&ost->fifo, audio_buf, frame_bytes,
518 &ost->fifo.rptr) == 0) {
520 av_init_packet(&pkt);
522 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
525 pkt.stream_index= ost->index;
529 pkt.pts= enc->coded_frame->pts;
530 pkt.flags |= PKT_FLAG_KEY;
531 av_interleaved_write_frame(s, &pkt);
533 ost->sync_opts += enc->frame_size;
537 av_init_packet(&pkt);
539 ost->sync_opts += size_out / (2 * enc->channels);
541 /* output a pcm frame */
542 /* XXX: change encoding codec API to avoid this ? */
543 switch(enc->codec->id) {
544 case CODEC_ID_PCM_S16LE:
545 case CODEC_ID_PCM_S16BE:
546 case CODEC_ID_PCM_U16LE:
547 case CODEC_ID_PCM_U16BE:
550 size_out = size_out >> 1;
553 ret = avcodec_encode_audio(enc, audio_out, size_out,
556 pkt.stream_index= ost->index;
560 pkt.pts= enc->coded_frame->pts;
561 pkt.flags |= PKT_FLAG_KEY;
562 av_interleaved_write_frame(s, &pkt);
566 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
570 AVPicture picture_tmp;
573 dec = &ist->st->codec;
575 /* deinterlace : must be done before any resize */
576 if (do_deinterlace || using_vhook) {
579 /* create temporary picture */
580 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
581 buf = av_malloc(size);
585 picture2 = &picture_tmp;
586 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
589 if(avpicture_deinterlace(picture2, picture,
590 dec->pix_fmt, dec->width, dec->height) < 0) {
591 /* if error, do not deinterlace */
597 if (img_convert(picture2, dec->pix_fmt, picture,
598 dec->pix_fmt, dec->width, dec->height) < 0) {
599 /* if error, do not copy */
609 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
611 if (picture != picture2)
612 *picture = *picture2;
616 /* we begin to correct av delay at this threshold */
617 #define AV_DELAY_MAX 0.100
620 /* Expects img to be yuv420 */
621 static void fill_pad_region(AVPicture* img, int height, int width,
622 int padtop, int padbottom, int padleft, int padright, int *color) {
627 for (i = 0; i < 3; i++) {
628 shift = (i == 0) ? 0 : 1;
630 if (padtop || padleft) {
631 memset(img->data[i], color[i], (((img->linesize[i] * padtop) +
635 if (padleft || padright) {
636 optr = img->data[i] + (img->linesize[i] * (padtop >> shift)) +
637 (img->linesize[i] - (padright >> shift));
639 for (y = 0; y < ((height - (padtop + padbottom)) >> shift); y++) {
640 memset(optr, color[i], (padleft + padright) >> shift);
641 optr += img->linesize[i];
646 optr = img->data[i] + (img->linesize[i] * ((height - padbottom) >> shift));
647 memset(optr, color[i], ((img->linesize[i] * padbottom) >> shift));
652 static uint8_t *bit_buffer= NULL;
654 static void do_video_out(AVFormatContext *s,
660 int nb_frames, i, ret;
661 AVFrame *final_picture, *formatted_picture;
662 AVFrame picture_format_temp, picture_crop_temp;
663 uint8_t *buf = NULL, *buf1 = NULL;
664 AVCodecContext *enc, *dec;
665 enum PixelFormat target_pixfmt;
667 #define VIDEO_BUFFER_SIZE (1024*1024)
669 avcodec_get_frame_defaults(&picture_format_temp);
670 avcodec_get_frame_defaults(&picture_crop_temp);
672 enc = &ost->st->codec;
673 dec = &ist->st->codec;
675 /* by default, we output a single frame */
680 if(video_sync_method){
682 vdelta = ost->sync_ipts * enc->frame_rate / enc->frame_rate_base - ost->sync_opts;
683 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
686 else if (vdelta > 1.1)
687 nb_frames = lrintf(vdelta - 1.1 + 0.5);
688 //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);
692 fprintf(stderr, "*** drop!\n");
693 }else if (nb_frames > 1) {
694 nb_frames_dup += nb_frames;
696 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
699 ost->sync_opts= lrintf(ost->sync_ipts * enc->frame_rate / enc->frame_rate_base);
704 /* convert pixel format if needed */
705 target_pixfmt = ost->video_resample || ost->video_pad
706 ? PIX_FMT_YUV420P : enc->pix_fmt;
707 if (dec->pix_fmt != target_pixfmt) {
710 /* create temporary picture */
711 size = avpicture_get_size(target_pixfmt, dec->width, dec->height);
712 buf = av_malloc(size);
715 formatted_picture = &picture_format_temp;
716 avpicture_fill((AVPicture*)formatted_picture, buf, target_pixfmt, dec->width, dec->height);
718 if (img_convert((AVPicture*)formatted_picture, target_pixfmt,
719 (AVPicture *)in_picture, dec->pix_fmt,
720 dec->width, dec->height) < 0) {
723 fprintf(stderr, "pixel format conversion not handled\n");
728 formatted_picture = in_picture;
731 /* XXX: resampling could be done before raw format conversion in
732 some cases to go faster */
733 /* XXX: only works for YUV420P */
734 if (ost->video_resample) {
735 final_picture = &ost->pict_tmp;
736 img_resample(ost->img_resample_ctx, (AVPicture*)final_picture, (AVPicture*)formatted_picture);
738 if (ost->padtop || ost->padbottom || ost->padleft || ost->padright) {
739 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
740 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
744 if (enc->pix_fmt != PIX_FMT_YUV420P) {
748 /* create temporary picture */
749 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
750 buf = av_malloc(size);
753 final_picture = &picture_format_temp;
754 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
756 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
757 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
758 enc->width, enc->height) < 0) {
761 fprintf(stderr, "pixel format conversion not handled\n");
766 } else if (ost->video_crop) {
767 picture_crop_temp.data[0] = formatted_picture->data[0] +
768 (ost->topBand * formatted_picture->linesize[0]) + ost->leftBand;
770 picture_crop_temp.data[1] = formatted_picture->data[1] +
771 ((ost->topBand >> 1) * formatted_picture->linesize[1]) +
772 (ost->leftBand >> 1);
774 picture_crop_temp.data[2] = formatted_picture->data[2] +
775 ((ost->topBand >> 1) * formatted_picture->linesize[2]) +
776 (ost->leftBand >> 1);
778 picture_crop_temp.linesize[0] = formatted_picture->linesize[0];
779 picture_crop_temp.linesize[1] = formatted_picture->linesize[1];
780 picture_crop_temp.linesize[2] = formatted_picture->linesize[2];
781 final_picture = &picture_crop_temp;
782 } else if (ost->video_pad) {
783 final_picture = &ost->pict_tmp;
785 for (i = 0; i < 3; i++) {
786 uint8_t *optr, *iptr;
787 int shift = (i == 0) ? 0 : 1;
790 /* set offset to start writing image into */
791 optr = final_picture->data[i] + (((final_picture->linesize[i] *
792 ost->padtop) + ost->padleft) >> shift);
793 iptr = formatted_picture->data[i];
795 yheight = (enc->height - ost->padtop - ost->padbottom) >> shift;
796 for (y = 0; y < yheight; y++) {
797 /* copy unpadded image row into padded image row */
798 memcpy(optr, iptr, formatted_picture->linesize[i]);
799 optr += final_picture->linesize[i];
800 iptr += formatted_picture->linesize[i];
804 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
805 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
808 if (enc->pix_fmt != PIX_FMT_YUV420P) {
812 /* create temporary picture */
813 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
814 buf = av_malloc(size);
817 final_picture = &picture_format_temp;
818 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
820 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
821 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
822 enc->width, enc->height) < 0) {
825 fprintf(stderr, "pixel format conversion not handled\n");
831 final_picture = formatted_picture;
833 /* duplicates frame if needed */
834 for(i=0;i<nb_frames;i++) {
836 av_init_packet(&pkt);
837 pkt.stream_index= ost->index;
839 if (s->oformat->flags & AVFMT_RAWPICTURE) {
840 /* raw pictures are written as AVPicture structure to
841 avoid any copies. We support temorarily the older
843 AVFrame* old_frame = enc->coded_frame;
844 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
845 pkt.data= (uint8_t *)final_picture;
846 pkt.size= sizeof(AVPicture);
848 pkt.pts= dec->coded_frame->pts;
849 if(dec->coded_frame && dec->coded_frame->key_frame)
850 pkt.flags |= PKT_FLAG_KEY;
852 av_interleaved_write_frame(s, &pkt);
853 enc->coded_frame = old_frame;
857 big_picture= *final_picture;
858 /* better than nothing: use input picture interlaced
860 big_picture.interlaced_frame = in_picture->interlaced_frame;
861 if(do_interlace_me || do_interlace_dct){
862 if(top_field_first == -1)
863 big_picture.top_field_first = in_picture->top_field_first;
865 big_picture.top_field_first = top_field_first;
868 /* handles sameq here. This is not correct because it may
869 not be a global option */
871 big_picture.quality = ist->st->quality;
873 big_picture.quality = ost->st->quality;
875 big_picture.pict_type = 0;
876 // big_picture.pts = AV_NOPTS_VALUE;
877 big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->frame_rate_base, enc->frame_rate);
878 //av_log(NULL, AV_LOG_DEBUG, "%lld -> encoder\n", ost->sync_opts);
879 ret = avcodec_encode_video(enc,
880 bit_buffer, VIDEO_BUFFER_SIZE,
882 //enc->frame_number = enc->real_pict_num;
884 pkt.data= bit_buffer;
887 pkt.pts= enc->coded_frame->pts;
888 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %lld/%lld\n",
889 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1,
890 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1);*/
892 if(enc->coded_frame && enc->coded_frame->key_frame)
893 pkt.flags |= PKT_FLAG_KEY;
894 av_interleaved_write_frame(s, &pkt);
896 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
897 // enc->frame_number-1, enc->real_pict_num, ret,
899 /* if two pass, output log */
900 if (ost->logfile && enc->stats_out) {
901 fprintf(ost->logfile, "%s", enc->stats_out);
913 static double psnr(double d){
914 if(d==0) return INFINITY;
915 return -10.0*log(d)/log(10.0);
918 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
921 static FILE *fvstats=NULL;
928 double ti1, bitrate, avg_bitrate;
932 today = localtime(&today2);
933 sprintf(filename, "vstats_%02d%02d%02d.log", today->tm_hour,
936 fvstats = fopen(filename,"w");
944 enc = &ost->st->codec;
945 if (enc->codec_type == CODEC_TYPE_VIDEO) {
946 frame_number = ost->frame_number;
947 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
948 if (enc->flags&CODEC_FLAG_PSNR)
949 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
951 fprintf(fvstats,"f_size= %6d ", frame_size);
952 /* compute pts value */
953 ti1 = (double)ost->sync_opts *enc->frame_rate_base / enc->frame_rate;
957 bitrate = (double)(frame_size * 8) * enc->frame_rate / enc->frame_rate_base / 1000.0;
958 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
959 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
960 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
961 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
965 static void print_report(AVFormatContext **output_files,
966 AVOutputStream **ost_table, int nb_ostreams,
971 AVFormatContext *oc, *os;
974 int frame_number, vid, i;
975 double bitrate, ti1, pts;
976 static int64_t last_time = -1;
978 if (!is_last_report) {
980 /* display the report every 0.5 seconds */
981 cur_time = av_gettime();
982 if (last_time == -1) {
983 last_time = cur_time;
986 if ((cur_time - last_time) < 500000)
988 last_time = cur_time;
992 oc = output_files[0];
994 total_size = url_ftell(&oc->pb);
999 for(i=0;i<nb_ostreams;i++) {
1001 os = output_files[ost->file_index];
1002 enc = &ost->st->codec;
1003 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1004 sprintf(buf + strlen(buf), "q=%2.1f ",
1005 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1007 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1008 frame_number = ost->frame_number;
1009 sprintf(buf + strlen(buf), "frame=%5d q=%2.1f ",
1010 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : 0);
1012 sprintf(buf + strlen(buf), "L");
1013 if (enc->flags&CODEC_FLAG_PSNR){
1015 double error, error_sum=0;
1016 double scale, scale_sum=0;
1017 char type[3]= {'Y','U','V'};
1018 sprintf(buf + strlen(buf), "PSNR=");
1021 error= enc->error[j];
1022 scale= enc->width*enc->height*255.0*255.0*frame_number;
1024 error= enc->coded_frame->error[j];
1025 scale= enc->width*enc->height*255.0*255.0;
1030 sprintf(buf + strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1032 sprintf(buf + strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1036 /* compute min output value */
1037 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1038 if ((pts < ti1) && (pts > 0))
1044 if (verbose || is_last_report) {
1045 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1047 sprintf(buf + strlen(buf),
1048 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
1049 (double)total_size / 1024, ti1, bitrate);
1052 sprintf(buf + strlen(buf), " dup=%d drop=%d",
1053 nb_frames_dup, nb_frames_drop);
1056 fprintf(stderr, "%s \r", buf);
1061 if (is_last_report && verbose >= 0){
1062 int64_t raw= audio_size + video_size + extra_size;
1063 fprintf(stderr, "\n");
1064 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1068 100.0*(total_size - raw)/raw
1073 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1074 static int output_packet(AVInputStream *ist, int ist_index,
1075 AVOutputStream **ost_table, int nb_ostreams,
1076 const AVPacket *pkt)
1078 AVFormatContext *os;
1079 AVOutputStream *ost;
1083 int data_size, got_picture;
1085 void *buffer_to_free;
1088 ist->pts= ist->next_pts; // needed for last packet if vsync=0
1089 } else if (pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1090 ist->next_pts = ist->pts = pkt->dts;
1092 assert(ist->pts == ist->next_pts);
1106 /* decode the packet if needed */
1107 data_buf = NULL; /* fail safe */
1109 if (ist->decoding_needed) {
1110 switch(ist->st->codec.codec_type) {
1111 case CODEC_TYPE_AUDIO:{
1112 /* XXX: could avoid copy if PCM 16 bits with same
1113 endianness as CPU */
1114 short samples[pkt && pkt->size > AVCODEC_MAX_AUDIO_FRAME_SIZE/2 ? pkt->size : AVCODEC_MAX_AUDIO_FRAME_SIZE/2];
1115 ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size,
1121 /* Some bug in mpeg audio decoder gives */
1122 /* data_size < 0, it seems they are overflows */
1123 if (data_size <= 0) {
1124 /* no audio frame */
1127 data_buf = (uint8_t *)samples;
1128 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1129 (ist->st->codec.sample_rate * ist->st->codec.channels);
1131 case CODEC_TYPE_VIDEO:
1132 data_size = (ist->st->codec.width * ist->st->codec.height * 3) / 2;
1133 /* XXX: allocate picture correctly */
1134 avcodec_get_frame_defaults(&picture);
1136 ret = avcodec_decode_video(&ist->st->codec,
1137 &picture, &got_picture, ptr, len);
1138 ist->st->quality= picture.quality;
1142 /* no picture yet */
1143 goto discard_packet;
1145 if (ist->st->codec.frame_rate_base != 0) {
1146 ist->next_pts += ((int64_t)AV_TIME_BASE *
1147 ist->st->codec.frame_rate_base) /
1148 ist->st->codec.frame_rate;
1162 buffer_to_free = NULL;
1163 if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1164 pre_process_video_frame(ist, (AVPicture *)&picture,
1168 /* frame rate emulation */
1169 if (ist->st->codec.rate_emu) {
1170 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec.frame_rate_base, 1000000, ist->st->codec.frame_rate);
1171 int64_t now = av_gettime() - ist->start;
1179 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1180 is the one of the next displayed one */
1181 /* XXX: add mpeg4 too ? */
1182 if (ist->st->codec.codec_id == CODEC_ID_MPEG1VIDEO) {
1183 if (ist->st->codec.pict_type != B_TYPE) {
1185 tmp = ist->last_ip_pts;
1186 ist->last_ip_pts = ist->frac_pts.val;
1187 ist->frac_pts.val = tmp;
1191 /* if output time reached then transcode raw format,
1192 encode packets and output them */
1193 if (start_time == 0 || ist->pts >= start_time)
1194 for(i=0;i<nb_ostreams;i++) {
1198 if (ost->source_index == ist_index) {
1199 os = output_files[ost->file_index];
1202 printf("%d: got pts=%0.3f %0.3f\n", i,
1203 (double)pkt->pts / AV_TIME_BASE,
1204 ((double)ist->pts / AV_TIME_BASE) -
1205 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1207 /* set the input output pts pairs */
1208 ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index])/ AV_TIME_BASE;
1210 if (ost->encoding_needed) {
1211 switch(ost->st->codec.codec_type) {
1212 case CODEC_TYPE_AUDIO:
1213 do_audio_out(os, ost, ist, data_buf, data_size);
1215 case CODEC_TYPE_VIDEO:
1216 /* find an audio stream for synchro */
1219 AVOutputStream *audio_sync, *ost1;
1221 for(i=0;i<nb_ostreams;i++) {
1222 ost1 = ost_table[i];
1223 if (ost1->file_index == ost->file_index &&
1224 ost1->st->codec.codec_type == CODEC_TYPE_AUDIO) {
1230 do_video_out(os, ost, ist, &picture, &frame_size);
1231 video_size += frame_size;
1232 if (do_vstats && frame_size)
1233 do_video_stats(os, ost, frame_size);
1240 AVFrame avframe; //FIXME/XXX remove this
1242 av_init_packet(&opkt);
1244 /* no reencoding needed : output the packet directly */
1245 /* force the input stream PTS */
1247 avcodec_get_frame_defaults(&avframe);
1248 ost->st->codec.coded_frame= &avframe;
1249 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1251 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO)
1252 audio_size += data_size;
1253 else if (ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1254 video_size += data_size;
1256 opkt.stream_index= ost->index;
1257 opkt.data= data_buf;
1258 opkt.size= data_size;
1259 opkt.pts= pkt->pts + input_files_ts_offset[ist->file_index];
1260 opkt.dts= pkt->dts + input_files_ts_offset[ist->file_index];
1261 opkt.flags= pkt->flags;
1263 av_interleaved_write_frame(os, &opkt);
1264 ost->st->codec.frame_number++;
1265 ost->frame_number++;
1269 av_free(buffer_to_free);
1275 for(i=0;i<nb_ostreams;i++) {
1277 if (ost->source_index == ist_index) {
1278 AVCodecContext *enc= &ost->st->codec;
1279 os = output_files[ost->file_index];
1281 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1283 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1286 if (ost->encoding_needed) {
1289 av_init_packet(&pkt);
1290 pkt.stream_index= ost->index;
1292 switch(ost->st->codec.codec_type) {
1293 case CODEC_TYPE_AUDIO:
1294 ret = avcodec_encode_audio(enc, bit_buffer, VIDEO_BUFFER_SIZE, NULL);
1296 pkt.flags |= PKT_FLAG_KEY;
1298 case CODEC_TYPE_VIDEO:
1299 ret = avcodec_encode_video(enc, bit_buffer, VIDEO_BUFFER_SIZE, NULL);
1301 if(enc->coded_frame && enc->coded_frame->key_frame)
1302 pkt.flags |= PKT_FLAG_KEY;
1303 if (ost->logfile && enc->stats_out) {
1304 fprintf(ost->logfile, "%s", enc->stats_out);
1313 pkt.data= bit_buffer;
1315 if(enc->coded_frame)
1316 pkt.pts= enc->coded_frame->pts;
1317 av_interleaved_write_frame(os, &pkt);
1331 * The following code is the main loop of the file converter
1333 static int av_encode(AVFormatContext **output_files,
1334 int nb_output_files,
1335 AVFormatContext **input_files,
1337 AVStreamMap *stream_maps, int nb_stream_maps)
1339 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1340 AVFormatContext *is, *os;
1341 AVCodecContext *codec, *icodec;
1342 AVOutputStream *ost, **ost_table = NULL;
1343 AVInputStream *ist, **ist_table = NULL;
1344 AVInputFile *file_table;
1345 AVFormatContext *stream_no_data;
1348 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1353 bit_buffer = av_malloc(VIDEO_BUFFER_SIZE);
1357 /* input stream init */
1359 for(i=0;i<nb_input_files;i++) {
1360 is = input_files[i];
1361 file_table[i].ist_index = j;
1362 file_table[i].nb_streams = is->nb_streams;
1363 j += is->nb_streams;
1367 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1371 for(i=0;i<nb_istreams;i++) {
1372 ist = av_mallocz(sizeof(AVInputStream));
1378 for(i=0;i<nb_input_files;i++) {
1379 is = input_files[i];
1380 for(k=0;k<is->nb_streams;k++) {
1381 ist = ist_table[j++];
1382 ist->st = is->streams[k];
1383 ist->file_index = i;
1385 ist->discard = 1; /* the stream is discarded by default
1388 if (ist->st->codec.rate_emu) {
1389 ist->start = av_gettime();
1395 /* output stream init */
1397 for(i=0;i<nb_output_files;i++) {
1398 os = output_files[i];
1399 nb_ostreams += os->nb_streams;
1401 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1402 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1406 /* Sanity check the mapping args -- do the input files & streams exist? */
1407 for(i=0;i<nb_stream_maps;i++) {
1408 int fi = stream_maps[i].file_index;
1409 int si = stream_maps[i].stream_index;
1411 if (fi < 0 || fi > nb_input_files - 1 ||
1412 si < 0 || si > file_table[fi].nb_streams - 1) {
1413 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1418 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1421 for(i=0;i<nb_ostreams;i++) {
1422 ost = av_mallocz(sizeof(AVOutputStream));
1429 for(k=0;k<nb_output_files;k++) {
1430 os = output_files[k];
1431 for(i=0;i<os->nb_streams;i++) {
1433 ost = ost_table[n++];
1434 ost->file_index = k;
1436 ost->st = os->streams[i];
1437 if (nb_stream_maps > 0) {
1438 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1439 stream_maps[n-1].stream_index;
1441 /* Sanity check that the stream types match */
1442 if (ist_table[ost->source_index]->st->codec.codec_type != ost->st->codec.codec_type) {
1443 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1444 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1445 ost->file_index, ost->index);
1450 /* get corresponding input stream index : we select the first one with the right type */
1452 for(j=0;j<nb_istreams;j++) {
1455 ist->st->codec.codec_type == ost->st->codec.codec_type) {
1456 ost->source_index = j;
1462 /* try again and reuse existing stream */
1463 for(j=0;j<nb_istreams;j++) {
1465 if (ist->st->codec.codec_type == ost->st->codec.codec_type) {
1466 ost->source_index = j;
1471 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1472 ost->file_index, ost->index);
1477 ist = ist_table[ost->source_index];
1482 /* for each output stream, we compute the right encoding parameters */
1483 for(i=0;i<nb_ostreams;i++) {
1485 ist = ist_table[ost->source_index];
1487 codec = &ost->st->codec;
1488 icodec = &ist->st->codec;
1490 if (ost->st->stream_copy) {
1491 /* if stream_copy is selected, no need to decode or encode */
1492 codec->codec_id = icodec->codec_id;
1493 codec->codec_type = icodec->codec_type;
1494 codec->codec_tag = icodec->codec_tag;
1495 codec->bit_rate = icodec->bit_rate;
1496 switch(codec->codec_type) {
1497 case CODEC_TYPE_AUDIO:
1498 codec->sample_rate = icodec->sample_rate;
1499 codec->channels = icodec->channels;
1500 codec->frame_size = icodec->frame_size;
1502 case CODEC_TYPE_VIDEO:
1503 codec->frame_rate = icodec->frame_rate;
1504 codec->frame_rate_base = icodec->frame_rate_base;
1505 codec->width = icodec->width;
1506 codec->height = icodec->height;
1512 switch(codec->codec_type) {
1513 case CODEC_TYPE_AUDIO:
1514 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1517 if (codec->channels == icodec->channels &&
1518 codec->sample_rate == icodec->sample_rate) {
1519 ost->audio_resample = 0;
1521 if (codec->channels != icodec->channels &&
1522 (icodec->codec_id == CODEC_ID_AC3 ||
1523 icodec->codec_id == CODEC_ID_DTS)) {
1524 /* Special case for 5:1 AC3 and DTS input */
1525 /* and mono or stereo output */
1526 /* Request specific number of channels */
1527 icodec->channels = codec->channels;
1528 if (codec->sample_rate == icodec->sample_rate)
1529 ost->audio_resample = 0;
1531 ost->audio_resample = 1;
1534 ost->audio_resample = 1;
1537 if(audio_sync_method>1)
1538 ost->audio_resample = 1;
1540 if(ost->audio_resample){
1541 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1542 codec->sample_rate, icodec->sample_rate);
1544 printf("Can't resample. Aborting.\n");
1548 ist->decoding_needed = 1;
1549 ost->encoding_needed = 1;
1551 case CODEC_TYPE_VIDEO:
1552 if (codec->width == icodec->width &&
1553 codec->height == icodec->height &&
1554 frame_topBand == 0 &&
1555 frame_bottomBand == 0 &&
1556 frame_leftBand == 0 &&
1557 frame_rightBand == 0 &&
1558 frame_padtop == 0 &&
1559 frame_padbottom == 0 &&
1560 frame_padleft == 0 &&
1561 frame_padright == 0)
1563 ost->video_resample = 0;
1564 ost->video_crop = 0;
1566 } else if ((codec->width == icodec->width -
1567 (frame_leftBand + frame_rightBand)) &&
1568 (codec->height == icodec->height -
1569 (frame_topBand + frame_bottomBand)))
1571 ost->video_resample = 0;
1572 ost->video_crop = 1;
1573 ost->topBand = frame_topBand;
1574 ost->leftBand = frame_leftBand;
1575 } else if ((codec->width == icodec->width +
1576 (frame_padleft + frame_padright)) &&
1577 (codec->height == icodec->height +
1578 (frame_padtop + frame_padbottom))) {
1579 ost->video_resample = 0;
1580 ost->video_crop = 0;
1582 ost->padtop = frame_padtop;
1583 ost->padleft = frame_padleft;
1584 ost->padbottom = frame_padbottom;
1585 ost->padright = frame_padright;
1586 avcodec_get_frame_defaults(&ost->pict_tmp);
1587 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1588 codec->width, codec->height ) )
1591 ost->video_resample = 1;
1592 ost->video_crop = 0; // cropping is handled as part of resample
1593 avcodec_get_frame_defaults(&ost->pict_tmp);
1594 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1595 codec->width, codec->height ) )
1598 ost->img_resample_ctx = img_resample_full_init(
1599 ost->st->codec.width, ost->st->codec.height,
1600 ist->st->codec.width, ist->st->codec.height,
1601 frame_topBand, frame_bottomBand,
1602 frame_leftBand, frame_rightBand,
1603 frame_padtop, frame_padbottom,
1604 frame_padleft, frame_padright);
1606 ost->padtop = frame_padtop;
1607 ost->padleft = frame_padleft;
1608 ost->padbottom = frame_padbottom;
1609 ost->padright = frame_padright;
1612 ost->encoding_needed = 1;
1613 ist->decoding_needed = 1;
1619 if (ost->encoding_needed &&
1620 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1621 char logfilename[1024];
1626 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1628 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1629 if (codec->flags & CODEC_FLAG_PASS1) {
1630 f = fopen(logfilename, "w");
1632 perror(logfilename);
1637 /* read the log file */
1638 f = fopen(logfilename, "r");
1640 perror(logfilename);
1643 fseek(f, 0, SEEK_END);
1645 fseek(f, 0, SEEK_SET);
1646 logbuffer = av_malloc(size + 1);
1648 fprintf(stderr, "Could not allocate log buffer\n");
1651 size = fread(logbuffer, 1, size, f);
1653 logbuffer[size] = '\0';
1654 codec->stats_in = logbuffer;
1660 /* dump the file output parameters - cannot be done before in case
1662 for(i=0;i<nb_output_files;i++) {
1663 dump_format(output_files[i], i, output_files[i]->filename, 1);
1666 /* dump the stream mapping */
1668 fprintf(stderr, "Stream mapping:\n");
1669 for(i=0;i<nb_ostreams;i++) {
1671 fprintf(stderr, " Stream #%d.%d -> #%d.%d\n",
1672 ist_table[ost->source_index]->file_index,
1673 ist_table[ost->source_index]->index,
1679 /* open each encoder */
1680 for(i=0;i<nb_ostreams;i++) {
1682 if (ost->encoding_needed) {
1684 codec = avcodec_find_encoder(ost->st->codec.codec_id);
1686 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1687 ost->file_index, ost->index);
1690 if (avcodec_open(&ost->st->codec, codec) < 0) {
1691 fprintf(stderr, "Error while opening codec for stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1692 ost->file_index, ost->index);
1695 extra_size += ost->st->codec.extradata_size;
1699 /* open each decoder */
1700 for(i=0;i<nb_istreams;i++) {
1702 if (ist->decoding_needed) {
1704 codec = avcodec_find_decoder(ist->st->codec.codec_id);
1706 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1707 ist->st->codec.codec_id, ist->file_index, ist->index);
1710 if (avcodec_open(&ist->st->codec, codec) < 0) {
1711 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1712 ist->file_index, ist->index);
1715 //if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO)
1716 // ist->st->codec.flags |= CODEC_FLAG_REPEAT_FIELD;
1721 for(i=0;i<nb_istreams;i++) {
1723 is = input_files[ist->file_index];
1725 ist->next_pts = ist->st->start_time;
1726 if(ist->next_pts == AV_NOPTS_VALUE)
1731 /* compute buffer size max (should use a complete heuristic) */
1732 for(i=0;i<nb_input_files;i++) {
1733 file_table[i].buffer_size_max = 2048;
1736 /* set meta data information from input file if required */
1737 for (i=0;i<nb_meta_data_maps;i++) {
1738 AVFormatContext *out_file;
1739 AVFormatContext *in_file;
1741 int out_file_index = meta_data_maps[i].out_file;
1742 int in_file_index = meta_data_maps[i].in_file;
1743 if ( out_file_index < 0 || out_file_index >= nb_output_files ) {
1744 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1748 if ( in_file_index < 0 || in_file_index >= nb_input_files ) {
1749 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1754 out_file = output_files[out_file_index];
1755 in_file = input_files[in_file_index];
1757 strcpy(out_file->title, in_file->title);
1758 strcpy(out_file->author, in_file->author);
1759 strcpy(out_file->copyright, in_file->copyright);
1760 strcpy(out_file->comment, in_file->comment);
1761 strcpy(out_file->album, in_file->album);
1762 out_file->year = in_file->year;
1763 out_file->track = in_file->track;
1764 strcpy(out_file->genre, in_file->genre);
1767 /* open files and write file headers */
1768 for(i=0;i<nb_output_files;i++) {
1769 os = output_files[i];
1770 if (av_write_header(os) < 0) {
1771 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1777 #ifndef CONFIG_WIN32
1778 if ( !using_stdin && verbose >= 0) {
1779 fprintf(stderr, "Press [q] to stop encoding\n");
1780 url_set_interrupt_cb(decode_interrupt_cb);
1788 for(; received_sigterm == 0;) {
1789 int file_index, ist_index;
1797 /* if 'q' pressed, exits */
1801 /* read_key() returns 0 on EOF */
1807 /* select the stream that we must read now by looking at the
1808 smallest output pts */
1810 for(i=0;i<nb_ostreams;i++) {
1813 os = output_files[ost->file_index];
1814 ist = ist_table[ost->source_index];
1815 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1816 opts = (double)ost->sync_opts * ost->st->codec.frame_rate_base / ost->st->codec.frame_rate;
1818 opts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1819 ipts = (double)ist->pts;
1820 if (!file_table[ist->file_index].eof_reached){
1821 if(ipts < ipts_min) {
1823 if(input_sync ) file_index = ist->file_index;
1825 if(opts < opts_min) {
1827 if(!input_sync) file_index = ist->file_index;
1831 /* if none, if is finished */
1832 if (file_index < 0) {
1836 /* finish if recording time exhausted */
1837 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
1840 /* read a frame from it and output it in the fifo */
1841 is = input_files[file_index];
1842 if (av_read_frame(is, &pkt) < 0) {
1843 file_table[file_index].eof_reached = 1;
1848 stream_no_data = is;
1853 av_pkt_dump(stdout, &pkt, do_hex_dump);
1855 /* the following test is needed in case new streams appear
1856 dynamically in stream : we ignore them */
1857 if (pkt.stream_index >= file_table[file_index].nb_streams)
1858 goto discard_packet;
1859 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1860 ist = ist_table[ist_index];
1862 goto discard_packet;
1864 // 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);
1865 if (pkt.dts != AV_NOPTS_VALUE) {
1866 int64_t delta= pkt.dts - ist->next_pts;
1867 if(ABS(delta) > 10LL*AV_TIME_BASE && !copy_ts){
1868 input_files_ts_offset[ist->file_index]-= delta;
1870 fprintf(stderr, "timestamp discontinuity %lld, new offset= %lld\n", delta, input_files_ts_offset[ist->file_index]);
1871 for(i=0; i<file_table[file_index].nb_streams; i++){
1872 int index= file_table[file_index].ist_index + i;
1873 ist_table[index]->next_pts += delta;
1874 ist_table[index]->is_start=1;
1879 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1880 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1883 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1884 ist->file_index, ist->index);
1886 av_free_packet(&pkt);
1891 av_free_packet(&pkt);
1893 /* dump report by using the output first video and audio streams */
1894 print_report(output_files, ost_table, nb_ostreams, 0);
1897 /* at the end of stream, we must flush the decoder buffers */
1898 for(i=0;i<nb_istreams;i++) {
1900 if (ist->decoding_needed) {
1901 output_packet(ist, i, ost_table, nb_ostreams, NULL);
1907 /* write the trailer if needed and close file */
1908 for(i=0;i<nb_output_files;i++) {
1909 os = output_files[i];
1910 av_write_trailer(os);
1913 /* dump report by using the first video and audio streams */
1914 print_report(output_files, ost_table, nb_ostreams, 1);
1916 /* close each encoder */
1917 for(i=0;i<nb_ostreams;i++) {
1919 if (ost->encoding_needed) {
1920 av_freep(&ost->st->codec.stats_in);
1921 avcodec_close(&ost->st->codec);
1925 /* close each decoder */
1926 for(i=0;i<nb_istreams;i++) {
1928 if (ist->decoding_needed) {
1929 avcodec_close(&ist->st->codec);
1937 av_free(file_table);
1940 for(i=0;i<nb_istreams;i++) {
1947 for(i=0;i<nb_ostreams;i++) {
1951 fclose(ost->logfile);
1952 ost->logfile = NULL;
1954 fifo_free(&ost->fifo); /* works even if fifo is not
1955 initialized but set to zero */
1956 av_free(ost->pict_tmp.data[0]);
1957 if (ost->video_resample)
1958 img_resample_close(ost->img_resample_ctx);
1959 if (ost->audio_resample)
1960 audio_resample_close(ost->resample);
1973 int file_read(const char *filename)
1976 unsigned char buffer[1024];
1979 if (url_open(&h, filename, O_RDONLY) < 0) {
1980 printf("could not open '%s'\n", filename);
1984 len = url_read(h, buffer, sizeof(buffer));
1987 for(i=0;i<len;i++) putchar(buffer[i]);
1994 static void opt_image_format(const char *arg)
1998 for(f = first_image_format; f != NULL; f = f->next) {
1999 if (!strcmp(arg, f->name))
2003 fprintf(stderr, "Unknown image format: '%s'\n", arg);
2009 static void opt_format(const char *arg)
2011 /* compatibility stuff for pgmyuv */
2012 if (!strcmp(arg, "pgmyuv")) {
2013 opt_image_format(arg);
2017 file_iformat = av_find_input_format(arg);
2018 file_oformat = guess_format(arg, NULL, NULL);
2019 if (!file_iformat && !file_oformat) {
2020 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2025 static void opt_video_bitrate(const char *arg)
2027 video_bit_rate = atoi(arg) * 1000;
2030 static void opt_video_bitrate_tolerance(const char *arg)
2032 video_bit_rate_tolerance = atoi(arg) * 1000;
2035 static void opt_video_bitrate_max(const char *arg)
2037 video_rc_max_rate = atoi(arg) * 1000;
2040 static void opt_video_bitrate_min(const char *arg)
2042 video_rc_min_rate = atoi(arg) * 1000;
2045 static void opt_video_buffer_size(const char *arg)
2047 video_rc_buffer_size = atoi(arg) * 8*1024;
2050 static void opt_video_rc_eq(char *arg)
2055 static void opt_video_rc_override_string(char *arg)
2057 video_rc_override_string = arg;
2061 static void opt_workaround_bugs(const char *arg)
2063 workaround_bugs = atoi(arg);
2066 static void opt_dct_algo(const char *arg)
2068 dct_algo = atoi(arg);
2071 static void opt_idct_algo(const char *arg)
2073 idct_algo = atoi(arg);
2076 static void opt_me_threshold(const char *arg)
2078 me_threshold = atoi(arg);
2081 static void opt_mb_threshold(const char *arg)
2083 mb_threshold = atoi(arg);
2086 static void opt_error_resilience(const char *arg)
2088 error_resilience = atoi(arg);
2091 static void opt_error_concealment(const char *arg)
2093 error_concealment = atoi(arg);
2096 static void opt_debug(const char *arg)
2101 static void opt_vismv(const char *arg)
2103 debug_mv = atoi(arg);
2106 static void opt_verbose(const char *arg)
2108 verbose = atoi(arg);
2109 av_log_set_level(atoi(arg));
2112 static void opt_frame_rate(const char *arg)
2114 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
2115 fprintf(stderr, "Incorrect frame rate\n");
2120 static void opt_frame_crop_top(const char *arg)
2122 frame_topBand = atoi(arg);
2123 if (frame_topBand < 0) {
2124 fprintf(stderr, "Incorrect top crop size\n");
2127 if ((frame_topBand % 2) != 0) {
2128 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2131 if ((frame_topBand) >= frame_height){
2132 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2135 frame_height -= frame_topBand;
2138 static void opt_frame_crop_bottom(const char *arg)
2140 frame_bottomBand = atoi(arg);
2141 if (frame_bottomBand < 0) {
2142 fprintf(stderr, "Incorrect bottom crop size\n");
2145 if ((frame_bottomBand % 2) != 0) {
2146 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2149 if ((frame_bottomBand) >= frame_height){
2150 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2153 frame_height -= frame_bottomBand;
2156 static void opt_frame_crop_left(const char *arg)
2158 frame_leftBand = atoi(arg);
2159 if (frame_leftBand < 0) {
2160 fprintf(stderr, "Incorrect left crop size\n");
2163 if ((frame_leftBand % 2) != 0) {
2164 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2167 if ((frame_leftBand) >= frame_width){
2168 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2171 frame_width -= frame_leftBand;
2174 static void opt_frame_crop_right(const char *arg)
2176 frame_rightBand = atoi(arg);
2177 if (frame_rightBand < 0) {
2178 fprintf(stderr, "Incorrect right crop size\n");
2181 if ((frame_rightBand % 2) != 0) {
2182 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2185 if ((frame_rightBand) >= frame_width){
2186 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2189 frame_width -= frame_rightBand;
2192 static void opt_frame_size(const char *arg)
2194 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2195 fprintf(stderr, "Incorrect frame size\n");
2198 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2199 fprintf(stderr, "Frame size must be a multiple of 2\n");
2205 #define SCALEBITS 10
2206 #define ONE_HALF (1 << (SCALEBITS - 1))
2207 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2209 #define RGB_TO_Y(r, g, b) \
2210 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2211 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2213 #define RGB_TO_U(r1, g1, b1, shift)\
2214 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2215 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2217 #define RGB_TO_V(r1, g1, b1, shift)\
2218 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2219 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2221 static void opt_pad_color(const char *arg) {
2222 /* Input is expected to be six hex digits similar to
2223 how colors are expressed in html tags (but without the #) */
2224 int rgb = strtol(arg, NULL, 16);
2228 g = ((rgb >> 8) & 255);
2231 padcolor[0] = RGB_TO_Y(r,g,b);
2232 padcolor[1] = RGB_TO_U(r,g,b,0);
2233 padcolor[2] = RGB_TO_V(r,g,b,0);
2236 static void opt_frame_pad_top(const char *arg)
2238 frame_padtop = atoi(arg);
2239 if (frame_padtop < 0) {
2240 fprintf(stderr, "Incorrect top pad size\n");
2243 if ((frame_padtop % 2) != 0) {
2244 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2249 static void opt_frame_pad_bottom(const char *arg)
2251 frame_padbottom = atoi(arg);
2252 if (frame_padbottom < 0) {
2253 fprintf(stderr, "Incorrect bottom pad size\n");
2256 if ((frame_padbottom % 2) != 0) {
2257 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2263 static void opt_frame_pad_left(const char *arg)
2265 frame_padleft = atoi(arg);
2266 if (frame_padleft < 0) {
2267 fprintf(stderr, "Incorrect left pad size\n");
2270 if ((frame_padleft % 2) != 0) {
2271 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2277 static void opt_frame_pad_right(const char *arg)
2279 frame_padright = atoi(arg);
2280 if (frame_padright < 0) {
2281 fprintf(stderr, "Incorrect right pad size\n");
2284 if ((frame_padright % 2) != 0) {
2285 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2291 static void opt_frame_pix_fmt(const char *arg)
2293 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2296 static void opt_frame_aspect_ratio(const char *arg)
2302 p = strchr(arg, ':');
2304 x = strtol(arg, (char **)&arg, 10);
2306 y = strtol(arg+1, (char **)&arg, 10);
2308 ar = (double)x / (double)y;
2310 ar = strtod(arg, (char **)&arg);
2313 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2316 frame_aspect_ratio = ar;
2319 static void opt_gop_size(const char *arg)
2321 gop_size = atoi(arg);
2324 static void opt_b_frames(const char *arg)
2326 b_frames = atoi(arg);
2327 if (b_frames > FF_MAX_B_FRAMES) {
2328 fprintf(stderr, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES);
2330 } else if (b_frames < 1) {
2331 fprintf(stderr, "\nNumber of B frames must be higher than 0\n");
2336 static void opt_mb_decision(const char *arg)
2338 mb_decision = atoi(arg);
2341 static void opt_mb_cmp(const char *arg)
2346 static void opt_ildct_cmp(const char *arg)
2348 ildct_cmp = atoi(arg);
2351 static void opt_sub_cmp(const char *arg)
2353 sub_cmp = atoi(arg);
2356 static void opt_cmp(const char *arg)
2361 static void opt_pre_cmp(const char *arg)
2363 pre_cmp = atoi(arg);
2366 static void opt_pre_me(const char *arg)
2371 static void opt_lumi_mask(const char *arg)
2373 lumi_mask = atof(arg);
2376 static void opt_dark_mask(const char *arg)
2378 dark_mask = atof(arg);
2381 static void opt_scplx_mask(const char *arg)
2383 scplx_mask = atof(arg);
2386 static void opt_tcplx_mask(const char *arg)
2388 tcplx_mask = atof(arg);
2391 static void opt_p_mask(const char *arg)
2396 static void opt_qscale(const char *arg)
2398 video_qscale = atof(arg);
2399 if (video_qscale < 0.01 ||
2400 video_qscale > 255) {
2401 fprintf(stderr, "qscale must be >= 0.01 and <= 255\n");
2406 static void opt_lmax(const char *arg)
2408 video_lmax = atof(arg)*FF_QP2LAMBDA;
2411 static void opt_lmin(const char *arg)
2413 video_lmin = atof(arg)*FF_QP2LAMBDA;
2416 static void opt_qmin(const char *arg)
2418 video_qmin = atoi(arg);
2419 if (video_qmin < 0 ||
2421 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2426 static void opt_qmax(const char *arg)
2428 video_qmax = atoi(arg);
2429 if (video_qmax < 0 ||
2431 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2436 static void opt_mb_qmin(const char *arg)
2438 video_mb_qmin = atoi(arg);
2439 if (video_mb_qmin < 0 ||
2440 video_mb_qmin > 31) {
2441 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2446 static void opt_mb_qmax(const char *arg)
2448 video_mb_qmax = atoi(arg);
2449 if (video_mb_qmax < 0 ||
2450 video_mb_qmax > 31) {
2451 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2456 static void opt_qdiff(const char *arg)
2458 video_qdiff = atoi(arg);
2459 if (video_qdiff < 0 ||
2461 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2466 static void opt_qblur(const char *arg)
2468 video_qblur = atof(arg);
2471 static void opt_qcomp(const char *arg)
2473 video_qcomp = atof(arg);
2476 static void opt_rc_initial_cplx(const char *arg)
2478 video_rc_initial_cplx = atof(arg);
2480 static void opt_b_qfactor(const char *arg)
2482 video_b_qfactor = atof(arg);
2484 static void opt_i_qfactor(const char *arg)
2486 video_i_qfactor = atof(arg);
2488 static void opt_b_qoffset(const char *arg)
2490 video_b_qoffset = atof(arg);
2492 static void opt_i_qoffset(const char *arg)
2494 video_i_qoffset = atof(arg);
2497 static void opt_ibias(const char *arg)
2499 video_intra_quant_bias = atoi(arg);
2501 static void opt_pbias(const char *arg)
2503 video_inter_quant_bias = atoi(arg);
2506 static void opt_packet_size(const char *arg)
2508 packet_size= atoi(arg);
2511 static void opt_error_rate(const char *arg)
2513 error_rate= atoi(arg);
2516 static void opt_strict(const char *arg)
2521 static void opt_top_field_first(const char *arg)
2523 top_field_first= atoi(arg);
2526 static void opt_noise_reduction(const char *arg)
2528 noise_reduction= atoi(arg);
2531 static void opt_qns(const char *arg)
2536 static void opt_sc_threshold(const char *arg)
2538 sc_threshold= atoi(arg);
2541 static void opt_me_range(const char *arg)
2543 me_range = atoi(arg);
2546 static void opt_thread_count(const char *arg)
2548 thread_count= atoi(arg);
2549 #if !defined(HAVE_PTHREADS) && !defined(HAVE_W32THREADS)
2551 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2555 static void opt_audio_bitrate(const char *arg)
2557 audio_bit_rate = atoi(arg) * 1000;
2560 static void opt_audio_rate(const char *arg)
2562 audio_sample_rate = atoi(arg);
2565 static void opt_audio_channels(const char *arg)
2567 audio_channels = atoi(arg);
2570 static void opt_video_device(const char *arg)
2572 video_device = av_strdup(arg);
2575 static void opt_video_channel(const char *arg)
2577 video_channel = strtol(arg, NULL, 0);
2580 static void opt_video_standard(const char *arg)
2582 video_standard = av_strdup(arg);
2585 static void opt_audio_device(const char *arg)
2587 audio_device = av_strdup(arg);
2590 static void opt_dv1394(const char *arg)
2592 video_grab_format = "dv1394";
2593 audio_grab_format = NULL;
2596 static void opt_audio_codec(const char *arg)
2600 if (!strcmp(arg, "copy")) {
2601 audio_stream_copy = 1;
2605 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_AUDIO)
2610 fprintf(stderr, "Unknown audio codec '%s'\n", arg);
2613 audio_codec_id = p->id;
2618 static void add_frame_hooker(const char *arg)
2623 char *args = av_strdup(arg);
2627 argv[0] = strtok(args, " ");
2628 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2631 i = frame_hook_add(argc, argv);
2634 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2639 const char *motion_str[] = {
2649 static void opt_motion_estimation(const char *arg)
2655 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2658 if (!strcmp(*p, arg))
2662 me_method = (p - motion_str) + 1;
2665 static void opt_video_codec(const char *arg)
2669 if (!strcmp(arg, "copy")) {
2670 video_stream_copy = 1;
2674 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_VIDEO)
2679 fprintf(stderr, "Unknown video codec '%s'\n", arg);
2682 video_codec_id = p->id;
2687 static void opt_map(const char *arg)
2693 m = &stream_maps[nb_stream_maps++];
2695 m->file_index = strtol(arg, (char **)&p, 0);
2699 m->stream_index = strtol(p, (char **)&p, 0);
2702 static void opt_map_meta_data(const char *arg)
2708 m = &meta_data_maps[nb_meta_data_maps++];
2710 m->out_file = strtol(arg, (char **)&p, 0);
2714 m->in_file = strtol(p, (char **)&p, 0);
2717 static void opt_recording_time(const char *arg)
2719 recording_time = parse_date(arg, 1);
2722 static void opt_start_time(const char *arg)
2724 start_time = parse_date(arg, 1);
2727 static void opt_rec_timestamp(const char *arg)
2729 rec_timestamp = parse_date(arg, 0) / 1000000;
2732 static void opt_input_ts_offset(const char *arg)
2734 input_ts_offset = parse_date(arg, 1);
2737 static void opt_input_file(const char *filename)
2739 AVFormatContext *ic;
2740 AVFormatParameters params, *ap = ¶ms;
2741 int err, i, ret, rfps, rfps_base;
2744 if (!strcmp(filename, "-"))
2747 using_stdin |= !strcmp(filename, "pipe:" ) ||
2748 !strcmp( filename, "/dev/stdin" );
2750 /* get default parameters from command line */
2751 memset(ap, 0, sizeof(*ap));
2752 ap->sample_rate = audio_sample_rate;
2753 ap->channels = audio_channels;
2754 ap->frame_rate = frame_rate;
2755 ap->frame_rate_base = frame_rate_base;
2756 ap->width = frame_width + frame_padleft + frame_padright;
2757 ap->height = frame_height + frame_padtop + frame_padbottom;
2758 ap->image_format = image_format;
2759 ap->pix_fmt = frame_pix_fmt;
2761 /* open the input file with generic libav function */
2762 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2764 print_error(filename, err);
2768 /* If not enough info to get the stream parameters, we decode the
2769 first frames to get it. (used in mpeg case for example) */
2770 ret = av_find_stream_info(ic);
2771 if (ret < 0 && verbose >= 0) {
2772 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2776 timestamp = start_time;
2777 /* add the stream start time */
2778 if (ic->start_time != AV_NOPTS_VALUE)
2779 timestamp += ic->start_time;
2781 /* if seeking requested, we execute it */
2782 if (start_time != 0) {
2783 ret = av_seek_frame(ic, -1, timestamp);
2785 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2786 filename, (double)timestamp / AV_TIME_BASE);
2788 /* reset seek info */
2792 /* update the current parameters so that they match the one of the input stream */
2793 for(i=0;i<ic->nb_streams;i++) {
2794 AVCodecContext *enc = &ic->streams[i]->codec;
2795 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2797 avcodec_thread_init(enc, thread_count);
2799 enc->thread_count= thread_count;
2800 switch(enc->codec_type) {
2801 case CODEC_TYPE_AUDIO:
2802 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2803 audio_channels = enc->channels;
2804 audio_sample_rate = enc->sample_rate;
2806 case CODEC_TYPE_VIDEO:
2807 frame_height = enc->height;
2808 frame_width = enc->width;
2809 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2810 frame_pix_fmt = enc->pix_fmt;
2811 rfps = ic->streams[i]->r_frame_rate;
2812 rfps_base = ic->streams[i]->r_frame_rate_base;
2813 enc->workaround_bugs = workaround_bugs;
2814 enc->error_resilience = error_resilience;
2815 enc->error_concealment = error_concealment;
2816 enc->idct_algo = idct_algo;
2818 enc->debug_mv = debug_mv;
2820 enc->flags|= CODEC_FLAG_BITEXACT;
2822 enc->debug |= FF_DEBUG_MV;
2824 assert(enc->frame_rate_base == rfps_base); // should be true for now
2825 if (enc->frame_rate != rfps) {
2828 fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f->%2.2f\n",
2829 i, (float)enc->frame_rate / enc->frame_rate_base,
2831 (float)rfps / rfps_base);
2833 /* update the current frame rate to match the stream frame rate */
2835 frame_rate_base = rfps_base;
2837 enc->rate_emu = rate_emu;
2839 case CODEC_TYPE_DATA:
2846 input_files[nb_input_files] = ic;
2847 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2848 /* dump the file content */
2850 dump_format(ic, nb_input_files, filename, 0);
2853 file_iformat = NULL;
2854 file_oformat = NULL;
2855 image_format = NULL;
2860 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
2862 int has_video, has_audio, i, j;
2863 AVFormatContext *ic;
2867 for(j=0;j<nb_input_files;j++) {
2868 ic = input_files[j];
2869 for(i=0;i<ic->nb_streams;i++) {
2870 AVCodecContext *enc = &ic->streams[i]->codec;
2871 switch(enc->codec_type) {
2872 case CODEC_TYPE_AUDIO:
2875 case CODEC_TYPE_VIDEO:
2878 case CODEC_TYPE_DATA:
2885 *has_video_ptr = has_video;
2886 *has_audio_ptr = has_audio;
2889 static void opt_output_file(const char *filename)
2892 AVFormatContext *oc;
2893 int use_video, use_audio, nb_streams, input_has_video, input_has_audio;
2895 AVFormatParameters params, *ap = ¶ms;
2897 if (!strcmp(filename, "-"))
2900 oc = av_alloc_format_context();
2902 if (!file_oformat) {
2903 file_oformat = guess_format(NULL, filename, NULL);
2904 if (!file_oformat) {
2905 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
2911 oc->oformat = file_oformat;
2913 if (!strcmp(file_oformat->name, "ffm") &&
2914 strstart(filename, "http:", NULL)) {
2915 /* special case for files sent to ffserver: we get the stream
2916 parameters from ffserver */
2917 if (read_ffserver_streams(oc, filename) < 0) {
2918 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
2922 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy;
2923 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy;
2925 /* disable if no corresponding type found and at least one
2927 if (nb_input_files > 0) {
2928 check_audio_video_inputs(&input_has_video, &input_has_audio);
2929 if (!input_has_video)
2931 if (!input_has_audio)
2935 /* manual disable */
2936 if (audio_disable) {
2939 if (video_disable) {
2945 AVCodecContext *video_enc;
2947 st = av_new_stream(oc, nb_streams++);
2949 fprintf(stderr, "Could not alloc stream\n");
2952 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2954 avcodec_thread_init(&st->codec, thread_count);
2957 video_enc = &st->codec;
2959 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
2960 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2961 if (video_stream_copy) {
2962 st->stream_copy = 1;
2963 video_enc->codec_type = CODEC_TYPE_VIDEO;
2969 codec_id = file_oformat->video_codec;
2970 if (video_codec_id != CODEC_ID_NONE)
2971 codec_id = video_codec_id;
2973 video_enc->codec_id = codec_id;
2974 codec = avcodec_find_encoder(codec_id);
2976 video_enc->bit_rate = video_bit_rate;
2977 video_enc->bit_rate_tolerance = video_bit_rate_tolerance;
2978 video_enc->frame_rate = frame_rate;
2979 video_enc->frame_rate_base = frame_rate_base;
2980 if(codec && codec->supported_framerates){
2981 const AVRational *p= codec->supported_framerates;
2982 AVRational req= (AVRational){frame_rate, frame_rate_base};
2983 const AVRational *best=NULL;
2984 AVRational best_error= (AVRational){INT_MAX, 1};
2985 for(; p->den!=0; p++){
2986 AVRational error= av_sub_q(req, *p);
2987 if(error.num <0) error.num *= -1;
2988 if(av_cmp_q(error, best_error) < 0){
2993 video_enc->frame_rate = best->num;
2994 video_enc->frame_rate_base= best->den;
2997 video_enc->width = frame_width + frame_padright + frame_padleft;
2998 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2999 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3000 video_enc->pix_fmt = frame_pix_fmt;
3002 if(codec && codec->pix_fmts){
3003 const enum PixelFormat *p= codec->pix_fmts;
3005 if(*p == video_enc->pix_fmt)
3009 video_enc->pix_fmt = codec->pix_fmts[0];
3013 video_enc->gop_size = gop_size;
3015 video_enc->gop_size = 0;
3016 if (video_qscale || same_quality) {
3017 video_enc->flags |= CODEC_FLAG_QSCALE;
3018 st->quality = FF_QP2LAMBDA * video_qscale;
3022 video_enc->intra_matrix = intra_matrix;
3024 video_enc->inter_matrix = inter_matrix;
3027 video_enc->flags |= CODEC_FLAG_BITEXACT;
3029 video_enc->mb_decision = mb_decision;
3030 video_enc->mb_cmp = mb_cmp;
3031 video_enc->ildct_cmp = ildct_cmp;
3032 video_enc->me_sub_cmp = sub_cmp;
3033 video_enc->me_cmp = cmp;
3034 video_enc->me_pre_cmp = pre_cmp;
3035 video_enc->pre_me = pre_me;
3036 video_enc->lumi_masking = lumi_mask;
3037 video_enc->dark_masking = dark_mask;
3038 video_enc->spatial_cplx_masking = scplx_mask;
3039 video_enc->temporal_cplx_masking = tcplx_mask;
3040 video_enc->p_masking = p_mask;
3041 video_enc->quantizer_noise_shaping= qns;
3044 video_enc->flags |= CODEC_FLAG_H263P_UMV;
3047 video_enc->flags |= CODEC_FLAG_H263P_SLICE_STRUCT;
3050 video_enc->flags |= CODEC_FLAG_H263P_AIC;
3053 video_enc->flags |= CODEC_FLAG_H263P_AIV;
3056 video_enc->flags |= CODEC_FLAG_4MV;
3059 video_enc->flags |= CODEC_FLAG_OBMC;
3062 video_enc->flags |= CODEC_FLAG_LOOP_FILTER;
3066 video_enc->flags |= CODEC_FLAG_PART;
3069 video_enc->flags |= CODEC_FLAG_ALT_SCAN;
3072 video_enc->flags |= CODEC_FLAG_TRELLIS_QUANT;
3074 if (use_scan_offset) {
3075 video_enc->flags |= CODEC_FLAG_SVCD_SCAN_OFFSET;
3078 video_enc->flags |= CODEC_FLAG_CLOSED_GOP;
3081 video_enc->flags |= CODEC_FLAG_QPEL;
3084 video_enc->flags |= CODEC_FLAG_QP_RD;
3087 video_enc->flags |= CODEC_FLAG_CBP_RD;
3090 video_enc->max_b_frames = b_frames;
3091 video_enc->b_frame_strategy = 0;
3092 video_enc->b_quant_factor = 2.0;
3094 if (do_interlace_dct) {
3095 video_enc->flags |= CODEC_FLAG_INTERLACED_DCT;
3097 if (do_interlace_me) {
3098 video_enc->flags |= CODEC_FLAG_INTERLACED_ME;
3100 video_enc->qmin = video_qmin;
3101 video_enc->qmax = video_qmax;
3102 video_enc->lmin = video_lmin;
3103 video_enc->lmax = video_lmax;
3104 video_enc->mb_qmin = video_mb_qmin;
3105 video_enc->mb_qmax = video_mb_qmax;
3106 video_enc->max_qdiff = video_qdiff;
3107 video_enc->qblur = video_qblur;
3108 video_enc->qcompress = video_qcomp;
3109 video_enc->rc_eq = video_rc_eq;
3110 video_enc->debug = debug;
3111 video_enc->debug_mv = debug_mv;
3112 video_enc->thread_count = thread_count;
3113 p= video_rc_override_string;
3116 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3118 fprintf(stderr, "error parsing rc_override\n");
3121 video_enc->rc_override=
3122 av_realloc(video_enc->rc_override,
3123 sizeof(RcOverride)*(i+1));
3124 video_enc->rc_override[i].start_frame= start;
3125 video_enc->rc_override[i].end_frame = end;
3127 video_enc->rc_override[i].qscale= q;
3128 video_enc->rc_override[i].quality_factor= 1.0;
3131 video_enc->rc_override[i].qscale= 0;
3132 video_enc->rc_override[i].quality_factor= -q/100.0;
3137 video_enc->rc_override_count=i;
3139 video_enc->rc_max_rate = video_rc_max_rate;
3140 video_enc->rc_min_rate = video_rc_min_rate;
3141 video_enc->rc_buffer_size = video_rc_buffer_size;
3142 video_enc->rc_buffer_aggressivity= video_rc_buffer_aggressivity;
3143 video_enc->rc_initial_cplx= video_rc_initial_cplx;
3144 video_enc->i_quant_factor = video_i_qfactor;
3145 video_enc->b_quant_factor = video_b_qfactor;
3146 video_enc->i_quant_offset = video_i_qoffset;
3147 video_enc->b_quant_offset = video_b_qoffset;
3148 video_enc->intra_quant_bias = video_intra_quant_bias;
3149 video_enc->inter_quant_bias = video_inter_quant_bias;
3150 video_enc->dct_algo = dct_algo;
3151 video_enc->idct_algo = idct_algo;
3152 video_enc->me_threshold= me_threshold;
3153 video_enc->mb_threshold= mb_threshold;
3154 video_enc->intra_dc_precision= intra_dc_precision - 8;
3155 video_enc->strict_std_compliance = strict;
3156 video_enc->error_rate = error_rate;
3157 video_enc->noise_reduction= noise_reduction;
3158 video_enc->scenechange_threshold= sc_threshold;
3159 video_enc->me_range = me_range;
3160 video_enc->coder_type= coder;
3161 video_enc->context_model= context;
3162 video_enc->prediction_method= predictor;
3163 video_enc->profile= video_profile;
3164 video_enc->level= video_level;
3165 video_enc->nsse_weight= nsse_weight;
3168 video_enc->rtp_mode= 1;
3169 video_enc->rtp_payload_size= packet_size;
3173 video_enc->flags|= CODEC_FLAG_PSNR;
3175 video_enc->me_method = me_method;
3180 video_enc->flags |= CODEC_FLAG_PASS1;
3182 video_enc->flags |= CODEC_FLAG_PASS2;
3189 AVCodecContext *audio_enc;
3191 st = av_new_stream(oc, nb_streams++);
3193 fprintf(stderr, "Could not alloc stream\n");
3196 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
3198 avcodec_thread_init(&st->codec, thread_count);
3201 audio_enc = &st->codec;
3202 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3204 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
3205 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3206 if (audio_stream_copy) {
3207 st->stream_copy = 1;
3208 audio_enc->channels = audio_channels;
3210 codec_id = file_oformat->audio_codec;
3211 if (audio_codec_id != CODEC_ID_NONE)
3212 codec_id = audio_codec_id;
3213 audio_enc->codec_id = codec_id;
3215 audio_enc->bit_rate = audio_bit_rate;
3216 audio_enc->strict_std_compliance = strict;
3217 audio_enc->thread_count = thread_count;
3218 /* For audio codecs other than AC3 or DTS we limit */
3219 /* the number of coded channels to stereo */
3220 if (audio_channels > 2 && codec_id != CODEC_ID_AC3
3221 && codec_id != CODEC_ID_DTS) {
3222 audio_enc->channels = 2;
3224 audio_enc->channels = audio_channels;
3226 audio_enc->sample_rate = audio_sample_rate;
3229 oc->nb_streams = nb_streams;
3232 fprintf(stderr, "No audio or video streams available\n");
3236 oc->timestamp = rec_timestamp;
3239 pstrcpy(oc->title, sizeof(oc->title), str_title);
3241 pstrcpy(oc->author, sizeof(oc->author), str_author);
3243 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3245 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3248 output_files[nb_output_files++] = oc;
3250 strcpy(oc->filename, filename);
3252 /* check filename in case of an image number is expected */
3253 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3254 if (filename_number_test(oc->filename) < 0) {
3255 print_error(oc->filename, AVERROR_NUMEXPECTED);
3260 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3261 /* test if it already exists to avoid loosing precious files */
3262 if (!file_overwrite &&
3263 (strchr(filename, ':') == NULL ||
3264 strstart(filename, "file:", NULL))) {
3265 if (url_exist(filename)) {
3268 if ( !using_stdin ) {
3269 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3272 if (toupper(c) != 'Y') {
3273 fprintf(stderr, "Not overwriting - exiting\n");
3278 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3285 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3286 fprintf(stderr, "Could not open '%s'\n", filename);
3291 memset(ap, 0, sizeof(*ap));
3292 ap->image_format = image_format;
3293 if (av_set_parameters(oc, ap) < 0) {
3294 fprintf(stderr, "%s: Invalid encoding parameters\n",
3299 /* reset some options */
3300 file_oformat = NULL;
3301 file_iformat = NULL;
3302 image_format = NULL;
3305 audio_codec_id = CODEC_ID_NONE;
3306 video_codec_id = CODEC_ID_NONE;
3307 audio_stream_copy = 0;
3308 video_stream_copy = 0;
3311 /* prepare dummy protocols for grab */
3312 static void prepare_grab(void)
3314 int has_video, has_audio, i, j;
3315 AVFormatContext *oc;
3316 AVFormatContext *ic;
3317 AVFormatParameters vp1, *vp = &vp1;
3318 AVFormatParameters ap1, *ap = &ap1;
3320 /* see if audio/video inputs are needed */
3323 memset(ap, 0, sizeof(*ap));
3324 memset(vp, 0, sizeof(*vp));
3325 for(j=0;j<nb_output_files;j++) {
3326 oc = output_files[j];
3327 for(i=0;i<oc->nb_streams;i++) {
3328 AVCodecContext *enc = &oc->streams[i]->codec;
3329 switch(enc->codec_type) {
3330 case CODEC_TYPE_AUDIO:
3331 if (enc->sample_rate > ap->sample_rate)
3332 ap->sample_rate = enc->sample_rate;
3333 if (enc->channels > ap->channels)
3334 ap->channels = enc->channels;
3337 case CODEC_TYPE_VIDEO:
3338 if (enc->width > vp->width)
3339 vp->width = enc->width;
3340 if (enc->height > vp->height)
3341 vp->height = enc->height;
3343 assert(enc->frame_rate_base == DEFAULT_FRAME_RATE_BASE);
3344 if (enc->frame_rate > vp->frame_rate){
3345 vp->frame_rate = enc->frame_rate;
3346 vp->frame_rate_base = enc->frame_rate_base;
3356 if (has_video == 0 && has_audio == 0) {
3357 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3362 AVInputFormat *fmt1;
3363 fmt1 = av_find_input_format(video_grab_format);
3364 vp->device = video_device;
3365 vp->channel = video_channel;
3366 vp->standard = video_standard;
3367 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3368 fprintf(stderr, "Could not find video grab device\n");
3371 /* If not enough info to get the stream parameters, we decode the
3372 first frames to get it. */
3373 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3374 fprintf(stderr, "Could not find video grab parameters\n");
3377 /* by now video grab has one stream */
3378 ic->streams[0]->r_frame_rate = vp->frame_rate;
3379 ic->streams[0]->r_frame_rate_base = vp->frame_rate_base;
3380 input_files[nb_input_files] = ic;
3383 dump_format(ic, nb_input_files, "", 0);
3387 if (has_audio && audio_grab_format) {
3388 AVInputFormat *fmt1;
3389 fmt1 = av_find_input_format(audio_grab_format);
3390 ap->device = audio_device;
3391 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3392 fprintf(stderr, "Could not find audio grab device\n");
3395 input_files[nb_input_files] = ic;
3398 dump_format(ic, nb_input_files, "", 0);
3404 /* same option as mencoder */
3405 static void opt_pass(const char *pass_str)
3408 pass = atoi(pass_str);
3409 if (pass != 1 && pass != 2) {
3410 fprintf(stderr, "pass number can be only 1 or 2\n");
3416 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3417 static int64_t getutime(void)
3419 return av_gettime();
3422 static int64_t getutime(void)
3424 struct rusage rusage;
3426 getrusage(RUSAGE_SELF, &rusage);
3427 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3431 extern int ffm_nopts;
3433 static void opt_bitexact(void)
3436 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3440 static void show_formats(void)
3442 AVInputFormat *ifmt;
3443 AVOutputFormat *ofmt;
3444 AVImageFormat *image_fmt;
3447 const char **pp, *last_name;
3449 printf("File formats:\n");
3454 const char *name=NULL;
3456 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3457 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3458 strcmp(ofmt->name, last_name)>0){
3463 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3464 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3465 strcmp(ifmt->name, last_name)>0){
3469 if(name && strcmp(ifmt->name, name)==0)
3484 printf("Image formats:\n");
3485 for(image_fmt = first_image_format; image_fmt != NULL;
3486 image_fmt = image_fmt->next) {
3489 image_fmt->img_read ? "D":" ",
3490 image_fmt->img_write ? "E":" ",
3495 printf("Codecs:\n");
3503 for(p = first_avcodec; p != NULL; p = p->next) {
3504 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3505 strcmp(p->name, last_name)>0){
3507 decode= encode= cap=0;
3509 if(p2 && strcmp(p->name, p2->name)==0){
3510 if(p->decode) decode=1;
3511 if(p->encode) encode=1;
3512 cap |= p->capabilities;
3517 last_name= p2->name;
3521 decode ? "D": (/*p2->decoder ? "d":*/" "),
3523 p2->type == CODEC_TYPE_AUDIO ? "A":"V",
3524 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3525 cap & CODEC_CAP_DR1 ? "D":" ",
3526 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3528 /* if(p2->decoder && decode==0)
3529 printf(" use %s for decoding", p2->decoder->name);*/
3534 printf("Supported file protocols:\n");
3535 for(up = first_protocol; up != NULL; up = up->next)
3536 printf(" %s:", up->name);
3539 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3540 printf("Motion estimation methods:\n");
3544 if ((pp - motion_str + 1) == ME_ZERO)
3545 printf("(fastest)");
3546 else if ((pp - motion_str + 1) == ME_FULL)
3547 printf("(slowest)");
3548 else if ((pp - motion_str + 1) == ME_EPZS)
3549 printf("(default)");
3554 "Note, the names of encoders and decoders dont always match, so there are\n"
3555 "several cases where the above table shows encoder only or decoder only entries\n"
3556 "even though both encoding and decoding are supported for example, the h263\n"
3557 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3562 void parse_matrix_coeffs(uint16_t *dest, const char *str)
3565 const char *p = str;
3572 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3579 void opt_inter_matrix(const char *arg)
3581 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3582 parse_matrix_coeffs(inter_matrix, arg);
3585 void opt_intra_matrix(const char *arg)
3587 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3588 parse_matrix_coeffs(intra_matrix, arg);
3591 static void opt_target(const char *arg)
3595 if(!strncmp(arg, "pal-", 4)) {
3598 } else if(!strncmp(arg, "ntsc-", 5)) {
3603 /* Calculate FR via float to avoid int overflow */
3604 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3607 } else if((fr == 29970) || (fr == 23976)) {
3610 /* Try to determine PAL/NTSC by peeking in the input files */
3611 if(nb_input_files) {
3613 for(j = 0; j < nb_input_files; j++) {
3614 for(i = 0; i < input_files[j]->nb_streams; i++) {
3615 AVCodecContext *c = &input_files[j]->streams[i]->codec;
3616 if(c->codec_type != CODEC_TYPE_VIDEO)
3618 fr = c->frame_rate * 1000 / c->frame_rate_base;
3622 } else if((fr == 29970) || (fr == 23976)) {
3632 if(verbose && norm >= 0)
3633 printf("Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3637 fprintf(stderr, "Could not determine norm (PAL/NTSC) for target.\n");
3638 fprintf(stderr, "Please prefix target with \"pal-\" or \"ntsc-\",\n");
3639 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3643 if(!strcmp(arg, "vcd")) {
3645 opt_video_codec("mpeg1video");
3646 opt_audio_codec("mp2");
3649 opt_frame_size(norm ? "352x240" : "352x288");
3651 video_bit_rate = 1150000;
3652 video_rc_max_rate = 1150000;
3653 video_rc_min_rate = 1150000;
3654 video_rc_buffer_size = 40*1024*8;
3656 audio_bit_rate = 224000;
3657 audio_sample_rate = 44100;
3659 } else if(!strcmp(arg, "svcd")) {
3661 opt_video_codec("mpeg2video");
3662 opt_audio_codec("mp2");
3665 opt_frame_size(norm ? "480x480" : "480x576");
3666 opt_gop_size(norm ? "18" : "15");
3668 video_bit_rate = 2040000;
3669 video_rc_max_rate = 2516000;
3670 video_rc_min_rate = 0; //1145000;
3671 video_rc_buffer_size = 224*1024*8;
3672 use_scan_offset = 1;
3674 audio_bit_rate = 224000;
3675 audio_sample_rate = 44100;
3677 } else if(!strcmp(arg, "dvd")) {
3679 opt_video_codec("mpeg2video");
3680 opt_audio_codec("ac3");
3683 opt_frame_size(norm ? "720x480" : "720x576");
3684 opt_gop_size(norm ? "18" : "15");
3686 video_bit_rate = 6000000;
3687 video_rc_max_rate = 9000000;
3688 video_rc_min_rate = 0; //1500000;
3689 video_rc_buffer_size = 224*1024*8;
3691 audio_bit_rate = 448000;
3692 audio_sample_rate = 48000;
3695 fprintf(stderr, "Unknown target: %s\n", arg);
3700 static void show_version(void)
3702 printf("ffmpeg " FFMPEG_VERSION "\n"
3705 avcodec_build(), LIBAVFORMAT_BUILD);
3709 const OptionDef options[] = {
3711 { "L", 0, {(void*)show_license}, "show license" },
3712 { "h", 0, {(void*)show_help}, "show help" },
3713 { "version", 0, {(void*)show_version}, "show version" },
3714 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3715 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3716 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
3717 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3718 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3719 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream" },
3720 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3721 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3722 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3723 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3724 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3725 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3726 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3727 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3728 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3729 { "debug", HAS_ARG | OPT_EXPERT, {(void*)opt_debug}, "print specific debug info", "" },
3730 { "vismv", HAS_ARG | OPT_EXPERT, {(void*)opt_vismv}, "visualize motion vectors", "" },
3731 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3732 "add timings for benchmarking" },
3733 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3734 "dump each input packet" },
3735 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3736 "when dumping packets, also dump the payload" },
3737 { "bitexact", OPT_EXPERT, {(void*)opt_bitexact}, "only use bit exact algorithms (for codec testing)" },
3738 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3739 { "loop", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3740 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3741 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\" or \"dvd\")", "type" },
3742 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3743 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3744 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3745 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3748 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
3749 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3750 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3751 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3752 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3753 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3754 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3755 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3756 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3757 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3758 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3759 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3760 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3761 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3762 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
3763 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3764 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3765 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
3766 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
3767 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
3768 { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
3769 { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
3770 { "mbqmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmin}, "min macroblock quantiser scale (VBR)", "q" },
3771 { "mbqmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmax}, "max macroblock quantiser scale (VBR)", "q" },
3772 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
3773 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
3774 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
3775 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
3776 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
3777 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
3778 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
3779 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
3780 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
3781 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
3782 // { "b_strategy", HAS_ARG | OPT_EXPERT, {(void*)opt_b_strategy}, "dynamic b frame selection strategy", "strategy" },
3783 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3784 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3785 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
3786 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
3787 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
3788 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffer size (in kByte)", "size" },
3789 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3790 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
3792 { "dct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dct_algo}, "set dct algo", "algo" },
3793 { "idct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_idct_algo}, "set idct algo", "algo" },
3794 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
3795 { "mb_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_threshold}, "macroblock threshold", "" },
3796 { "er", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_resilience}, "set error resilience", "n" },
3797 { "ec", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_concealment}, "set error concealment", "bit_mask" },
3798 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
3799 { "hq", OPT_BOOL, {(void*)&mb_decision}, "activate high quality settings" },
3800 { "mbd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_decision}, "macroblock decision", "mode" },
3801 { "mbcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_cmp}, "macroblock compare function", "cmp function" },
3802 { "ildctcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ildct_cmp}, "ildct compare function", "cmp function" },
3803 { "subcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sub_cmp}, "subpel compare function", "cmp function" },
3804 { "cmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_cmp}, "fullpel compare function", "cmp function" },
3805 { "precmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_cmp}, "pre motion estimation compare function", "cmp function" },
3806 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
3807 { "lumi_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lumi_mask}, "luminance masking", "" },
3808 { "dark_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dark_mask}, "darkness masking", "" },
3809 { "scplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_scplx_mask}, "spatial complexity masking", "" },
3810 { "tcplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_tcplx_mask}, "temporal complexity masking", "" },
3811 { "p_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_p_mask}, "inter masking", "" },
3812 { "4mv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_4mv}, "use four motion vector by macroblock (MPEG4)" },
3813 { "obmc", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_obmc}, "use overlapped block motion compensation (h263+)" },
3814 { "lf", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_loop}, "use loop filter (h263+)" },
3815 { "part", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_part}, "use data partitioning (MPEG4)" },
3816 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
3817 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
3818 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
3819 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3820 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3821 "use same video quality as source (implies VBR)" },
3822 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3823 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3824 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3825 "deinterlace pictures" },
3826 { "ildct", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_dct},
3827 "force interlaced dct support in encoder (MPEG2/MPEG4)" },
3828 { "ilme", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_me},
3829 "force interlaced me support in encoder (MPEG2/MPEG4)" },
3830 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3831 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
3832 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3833 { "aic", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aic}, "enable Advanced intra coding (h263+)" },
3834 { "aiv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aiv}, "enable Alternative inter vlc (h263+)" },
3835 { "umv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_umv}, "enable Unlimited Motion Vector (h263+)" },
3836 { "ssm", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_ss}, "enable Slice Structured mode (h263+)" },
3837 { "alt", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_alt_scan}, "enable alternate scantable (MPEG2/MPEG4)" },
3838 { "qprd", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qprd}, "" },
3839 { "cbp", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_cbprd}, "" },
3840 { "trell", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_trell}, "enable trellis quantization" },
3841 { "cgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&closed_gop}, "closed gop" },
3842 { "scan_offset", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_scan_offset}, "enable SVCD Scan Offset placeholder" },
3843 { "qpel", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qpel}, "enable 1/4-pel" },
3844 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3845 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3846 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3847 { "nr", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_noise_reduction}, "noise reduction", "" },
3848 { "qns", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qns}, "quantization noise shaping", "" },
3849 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
3850 { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
3851 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3852 { "coder", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&coder}, "coder type", "" },
3853 { "context", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&context}, "context model", "" },
3854 { "pred", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&predictor}, "prediction method", "" },
3855 { "vprofile", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_profile}, "profile", "" },
3856 { "vlevel", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_level}, "level", "" },
3857 { "nssew", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&nsse_weight}, "weight", "" },
3860 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
3861 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3862 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3863 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3864 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3867 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
3868 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3869 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3870 { "dv1394", OPT_EXPERT | OPT_GRAB, {(void*)opt_dv1394}, "set DV1394 grab", "" },
3871 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
3875 static void show_banner(void)
3877 printf("ffmpeg version " FFMPEG_VERSION ", build %d, Copyright (c) 2000-2004 Fabrice Bellard\n",
3879 printf(" built on " __DATE__ " " __TIME__);
3881 printf(", gcc: %s\n", __VERSION__);
3883 printf(", using a non-gcc compiler\n");
3887 static void show_license(void)
3892 "This program is free software; you can redistribute it and/or modify\n"
3893 "it under the terms of the GNU General Public License as published by\n"
3894 "the Free Software Foundation; either version 2 of the License, or\n"
3895 "(at your option) any later version.\n"
3897 "This program is distributed in the hope that it will be useful,\n"
3898 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3899 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
3900 "GNU General Public License for more details.\n"
3902 "You should have received a copy of the GNU General Public License\n"
3903 "along with this program; if not, write to the Free Software\n"
3904 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3908 "This library is free software; you can redistribute it and/or\n"
3909 "modify it under the terms of the GNU Lesser General Public\n"
3910 "License as published by the Free Software Foundation; either\n"
3911 "version 2 of the License, or (at your option) any later version.\n"
3913 "This library is distributed in the hope that it will be useful,\n"
3914 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3915 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
3916 "Lesser General Public License for more details.\n"
3918 "You should have received a copy of the GNU Lesser General Public\n"
3919 "License along with this library; if not, write to the Free Software\n"
3920 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3926 static void show_help(void)
3929 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3930 "Hyper fast Audio and Video encoder\n");
3932 show_help_options(options, "Main options:\n",
3933 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
3934 show_help_options(options, "\nVideo options:\n",
3935 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3937 show_help_options(options, "\nAdvanced Video options:\n",
3938 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3939 OPT_VIDEO | OPT_EXPERT);
3940 show_help_options(options, "\nAudio options:\n",
3941 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3943 show_help_options(options, "\nAdvanced Audio options:\n",
3944 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3945 OPT_AUDIO | OPT_EXPERT);
3946 show_help_options(options, "\nAudio/Video grab options:\n",
3949 show_help_options(options, "\nAdvanced options:\n",
3950 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3955 void parse_arg_file(const char *filename)
3957 opt_output_file(filename);
3960 int main(int argc, char **argv)
3973 parse_options(argc, argv, options);
3975 /* file converter / grab */
3976 if (nb_output_files <= 0) {
3977 fprintf(stderr, "Must supply at least one output file\n");
3981 if (nb_input_files == 0) {
3987 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3988 stream_maps, nb_stream_maps);
3989 ti = getutime() - ti;
3991 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3995 for(i=0;i<nb_output_files;i++) {
3996 /* maybe av_close_output_file ??? */
3997 AVFormatContext *s = output_files[i];
3999 if (!(s->oformat->flags & AVFMT_NOFILE))
4001 for(j=0;j<s->nb_streams;j++)
4002 av_free(s->streams[j]);
4005 for(i=0;i<nb_input_files;i++)
4006 av_close_input_file(input_files[i]);
4011 av_free(intra_matrix);
4013 av_free(inter_matrix);
4015 #ifdef POWERPC_PERFORMANCE_REPORT
4016 extern void powerpc_display_perf_report(void);
4017 powerpc_display_perf_report();
4018 #endif /* POWERPC_PERFORMANCE_REPORT */
4020 #ifndef CONFIG_WIN32
4021 if (received_sigterm) {
4023 "Received signal %d: terminating.\n",
4024 (int) received_sigterm);
4028 exit(0); /* not all OS-es handle main() return value */