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"
27 #include <sys/ioctl.h>
30 #include <sys/resource.h>
34 #include <sys/types.h>
35 #include <sys/select.h>
38 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
43 #if !defined(INFINITY) && defined(HUGE_VAL)
44 #define INFINITY HUGE_VAL
47 /* select an input stream for an output stream */
48 typedef struct AVStreamMap {
53 extern const OptionDef options[];
55 static void show_help(void);
56 static void show_license(void);
60 static AVFormatContext *input_files[MAX_FILES];
61 static int nb_input_files = 0;
63 static AVFormatContext *output_files[MAX_FILES];
64 static int nb_output_files = 0;
66 static AVStreamMap stream_maps[MAX_FILES];
67 static int nb_stream_maps;
69 static AVInputFormat *file_iformat;
70 static AVOutputFormat *file_oformat;
71 static AVImageFormat *image_format;
72 static int frame_width = 160;
73 static int frame_height = 128;
74 static float frame_aspect_ratio = 0;
75 static enum PixelFormat frame_pix_fmt = PIX_FMT_YUV420P;
76 static int frame_padtop = 0;
77 static int frame_padbottom = 0;
78 static int frame_padleft = 0;
79 static int frame_padright = 0;
80 static int padcolor[3] = {16,128,128}; /* default to black */
81 static int frame_topBand = 0;
82 static int frame_bottomBand = 0;
83 static int frame_leftBand = 0;
84 static int frame_rightBand = 0;
85 static int frame_rate = 25;
86 static int frame_rate_base = 1;
87 static int video_bit_rate = 200*1000;
88 static int video_bit_rate_tolerance = 4000*1000;
89 static float video_qscale = 0;
90 static int video_qmin = 2;
91 static int video_qmax = 31;
92 static int video_lmin = 2*FF_QP2LAMBDA;
93 static int video_lmax = 31*FF_QP2LAMBDA;
94 static int video_mb_qmin = 2;
95 static int video_mb_qmax = 31;
96 static int video_qdiff = 3;
97 static float video_qblur = 0.5;
98 static float video_qcomp = 0.5;
99 static uint16_t *intra_matrix = NULL;
100 static uint16_t *inter_matrix = NULL;
101 #if 0 //experimental, (can be removed)
102 static float video_rc_qsquish=1.0;
103 static float video_rc_qmod_amp=0;
104 static int video_rc_qmod_freq=0;
106 static char *video_rc_override_string=NULL;
107 static char *video_rc_eq="tex^qComp";
108 static int video_rc_buffer_size=0;
109 static float video_rc_buffer_aggressivity=1.0;
110 static int video_rc_max_rate=0;
111 static int video_rc_min_rate=0;
112 static float video_rc_initial_cplx=0;
113 static float video_b_qfactor = 1.25;
114 static float video_b_qoffset = 1.25;
115 static float video_i_qfactor = -0.8;
116 static float video_i_qoffset = 0.0;
117 static int video_intra_quant_bias= FF_DEFAULT_QUANT_BIAS;
118 static int video_inter_quant_bias= FF_DEFAULT_QUANT_BIAS;
119 static int me_method = ME_EPZS;
120 static int video_disable = 0;
121 static int video_codec_id = CODEC_ID_NONE;
122 static int same_quality = 0;
123 static int b_frames = 0;
124 static int mb_decision = FF_MB_DECISION_SIMPLE;
125 static int ildct_cmp = FF_CMP_VSAD;
126 static int mb_cmp = FF_CMP_SAD;
127 static int sub_cmp = FF_CMP_SAD;
128 static int cmp = FF_CMP_SAD;
129 static int pre_cmp = FF_CMP_SAD;
130 static int pre_me = 0;
131 static float lumi_mask = 0;
132 static float dark_mask = 0;
133 static float scplx_mask = 0;
134 static float tcplx_mask = 0;
135 static float p_mask = 0;
136 static int use_4mv = 0;
137 static int use_obmc = 0;
138 static int use_loop = 0;
139 static int use_aic = 0;
140 static int use_aiv = 0;
141 static int use_umv = 0;
142 static int use_ss = 0;
143 static int use_alt_scan = 0;
144 static int use_trell = 0;
145 static int use_scan_offset = 0;
146 static int use_qpel = 0;
148 static int closed_gop = 0;
149 static int do_deinterlace = 0;
150 static int do_interlace_dct = 0;
151 static int do_interlace_me = 0;
152 static int workaround_bugs = FF_BUG_AUTODETECT;
153 static int error_resilience = 2;
154 static int error_concealment = 3;
155 static int dct_algo = 0;
156 static int idct_algo = 0;
157 static int use_part = 0;
158 static int packet_size = 0;
159 static int error_rate = 0;
160 static int strict = 0;
161 static int top_field_first = -1;
162 static int noise_reduction = 0;
163 static int sc_threshold = 0;
164 static int debug = 0;
165 static int debug_mv = 0;
166 static int me_threshold = 0;
167 static int mb_threshold = 0;
168 static int intra_dc_precision = 0;
169 static int coder = 0;
170 static int context = 0;
171 static int predictor = 0;
172 extern int loop_input; /* currently a hack */
174 static int gop_size = 12;
175 static int intra_only = 0;
176 static int audio_sample_rate = 44100;
177 static int audio_bit_rate = 64000;
178 static int audio_disable = 0;
179 static int audio_channels = 1;
180 static int audio_codec_id = CODEC_ID_NONE;
182 static int64_t recording_time = 0;
183 static int64_t start_time = 0;
184 static int64_t rec_timestamp = 0;
185 static int file_overwrite = 0;
186 static char *str_title = NULL;
187 static char *str_author = NULL;
188 static char *str_copyright = NULL;
189 static char *str_comment = NULL;
190 static int do_benchmark = 0;
191 static int do_hex_dump = 0;
192 static int do_pkt_dump = 0;
193 static int do_psnr = 0;
194 static int do_vstats = 0;
195 static int do_pass = 0;
196 static int bitexact = 0;
197 static char *pass_logfilename = NULL;
198 static int audio_stream_copy = 0;
199 static int video_stream_copy = 0;
200 static int sync_method= 1;
202 static int rate_emu = 0;
204 static char *video_grab_format = "video4linux";
205 static char *video_device = NULL;
206 static int video_channel = 0;
207 static char *video_standard = "ntsc";
209 static char *audio_grab_format = "audio_device";
210 static char *audio_device = NULL;
212 static int using_stdin = 0;
213 static int using_vhook = 0;
214 static int verbose = 1;
215 static int thread_count= 1;
216 static int q_pressed = 0;
217 static int me_range = 0;
218 static int64_t video_size = 0;
219 static int64_t audio_size = 0;
220 static int64_t extra_size = 0;
222 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
224 typedef struct AVOutputStream {
225 int file_index; /* file index */
226 int index; /* stream index in the output file */
227 int source_index; /* AVInputStream index */
228 AVStream *st; /* stream in the output file */
229 int encoding_needed; /* true if encoding needed for this stream */
231 /* input pts and corresponding output pts
234 double sync_ipts_offset;
237 int video_resample; /* video_resample and video_crop are mutually exclusive */
238 AVFrame pict_tmp; /* temporary image for resampling */
239 ImgReSampleContext *img_resample_ctx; /* for image resampling */
241 int video_crop; /* video_resample and video_crop are mutually exclusive */
242 int topBand; /* cropping area sizes */
245 int video_pad; /* video_resample and video_pad are mutually exclusive */
246 int padtop; /* padding area sizes */
253 ReSampleContext *resample; /* for audio resampling */
254 FifoBuffer fifo; /* for compression: one audio fifo per codec */
258 typedef struct AVInputStream {
262 int discard; /* true if stream data should be discarded */
263 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
264 int64_t sample_index; /* current sample */
266 int64_t start; /* time when read started */
267 unsigned long frame; /* current frame */
268 int64_t next_pts; /* synthetic pts for cases where pkt.pts
270 int64_t pts; /* current pts */
273 typedef struct AVInputFile {
274 int eof_reached; /* true if eof reached */
275 int ist_index; /* index of first stream in ist_table */
276 int buffer_size; /* current total buffer size */
277 int buffer_size_max; /* buffer size at which we consider we can stop
279 int nb_streams; /* nb streams we are aware of */
284 /* init terminal so that we can grab keys */
285 static struct termios oldtty;
287 static void term_exit(void)
289 tcsetattr (0, TCSANOW, &oldtty);
292 static volatile sig_atomic_t received_sigterm = 0;
295 sigterm_handler(int sig)
297 received_sigterm = sig;
301 static void term_init(void)
308 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
309 |INLCR|IGNCR|ICRNL|IXON);
310 tty.c_oflag |= OPOST;
311 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
312 tty.c_cflag &= ~(CSIZE|PARENB);
317 tcsetattr (0, TCSANOW, &tty);
319 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
320 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
321 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
323 register a function to be called at normal program termination
326 #ifdef CONFIG_BEOS_NETSERVER
327 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
331 /* read a key without blocking */
332 static int read_key(void)
336 #ifndef CONFIG_BEOS_NETSERVER
344 n = select(1, &rfds, NULL, NULL, &tv);
356 static int decode_interrupt_cb(void)
358 return q_pressed || (q_pressed = read_key() == 'q');
363 static volatile int received_sigterm = 0;
365 /* no interactive support */
366 static void term_exit(void)
370 static void term_init(void)
374 static int read_key(void)
381 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
386 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
389 /* copy stream format */
390 s->nb_streams = ic->nb_streams;
391 for(i=0;i<ic->nb_streams;i++) {
394 st = av_mallocz(sizeof(AVStream));
395 memcpy(st, ic->streams[i], sizeof(AVStream));
399 av_close_input_file(ic);
403 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
405 static void do_audio_out(AVFormatContext *s,
408 unsigned char *buf, int size)
411 static uint8_t *audio_buf = NULL;
412 static uint8_t *audio_out = NULL;
413 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
415 int size_out, frame_bytes, ret;
418 /* SC: dynamic allocation of buffers */
420 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
422 audio_out = av_malloc(audio_out_size);
423 if (!audio_buf || !audio_out)
424 return; /* Should signal an error ! */
427 enc = &ost->st->codec;
429 if (ost->audio_resample) {
431 size_out = audio_resample(ost->resample,
432 (short *)buftmp, (short *)buf,
433 size / (ist->st->codec.channels * 2));
434 size_out = size_out * enc->channels * 2;
440 /* now encode as many frames as possible */
441 if (enc->frame_size > 1) {
442 /* output resampled raw samples */
443 fifo_write(&ost->fifo, buftmp, size_out,
446 frame_bytes = enc->frame_size * 2 * enc->channels;
448 while (fifo_read(&ost->fifo, audio_buf, frame_bytes,
449 &ost->fifo.rptr) == 0) {
450 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
453 av_write_frame(s, ost->index, audio_out, ret);
456 /* output a pcm frame */
457 /* XXX: change encoding codec API to avoid this ? */
458 switch(enc->codec->id) {
459 case CODEC_ID_PCM_S16LE:
460 case CODEC_ID_PCM_S16BE:
461 case CODEC_ID_PCM_U16LE:
462 case CODEC_ID_PCM_U16BE:
465 size_out = size_out >> 1;
468 ret = avcodec_encode_audio(enc, audio_out, size_out,
471 av_write_frame(s, ost->index, audio_out, ret);
475 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
479 AVPicture picture_tmp;
482 dec = &ist->st->codec;
484 /* deinterlace : must be done before any resize */
485 if (do_deinterlace || using_vhook) {
488 /* create temporary picture */
489 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
490 buf = av_malloc(size);
494 picture2 = &picture_tmp;
495 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
498 if(avpicture_deinterlace(picture2, picture,
499 dec->pix_fmt, dec->width, dec->height) < 0) {
500 /* if error, do not deinterlace */
506 if (img_convert(picture2, dec->pix_fmt, picture,
507 dec->pix_fmt, dec->width, dec->height) < 0) {
508 /* if error, do not copy */
518 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
520 if (picture != picture2)
521 *picture = *picture2;
525 /* we begin to correct av delay at this threshold */
526 #define AV_DELAY_MAX 0.100
529 /* Expects img to be yuv420 */
530 static void fill_pad_region(AVPicture* img, int height, int width,
531 int padtop, int padbottom, int padleft, int padright, int *color) {
536 for (i = 0; i < 3; i++) {
537 shift = (i == 0) ? 0 : 1;
539 if (padtop || padleft) {
540 memset(img->data[i], color[i], (((img->linesize[i] * padtop) +
544 if (padleft || padright) {
545 optr = img->data[i] + (img->linesize[i] * (padtop >> shift)) +
546 (img->linesize[i] - (padright >> shift));
548 for (y = 0; y < ((height - (padtop + padbottom)) >> shift); y++) {
549 memset(optr, color[i], (padleft + padright) >> shift);
550 optr += img->linesize[i];
555 optr = img->data[i] + (img->linesize[i] * ((height - padbottom) >> shift));
556 memset(optr, color[i], ((img->linesize[i] * padbottom) >> shift));
562 static void do_video_out(AVFormatContext *s,
566 int *frame_size, AVOutputStream *audio_sync)
568 int nb_frames, i, ret;
569 AVFrame *final_picture, *formatted_picture;
570 AVFrame picture_format_temp, picture_crop_temp;
571 static uint8_t *video_buffer= NULL;
572 uint8_t *buf = NULL, *buf1 = NULL;
573 AVCodecContext *enc, *dec;
574 enum PixelFormat target_pixfmt;
576 #define VIDEO_BUFFER_SIZE (1024*1024)
578 avcodec_get_frame_defaults(&picture_format_temp);
579 avcodec_get_frame_defaults(&picture_crop_temp);
581 enc = &ost->st->codec;
582 dec = &ist->st->codec;
584 /* by default, we output a single frame */
589 /* NOTE: the A/V sync is always done by considering the audio is
590 the master clock. It is suffisant for transcoding or playing,
591 but not for the general case */
594 /* compute the A-V delay and duplicate/remove frames if needed */
595 double adelta, vdelta, av_delay;
597 adelta = audio_sync->sync_ipts - ((double)audio_sync->sync_opts *
598 s->pts_num / s->pts_den);
600 vdelta = ost->sync_ipts - ((double)ost->sync_opts *
601 s->pts_num / s->pts_den);
603 av_delay = adelta - vdelta;
604 if (av_delay < -AV_DELAY_MAX)
606 else if (av_delay > AV_DELAY_MAX)
608 // printf("adelta=%f vdelta=%f delay=%f nb=%d (A)\n", adelta, vdelta, av_delay, nb_frames);
612 vdelta = (double)(ost->st->pts.val) * s->pts_num / s->pts_den - (ost->sync_ipts - ost->sync_ipts_offset);
613 if (vdelta < 100 && vdelta > -100 && ost->sync_ipts_offset) {
614 if (vdelta < -AV_DELAY_MAX)
616 else if (vdelta > AV_DELAY_MAX)
619 ost->sync_ipts_offset -= vdelta;
620 if (!ost->sync_ipts_offset)
621 ost->sync_ipts_offset = 0.000001; /* one microsecond */
623 // printf("delay=%f nb=%d (V)\n",vdelta, nb_frames);
627 #if defined(AVSYNC_DEBUG)
629 static char *action[] = { "drop frame", "copy frame", "dup frame" };
630 if (audio_sync && verbose >=0) {
631 fprintf(stderr, "Input APTS %12.6f, output APTS %12.6f, ",
632 (double) audio_sync->sync_ipts,
633 (double) audio_sync->st->pts.val * s->pts_num / s->pts_den);
634 fprintf(stderr, "Input VPTS %12.6f, output VPTS %12.6f: %s\n",
635 (double) ost->sync_ipts,
636 (double) ost->st->pts.val * s->pts_num / s->pts_den,
646 video_buffer = av_malloc(VIDEO_BUFFER_SIZE);
650 /* convert pixel format if needed */
651 target_pixfmt = ost->video_resample || ost->video_pad
652 ? PIX_FMT_YUV420P : enc->pix_fmt;
653 if (dec->pix_fmt != target_pixfmt) {
656 /* create temporary picture */
657 size = avpicture_get_size(target_pixfmt, dec->width, dec->height);
658 buf = av_malloc(size);
661 formatted_picture = &picture_format_temp;
662 avpicture_fill((AVPicture*)formatted_picture, buf, target_pixfmt, dec->width, dec->height);
664 if (img_convert((AVPicture*)formatted_picture, target_pixfmt,
665 (AVPicture *)in_picture, dec->pix_fmt,
666 dec->width, dec->height) < 0) {
669 fprintf(stderr, "pixel format conversion not handled\n");
674 formatted_picture = in_picture;
677 /* XXX: resampling could be done before raw format conversion in
678 some cases to go faster */
679 /* XXX: only works for YUV420P */
680 if (ost->video_resample) {
681 final_picture = &ost->pict_tmp;
682 img_resample(ost->img_resample_ctx, (AVPicture*)final_picture, (AVPicture*)formatted_picture);
684 if (ost->padtop || ost->padbottom || ost->padleft || ost->padright) {
685 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
686 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
690 if (enc->pix_fmt != PIX_FMT_YUV420P) {
694 /* create temporary picture */
695 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
696 buf = av_malloc(size);
699 final_picture = &picture_format_temp;
700 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
702 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
703 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
704 enc->width, enc->height) < 0) {
707 fprintf(stderr, "pixel format conversion not handled\n");
712 } else if (ost->video_crop) {
713 picture_crop_temp.data[0] = formatted_picture->data[0] +
714 (ost->topBand * formatted_picture->linesize[0]) + ost->leftBand;
716 picture_crop_temp.data[1] = formatted_picture->data[1] +
717 ((ost->topBand >> 1) * formatted_picture->linesize[1]) +
718 (ost->leftBand >> 1);
720 picture_crop_temp.data[2] = formatted_picture->data[2] +
721 ((ost->topBand >> 1) * formatted_picture->linesize[2]) +
722 (ost->leftBand >> 1);
724 picture_crop_temp.linesize[0] = formatted_picture->linesize[0];
725 picture_crop_temp.linesize[1] = formatted_picture->linesize[1];
726 picture_crop_temp.linesize[2] = formatted_picture->linesize[2];
727 final_picture = &picture_crop_temp;
728 } else if (ost->video_pad) {
729 final_picture = &ost->pict_tmp;
731 for (i = 0; i < 3; i++) {
732 uint8_t *optr, *iptr;
733 int shift = (i == 0) ? 0 : 1;
736 /* set offset to start writing image into */
737 optr = final_picture->data[i] + (((final_picture->linesize[i] *
738 ost->padtop) + ost->padleft) >> shift);
739 iptr = formatted_picture->data[i];
741 yheight = (enc->height - ost->padtop - ost->padbottom) >> shift;
742 for (y = 0; y < yheight; y++) {
743 /* copy unpadded image row into padded image row */
744 memcpy(optr, iptr, formatted_picture->linesize[i]);
745 optr += final_picture->linesize[i];
746 iptr += formatted_picture->linesize[i];
750 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
751 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
754 if (enc->pix_fmt != PIX_FMT_YUV420P) {
758 /* create temporary picture */
759 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
760 buf = av_malloc(size);
763 final_picture = &picture_format_temp;
764 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
766 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
767 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
768 enc->width, enc->height) < 0) {
771 fprintf(stderr, "pixel format conversion not handled\n");
777 final_picture = formatted_picture;
779 /* duplicates frame if needed */
780 /* XXX: pb because no interleaving */
781 for(i=0;i<nb_frames;i++) {
782 if (s->oformat->flags & AVFMT_RAWPICTURE) {
783 /* raw pictures are written as AVPicture structure to
784 avoid any copies. We support temorarily the older
786 AVFrame* old_frame = enc->coded_frame;
787 enc->coded_frame = dec->coded_frame;
788 av_write_frame(s, ost->index,
789 (uint8_t *)final_picture, sizeof(AVPicture));
790 enc->coded_frame = old_frame;
794 big_picture= *final_picture;
795 /* better than nothing: use input picture interlaced
797 big_picture.interlaced_frame = in_picture->interlaced_frame;
798 if(do_interlace_me || do_interlace_dct){
799 if(top_field_first == -1)
800 big_picture.top_field_first = in_picture->top_field_first;
802 big_picture.top_field_first = 1;
805 /* handles sameq here. This is not correct because it may
806 not be a global option */
808 big_picture.quality = ist->st->quality;
810 big_picture.quality = ost->st->quality;
812 big_picture.pict_type = 0;
813 big_picture.pts = AV_NOPTS_VALUE; //FIXME
814 ret = avcodec_encode_video(enc,
815 video_buffer, VIDEO_BUFFER_SIZE,
817 //enc->frame_number = enc->real_pict_num;
818 av_write_frame(s, ost->index, video_buffer, ret);
820 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
821 // enc->frame_number-1, enc->real_pict_num, ret,
823 /* if two pass, output log */
824 if (ost->logfile && enc->stats_out) {
825 fprintf(ost->logfile, "%s", enc->stats_out);
835 static double psnr(double d){
836 if(d==0) return INFINITY;
837 return -10.0*log(d)/log(10.0);
840 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
843 static FILE *fvstats=NULL;
850 double ti1, bitrate, avg_bitrate;
854 today = localtime(&today2);
855 sprintf(filename, "vstats_%02d%02d%02d.log", today->tm_hour,
858 fvstats = fopen(filename,"w");
866 enc = &ost->st->codec;
867 if (enc->codec_type == CODEC_TYPE_VIDEO) {
868 frame_number = ost->frame_number;
869 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
870 if (enc->flags&CODEC_FLAG_PSNR)
871 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
873 fprintf(fvstats,"f_size= %6d ", frame_size);
874 /* compute pts value */
875 ti1 = (double)ost->st->pts.val * os->pts_num / os->pts_den;
879 bitrate = (double)(frame_size * 8) * enc->frame_rate / enc->frame_rate_base / 1000.0;
880 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
881 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
882 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
883 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
887 static void print_report(AVFormatContext **output_files,
888 AVOutputStream **ost_table, int nb_ostreams,
893 AVFormatContext *oc, *os;
896 int frame_number, vid, i;
897 double bitrate, ti1, pts;
898 static int64_t last_time = -1;
900 if (!is_last_report) {
902 /* display the report every 0.5 seconds */
903 cur_time = av_gettime();
904 if (last_time == -1) {
905 last_time = cur_time;
908 if ((cur_time - last_time) < 500000)
910 last_time = cur_time;
914 oc = output_files[0];
916 total_size = url_ftell(&oc->pb);
921 for(i=0;i<nb_ostreams;i++) {
923 os = output_files[ost->file_index];
924 enc = &ost->st->codec;
925 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
926 sprintf(buf + strlen(buf), "q=%2.1f ",
927 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
929 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
930 frame_number = ost->frame_number;
931 sprintf(buf + strlen(buf), "frame=%5d q=%2.1f ",
932 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : 0);
934 sprintf(buf + strlen(buf), "L");
935 if (enc->flags&CODEC_FLAG_PSNR){
937 double error, error_sum=0;
938 double scale, scale_sum=0;
939 char type[3]= {'Y','U','V'};
940 sprintf(buf + strlen(buf), "PSNR=");
943 error= enc->error[j];
944 scale= enc->width*enc->height*255.0*255.0*frame_number;
946 error= enc->coded_frame->error[j];
947 scale= enc->width*enc->height*255.0*255.0;
952 sprintf(buf + strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
954 sprintf(buf + strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
958 /* compute min output value */
959 pts = (double)ost->st->pts.val * os->pts_num / os->pts_den;
960 if ((pts < ti1) && (pts > 0))
966 if (verbose || is_last_report) {
967 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
969 sprintf(buf + strlen(buf),
970 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
971 (double)total_size / 1024, ti1, bitrate);
974 fprintf(stderr, "%s \r", buf);
979 if (is_last_report && verbose >= 0){
980 int64_t raw= audio_size + video_size + extra_size;
981 fprintf(stderr, "\n");
982 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
986 100.0*(total_size - raw)/raw
991 /* pkt = NULL means EOF (needed to flush decoder buffers) */
992 static int output_packet(AVInputStream *ist, int ist_index,
993 AVOutputStream **ost_table, int nb_ostreams,
1001 int data_size, got_picture;
1003 short samples[AVCODEC_MAX_AUDIO_FRAME_SIZE / 2];
1004 void *buffer_to_free;
1006 if (pkt && pkt->pts != AV_NOPTS_VALUE) {
1007 ist->next_pts = ist->pts = pkt->pts;
1009 ist->pts = ist->next_pts;
1023 /* decode the packet if needed */
1024 data_buf = NULL; /* fail safe */
1026 if (ist->decoding_needed) {
1027 switch(ist->st->codec.codec_type) {
1028 case CODEC_TYPE_AUDIO:
1029 /* XXX: could avoid copy if PCM 16 bits with same
1030 endianness as CPU */
1031 ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size,
1037 /* Some bug in mpeg audio decoder gives */
1038 /* data_size < 0, it seems they are overflows */
1039 if (data_size <= 0) {
1040 /* no audio frame */
1043 data_buf = (uint8_t *)samples;
1044 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1045 (ist->st->codec.sample_rate * ist->st->codec.channels);
1047 case CODEC_TYPE_VIDEO:
1048 data_size = (ist->st->codec.width * ist->st->codec.height * 3) / 2;
1049 /* XXX: allocate picture correctly */
1050 avcodec_get_frame_defaults(&picture);
1052 ret = avcodec_decode_video(&ist->st->codec,
1053 &picture, &got_picture, ptr, len);
1054 ist->st->quality= picture.quality;
1058 /* no picture yet */
1059 goto discard_packet;
1061 if (ist->st->codec.frame_rate_base != 0) {
1062 ist->next_pts += ((int64_t)AV_TIME_BASE *
1063 ist->st->codec.frame_rate_base) /
1064 ist->st->codec.frame_rate;
1078 buffer_to_free = NULL;
1079 if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1080 pre_process_video_frame(ist, (AVPicture *)&picture,
1084 /* frame rate emulation */
1085 if (ist->st->codec.rate_emu) {
1086 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec.frame_rate_base, 1000000, ist->st->codec.frame_rate);
1087 int64_t now = av_gettime() - ist->start;
1095 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1096 is the one of the next displayed one */
1097 /* XXX: add mpeg4 too ? */
1098 if (ist->st->codec.codec_id == CODEC_ID_MPEG1VIDEO) {
1099 if (ist->st->codec.pict_type != B_TYPE) {
1101 tmp = ist->last_ip_pts;
1102 ist->last_ip_pts = ist->frac_pts.val;
1103 ist->frac_pts.val = tmp;
1107 /* if output time reached then transcode raw format,
1108 encode packets and output them */
1109 if (start_time == 0 || ist->pts >= start_time)
1110 for(i=0;i<nb_ostreams;i++) {
1114 if (ost->source_index == ist_index) {
1115 os = output_files[ost->file_index];
1118 printf("%d: got pts=%0.3f %0.3f\n", i,
1119 (double)pkt->pts / AV_TIME_BASE,
1120 ((double)ist->pts / AV_TIME_BASE) -
1121 ((double)ost->st->pts.val * os->pts_num / os->pts_den));
1123 /* set the input output pts pairs */
1124 ost->sync_ipts = (double)ist->pts / AV_TIME_BASE;
1125 /* XXX: take into account the various fifos,
1126 in particular for audio */
1127 ost->sync_opts = ost->st->pts.val;
1128 //printf("ipts=%lld sync_ipts=%f sync_opts=%lld pts.val=%lld pkt->pts=%lld\n", ist->pts, ost->sync_ipts, ost->sync_opts, ost->st->pts.val, pkt->pts);
1130 if (ost->encoding_needed) {
1131 switch(ost->st->codec.codec_type) {
1132 case CODEC_TYPE_AUDIO:
1133 do_audio_out(os, ost, ist, data_buf, data_size);
1135 case CODEC_TYPE_VIDEO:
1136 /* find an audio stream for synchro */
1139 AVOutputStream *audio_sync, *ost1;
1141 for(i=0;i<nb_ostreams;i++) {
1142 ost1 = ost_table[i];
1143 if (ost1->file_index == ost->file_index &&
1144 ost1->st->codec.codec_type == CODEC_TYPE_AUDIO) {
1150 do_video_out(os, ost, ist, &picture, &frame_size, audio_sync);
1151 video_size += frame_size;
1152 if (do_vstats && frame_size)
1153 do_video_stats(os, ost, frame_size);
1162 /* no reencoding needed : output the packet directly */
1163 /* force the input stream PTS */
1165 avcodec_get_frame_defaults(&avframe);
1166 ost->st->codec.coded_frame= &avframe;
1167 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1168 ost->st->pts.val= av_rescale(ist->pts, os->pts_den, os->pts_num*AV_TIME_BASE);
1170 av_write_frame(os, ost->index, data_buf, data_size);
1171 ost->st->codec.frame_number++;
1172 ost->frame_number++;
1176 av_free(buffer_to_free);
1186 * The following code is the main loop of the file converter
1188 static int av_encode(AVFormatContext **output_files,
1189 int nb_output_files,
1190 AVFormatContext **input_files,
1192 AVStreamMap *stream_maps, int nb_stream_maps)
1194 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1195 AVFormatContext *is, *os;
1196 AVCodecContext *codec, *icodec;
1197 AVOutputStream *ost, **ost_table = NULL;
1198 AVInputStream *ist, **ist_table = NULL;
1199 AVInputFile *file_table;
1200 AVFormatContext *stream_no_data;
1203 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1207 /* input stream init */
1209 for(i=0;i<nb_input_files;i++) {
1210 is = input_files[i];
1211 file_table[i].ist_index = j;
1212 file_table[i].nb_streams = is->nb_streams;
1213 j += is->nb_streams;
1217 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1221 for(i=0;i<nb_istreams;i++) {
1222 ist = av_mallocz(sizeof(AVInputStream));
1228 for(i=0;i<nb_input_files;i++) {
1229 is = input_files[i];
1230 for(k=0;k<is->nb_streams;k++) {
1231 ist = ist_table[j++];
1232 ist->st = is->streams[k];
1233 ist->file_index = i;
1235 ist->discard = 1; /* the stream is discarded by default
1238 if (ist->st->codec.rate_emu) {
1239 ist->start = av_gettime();
1245 /* output stream init */
1247 for(i=0;i<nb_output_files;i++) {
1248 os = output_files[i];
1249 nb_ostreams += os->nb_streams;
1251 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1252 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1256 /* Sanity check the mapping args -- do the input files & streams exist? */
1257 for(i=0;i<nb_stream_maps;i++) {
1258 int fi = stream_maps[i].file_index;
1259 int si = stream_maps[i].stream_index;
1261 if (fi < 0 || fi > nb_input_files - 1 ||
1262 si < 0 || si > file_table[fi].nb_streams - 1) {
1263 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1268 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1271 for(i=0;i<nb_ostreams;i++) {
1272 ost = av_mallocz(sizeof(AVOutputStream));
1279 for(k=0;k<nb_output_files;k++) {
1280 os = output_files[k];
1281 for(i=0;i<os->nb_streams;i++) {
1283 ost = ost_table[n++];
1284 ost->file_index = k;
1286 ost->st = os->streams[i];
1287 if (nb_stream_maps > 0) {
1288 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1289 stream_maps[n-1].stream_index;
1291 /* Sanity check that the stream types match */
1292 if (ist_table[ost->source_index]->st->codec.codec_type != ost->st->codec.codec_type) {
1293 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1294 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1295 ost->file_index, ost->index);
1300 /* get corresponding input stream index : we select the first one with the right type */
1302 for(j=0;j<nb_istreams;j++) {
1305 ist->st->codec.codec_type == ost->st->codec.codec_type) {
1306 ost->source_index = j;
1312 /* try again and reuse existing stream */
1313 for(j=0;j<nb_istreams;j++) {
1315 if (ist->st->codec.codec_type == ost->st->codec.codec_type) {
1316 ost->source_index = j;
1321 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1322 ost->file_index, ost->index);
1327 ist = ist_table[ost->source_index];
1332 /* for each output stream, we compute the right encoding parameters */
1333 for(i=0;i<nb_ostreams;i++) {
1335 ist = ist_table[ost->source_index];
1337 codec = &ost->st->codec;
1338 icodec = &ist->st->codec;
1340 if (ost->st->stream_copy) {
1341 /* if stream_copy is selected, no need to decode or encode */
1342 codec->codec_id = icodec->codec_id;
1343 codec->codec_type = icodec->codec_type;
1344 codec->codec_tag = icodec->codec_tag;
1345 codec->bit_rate = icodec->bit_rate;
1346 switch(codec->codec_type) {
1347 case CODEC_TYPE_AUDIO:
1348 codec->sample_rate = icodec->sample_rate;
1349 codec->channels = icodec->channels;
1350 codec->frame_size = icodec->frame_size;
1352 case CODEC_TYPE_VIDEO:
1353 codec->frame_rate = icodec->frame_rate;
1354 codec->frame_rate_base = icodec->frame_rate_base;
1355 codec->width = icodec->width;
1356 codec->height = icodec->height;
1362 switch(codec->codec_type) {
1363 case CODEC_TYPE_AUDIO:
1364 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1367 if (codec->channels == icodec->channels &&
1368 codec->sample_rate == icodec->sample_rate) {
1369 ost->audio_resample = 0;
1371 if (codec->channels != icodec->channels &&
1372 icodec->codec_id == CODEC_ID_AC3) {
1373 /* Special case for 5:1 AC3 input */
1374 /* and mono or stereo output */
1375 /* Request specific number of channels */
1376 icodec->channels = codec->channels;
1377 if (codec->sample_rate == icodec->sample_rate)
1378 ost->audio_resample = 0;
1380 ost->audio_resample = 1;
1381 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1383 icodec->sample_rate);
1386 printf("Can't resample. Aborting.\n");
1390 /* Request specific number of channels */
1391 icodec->channels = codec->channels;
1393 ost->audio_resample = 1;
1394 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1396 icodec->sample_rate);
1399 printf("Can't resample. Aborting.\n");
1404 ist->decoding_needed = 1;
1405 ost->encoding_needed = 1;
1407 case CODEC_TYPE_VIDEO:
1408 if (codec->width == icodec->width &&
1409 codec->height == icodec->height &&
1410 frame_topBand == 0 &&
1411 frame_bottomBand == 0 &&
1412 frame_leftBand == 0 &&
1413 frame_rightBand == 0 &&
1414 frame_padtop == 0 &&
1415 frame_padbottom == 0 &&
1416 frame_padleft == 0 &&
1417 frame_padright == 0)
1419 ost->video_resample = 0;
1420 ost->video_crop = 0;
1422 } else if ((codec->width == icodec->width -
1423 (frame_leftBand + frame_rightBand)) &&
1424 (codec->height == icodec->height -
1425 (frame_topBand + frame_bottomBand)))
1427 ost->video_resample = 0;
1428 ost->video_crop = 1;
1429 ost->topBand = frame_topBand;
1430 ost->leftBand = frame_leftBand;
1431 } else if ((codec->width == icodec->width +
1432 (frame_padleft + frame_padright)) &&
1433 (codec->height == icodec->height +
1434 (frame_padtop + frame_padbottom))) {
1435 ost->video_resample = 0;
1436 ost->video_crop = 0;
1438 ost->padtop = frame_padtop;
1439 ost->padleft = frame_padleft;
1440 ost->padbottom = frame_padbottom;
1441 ost->padright = frame_padright;
1442 avcodec_get_frame_defaults(&ost->pict_tmp);
1443 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1444 codec->width, codec->height ) )
1447 ost->video_resample = 1;
1448 ost->video_crop = 0; // cropping is handled as part of resample
1449 avcodec_get_frame_defaults(&ost->pict_tmp);
1450 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1451 codec->width, codec->height ) )
1454 ost->img_resample_ctx = img_resample_full_init(
1455 ost->st->codec.width, ost->st->codec.height,
1456 ist->st->codec.width, ist->st->codec.height,
1457 frame_topBand, frame_bottomBand,
1458 frame_leftBand, frame_rightBand,
1459 frame_padtop, frame_padbottom,
1460 frame_padleft, frame_padright);
1462 ost->padtop = frame_padtop;
1463 ost->padleft = frame_padleft;
1464 ost->padbottom = frame_padbottom;
1465 ost->padright = frame_padright;
1468 ost->encoding_needed = 1;
1469 ist->decoding_needed = 1;
1475 if (ost->encoding_needed &&
1476 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1477 char logfilename[1024];
1482 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1484 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1485 if (codec->flags & CODEC_FLAG_PASS1) {
1486 f = fopen(logfilename, "w");
1488 perror(logfilename);
1493 /* read the log file */
1494 f = fopen(logfilename, "r");
1496 perror(logfilename);
1499 fseek(f, 0, SEEK_END);
1501 fseek(f, 0, SEEK_SET);
1502 logbuffer = av_malloc(size + 1);
1504 fprintf(stderr, "Could not allocate log buffer\n");
1507 size = fread(logbuffer, 1, size, f);
1509 logbuffer[size] = '\0';
1510 codec->stats_in = logbuffer;
1516 /* dump the file output parameters - cannot be done before in case
1518 for(i=0;i<nb_output_files;i++) {
1519 dump_format(output_files[i], i, output_files[i]->filename, 1);
1522 /* dump the stream mapping */
1524 fprintf(stderr, "Stream mapping:\n");
1525 for(i=0;i<nb_ostreams;i++) {
1527 fprintf(stderr, " Stream #%d.%d -> #%d.%d\n",
1528 ist_table[ost->source_index]->file_index,
1529 ist_table[ost->source_index]->index,
1535 /* open each encoder */
1536 for(i=0;i<nb_ostreams;i++) {
1538 if (ost->encoding_needed) {
1540 codec = avcodec_find_encoder(ost->st->codec.codec_id);
1542 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1543 ost->file_index, ost->index);
1546 if (avcodec_open(&ost->st->codec, codec) < 0) {
1547 fprintf(stderr, "Error while opening codec for stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1548 ost->file_index, ost->index);
1551 extra_size += ost->st->codec.extradata_size;
1555 /* open each decoder */
1556 for(i=0;i<nb_istreams;i++) {
1558 if (ist->decoding_needed) {
1560 codec = avcodec_find_decoder(ist->st->codec.codec_id);
1562 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1563 ist->st->codec.codec_id, ist->file_index, ist->index);
1566 if (avcodec_open(&ist->st->codec, codec) < 0) {
1567 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1568 ist->file_index, ist->index);
1571 //if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO)
1572 // ist->st->codec.flags |= CODEC_FLAG_REPEAT_FIELD;
1577 for(i=0;i<nb_istreams;i++) {
1579 is = input_files[ist->file_index];
1584 /* compute buffer size max (should use a complete heuristic) */
1585 for(i=0;i<nb_input_files;i++) {
1586 file_table[i].buffer_size_max = 2048;
1589 /* open files and write file headers */
1590 for(i=0;i<nb_output_files;i++) {
1591 os = output_files[i];
1592 if (av_write_header(os) < 0) {
1593 fprintf(stderr, "Could not write header for output file #%d (incorrect codec paramters ?)\n", i);
1599 #ifndef CONFIG_WIN32
1600 if ( !using_stdin && verbose >= 0) {
1601 fprintf(stderr, "Press [q] to stop encoding\n");
1602 url_set_interrupt_cb(decode_interrupt_cb);
1610 for(; received_sigterm == 0;) {
1611 int file_index, ist_index;
1616 /* if 'q' pressed, exits */
1620 /* read_key() returns 0 on EOF */
1626 /* select the stream that we must read now by looking at the
1627 smallest output pts */
1630 for(i=0;i<nb_ostreams;i++) {
1633 os = output_files[ost->file_index];
1634 ist = ist_table[ost->source_index];
1635 pts = (double)ost->st->pts.val * os->pts_num / os->pts_den;
1636 if (!file_table[ist->file_index].eof_reached &&
1639 file_index = ist->file_index;
1642 /* if none, if is finished */
1643 if (file_index < 0) {
1647 /* finish if recording time exhausted */
1648 if (recording_time > 0 && pts_min >= (recording_time / 1000000.0))
1651 /* read a frame from it and output it in the fifo */
1652 is = input_files[file_index];
1653 if (av_read_frame(is, &pkt) < 0) {
1654 file_table[file_index].eof_reached = 1;
1659 stream_no_data = is;
1664 av_pkt_dump(stdout, &pkt, do_hex_dump);
1666 /* the following test is needed in case new streams appear
1667 dynamically in stream : we ignore them */
1668 if (pkt.stream_index >= file_table[file_index].nb_streams)
1669 goto discard_packet;
1670 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1671 ist = ist_table[ist_index];
1673 goto discard_packet;
1675 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1676 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1679 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1680 ist->file_index, ist->index);
1682 av_free_packet(&pkt);
1687 av_free_packet(&pkt);
1689 /* dump report by using the output first video and audio streams */
1690 print_report(output_files, ost_table, nb_ostreams, 0);
1693 /* at the end of stream, we must flush the decoder buffers */
1694 for(i=0;i<nb_istreams;i++) {
1696 if (ist->decoding_needed) {
1697 output_packet(ist, i, ost_table, nb_ostreams, NULL);
1703 /* write the trailer if needed and close file */
1704 for(i=0;i<nb_output_files;i++) {
1705 os = output_files[i];
1706 av_write_trailer(os);
1709 /* dump report by using the first video and audio streams */
1710 print_report(output_files, ost_table, nb_ostreams, 1);
1712 /* close each encoder */
1713 for(i=0;i<nb_ostreams;i++) {
1715 if (ost->encoding_needed) {
1716 av_freep(&ost->st->codec.stats_in);
1717 avcodec_close(&ost->st->codec);
1721 /* close each decoder */
1722 for(i=0;i<nb_istreams;i++) {
1724 if (ist->decoding_needed) {
1725 avcodec_close(&ist->st->codec);
1733 av_free(file_table);
1736 for(i=0;i<nb_istreams;i++) {
1743 for(i=0;i<nb_ostreams;i++) {
1747 fclose(ost->logfile);
1748 ost->logfile = NULL;
1750 fifo_free(&ost->fifo); /* works even if fifo is not
1751 initialized but set to zero */
1752 av_free(ost->pict_tmp.data[0]);
1753 if (ost->video_resample)
1754 img_resample_close(ost->img_resample_ctx);
1755 if (ost->audio_resample)
1756 audio_resample_close(ost->resample);
1769 int file_read(const char *filename)
1772 unsigned char buffer[1024];
1775 if (url_open(&h, filename, O_RDONLY) < 0) {
1776 printf("could not open '%s'\n", filename);
1780 len = url_read(h, buffer, sizeof(buffer));
1783 for(i=0;i<len;i++) putchar(buffer[i]);
1790 static void opt_image_format(const char *arg)
1794 for(f = first_image_format; f != NULL; f = f->next) {
1795 if (!strcmp(arg, f->name))
1799 fprintf(stderr, "Unknown image format: '%s'\n", arg);
1805 static void opt_format(const char *arg)
1807 /* compatibility stuff for pgmyuv */
1808 if (!strcmp(arg, "pgmyuv")) {
1809 opt_image_format(arg);
1813 file_iformat = av_find_input_format(arg);
1814 file_oformat = guess_format(arg, NULL, NULL);
1815 if (!file_iformat && !file_oformat) {
1816 fprintf(stderr, "Unknown input or output format: %s\n", arg);
1821 static void opt_video_bitrate(const char *arg)
1823 video_bit_rate = atoi(arg) * 1000;
1826 static void opt_video_bitrate_tolerance(const char *arg)
1828 video_bit_rate_tolerance = atoi(arg) * 1000;
1831 static void opt_video_bitrate_max(const char *arg)
1833 video_rc_max_rate = atoi(arg) * 1000;
1836 static void opt_video_bitrate_min(const char *arg)
1838 video_rc_min_rate = atoi(arg) * 1000;
1841 static void opt_video_buffer_size(const char *arg)
1843 video_rc_buffer_size = atoi(arg) * 8*1024;
1846 static void opt_video_rc_eq(char *arg)
1851 static void opt_video_rc_override_string(char *arg)
1853 video_rc_override_string = arg;
1857 static void opt_workaround_bugs(const char *arg)
1859 workaround_bugs = atoi(arg);
1862 static void opt_dct_algo(const char *arg)
1864 dct_algo = atoi(arg);
1867 static void opt_idct_algo(const char *arg)
1869 idct_algo = atoi(arg);
1872 static void opt_me_threshold(const char *arg)
1874 me_threshold = atoi(arg);
1877 static void opt_mb_threshold(const char *arg)
1879 mb_threshold = atoi(arg);
1882 static void opt_error_resilience(const char *arg)
1884 error_resilience = atoi(arg);
1887 static void opt_error_concealment(const char *arg)
1889 error_concealment = atoi(arg);
1892 static void opt_debug(const char *arg)
1897 static void opt_vismv(const char *arg)
1899 debug_mv = atoi(arg);
1902 static void opt_verbose(const char *arg)
1904 verbose = atoi(arg);
1905 av_log_set_level(atoi(arg));
1908 static void opt_sync_method(const char *arg)
1910 sync_method = atoi(arg);
1913 static void opt_frame_rate(const char *arg)
1915 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
1916 fprintf(stderr, "Incorrect frame rate\n");
1921 static void opt_frame_crop_top(const char *arg)
1923 frame_topBand = atoi(arg);
1924 if (frame_topBand < 0) {
1925 fprintf(stderr, "Incorrect top crop size\n");
1928 if ((frame_topBand % 2) != 0) {
1929 fprintf(stderr, "Top crop size must be a multiple of 2\n");
1932 if ((frame_topBand) >= frame_height){
1933 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
1936 frame_height -= frame_topBand;
1939 static void opt_frame_crop_bottom(const char *arg)
1941 frame_bottomBand = atoi(arg);
1942 if (frame_bottomBand < 0) {
1943 fprintf(stderr, "Incorrect bottom crop size\n");
1946 if ((frame_bottomBand % 2) != 0) {
1947 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
1950 if ((frame_bottomBand) >= frame_height){
1951 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
1954 frame_height -= frame_bottomBand;
1957 static void opt_frame_crop_left(const char *arg)
1959 frame_leftBand = atoi(arg);
1960 if (frame_leftBand < 0) {
1961 fprintf(stderr, "Incorrect left crop size\n");
1964 if ((frame_leftBand % 2) != 0) {
1965 fprintf(stderr, "Left crop size must be a multiple of 2\n");
1968 if ((frame_leftBand) >= frame_width){
1969 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
1972 frame_width -= frame_leftBand;
1975 static void opt_frame_crop_right(const char *arg)
1977 frame_rightBand = atoi(arg);
1978 if (frame_rightBand < 0) {
1979 fprintf(stderr, "Incorrect right crop size\n");
1982 if ((frame_rightBand % 2) != 0) {
1983 fprintf(stderr, "Right crop size must be a multiple of 2\n");
1986 if ((frame_rightBand) >= frame_width){
1987 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
1990 frame_width -= frame_rightBand;
1993 static void opt_frame_size(const char *arg)
1995 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
1996 fprintf(stderr, "Incorrect frame size\n");
1999 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2000 fprintf(stderr, "Frame size must be a multiple of 2\n");
2006 #define SCALEBITS 10
2007 #define ONE_HALF (1 << (SCALEBITS - 1))
2008 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2010 #define RGB_TO_Y(r, g, b) \
2011 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2012 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2014 #define RGB_TO_U(r1, g1, b1, shift)\
2015 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2016 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2018 #define RGB_TO_V(r1, g1, b1, shift)\
2019 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2020 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2022 static void opt_pad_color(const char *arg) {
2023 /* Input is expected to be six hex digits similar to
2024 how colors are expressed in html tags (but without the #) */
2025 int rgb = strtol(arg, NULL, 16);
2029 g = ((rgb >> 8) & 255);
2032 padcolor[0] = RGB_TO_Y(r,g,b);
2033 padcolor[1] = RGB_TO_U(r,g,b,0);
2034 padcolor[2] = RGB_TO_V(r,g,b,0);
2037 static void opt_frame_pad_top(const char *arg)
2039 frame_padtop = atoi(arg);
2040 if (frame_padtop < 0) {
2041 fprintf(stderr, "Incorrect top pad size\n");
2044 if ((frame_padtop % 2) != 0) {
2045 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2050 static void opt_frame_pad_bottom(const char *arg)
2052 frame_padbottom = atoi(arg);
2053 if (frame_padbottom < 0) {
2054 fprintf(stderr, "Incorrect bottom pad size\n");
2057 if ((frame_padbottom % 2) != 0) {
2058 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2064 static void opt_frame_pad_left(const char *arg)
2066 frame_padleft = atoi(arg);
2067 if (frame_padleft < 0) {
2068 fprintf(stderr, "Incorrect left pad size\n");
2071 if ((frame_padleft % 2) != 0) {
2072 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2078 static void opt_frame_pad_right(const char *arg)
2080 frame_padright = atoi(arg);
2081 if (frame_padright < 0) {
2082 fprintf(stderr, "Incorrect right pad size\n");
2085 if ((frame_padright % 2) != 0) {
2086 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2092 static void opt_frame_pix_fmt(const char *arg)
2094 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2097 static void opt_frame_aspect_ratio(const char *arg)
2103 p = strchr(arg, ':');
2105 x = strtol(arg, (char **)&arg, 10);
2107 y = strtol(arg+1, (char **)&arg, 10);
2109 ar = (double)x / (double)y;
2111 ar = strtod(arg, (char **)&arg);
2114 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2117 frame_aspect_ratio = ar;
2120 static void opt_gop_size(const char *arg)
2122 gop_size = atoi(arg);
2125 static void opt_b_frames(const char *arg)
2127 b_frames = atoi(arg);
2128 if (b_frames > FF_MAX_B_FRAMES) {
2129 fprintf(stderr, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES);
2131 } else if (b_frames < 1) {
2132 fprintf(stderr, "\nNumber of B frames must be higher than 0\n");
2137 static void opt_mb_decision(const char *arg)
2139 mb_decision = atoi(arg);
2142 static void opt_mb_cmp(const char *arg)
2147 static void opt_ildct_cmp(const char *arg)
2149 ildct_cmp = atoi(arg);
2152 static void opt_sub_cmp(const char *arg)
2154 sub_cmp = atoi(arg);
2157 static void opt_cmp(const char *arg)
2162 static void opt_pre_cmp(const char *arg)
2164 pre_cmp = atoi(arg);
2167 static void opt_pre_me(const char *arg)
2172 static void opt_lumi_mask(const char *arg)
2174 lumi_mask = atof(arg);
2177 static void opt_dark_mask(const char *arg)
2179 dark_mask = atof(arg);
2182 static void opt_scplx_mask(const char *arg)
2184 scplx_mask = atof(arg);
2187 static void opt_tcplx_mask(const char *arg)
2189 tcplx_mask = atof(arg);
2192 static void opt_p_mask(const char *arg)
2197 static void opt_qscale(const char *arg)
2199 video_qscale = atof(arg);
2200 if (video_qscale < 0.01 ||
2201 video_qscale > 255) {
2202 fprintf(stderr, "qscale must be >= 0.01 and <= 255\n");
2207 static void opt_lmax(const char *arg)
2209 video_lmax = atof(arg)*FF_QP2LAMBDA;
2212 static void opt_lmin(const char *arg)
2214 video_lmin = atof(arg)*FF_QP2LAMBDA;
2217 static void opt_qmin(const char *arg)
2219 video_qmin = atoi(arg);
2220 if (video_qmin < 0 ||
2222 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2227 static void opt_qmax(const char *arg)
2229 video_qmax = atoi(arg);
2230 if (video_qmax < 0 ||
2232 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2237 static void opt_mb_qmin(const char *arg)
2239 video_mb_qmin = atoi(arg);
2240 if (video_mb_qmin < 0 ||
2241 video_mb_qmin > 31) {
2242 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2247 static void opt_mb_qmax(const char *arg)
2249 video_mb_qmax = atoi(arg);
2250 if (video_mb_qmax < 0 ||
2251 video_mb_qmax > 31) {
2252 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2257 static void opt_qdiff(const char *arg)
2259 video_qdiff = atoi(arg);
2260 if (video_qdiff < 0 ||
2262 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2267 static void opt_qblur(const char *arg)
2269 video_qblur = atof(arg);
2272 static void opt_qcomp(const char *arg)
2274 video_qcomp = atof(arg);
2277 static void opt_rc_initial_cplx(const char *arg)
2279 video_rc_initial_cplx = atof(arg);
2281 static void opt_b_qfactor(const char *arg)
2283 video_b_qfactor = atof(arg);
2285 static void opt_i_qfactor(const char *arg)
2287 video_i_qfactor = atof(arg);
2289 static void opt_b_qoffset(const char *arg)
2291 video_b_qoffset = atof(arg);
2293 static void opt_i_qoffset(const char *arg)
2295 video_i_qoffset = atof(arg);
2298 static void opt_ibias(const char *arg)
2300 video_intra_quant_bias = atoi(arg);
2302 static void opt_pbias(const char *arg)
2304 video_inter_quant_bias = atoi(arg);
2307 static void opt_packet_size(const char *arg)
2309 packet_size= atoi(arg);
2312 static void opt_error_rate(const char *arg)
2314 error_rate= atoi(arg);
2317 static void opt_strict(const char *arg)
2322 static void opt_top_field_first(const char *arg)
2324 top_field_first= atoi(arg);
2327 static void opt_noise_reduction(const char *arg)
2329 noise_reduction= atoi(arg);
2332 static void opt_qns(const char *arg)
2337 static void opt_sc_threshold(const char *arg)
2339 sc_threshold= atoi(arg);
2342 static void opt_me_range(const char *arg)
2344 me_range = atoi(arg);
2347 static void opt_thread_count(const char *arg)
2349 thread_count= atoi(arg);
2350 #if !defined(HAVE_PTHREADS) && !defined(HAVE_W32THREADS)
2352 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2356 static void opt_audio_bitrate(const char *arg)
2358 audio_bit_rate = atoi(arg) * 1000;
2361 static void opt_audio_rate(const char *arg)
2363 audio_sample_rate = atoi(arg);
2366 static void opt_audio_channels(const char *arg)
2368 audio_channels = atoi(arg);
2371 static void opt_video_device(const char *arg)
2373 video_device = av_strdup(arg);
2376 static void opt_video_channel(const char *arg)
2378 video_channel = strtol(arg, NULL, 0);
2381 static void opt_video_standard(const char *arg)
2383 video_standard = av_strdup(arg);
2386 static void opt_audio_device(const char *arg)
2388 audio_device = av_strdup(arg);
2391 static void opt_dv1394(const char *arg)
2393 video_grab_format = "dv1394";
2394 audio_grab_format = NULL;
2397 static void opt_audio_codec(const char *arg)
2401 if (!strcmp(arg, "copy")) {
2402 audio_stream_copy = 1;
2406 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_AUDIO)
2411 fprintf(stderr, "Unknown audio codec '%s'\n", arg);
2414 audio_codec_id = p->id;
2419 static void add_frame_hooker(const char *arg)
2424 char *args = av_strdup(arg);
2428 argv[0] = strtok(args, " ");
2429 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2432 i = frame_hook_add(argc, argv);
2435 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2440 const char *motion_str[] = {
2450 static void opt_motion_estimation(const char *arg)
2456 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2459 if (!strcmp(*p, arg))
2463 me_method = (p - motion_str) + 1;
2466 static void opt_video_codec(const char *arg)
2470 if (!strcmp(arg, "copy")) {
2471 video_stream_copy = 1;
2475 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_VIDEO)
2480 fprintf(stderr, "Unknown video codec '%s'\n", arg);
2483 video_codec_id = p->id;
2488 static void opt_map(const char *arg)
2494 m = &stream_maps[nb_stream_maps++];
2496 m->file_index = strtol(arg, (char **)&p, 0);
2500 m->stream_index = strtol(p, (char **)&p, 0);
2503 static void opt_recording_time(const char *arg)
2505 recording_time = parse_date(arg, 1);
2508 static void opt_start_time(const char *arg)
2510 start_time = parse_date(arg, 1);
2513 static void opt_rec_timestamp(const char *arg)
2515 rec_timestamp = parse_date(arg, 0) / 1000000;
2518 static void opt_input_file(const char *filename)
2520 AVFormatContext *ic;
2521 AVFormatParameters params, *ap = ¶ms;
2522 int err, i, ret, rfps, rfps_base;
2524 if (!strcmp(filename, "-"))
2527 using_stdin |= !strcmp(filename, "pipe:" ) ||
2528 !strcmp( filename, "/dev/stdin" );
2530 /* get default parameters from command line */
2531 memset(ap, 0, sizeof(*ap));
2532 ap->sample_rate = audio_sample_rate;
2533 ap->channels = audio_channels;
2534 ap->frame_rate = frame_rate;
2535 ap->frame_rate_base = frame_rate_base;
2536 ap->width = frame_width + frame_padleft + frame_padright;
2537 ap->height = frame_height + frame_padtop + frame_padbottom;
2538 ap->image_format = image_format;
2539 ap->pix_fmt = frame_pix_fmt;
2541 /* open the input file with generic libav function */
2542 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2544 print_error(filename, err);
2548 /* If not enough info to get the stream parameters, we decode the
2549 first frames to get it. (used in mpeg case for example) */
2550 ret = av_find_stream_info(ic);
2551 if (ret < 0 && verbose >= 0) {
2552 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2556 /* if seeking requested, we execute it */
2557 if (start_time != 0) {
2560 timestamp = start_time;
2561 /* add the stream start time */
2562 if (ic->start_time != AV_NOPTS_VALUE)
2563 timestamp += ic->start_time;
2564 ret = av_seek_frame(ic, -1, timestamp);
2566 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2567 filename, (double)timestamp / AV_TIME_BASE);
2569 /* reset seek info */
2573 /* update the current parameters so that they match the one of the input stream */
2574 for(i=0;i<ic->nb_streams;i++) {
2575 AVCodecContext *enc = &ic->streams[i]->codec;
2576 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2578 avcodec_thread_init(enc, thread_count);
2580 enc->thread_count= thread_count;
2581 switch(enc->codec_type) {
2582 case CODEC_TYPE_AUDIO:
2583 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2584 audio_channels = enc->channels;
2585 audio_sample_rate = enc->sample_rate;
2587 case CODEC_TYPE_VIDEO:
2588 frame_height = enc->height;
2589 frame_width = enc->width;
2590 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2591 frame_pix_fmt = enc->pix_fmt;
2592 rfps = ic->streams[i]->r_frame_rate;
2593 rfps_base = ic->streams[i]->r_frame_rate_base;
2594 enc->workaround_bugs = workaround_bugs;
2595 enc->error_resilience = error_resilience;
2596 enc->error_concealment = error_concealment;
2597 enc->idct_algo = idct_algo;
2599 enc->debug_mv = debug_mv;
2601 enc->flags|= CODEC_FLAG_BITEXACT;
2603 enc->debug |= FF_DEBUG_MV;
2605 assert(enc->frame_rate_base == rfps_base); // should be true for now
2606 if (enc->frame_rate != rfps) {
2609 fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f->%2.2f\n",
2610 i, (float)enc->frame_rate / enc->frame_rate_base,
2612 (float)rfps / rfps_base);
2614 /* update the current frame rate to match the stream frame rate */
2616 frame_rate_base = rfps_base;
2618 enc->rate_emu = rate_emu;
2620 case CODEC_TYPE_DATA:
2627 input_files[nb_input_files] = ic;
2628 /* dump the file content */
2630 dump_format(ic, nb_input_files, filename, 0);
2633 file_iformat = NULL;
2634 file_oformat = NULL;
2635 image_format = NULL;
2640 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
2642 int has_video, has_audio, i, j;
2643 AVFormatContext *ic;
2647 for(j=0;j<nb_input_files;j++) {
2648 ic = input_files[j];
2649 for(i=0;i<ic->nb_streams;i++) {
2650 AVCodecContext *enc = &ic->streams[i]->codec;
2651 switch(enc->codec_type) {
2652 case CODEC_TYPE_AUDIO:
2655 case CODEC_TYPE_VIDEO:
2658 case CODEC_TYPE_DATA:
2665 *has_video_ptr = has_video;
2666 *has_audio_ptr = has_audio;
2669 static void opt_output_file(const char *filename)
2672 AVFormatContext *oc;
2673 int use_video, use_audio, nb_streams, input_has_video, input_has_audio;
2675 AVFormatParameters params, *ap = ¶ms;
2677 if (!strcmp(filename, "-"))
2680 oc = av_alloc_format_context();
2682 if (!file_oformat) {
2683 file_oformat = guess_format(NULL, filename, NULL);
2684 if (!file_oformat) {
2685 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
2691 oc->oformat = file_oformat;
2693 if (!strcmp(file_oformat->name, "ffm") &&
2694 strstart(filename, "http:", NULL)) {
2695 /* special case for files sent to ffserver: we get the stream
2696 parameters from ffserver */
2697 if (read_ffserver_streams(oc, filename) < 0) {
2698 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
2702 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy;
2703 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy;
2705 /* disable if no corresponding type found and at least one
2707 if (nb_input_files > 0) {
2708 check_audio_video_inputs(&input_has_video, &input_has_audio);
2709 if (!input_has_video)
2711 if (!input_has_audio)
2715 /* manual disable */
2716 if (audio_disable) {
2719 if (video_disable) {
2725 AVCodecContext *video_enc;
2727 st = av_mallocz(sizeof(AVStream));
2729 fprintf(stderr, "Could not alloc stream\n");
2732 avcodec_get_context_defaults(&st->codec);
2733 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2735 avcodec_thread_init(&st->codec, thread_count);
2738 video_enc = &st->codec;
2740 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
2741 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2742 if (video_stream_copy) {
2743 st->stream_copy = 1;
2744 video_enc->codec_type = CODEC_TYPE_VIDEO;
2750 codec_id = file_oformat->video_codec;
2751 if (video_codec_id != CODEC_ID_NONE)
2752 codec_id = video_codec_id;
2754 video_enc->codec_id = codec_id;
2755 codec = avcodec_find_encoder(codec_id);
2757 video_enc->bit_rate = video_bit_rate;
2758 video_enc->bit_rate_tolerance = video_bit_rate_tolerance;
2759 video_enc->frame_rate = frame_rate;
2760 video_enc->frame_rate_base = frame_rate_base;
2761 if(codec && codec->supported_framerates){
2762 const AVRational *p= codec->supported_framerates;
2763 AVRational req= (AVRational){frame_rate, frame_rate_base};
2764 const AVRational *best=NULL;
2765 AVRational best_error= (AVRational){INT_MAX, 1};
2766 for(; p->den!=0; p++){
2767 AVRational error= av_sub_q(req, *p);
2768 if(error.num <0) error.num *= -1;
2769 if(av_cmp_q(error, best_error) < 0){
2774 video_enc->frame_rate = best->num;
2775 video_enc->frame_rate_base= best->den;
2778 video_enc->width = frame_width + frame_padright + frame_padleft;
2779 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2780 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
2781 video_enc->pix_fmt = frame_pix_fmt;
2783 if(codec && codec->pix_fmts){
2784 const enum PixelFormat *p= codec->pix_fmts;
2786 if(*p == video_enc->pix_fmt)
2790 video_enc->pix_fmt = codec->pix_fmts[0];
2794 video_enc->gop_size = gop_size;
2796 video_enc->gop_size = 0;
2797 if (video_qscale || same_quality) {
2798 video_enc->flags |= CODEC_FLAG_QSCALE;
2799 st->quality = FF_QP2LAMBDA * video_qscale;
2803 video_enc->intra_matrix = intra_matrix;
2805 video_enc->inter_matrix = inter_matrix;
2808 video_enc->flags |= CODEC_FLAG_BITEXACT;
2810 video_enc->mb_decision = mb_decision;
2811 video_enc->mb_cmp = mb_cmp;
2812 video_enc->ildct_cmp = ildct_cmp;
2813 video_enc->me_sub_cmp = sub_cmp;
2814 video_enc->me_cmp = cmp;
2815 video_enc->me_pre_cmp = pre_cmp;
2816 video_enc->pre_me = pre_me;
2817 video_enc->lumi_masking = lumi_mask;
2818 video_enc->dark_masking = dark_mask;
2819 video_enc->spatial_cplx_masking = scplx_mask;
2820 video_enc->temporal_cplx_masking = tcplx_mask;
2821 video_enc->p_masking = p_mask;
2822 video_enc->quantizer_noise_shaping= qns;
2825 video_enc->flags |= CODEC_FLAG_H263P_UMV;
2828 video_enc->flags |= CODEC_FLAG_H263P_SLICE_STRUCT;
2831 video_enc->flags |= CODEC_FLAG_H263P_AIC;
2834 video_enc->flags |= CODEC_FLAG_H263P_AIV;
2837 video_enc->flags |= CODEC_FLAG_4MV;
2840 video_enc->flags |= CODEC_FLAG_OBMC;
2843 video_enc->flags |= CODEC_FLAG_LOOP_FILTER;
2847 video_enc->flags |= CODEC_FLAG_PART;
2850 video_enc->flags |= CODEC_FLAG_ALT_SCAN;
2853 video_enc->flags |= CODEC_FLAG_TRELLIS_QUANT;
2855 if (use_scan_offset) {
2856 video_enc->flags |= CODEC_FLAG_SVCD_SCAN_OFFSET;
2859 video_enc->flags |= CODEC_FLAG_CLOSED_GOP;
2862 video_enc->flags |= CODEC_FLAG_QPEL;
2865 video_enc->max_b_frames = b_frames;
2866 video_enc->b_frame_strategy = 0;
2867 video_enc->b_quant_factor = 2.0;
2869 if (do_interlace_dct) {
2870 video_enc->flags |= CODEC_FLAG_INTERLACED_DCT;
2872 if (do_interlace_me) {
2873 video_enc->flags |= CODEC_FLAG_INTERLACED_ME;
2875 video_enc->qmin = video_qmin;
2876 video_enc->qmax = video_qmax;
2877 video_enc->lmin = video_lmin;
2878 video_enc->lmax = video_lmax;
2879 video_enc->mb_qmin = video_mb_qmin;
2880 video_enc->mb_qmax = video_mb_qmax;
2881 video_enc->max_qdiff = video_qdiff;
2882 video_enc->qblur = video_qblur;
2883 video_enc->qcompress = video_qcomp;
2884 video_enc->rc_eq = video_rc_eq;
2885 video_enc->debug = debug;
2886 video_enc->debug_mv = debug_mv;
2887 video_enc->thread_count = thread_count;
2888 p= video_rc_override_string;
2891 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
2893 fprintf(stderr, "error parsing rc_override\n");
2896 video_enc->rc_override=
2897 av_realloc(video_enc->rc_override,
2898 sizeof(RcOverride)*(i+1));
2899 video_enc->rc_override[i].start_frame= start;
2900 video_enc->rc_override[i].end_frame = end;
2902 video_enc->rc_override[i].qscale= q;
2903 video_enc->rc_override[i].quality_factor= 1.0;
2906 video_enc->rc_override[i].qscale= 0;
2907 video_enc->rc_override[i].quality_factor= -q/100.0;
2912 video_enc->rc_override_count=i;
2914 video_enc->rc_max_rate = video_rc_max_rate;
2915 video_enc->rc_min_rate = video_rc_min_rate;
2916 video_enc->rc_buffer_size = video_rc_buffer_size;
2917 video_enc->rc_buffer_aggressivity= video_rc_buffer_aggressivity;
2918 video_enc->rc_initial_cplx= video_rc_initial_cplx;
2919 video_enc->i_quant_factor = video_i_qfactor;
2920 video_enc->b_quant_factor = video_b_qfactor;
2921 video_enc->i_quant_offset = video_i_qoffset;
2922 video_enc->b_quant_offset = video_b_qoffset;
2923 video_enc->intra_quant_bias = video_intra_quant_bias;
2924 video_enc->inter_quant_bias = video_inter_quant_bias;
2925 video_enc->dct_algo = dct_algo;
2926 video_enc->idct_algo = idct_algo;
2927 video_enc->me_threshold= me_threshold;
2928 video_enc->mb_threshold= mb_threshold;
2929 video_enc->intra_dc_precision= intra_dc_precision;
2930 video_enc->strict_std_compliance = strict;
2931 video_enc->error_rate = error_rate;
2932 video_enc->noise_reduction= noise_reduction;
2933 video_enc->scenechange_threshold= sc_threshold;
2934 video_enc->me_range = me_range;
2935 video_enc->coder_type= coder;
2936 video_enc->context_model= context;
2937 video_enc->prediction_method= predictor;
2940 video_enc->rtp_mode= 1;
2941 video_enc->rtp_payload_size= packet_size;
2945 video_enc->flags|= CODEC_FLAG_PSNR;
2947 video_enc->me_method = me_method;
2952 video_enc->flags |= CODEC_FLAG_PASS1;
2954 video_enc->flags |= CODEC_FLAG_PASS2;
2958 oc->streams[nb_streams] = st;
2963 AVCodecContext *audio_enc;
2965 st = av_mallocz(sizeof(AVStream));
2967 fprintf(stderr, "Could not alloc stream\n");
2970 avcodec_get_context_defaults(&st->codec);
2971 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2973 avcodec_thread_init(&st->codec, thread_count);
2976 audio_enc = &st->codec;
2977 audio_enc->codec_type = CODEC_TYPE_AUDIO;
2979 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
2980 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2981 if (audio_stream_copy) {
2982 st->stream_copy = 1;
2984 codec_id = file_oformat->audio_codec;
2985 if (audio_codec_id != CODEC_ID_NONE)
2986 codec_id = audio_codec_id;
2987 audio_enc->codec_id = codec_id;
2989 audio_enc->bit_rate = audio_bit_rate;
2990 audio_enc->sample_rate = audio_sample_rate;
2991 audio_enc->strict_std_compliance = strict;
2992 audio_enc->thread_count = thread_count;
2993 /* For audio codecs other than AC3 we limit */
2994 /* the number of coded channels to stereo */
2995 if (audio_channels > 2 && codec_id != CODEC_ID_AC3) {
2996 audio_enc->channels = 2;
2998 audio_enc->channels = audio_channels;
3000 oc->streams[nb_streams] = st;
3004 oc->nb_streams = nb_streams;
3007 fprintf(stderr, "No audio or video streams available\n");
3011 oc->timestamp = rec_timestamp;
3014 pstrcpy(oc->title, sizeof(oc->title), str_title);
3016 pstrcpy(oc->author, sizeof(oc->author), str_author);
3018 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3020 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3023 output_files[nb_output_files++] = oc;
3025 strcpy(oc->filename, filename);
3027 /* check filename in case of an image number is expected */
3028 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3029 if (filename_number_test(oc->filename) < 0) {
3030 print_error(oc->filename, AVERROR_NUMEXPECTED);
3035 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3036 /* test if it already exists to avoid loosing precious files */
3037 if (!file_overwrite &&
3038 (strchr(filename, ':') == NULL ||
3039 strstart(filename, "file:", NULL))) {
3040 if (url_exist(filename)) {
3043 if ( !using_stdin ) {
3044 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3047 if (toupper(c) != 'Y') {
3048 fprintf(stderr, "Not overwriting - exiting\n");
3053 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3060 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3061 fprintf(stderr, "Could not open '%s'\n", filename);
3066 memset(ap, 0, sizeof(*ap));
3067 ap->image_format = image_format;
3068 if (av_set_parameters(oc, ap) < 0) {
3069 fprintf(stderr, "%s: Invalid encoding parameters\n",
3074 /* reset some options */
3075 file_oformat = NULL;
3076 file_iformat = NULL;
3077 image_format = NULL;
3080 audio_codec_id = CODEC_ID_NONE;
3081 video_codec_id = CODEC_ID_NONE;
3082 audio_stream_copy = 0;
3083 video_stream_copy = 0;
3086 /* prepare dummy protocols for grab */
3087 static void prepare_grab(void)
3089 int has_video, has_audio, i, j;
3090 AVFormatContext *oc;
3091 AVFormatContext *ic;
3092 AVFormatParameters vp1, *vp = &vp1;
3093 AVFormatParameters ap1, *ap = &ap1;
3095 /* see if audio/video inputs are needed */
3098 memset(ap, 0, sizeof(*ap));
3099 memset(vp, 0, sizeof(*vp));
3100 for(j=0;j<nb_output_files;j++) {
3101 oc = output_files[j];
3102 for(i=0;i<oc->nb_streams;i++) {
3103 AVCodecContext *enc = &oc->streams[i]->codec;
3104 switch(enc->codec_type) {
3105 case CODEC_TYPE_AUDIO:
3106 if (enc->sample_rate > ap->sample_rate)
3107 ap->sample_rate = enc->sample_rate;
3108 if (enc->channels > ap->channels)
3109 ap->channels = enc->channels;
3112 case CODEC_TYPE_VIDEO:
3113 if (enc->width > vp->width)
3114 vp->width = enc->width;
3115 if (enc->height > vp->height)
3116 vp->height = enc->height;
3118 assert(enc->frame_rate_base == DEFAULT_FRAME_RATE_BASE);
3119 if (enc->frame_rate > vp->frame_rate){
3120 vp->frame_rate = enc->frame_rate;
3121 vp->frame_rate_base = enc->frame_rate_base;
3131 if (has_video == 0 && has_audio == 0) {
3132 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3137 AVInputFormat *fmt1;
3138 fmt1 = av_find_input_format(video_grab_format);
3139 vp->device = video_device;
3140 vp->channel = video_channel;
3141 vp->standard = video_standard;
3142 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3143 fprintf(stderr, "Could not find video grab device\n");
3146 /* If not enough info to get the stream parameters, we decode the
3147 first frames to get it. */
3148 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3149 fprintf(stderr, "Could not find video grab parameters\n");
3152 /* by now video grab has one stream */
3153 ic->streams[0]->r_frame_rate = vp->frame_rate;
3154 ic->streams[0]->r_frame_rate_base = vp->frame_rate_base;
3155 input_files[nb_input_files] = ic;
3158 dump_format(ic, nb_input_files, "", 0);
3162 if (has_audio && audio_grab_format) {
3163 AVInputFormat *fmt1;
3164 fmt1 = av_find_input_format(audio_grab_format);
3165 ap->device = audio_device;
3166 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3167 fprintf(stderr, "Could not find audio grab device\n");
3170 input_files[nb_input_files] = ic;
3173 dump_format(ic, nb_input_files, "", 0);
3179 /* same option as mencoder */
3180 static void opt_pass(const char *pass_str)
3183 pass = atoi(pass_str);
3184 if (pass != 1 && pass != 2) {
3185 fprintf(stderr, "pass number can be only 1 or 2\n");
3191 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3192 static int64_t getutime(void)
3194 return av_gettime();
3197 static int64_t getutime(void)
3199 struct rusage rusage;
3201 getrusage(RUSAGE_SELF, &rusage);
3202 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3206 extern int ffm_nopts;
3208 static void opt_bitexact(void)
3211 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3215 static void show_formats(void)
3217 AVInputFormat *ifmt;
3218 AVOutputFormat *ofmt;
3219 AVImageFormat *image_fmt;
3222 const char **pp, *last_name;
3224 printf("File formats:\n");
3229 const char *name=NULL;
3231 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3232 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3233 strcmp(ofmt->name, last_name)>0){
3238 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3239 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3240 strcmp(ifmt->name, last_name)>0){
3244 if(name && strcmp(ifmt->name, name)==0)
3259 printf("Image formats:\n");
3260 for(image_fmt = first_image_format; image_fmt != NULL;
3261 image_fmt = image_fmt->next) {
3264 image_fmt->img_read ? "D":" ",
3265 image_fmt->img_write ? "E":" ",
3270 printf("Codecs:\n");
3278 for(p = first_avcodec; p != NULL; p = p->next) {
3279 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3280 strcmp(p->name, last_name)>0){
3282 decode= encode= cap=0;
3284 if(p2 && strcmp(p->name, p2->name)==0){
3285 if(p->decode) decode=1;
3286 if(p->encode) encode=1;
3287 cap |= p->capabilities;
3292 last_name= p2->name;
3296 decode ? "D": (/*p2->decoder ? "d":*/" "),
3298 p2->type == CODEC_TYPE_AUDIO ? "A":"V",
3299 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3300 cap & CODEC_CAP_DR1 ? "D":" ",
3301 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3303 /* if(p2->decoder && decode==0)
3304 printf(" use %s for decoding", p2->decoder->name);*/
3309 printf("Supported file protocols:\n");
3310 for(up = first_protocol; up != NULL; up = up->next)
3311 printf(" %s:", up->name);
3314 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3315 printf("Motion estimation methods:\n");
3319 if ((pp - motion_str + 1) == ME_ZERO)
3320 printf("(fastest)");
3321 else if ((pp - motion_str + 1) == ME_FULL)
3322 printf("(slowest)");
3323 else if ((pp - motion_str + 1) == ME_EPZS)
3324 printf("(default)");
3329 "Note, the names of encoders and decoders dont always match, so there are\n"
3330 "several cases where the above table shows encoder only or decoder only entries\n"
3331 "even though both encoding and decoding are supported for example, the h263\n"
3332 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3337 void parse_matrix_coeffs(uint16_t *dest, const char *str)
3340 const char *p = str;
3347 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3354 void opt_inter_matrix(const char *arg)
3356 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3357 parse_matrix_coeffs(inter_matrix, arg);
3360 void opt_intra_matrix(const char *arg)
3362 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3363 parse_matrix_coeffs(intra_matrix, arg);
3366 static void opt_target(const char *arg)
3370 if(!strncmp(arg, "pal-", 4)) {
3373 } else if(!strncmp(arg, "ntsc-", 5)) {
3378 /* Calculate FR via float to avoid int overflow */
3379 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3382 } else if((fr == 29970) || (fr == 23976)) {
3385 /* Try to determine PAL/NTSC by peeking in the input files */
3386 if(nb_input_files) {
3388 for(j = 0; j < nb_input_files; j++) {
3389 for(i = 0; i < input_files[j]->nb_streams; i++) {
3390 AVCodecContext *c = &input_files[j]->streams[i]->codec;
3391 if(c->codec_type != CODEC_TYPE_VIDEO)
3393 fr = c->frame_rate * 1000 / c->frame_rate_base;
3397 } else if((fr == 29970) || (fr == 23976)) {
3407 if(verbose && norm >= 0)
3408 printf("Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3412 fprintf(stderr, "Could not determine norm (PAL/NTSC) for target.\n");
3413 fprintf(stderr, "Please prefix target with \"pal-\" or \"ntsc-\",\n");
3414 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3418 if(!strcmp(arg, "vcd")) {
3420 opt_video_codec("mpeg1video");
3421 opt_audio_codec("mp2");
3424 opt_frame_size(norm ? "352x240" : "352x288");
3426 video_bit_rate = 1150000;
3427 video_rc_max_rate = 1150000;
3428 video_rc_min_rate = 1150000;
3429 video_rc_buffer_size = 40*1024*8;
3431 audio_bit_rate = 224000;
3432 audio_sample_rate = 44100;
3434 } else if(!strcmp(arg, "svcd")) {
3436 opt_video_codec("mpeg2video");
3437 opt_audio_codec("mp2");
3440 opt_frame_size(norm ? "480x480" : "480x576");
3441 opt_gop_size(norm ? "18" : "15");
3443 video_bit_rate = 2040000;
3444 video_rc_max_rate = 2516000;
3445 video_rc_min_rate = 0; //1145000;
3446 video_rc_buffer_size = 224*1024*8;
3447 use_scan_offset = 1;
3449 audio_bit_rate = 224000;
3450 audio_sample_rate = 44100;
3452 } else if(!strcmp(arg, "dvd")) {
3454 opt_video_codec("mpeg2video");
3455 opt_audio_codec("ac3");
3458 opt_frame_size(norm ? "720x480" : "720x576");
3459 opt_gop_size(norm ? "18" : "15");
3461 video_bit_rate = 6000000;
3462 video_rc_max_rate = 9000000;
3463 video_rc_min_rate = 0; //1500000;
3464 video_rc_buffer_size = 224*1024*8;
3466 audio_bit_rate = 448000;
3467 audio_sample_rate = 48000;
3470 fprintf(stderr, "Unknown target: %s\n", arg);
3475 static void show_version(void)
3477 printf("ffmpeg " FFMPEG_VERSION "\n"
3480 avcodec_build(), LIBAVFORMAT_BUILD);
3484 const OptionDef options[] = {
3486 { "L", 0, {(void*)show_license}, "show license" },
3487 { "h", 0, {(void*)show_help}, "show help" },
3488 { "version", 0, {(void*)show_version}, "show version" },
3489 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3490 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3491 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
3492 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3493 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3494 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream" },
3495 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3496 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3497 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3498 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3499 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3500 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3501 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3502 { "debug", HAS_ARG | OPT_EXPERT, {(void*)opt_debug}, "print specific debug info", "" },
3503 { "vismv", HAS_ARG | OPT_EXPERT, {(void*)opt_vismv}, "visualize motion vectors", "" },
3504 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3505 "add timings for benchmarking" },
3506 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3507 "dump each input packet" },
3508 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3509 "when dumping packets, also dump the payload" },
3510 { "bitexact", OPT_EXPERT, {(void*)opt_bitexact}, "only use bit exact algorithms (for codec testing)" },
3511 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3512 { "loop", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3513 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3514 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\" or \"dvd\")", "type" },
3515 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3516 { "sync", HAS_ARG | OPT_EXPERT, {(void*)opt_sync_method}, "sync method", "" },
3519 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
3520 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3521 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3522 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3523 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3524 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3525 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3526 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3527 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3528 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3529 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3530 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3531 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3532 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3533 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
3534 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3535 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3536 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
3537 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
3538 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
3539 { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
3540 { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
3541 { "mbqmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmin}, "min macroblock quantiser scale (VBR)", "q" },
3542 { "mbqmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmax}, "max macroblock quantiser scale (VBR)", "q" },
3543 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
3544 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
3545 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
3546 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
3547 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
3548 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
3549 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
3550 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
3551 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
3552 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
3553 // { "b_strategy", HAS_ARG | OPT_EXPERT, {(void*)opt_b_strategy}, "dynamic b frame selection strategy", "strategy" },
3554 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3555 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3556 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
3557 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
3558 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
3559 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffere size (in kByte)", "size" },
3560 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3561 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
3563 { "dct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dct_algo}, "set dct algo", "algo" },
3564 { "idct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_idct_algo}, "set idct algo", "algo" },
3565 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
3566 { "mb_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_threshold}, "macroblock threshold", "" },
3567 { "er", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_resilience}, "set error resilience", "n" },
3568 { "ec", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_concealment}, "set error concealment", "bit_mask" },
3569 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
3570 { "hq", OPT_BOOL, {(void*)&mb_decision}, "activate high quality settings" },
3571 { "mbd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_decision}, "macroblock decision", "mode" },
3572 { "mbcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_cmp}, "macroblock compare function", "cmp function" },
3573 { "ildctcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ildct_cmp}, "ildct compare function", "cmp function" },
3574 { "subcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sub_cmp}, "subpel compare function", "cmp function" },
3575 { "cmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_cmp}, "fullpel compare function", "cmp function" },
3576 { "precmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_cmp}, "pre motion estimation compare function", "cmp function" },
3577 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
3578 { "lumi_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lumi_mask}, "luminance masking", "" },
3579 { "dark_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dark_mask}, "darkness masking", "" },
3580 { "scplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_scplx_mask}, "spatial complexity masking", "" },
3581 { "tcplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_tcplx_mask}, "teporal complexity masking", "" },
3582 { "p_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_p_mask}, "inter masking", "" },
3583 { "4mv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_4mv}, "use four motion vector by macroblock (MPEG4)" },
3584 { "obmc", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_obmc}, "use overlapped block motion compensation (h263+)" },
3585 { "lf", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_loop}, "use loop filter (h263+)" },
3586 { "part", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_part}, "use data partitioning (MPEG4)" },
3587 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
3588 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
3589 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
3590 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3591 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3592 "use same video quality as source (implies VBR)" },
3593 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3594 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3595 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3596 "deinterlace pictures" },
3597 { "ildct", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_dct},
3598 "force interlaced dct support in encoder (MPEG2/MPEG4)" },
3599 { "ilme", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_me},
3600 "force interlaced me support in encoder (MPEG2/MPEG4)" },
3601 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3602 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
3603 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3604 { "aic", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aic}, "enable Advanced intra coding (h263+)" },
3605 { "aiv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aiv}, "enable Alternative inter vlc (h263+)" },
3606 { "umv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_umv}, "enable Unlimited Motion Vector (h263+)" },
3607 { "ssm", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_ss}, "enable Slice Structured mode (h263+)" },
3608 { "alt", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_alt_scan}, "enable alternate scantable (MPEG2/MPEG4)" },
3609 { "trell", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_trell}, "enable trellis quantization" },
3610 { "cgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&closed_gop}, "closed gop" },
3611 { "scan_offset", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_scan_offset}, "enable SVCD Scan Offset placeholder" },
3612 { "qpel", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qpel}, "enable 1/4-pel" },
3613 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3614 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3615 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3616 { "nr", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_noise_reduction}, "noise reduction", "" },
3617 { "qns", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qns}, "quantization noise shaping", "" },
3618 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
3619 { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
3620 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3621 { "coder", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&coder}, "coder type", "" },
3622 { "context", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&context}, "context model", "" },
3623 { "pred", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&predictor}, "prediction method", "" },
3626 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
3627 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3628 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3629 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3630 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3633 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
3634 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3635 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3636 { "dv1394", OPT_EXPERT | OPT_GRAB, {(void*)opt_dv1394}, "set DV1394 grab", "" },
3637 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
3641 static void show_banner(void)
3643 printf("ffmpeg version " FFMPEG_VERSION ", Copyright (c) 2000-2003 Fabrice Bellard\n");
3646 static void show_license(void)
3651 "This program is free software; you can redistribute it and/or modify\n"
3652 "it under the terms of the GNU General Public License as published by\n"
3653 "the Free Software Foundation; either version 2 of the License, or\n"
3654 "(at your option) any later version.\n"
3656 "This program is distributed in the hope that it will be useful,\n"
3657 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3658 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
3659 "GNU General Public License for more details.\n"
3661 "You should have received a copy of the GNU General Public License\n"
3662 "along with this program; if not, write to the Free Software\n"
3663 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3667 "This library is free software; you can redistribute it and/or\n"
3668 "modify it under the terms of the GNU Lesser General Public\n"
3669 "License as published by the Free Software Foundation; either\n"
3670 "version 2 of the License, or (at your option) any later version.\n"
3672 "This library is distributed in the hope that it will be useful,\n"
3673 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3674 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
3675 "Lesser General Public License for more details.\n"
3677 "You should have received a copy of the GNU Lesser General Public\n"
3678 "License along with this library; if not, write to the Free Software\n"
3679 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3685 static void show_help(void)
3688 printf("usage: ffmpeg [[options] -i input_file]... {[options] outfile}...\n"
3689 "Hyper fast Audio and Video encoder\n");
3691 show_help_options(options, "Main options:\n",
3692 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
3693 show_help_options(options, "\nVideo options:\n",
3694 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3696 show_help_options(options, "\nAdvanced Video options:\n",
3697 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3698 OPT_VIDEO | OPT_EXPERT);
3699 show_help_options(options, "\nAudio options:\n",
3700 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3702 show_help_options(options, "\nAdvanced Audio options:\n",
3703 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3704 OPT_AUDIO | OPT_EXPERT);
3705 show_help_options(options, "\nAudio/Video grab options:\n",
3708 show_help_options(options, "\nAdvanced options:\n",
3709 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3714 void parse_arg_file(const char *filename)
3716 opt_output_file(filename);
3719 int main(int argc, char **argv)
3730 parse_options(argc, argv, options);
3732 /* file converter / grab */
3733 if (nb_output_files <= 0) {
3734 fprintf(stderr, "Must supply at least one output file\n");
3738 if (nb_input_files == 0) {
3743 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3744 stream_maps, nb_stream_maps);
3745 ti = getutime() - ti;
3747 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3751 for(i=0;i<nb_output_files;i++) {
3752 /* maybe av_close_output_file ??? */
3753 AVFormatContext *s = output_files[i];
3755 if (!(s->oformat->flags & AVFMT_NOFILE))
3757 for(j=0;j<s->nb_streams;j++)
3758 av_free(s->streams[j]);
3761 for(i=0;i<nb_input_files;i++)
3762 av_close_input_file(input_files[i]);
3767 av_free(intra_matrix);
3769 av_free(inter_matrix);
3771 #ifdef POWERPC_PERFORMANCE_REPORT
3772 extern void powerpc_display_perf_report(void);
3773 powerpc_display_perf_report();
3774 #endif /* POWERPC_PERFORMANCE_REPORT */
3776 #ifndef CONFIG_WIN32
3777 if (received_sigterm) {
3779 "Received signal %d: terminating.\n",
3780 (int) received_sigterm);
3784 exit(0); /* not all OS-es handle main() return value */