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
21 #include "framehook.h"
26 #include <sys/ioctl.h>
29 #include <sys/resource.h>
33 #include <sys/types.h>
34 #include <sys/select.h>
37 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
42 #if !defined(INFINITY) && defined(HUGE_VAL)
43 #define INFINITY HUGE_VAL
46 /* select an input stream for an output stream */
47 typedef struct AVStreamMap {
52 extern const OptionDef options[];
54 static void show_help(void);
55 static void show_license(void);
59 static AVFormatContext *input_files[MAX_FILES];
60 static int nb_input_files = 0;
62 static AVFormatContext *output_files[MAX_FILES];
63 static int nb_output_files = 0;
65 static AVStreamMap stream_maps[MAX_FILES];
66 static int nb_stream_maps;
68 static AVInputFormat *file_iformat;
69 static AVOutputFormat *file_oformat;
70 static AVImageFormat *image_format;
71 static int frame_width = 160;
72 static int frame_height = 128;
73 static float frame_aspect_ratio = 0;
74 static enum PixelFormat frame_pix_fmt = PIX_FMT_YUV420P;
75 static int frame_padtop = 0;
76 static int frame_padbottom = 0;
77 static int frame_padleft = 0;
78 static int frame_padright = 0;
79 static int padcolor[3] = {16,128,128}; /* default to black */
80 static int frame_topBand = 0;
81 static int frame_bottomBand = 0;
82 static int frame_leftBand = 0;
83 static int frame_rightBand = 0;
84 static int frame_rate = 25;
85 static int frame_rate_base = 1;
86 static int video_bit_rate = 200*1000;
87 static int video_bit_rate_tolerance = 4000*1000;
88 static float video_qscale = 0;
89 static int video_qmin = 2;
90 static int video_qmax = 31;
91 static int video_mb_qmin = 2;
92 static int video_mb_qmax = 31;
93 static int video_qdiff = 3;
94 static float video_qblur = 0.5;
95 static float video_qcomp = 0.5;
96 static uint16_t *intra_matrix = NULL;
97 static uint16_t *inter_matrix = NULL;
98 #if 0 //experimental, (can be removed)
99 static float video_rc_qsquish=1.0;
100 static float video_rc_qmod_amp=0;
101 static int video_rc_qmod_freq=0;
103 static char *video_rc_override_string=NULL;
104 static char *video_rc_eq="tex^qComp";
105 static int video_rc_buffer_size=0;
106 static float video_rc_buffer_aggressivity=1.0;
107 static int video_rc_max_rate=0;
108 static int video_rc_min_rate=0;
109 static float video_rc_initial_cplx=0;
110 static float video_b_qfactor = 1.25;
111 static float video_b_qoffset = 1.25;
112 static float video_i_qfactor = -0.8;
113 static float video_i_qoffset = 0.0;
114 static int video_intra_quant_bias= FF_DEFAULT_QUANT_BIAS;
115 static int video_inter_quant_bias= FF_DEFAULT_QUANT_BIAS;
116 static int me_method = ME_EPZS;
117 static int video_disable = 0;
118 static int video_codec_id = CODEC_ID_NONE;
119 static int same_quality = 0;
120 static int b_frames = 0;
121 static int mb_decision = FF_MB_DECISION_SIMPLE;
122 static int ildct_cmp = FF_CMP_VSAD;
123 static int mb_cmp = FF_CMP_SAD;
124 static int sub_cmp = FF_CMP_SAD;
125 static int cmp = FF_CMP_SAD;
126 static int pre_cmp = FF_CMP_SAD;
127 static int pre_me = 0;
128 static float lumi_mask = 0;
129 static float dark_mask = 0;
130 static float scplx_mask = 0;
131 static float tcplx_mask = 0;
132 static float p_mask = 0;
133 static int use_4mv = 0;
134 static int use_obmc = 0;
135 static int use_loop = 0;
136 static int use_aic = 0;
137 static int use_aiv = 0;
138 static int use_umv = 0;
139 static int use_ss = 0;
140 static int use_alt_scan = 0;
141 static int use_trell = 0;
142 static int use_scan_offset = 0;
144 static int closed_gop = 0;
145 static int do_deinterlace = 0;
146 static int do_interlace_dct = 0;
147 static int do_interlace_me = 0;
148 static int workaround_bugs = FF_BUG_AUTODETECT;
149 static int error_resilience = 2;
150 static int error_concealment = 3;
151 static int dct_algo = 0;
152 static int idct_algo = 0;
153 static int use_part = 0;
154 static int packet_size = 0;
155 static int error_rate = 0;
156 static int strict = 0;
157 static int top_field_first = -1;
158 static int noise_reduction = 0;
159 static int sc_threshold = 0;
160 static int debug = 0;
161 static int debug_mv = 0;
162 extern int loop_input; /* currently a hack */
164 static int gop_size = 12;
165 static int intra_only = 0;
166 static int audio_sample_rate = 44100;
167 static int audio_bit_rate = 64000;
168 static int audio_disable = 0;
169 static int audio_channels = 1;
170 static int audio_codec_id = CODEC_ID_NONE;
172 static int64_t recording_time = 0;
173 static int64_t start_time = 0;
174 static int64_t rec_timestamp = 0;
175 static int file_overwrite = 0;
176 static char *str_title = NULL;
177 static char *str_author = NULL;
178 static char *str_copyright = NULL;
179 static char *str_comment = NULL;
180 static int do_benchmark = 0;
181 static int do_hex_dump = 0;
182 static int do_pkt_dump = 0;
183 static int do_psnr = 0;
184 static int do_vstats = 0;
185 static int do_pass = 0;
186 static int bitexact = 0;
187 static char *pass_logfilename = NULL;
188 static int audio_stream_copy = 0;
189 static int video_stream_copy = 0;
191 static int rate_emu = 0;
193 static char *video_grab_format = "video4linux";
194 static char *video_device = NULL;
195 static int video_channel = 0;
196 static char *video_standard = "ntsc";
198 static char *audio_grab_format = "audio_device";
199 static char *audio_device = NULL;
201 static int using_stdin = 0;
202 static int using_vhook = 0;
203 static int verbose = 1;
204 static int thread_count= 1;
205 static int q_pressed = 0;
206 static int64_t video_size = 0;
207 static int64_t audio_size = 0;
208 static int64_t extra_size = 0;
210 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
212 typedef struct AVOutputStream {
213 int file_index; /* file index */
214 int index; /* stream index in the output file */
215 int source_index; /* AVInputStream index */
216 AVStream *st; /* stream in the output file */
217 int encoding_needed; /* true if encoding needed for this stream */
219 /* input pts and corresponding output pts
222 double sync_ipts_offset;
225 int video_resample; /* video_resample and video_crop are mutually exclusive */
226 AVFrame pict_tmp; /* temporary image for resampling */
227 ImgReSampleContext *img_resample_ctx; /* for image resampling */
229 int video_crop; /* video_resample and video_crop are mutually exclusive */
230 int topBand; /* cropping area sizes */
233 int video_pad; /* video_resample and video_pad are mutually exclusive */
234 int padtop; /* padding area sizes */
241 ReSampleContext *resample; /* for audio resampling */
242 FifoBuffer fifo; /* for compression: one audio fifo per codec */
246 typedef struct AVInputStream {
250 int discard; /* true if stream data should be discarded */
251 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
252 int64_t sample_index; /* current sample */
254 int64_t start; /* time when read started */
255 unsigned long frame; /* current frame */
256 int64_t next_pts; /* synthetic pts for cases where pkt.pts
258 int64_t pts; /* current pts */
261 typedef struct AVInputFile {
262 int eof_reached; /* true if eof reached */
263 int ist_index; /* index of first stream in ist_table */
264 int buffer_size; /* current total buffer size */
265 int buffer_size_max; /* buffer size at which we consider we can stop
267 int nb_streams; /* nb streams we are aware of */
272 /* init terminal so that we can grab keys */
273 static struct termios oldtty;
275 static void term_exit(void)
277 tcsetattr (0, TCSANOW, &oldtty);
280 static volatile sig_atomic_t received_sigterm = 0;
283 sigterm_handler(int sig)
285 received_sigterm = sig;
289 static void term_init(void)
296 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
297 |INLCR|IGNCR|ICRNL|IXON);
298 tty.c_oflag |= OPOST;
299 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
300 tty.c_cflag &= ~(CSIZE|PARENB);
305 tcsetattr (0, TCSANOW, &tty);
307 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
308 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
309 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
311 register a function to be called at normal program termination
314 #ifdef CONFIG_BEOS_NETSERVER
315 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
319 /* read a key without blocking */
320 static int read_key(void)
324 #ifndef CONFIG_BEOS_NETSERVER
332 n = select(1, &rfds, NULL, NULL, &tv);
344 static int decode_interrupt_cb(void)
346 return q_pressed || (q_pressed = read_key() == 'q');
351 static volatile int received_sigterm = 0;
353 /* no interactive support */
354 static void term_exit(void)
358 static void term_init(void)
362 static int read_key(void)
369 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
374 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
377 /* copy stream format */
378 s->nb_streams = ic->nb_streams;
379 for(i=0;i<ic->nb_streams;i++) {
382 st = av_mallocz(sizeof(AVStream));
383 memcpy(st, ic->streams[i], sizeof(AVStream));
387 av_close_input_file(ic);
391 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
393 static void do_audio_out(AVFormatContext *s,
396 unsigned char *buf, int size)
399 static uint8_t *audio_buf = NULL;
400 static uint8_t *audio_out = NULL;
401 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
403 int size_out, frame_bytes, ret;
406 /* SC: dynamic allocation of buffers */
408 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
410 audio_out = av_malloc(audio_out_size);
411 if (!audio_buf || !audio_out)
412 return; /* Should signal an error ! */
415 enc = &ost->st->codec;
417 if (ost->audio_resample) {
419 size_out = audio_resample(ost->resample,
420 (short *)buftmp, (short *)buf,
421 size / (ist->st->codec.channels * 2));
422 size_out = size_out * enc->channels * 2;
428 /* now encode as many frames as possible */
429 if (enc->frame_size > 1) {
430 /* output resampled raw samples */
431 fifo_write(&ost->fifo, buftmp, size_out,
434 frame_bytes = enc->frame_size * 2 * enc->channels;
436 while (fifo_read(&ost->fifo, audio_buf, frame_bytes,
437 &ost->fifo.rptr) == 0) {
438 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
441 av_write_frame(s, ost->index, audio_out, ret);
444 /* output a pcm frame */
445 /* XXX: change encoding codec API to avoid this ? */
446 switch(enc->codec->id) {
447 case CODEC_ID_PCM_S16LE:
448 case CODEC_ID_PCM_S16BE:
449 case CODEC_ID_PCM_U16LE:
450 case CODEC_ID_PCM_U16BE:
453 size_out = size_out >> 1;
456 ret = avcodec_encode_audio(enc, audio_out, size_out,
459 av_write_frame(s, ost->index, audio_out, ret);
463 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
467 AVPicture picture_tmp;
470 dec = &ist->st->codec;
472 /* deinterlace : must be done before any resize */
473 if (do_deinterlace || using_vhook) {
476 /* create temporary picture */
477 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
478 buf = av_malloc(size);
482 picture2 = &picture_tmp;
483 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
486 if(avpicture_deinterlace(picture2, picture,
487 dec->pix_fmt, dec->width, dec->height) < 0) {
488 /* if error, do not deinterlace */
494 if (img_convert(picture2, dec->pix_fmt, picture,
495 dec->pix_fmt, dec->width, dec->height) < 0) {
496 /* if error, do not copy */
506 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
508 if (picture != picture2)
509 *picture = *picture2;
513 /* we begin to correct av delay at this threshold */
514 #define AV_DELAY_MAX 0.100
517 /* Expects img to be yuv420 */
518 static void fill_pad_region(AVPicture* img, int height, int width,
519 int padtop, int padbottom, int padleft, int padright, int *color) {
524 for (i = 0; i < 3; i++) {
525 shift = (i == 0) ? 0 : 1;
527 if (padtop || padleft) {
528 memset(img->data[i], color[i], (((img->linesize[i] * padtop) +
532 if (padleft || padright) {
533 optr = img->data[i] + (img->linesize[i] * (padtop >> shift)) +
534 (img->linesize[i] - (padright >> shift));
536 for (y = 0; y < ((height - (padtop + padbottom)) >> shift); y++) {
537 memset(optr, color[i], (padleft + padright) >> shift);
538 optr += img->linesize[i];
543 optr = img->data[i] + (img->linesize[i] * ((height - padbottom) >> shift));
544 memset(optr, color[i], ((img->linesize[i] * padbottom) >> shift));
550 static void do_video_out(AVFormatContext *s,
554 int *frame_size, AVOutputStream *audio_sync)
556 int nb_frames, i, ret;
557 AVFrame *final_picture, *formatted_picture;
558 AVFrame picture_format_temp, picture_crop_temp;
559 static uint8_t *video_buffer= NULL;
560 uint8_t *buf = NULL, *buf1 = NULL;
561 AVCodecContext *enc, *dec;
562 enum PixelFormat target_pixfmt;
564 #define VIDEO_BUFFER_SIZE (1024*1024)
566 avcodec_get_frame_defaults(&picture_format_temp);
567 avcodec_get_frame_defaults(&picture_crop_temp);
569 enc = &ost->st->codec;
570 dec = &ist->st->codec;
572 /* by default, we output a single frame */
577 /* NOTE: the A/V sync is always done by considering the audio is
578 the master clock. It is suffisant for transcoding or playing,
579 but not for the general case */
581 /* compute the A-V delay and duplicate/remove frames if needed */
582 double adelta, vdelta, av_delay;
584 adelta = audio_sync->sync_ipts - ((double)audio_sync->sync_opts *
585 s->pts_num / s->pts_den);
587 vdelta = ost->sync_ipts - ((double)ost->sync_opts *
588 s->pts_num / s->pts_den);
590 av_delay = adelta - vdelta;
591 // printf("delay=%f\n", av_delay);
592 if (av_delay < -AV_DELAY_MAX)
594 else if (av_delay > AV_DELAY_MAX)
599 vdelta = (double)(ost->st->pts.val) * s->pts_num / s->pts_den - (ost->sync_ipts - ost->sync_ipts_offset);
600 if (vdelta < 100 && vdelta > -100 && ost->sync_ipts_offset) {
601 if (vdelta < -AV_DELAY_MAX)
603 else if (vdelta > AV_DELAY_MAX)
606 ost->sync_ipts_offset -= vdelta;
607 if (!ost->sync_ipts_offset)
608 ost->sync_ipts_offset = 0.000001; /* one microsecond */
612 #if defined(AVSYNC_DEBUG)
614 static char *action[] = { "drop frame", "copy frame", "dup frame" };
615 if (audio_sync && verbose >=0) {
616 fprintf(stderr, "Input APTS %12.6f, output APTS %12.6f, ",
617 (double) audio_sync->sync_ipts,
618 (double) audio_sync->st->pts.val * s->pts_num / s->pts_den);
619 fprintf(stderr, "Input VPTS %12.6f, output VPTS %12.6f: %s\n",
620 (double) ost->sync_ipts,
621 (double) ost->st->pts.val * s->pts_num / s->pts_den,
631 video_buffer = av_malloc(VIDEO_BUFFER_SIZE);
635 /* convert pixel format if needed */
636 target_pixfmt = ost->video_resample || ost->video_pad
637 ? PIX_FMT_YUV420P : enc->pix_fmt;
638 if (dec->pix_fmt != target_pixfmt) {
641 /* create temporary picture */
642 size = avpicture_get_size(target_pixfmt, dec->width, dec->height);
643 buf = av_malloc(size);
646 formatted_picture = &picture_format_temp;
647 avpicture_fill((AVPicture*)formatted_picture, buf, target_pixfmt, dec->width, dec->height);
649 if (img_convert((AVPicture*)formatted_picture, target_pixfmt,
650 (AVPicture *)in_picture, dec->pix_fmt,
651 dec->width, dec->height) < 0) {
654 fprintf(stderr, "pixel format conversion not handled\n");
659 formatted_picture = in_picture;
662 /* XXX: resampling could be done before raw format conversion in
663 some cases to go faster */
664 /* XXX: only works for YUV420P */
665 if (ost->video_resample) {
666 final_picture = &ost->pict_tmp;
667 img_resample(ost->img_resample_ctx, (AVPicture*)final_picture, (AVPicture*)formatted_picture);
669 if (ost->padtop || ost->padbottom || ost->padleft || ost->padright) {
670 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
671 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
675 if (enc->pix_fmt != PIX_FMT_YUV420P) {
679 /* create temporary picture */
680 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
681 buf = av_malloc(size);
684 final_picture = &picture_format_temp;
685 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
687 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
688 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
689 enc->width, enc->height) < 0) {
692 fprintf(stderr, "pixel format conversion not handled\n");
697 } else if (ost->video_crop) {
698 picture_crop_temp.data[0] = formatted_picture->data[0] +
699 (ost->topBand * formatted_picture->linesize[0]) + ost->leftBand;
701 picture_crop_temp.data[1] = formatted_picture->data[1] +
702 ((ost->topBand >> 1) * formatted_picture->linesize[1]) +
703 (ost->leftBand >> 1);
705 picture_crop_temp.data[2] = formatted_picture->data[2] +
706 ((ost->topBand >> 1) * formatted_picture->linesize[2]) +
707 (ost->leftBand >> 1);
709 picture_crop_temp.linesize[0] = formatted_picture->linesize[0];
710 picture_crop_temp.linesize[1] = formatted_picture->linesize[1];
711 picture_crop_temp.linesize[2] = formatted_picture->linesize[2];
712 final_picture = &picture_crop_temp;
713 } else if (ost->video_pad) {
714 final_picture = &ost->pict_tmp;
716 for (i = 0; i < 3; i++) {
717 uint8_t *optr, *iptr;
718 int shift = (i == 0) ? 0 : 1;
721 /* set offset to start writing image into */
722 optr = final_picture->data[i] + (((final_picture->linesize[i] *
723 ost->padtop) + ost->padleft) >> shift);
724 iptr = formatted_picture->data[i];
726 yheight = (enc->height - ost->padtop - ost->padbottom) >> shift;
727 for (y = 0; y < yheight; y++) {
728 /* copy unpadded image row into padded image row */
729 memcpy(optr, iptr, formatted_picture->linesize[i]);
730 optr += final_picture->linesize[i];
731 iptr += formatted_picture->linesize[i];
735 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
736 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
739 if (enc->pix_fmt != PIX_FMT_YUV420P) {
743 /* create temporary picture */
744 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
745 buf = av_malloc(size);
748 final_picture = &picture_format_temp;
749 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
751 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
752 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
753 enc->width, enc->height) < 0) {
756 fprintf(stderr, "pixel format conversion not handled\n");
762 final_picture = formatted_picture;
764 /* duplicates frame if needed */
765 /* XXX: pb because no interleaving */
766 for(i=0;i<nb_frames;i++) {
767 if (s->oformat->flags & AVFMT_RAWPICTURE) {
768 /* raw pictures are written as AVPicture structure to
769 avoid any copies. We support temorarily the older
771 AVFrame* old_frame = enc->coded_frame;
772 enc->coded_frame = dec->coded_frame;
773 av_write_frame(s, ost->index,
774 (uint8_t *)final_picture, sizeof(AVPicture));
775 enc->coded_frame = old_frame;
779 big_picture= *final_picture;
780 /* better than nothing: use input picture interlaced
782 big_picture.interlaced_frame = in_picture->interlaced_frame;
783 if(do_interlace_me || do_interlace_dct){
784 if(top_field_first == -1)
785 big_picture.top_field_first = in_picture->top_field_first;
787 big_picture.top_field_first = 1;
790 /* handles sameq here. This is not correct because it may
791 not be a global option */
793 big_picture.quality = ist->st->quality;
795 big_picture.quality = ost->st->quality;
796 big_picture.pict_type = 0;
797 ret = avcodec_encode_video(enc,
798 video_buffer, VIDEO_BUFFER_SIZE,
800 //enc->frame_number = enc->real_pict_num;
801 av_write_frame(s, ost->index, video_buffer, ret);
803 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
804 // enc->frame_number-1, enc->real_pict_num, ret,
806 /* if two pass, output log */
807 if (ost->logfile && enc->stats_out) {
808 fprintf(ost->logfile, "%s", enc->stats_out);
818 static double psnr(double d){
819 if(d==0) return INFINITY;
820 return -10.0*log(d)/log(10.0);
823 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
826 static FILE *fvstats=NULL;
833 double ti1, bitrate, avg_bitrate;
837 today = localtime(&today2);
838 sprintf(filename, "vstats_%02d%02d%02d.log", today->tm_hour,
841 fvstats = fopen(filename,"w");
849 enc = &ost->st->codec;
850 if (enc->codec_type == CODEC_TYPE_VIDEO) {
851 frame_number = ost->frame_number;
852 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
853 if (enc->flags&CODEC_FLAG_PSNR)
854 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
856 fprintf(fvstats,"f_size= %6d ", frame_size);
857 /* compute pts value */
858 ti1 = (double)ost->st->pts.val * os->pts_num / os->pts_den;
862 bitrate = (double)(frame_size * 8) * enc->frame_rate / enc->frame_rate_base / 1000.0;
863 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
864 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
865 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
866 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
870 static void print_report(AVFormatContext **output_files,
871 AVOutputStream **ost_table, int nb_ostreams,
876 AVFormatContext *oc, *os;
879 int frame_number, vid, i;
880 double bitrate, ti1, pts;
881 static int64_t last_time = -1;
883 if (!is_last_report) {
885 /* display the report every 0.5 seconds */
886 cur_time = av_gettime();
887 if (last_time == -1) {
888 last_time = cur_time;
891 if ((cur_time - last_time) < 500000)
893 last_time = cur_time;
897 oc = output_files[0];
899 total_size = url_ftell(&oc->pb);
904 for(i=0;i<nb_ostreams;i++) {
906 os = output_files[ost->file_index];
907 enc = &ost->st->codec;
908 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
909 sprintf(buf + strlen(buf), "q=%2.1f ",
910 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
912 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
913 frame_number = ost->frame_number;
914 sprintf(buf + strlen(buf), "frame=%5d q=%2.1f ",
915 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : 0);
917 sprintf(buf + strlen(buf), "L");
918 if (enc->flags&CODEC_FLAG_PSNR){
920 double error, error_sum=0;
921 double scale, scale_sum=0;
922 char type[3]= {'Y','U','V'};
923 sprintf(buf + strlen(buf), "PSNR=");
926 error= enc->error[j];
927 scale= enc->width*enc->height*255.0*255.0*frame_number;
929 error= enc->coded_frame->error[j];
930 scale= enc->width*enc->height*255.0*255.0;
935 sprintf(buf + strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
937 sprintf(buf + strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
941 /* compute min output value */
942 pts = (double)ost->st->pts.val * os->pts_num / os->pts_den;
943 if ((pts < ti1) && (pts > 0))
949 if (verbose || is_last_report) {
950 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
952 sprintf(buf + strlen(buf),
953 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
954 (double)total_size / 1024, ti1, bitrate);
957 fprintf(stderr, "%s \r", buf);
962 if (is_last_report && verbose >= 0){
963 int64_t raw= audio_size + video_size + extra_size;
964 fprintf(stderr, "\n");
965 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
969 100.0*(total_size - raw)/raw
974 /* pkt = NULL means EOF (needed to flush decoder buffers) */
975 static int output_packet(AVInputStream *ist, int ist_index,
976 AVOutputStream **ost_table, int nb_ostreams,
984 int data_size, got_picture;
986 short samples[AVCODEC_MAX_AUDIO_FRAME_SIZE / 2];
987 void *buffer_to_free;
989 if (pkt && pkt->pts != AV_NOPTS_VALUE) {
992 ist->pts = ist->next_pts;
1006 /* decode the packet if needed */
1007 data_buf = NULL; /* fail safe */
1009 if (ist->decoding_needed) {
1010 switch(ist->st->codec.codec_type) {
1011 case CODEC_TYPE_AUDIO:
1012 /* XXX: could avoid copy if PCM 16 bits with same
1013 endianness as CPU */
1014 ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size,
1020 /* Some bug in mpeg audio decoder gives */
1021 /* data_size < 0, it seems they are overflows */
1022 if (data_size <= 0) {
1023 /* no audio frame */
1026 data_buf = (uint8_t *)samples;
1027 ist->next_pts += ((int64_t)AV_TIME_BASE * data_size) /
1028 (2 * ist->st->codec.channels);
1030 case CODEC_TYPE_VIDEO:
1031 data_size = (ist->st->codec.width * ist->st->codec.height * 3) / 2;
1032 /* XXX: allocate picture correctly */
1033 avcodec_get_frame_defaults(&picture);
1035 ret = avcodec_decode_video(&ist->st->codec,
1036 &picture, &got_picture, ptr, len);
1037 ist->st->quality= picture.quality;
1041 /* no picture yet */
1042 goto discard_packet;
1044 if (ist->st->codec.frame_rate_base != 0) {
1045 ist->next_pts += ((int64_t)AV_TIME_BASE *
1046 ist->st->codec.frame_rate_base) /
1047 ist->st->codec.frame_rate;
1061 buffer_to_free = NULL;
1062 if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1063 pre_process_video_frame(ist, (AVPicture *)&picture,
1067 /* frame rate emulation */
1068 if (ist->st->codec.rate_emu) {
1069 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec.frame_rate_base, 1000000, ist->st->codec.frame_rate);
1070 int64_t now = av_gettime() - ist->start;
1078 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1079 is the one of the next displayed one */
1080 /* XXX: add mpeg4 too ? */
1081 if (ist->st->codec.codec_id == CODEC_ID_MPEG1VIDEO) {
1082 if (ist->st->codec.pict_type != B_TYPE) {
1084 tmp = ist->last_ip_pts;
1085 ist->last_ip_pts = ist->frac_pts.val;
1086 ist->frac_pts.val = tmp;
1090 /* if output time reached then transcode raw format,
1091 encode packets and output them */
1092 if (start_time == 0 || ist->pts >= start_time)
1093 for(i=0;i<nb_ostreams;i++) {
1097 if (ost->source_index == ist_index) {
1098 os = output_files[ost->file_index];
1101 printf("%d: got pts=%0.3f %0.3f\n", i,
1102 (double)pkt->pts / AV_TIME_BASE,
1103 ((double)ist->pts / AV_TIME_BASE) -
1104 ((double)ost->st->pts.val * os->pts_num / os->pts_den));
1106 /* set the input output pts pairs */
1107 ost->sync_ipts = (double)ist->pts / AV_TIME_BASE;
1108 /* XXX: take into account the various fifos,
1109 in particular for audio */
1110 ost->sync_opts = ost->st->pts.val;
1111 //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);
1113 if (ost->encoding_needed) {
1114 switch(ost->st->codec.codec_type) {
1115 case CODEC_TYPE_AUDIO:
1116 do_audio_out(os, ost, ist, data_buf, data_size);
1118 case CODEC_TYPE_VIDEO:
1119 /* find an audio stream for synchro */
1122 AVOutputStream *audio_sync, *ost1;
1124 for(i=0;i<nb_ostreams;i++) {
1125 ost1 = ost_table[i];
1126 if (ost1->file_index == ost->file_index &&
1127 ost1->st->codec.codec_type == CODEC_TYPE_AUDIO) {
1133 do_video_out(os, ost, ist, &picture, &frame_size, audio_sync);
1134 video_size += frame_size;
1135 if (do_vstats && frame_size)
1136 do_video_stats(os, ost, frame_size);
1145 /* no reencoding needed : output the packet directly */
1146 /* force the input stream PTS */
1148 avcodec_get_frame_defaults(&avframe);
1149 ost->st->codec.coded_frame= &avframe;
1150 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1151 ost->st->pts.val= av_rescale(ist->pts, os->pts_den, os->pts_num*AV_TIME_BASE);
1153 av_write_frame(os, ost->index, data_buf, data_size);
1154 ost->st->codec.frame_number++;
1155 ost->frame_number++;
1159 av_free(buffer_to_free);
1169 * The following code is the main loop of the file converter
1171 static int av_encode(AVFormatContext **output_files,
1172 int nb_output_files,
1173 AVFormatContext **input_files,
1175 AVStreamMap *stream_maps, int nb_stream_maps)
1177 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1178 AVFormatContext *is, *os;
1179 AVCodecContext *codec, *icodec;
1180 AVOutputStream *ost, **ost_table = NULL;
1181 AVInputStream *ist, **ist_table = NULL;
1182 AVInputFile *file_table;
1183 AVFormatContext *stream_no_data;
1186 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1190 /* input stream init */
1192 for(i=0;i<nb_input_files;i++) {
1193 is = input_files[i];
1194 file_table[i].ist_index = j;
1195 file_table[i].nb_streams = is->nb_streams;
1196 j += is->nb_streams;
1200 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1204 for(i=0;i<nb_istreams;i++) {
1205 ist = av_mallocz(sizeof(AVInputStream));
1211 for(i=0;i<nb_input_files;i++) {
1212 is = input_files[i];
1213 for(k=0;k<is->nb_streams;k++) {
1214 ist = ist_table[j++];
1215 ist->st = is->streams[k];
1216 ist->file_index = i;
1218 ist->discard = 1; /* the stream is discarded by default
1221 if (ist->st->codec.rate_emu) {
1222 ist->start = av_gettime();
1228 /* output stream init */
1230 for(i=0;i<nb_output_files;i++) {
1231 os = output_files[i];
1232 nb_ostreams += os->nb_streams;
1234 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1235 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1239 /* Sanity check the mapping args -- do the input files & streams exist? */
1240 for(i=0;i<nb_stream_maps;i++) {
1241 int fi = stream_maps[i].file_index;
1242 int si = stream_maps[i].stream_index;
1244 if (fi < 0 || fi > nb_input_files - 1 ||
1245 si < 0 || si > file_table[fi].nb_streams - 1) {
1246 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1251 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1254 for(i=0;i<nb_ostreams;i++) {
1255 ost = av_mallocz(sizeof(AVOutputStream));
1262 for(k=0;k<nb_output_files;k++) {
1263 os = output_files[k];
1264 for(i=0;i<os->nb_streams;i++) {
1266 ost = ost_table[n++];
1267 ost->file_index = k;
1269 ost->st = os->streams[i];
1270 if (nb_stream_maps > 0) {
1271 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1272 stream_maps[n-1].stream_index;
1274 /* Sanity check that the stream types match */
1275 if (ist_table[ost->source_index]->st->codec.codec_type != ost->st->codec.codec_type) {
1276 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1277 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1278 ost->file_index, ost->index);
1283 /* get corresponding input stream index : we select the first one with the right type */
1285 for(j=0;j<nb_istreams;j++) {
1288 ist->st->codec.codec_type == ost->st->codec.codec_type) {
1289 ost->source_index = j;
1295 /* try again and reuse existing stream */
1296 for(j=0;j<nb_istreams;j++) {
1298 if (ist->st->codec.codec_type == ost->st->codec.codec_type) {
1299 ost->source_index = j;
1304 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1305 ost->file_index, ost->index);
1310 ist = ist_table[ost->source_index];
1315 /* for each output stream, we compute the right encoding parameters */
1316 for(i=0;i<nb_ostreams;i++) {
1318 ist = ist_table[ost->source_index];
1320 codec = &ost->st->codec;
1321 icodec = &ist->st->codec;
1323 if (ost->st->stream_copy) {
1324 /* if stream_copy is selected, no need to decode or encode */
1325 codec->codec_id = icodec->codec_id;
1326 codec->codec_type = icodec->codec_type;
1327 codec->codec_tag = icodec->codec_tag;
1328 codec->bit_rate = icodec->bit_rate;
1329 switch(codec->codec_type) {
1330 case CODEC_TYPE_AUDIO:
1331 codec->sample_rate = icodec->sample_rate;
1332 codec->channels = icodec->channels;
1333 codec->frame_size = icodec->frame_size;
1335 case CODEC_TYPE_VIDEO:
1336 codec->frame_rate = icodec->frame_rate;
1337 codec->frame_rate_base = icodec->frame_rate_base;
1338 codec->width = icodec->width;
1339 codec->height = icodec->height;
1345 switch(codec->codec_type) {
1346 case CODEC_TYPE_AUDIO:
1347 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1350 if (codec->channels == icodec->channels &&
1351 codec->sample_rate == icodec->sample_rate) {
1352 ost->audio_resample = 0;
1354 if (codec->channels != icodec->channels &&
1355 icodec->codec_id == CODEC_ID_AC3) {
1356 /* Special case for 5:1 AC3 input */
1357 /* and mono or stereo output */
1358 /* Request specific number of channels */
1359 icodec->channels = codec->channels;
1360 if (codec->sample_rate == icodec->sample_rate)
1361 ost->audio_resample = 0;
1363 ost->audio_resample = 1;
1364 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1366 icodec->sample_rate);
1369 printf("Can't resample. Aborting.\n");
1373 /* Request specific number of channels */
1374 icodec->channels = codec->channels;
1376 ost->audio_resample = 1;
1377 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1379 icodec->sample_rate);
1382 printf("Can't resample. Aborting.\n");
1387 ist->decoding_needed = 1;
1388 ost->encoding_needed = 1;
1390 case CODEC_TYPE_VIDEO:
1391 if (codec->width == icodec->width &&
1392 codec->height == icodec->height &&
1393 frame_topBand == 0 &&
1394 frame_bottomBand == 0 &&
1395 frame_leftBand == 0 &&
1396 frame_rightBand == 0 &&
1397 frame_padtop == 0 &&
1398 frame_padbottom == 0 &&
1399 frame_padleft == 0 &&
1400 frame_padright == 0)
1402 ost->video_resample = 0;
1403 ost->video_crop = 0;
1405 } else if ((codec->width == icodec->width -
1406 (frame_leftBand + frame_rightBand)) &&
1407 (codec->height == icodec->height -
1408 (frame_topBand + frame_bottomBand)))
1410 ost->video_resample = 0;
1411 ost->video_crop = 1;
1412 ost->topBand = frame_topBand;
1413 ost->leftBand = frame_leftBand;
1414 } else if ((codec->width == icodec->width +
1415 (frame_padleft + frame_padright)) &&
1416 (codec->height == icodec->height +
1417 (frame_padtop + frame_padbottom))) {
1418 ost->video_resample = 0;
1419 ost->video_crop = 0;
1421 ost->padtop = frame_padtop;
1422 ost->padleft = frame_padleft;
1423 ost->padbottom = frame_padbottom;
1424 ost->padright = frame_padright;
1425 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1426 codec->width, codec->height ) )
1429 ost->video_resample = 1;
1430 ost->video_crop = 0; // cropping is handled as part of resample
1431 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1432 codec->width, codec->height ) )
1434 avcodec_get_frame_defaults(&ost->pict_tmp);
1436 ost->img_resample_ctx = img_resample_full_init(
1437 ost->st->codec.width, ost->st->codec.height,
1438 ist->st->codec.width, ist->st->codec.height,
1439 frame_topBand, frame_bottomBand,
1440 frame_leftBand, frame_rightBand,
1441 frame_padtop, frame_padbottom,
1442 frame_padleft, frame_padright);
1444 ost->padtop = frame_padtop;
1445 ost->padleft = frame_padleft;
1446 ost->padbottom = frame_padbottom;
1447 ost->padright = frame_padright;
1450 ost->encoding_needed = 1;
1451 ist->decoding_needed = 1;
1457 if (ost->encoding_needed &&
1458 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1459 char logfilename[1024];
1464 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1466 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1467 if (codec->flags & CODEC_FLAG_PASS1) {
1468 f = fopen(logfilename, "w");
1470 perror(logfilename);
1475 /* read the log file */
1476 f = fopen(logfilename, "r");
1478 perror(logfilename);
1481 fseek(f, 0, SEEK_END);
1483 fseek(f, 0, SEEK_SET);
1484 logbuffer = av_malloc(size + 1);
1486 fprintf(stderr, "Could not allocate log buffer\n");
1489 size = fread(logbuffer, 1, size, f);
1491 logbuffer[size] = '\0';
1492 codec->stats_in = logbuffer;
1498 /* dump the file output parameters - cannot be done before in case
1500 for(i=0;i<nb_output_files;i++) {
1501 dump_format(output_files[i], i, output_files[i]->filename, 1);
1504 /* dump the stream mapping */
1506 fprintf(stderr, "Stream mapping:\n");
1507 for(i=0;i<nb_ostreams;i++) {
1509 fprintf(stderr, " Stream #%d.%d -> #%d.%d\n",
1510 ist_table[ost->source_index]->file_index,
1511 ist_table[ost->source_index]->index,
1517 /* open each encoder */
1518 for(i=0;i<nb_ostreams;i++) {
1520 if (ost->encoding_needed) {
1522 codec = avcodec_find_encoder(ost->st->codec.codec_id);
1524 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1525 ost->file_index, ost->index);
1528 if (avcodec_open(&ost->st->codec, codec) < 0) {
1529 fprintf(stderr, "Error while opening codec for stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1530 ost->file_index, ost->index);
1533 extra_size += ost->st->codec.extradata_size;
1537 /* open each decoder */
1538 for(i=0;i<nb_istreams;i++) {
1540 if (ist->decoding_needed) {
1542 codec = avcodec_find_decoder(ist->st->codec.codec_id);
1544 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1545 ist->st->codec.codec_id, ist->file_index, ist->index);
1548 if (avcodec_open(&ist->st->codec, codec) < 0) {
1549 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1550 ist->file_index, ist->index);
1553 //if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO)
1554 // ist->st->codec.flags |= CODEC_FLAG_REPEAT_FIELD;
1559 for(i=0;i<nb_istreams;i++) {
1561 is = input_files[ist->file_index];
1566 /* compute buffer size max (should use a complete heuristic) */
1567 for(i=0;i<nb_input_files;i++) {
1568 file_table[i].buffer_size_max = 2048;
1571 /* open files and write file headers */
1572 for(i=0;i<nb_output_files;i++) {
1573 os = output_files[i];
1574 if (av_write_header(os) < 0) {
1575 fprintf(stderr, "Could not write header for output file #%d (incorrect codec paramters ?)\n", i);
1581 #ifndef CONFIG_WIN32
1582 if ( !using_stdin && verbose >= 0) {
1583 fprintf(stderr, "Press [q] to stop encoding\n");
1584 url_set_interrupt_cb(decode_interrupt_cb);
1592 for(; received_sigterm == 0;) {
1593 int file_index, ist_index;
1598 /* if 'q' pressed, exits */
1602 /* read_key() returns 0 on EOF */
1608 /* select the stream that we must read now by looking at the
1609 smallest output pts */
1612 for(i=0;i<nb_ostreams;i++) {
1615 os = output_files[ost->file_index];
1616 ist = ist_table[ost->source_index];
1617 pts = (double)ost->st->pts.val * os->pts_num / os->pts_den;
1618 if (!file_table[ist->file_index].eof_reached &&
1621 file_index = ist->file_index;
1624 /* if none, if is finished */
1625 if (file_index < 0) {
1629 /* finish if recording time exhausted */
1630 if (recording_time > 0 && pts_min >= (recording_time / 1000000.0))
1633 /* read a frame from it and output it in the fifo */
1634 is = input_files[file_index];
1635 if (av_read_frame(is, &pkt) < 0) {
1636 file_table[file_index].eof_reached = 1;
1641 stream_no_data = is;
1646 av_pkt_dump(stdout, &pkt, do_hex_dump);
1648 /* the following test is needed in case new streams appear
1649 dynamically in stream : we ignore them */
1650 if (pkt.stream_index >= file_table[file_index].nb_streams)
1651 goto discard_packet;
1652 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1653 ist = ist_table[ist_index];
1655 goto discard_packet;
1657 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1658 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1661 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1662 ist->file_index, ist->index);
1664 av_free_packet(&pkt);
1669 av_free_packet(&pkt);
1671 /* dump report by using the output first video and audio streams */
1672 print_report(output_files, ost_table, nb_ostreams, 0);
1675 /* at the end of stream, we must flush the decoder buffers */
1676 for(i=0;i<nb_istreams;i++) {
1678 if (ist->decoding_needed) {
1679 output_packet(ist, i, ost_table, nb_ostreams, NULL);
1685 /* write the trailer if needed and close file */
1686 for(i=0;i<nb_output_files;i++) {
1687 os = output_files[i];
1688 av_write_trailer(os);
1691 /* dump report by using the first video and audio streams */
1692 print_report(output_files, ost_table, nb_ostreams, 1);
1694 /* close each encoder */
1695 for(i=0;i<nb_ostreams;i++) {
1697 if (ost->encoding_needed) {
1698 av_freep(&ost->st->codec.stats_in);
1699 avcodec_close(&ost->st->codec);
1703 /* close each decoder */
1704 for(i=0;i<nb_istreams;i++) {
1706 if (ist->decoding_needed) {
1707 avcodec_close(&ist->st->codec);
1715 av_free(file_table);
1718 for(i=0;i<nb_istreams;i++) {
1725 for(i=0;i<nb_ostreams;i++) {
1729 fclose(ost->logfile);
1730 ost->logfile = NULL;
1732 fifo_free(&ost->fifo); /* works even if fifo is not
1733 initialized but set to zero */
1734 av_free(ost->pict_tmp.data[0]);
1735 if (ost->video_resample)
1736 img_resample_close(ost->img_resample_ctx);
1737 if (ost->audio_resample)
1738 audio_resample_close(ost->resample);
1751 int file_read(const char *filename)
1754 unsigned char buffer[1024];
1757 if (url_open(&h, filename, O_RDONLY) < 0) {
1758 printf("could not open '%s'\n", filename);
1762 len = url_read(h, buffer, sizeof(buffer));
1765 for(i=0;i<len;i++) putchar(buffer[i]);
1772 static void opt_image_format(const char *arg)
1776 for(f = first_image_format; f != NULL; f = f->next) {
1777 if (!strcmp(arg, f->name))
1781 fprintf(stderr, "Unknown image format: '%s'\n", arg);
1787 static void opt_format(const char *arg)
1789 /* compatibility stuff for pgmyuv */
1790 if (!strcmp(arg, "pgmyuv")) {
1791 opt_image_format(arg);
1795 file_iformat = av_find_input_format(arg);
1796 file_oformat = guess_format(arg, NULL, NULL);
1797 if (!file_iformat && !file_oformat) {
1798 fprintf(stderr, "Unknown input or output format: %s\n", arg);
1803 static void opt_video_bitrate(const char *arg)
1805 video_bit_rate = atoi(arg) * 1000;
1808 static void opt_video_bitrate_tolerance(const char *arg)
1810 video_bit_rate_tolerance = atoi(arg) * 1000;
1813 static void opt_video_bitrate_max(const char *arg)
1815 video_rc_max_rate = atoi(arg) * 1000;
1818 static void opt_video_bitrate_min(const char *arg)
1820 video_rc_min_rate = atoi(arg) * 1000;
1823 static void opt_video_buffer_size(const char *arg)
1825 video_rc_buffer_size = atoi(arg) * 8*1024;
1828 static void opt_video_rc_eq(char *arg)
1833 static void opt_video_rc_override_string(char *arg)
1835 video_rc_override_string = arg;
1839 static void opt_workaround_bugs(const char *arg)
1841 workaround_bugs = atoi(arg);
1844 static void opt_dct_algo(const char *arg)
1846 dct_algo = atoi(arg);
1849 static void opt_idct_algo(const char *arg)
1851 idct_algo = atoi(arg);
1855 static void opt_error_resilience(const char *arg)
1857 error_resilience = atoi(arg);
1860 static void opt_error_concealment(const char *arg)
1862 error_concealment = atoi(arg);
1865 static void opt_debug(const char *arg)
1870 static void opt_vismv(const char *arg)
1872 debug_mv = atoi(arg);
1875 static void opt_verbose(const char *arg)
1877 verbose = atoi(arg);
1878 av_log_set_level(atoi(arg));
1881 static void opt_frame_rate(const char *arg)
1883 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
1884 fprintf(stderr, "Incorrect frame rate\n");
1889 static void opt_frame_crop_top(const char *arg)
1891 frame_topBand = atoi(arg);
1892 if (frame_topBand < 0) {
1893 fprintf(stderr, "Incorrect top crop size\n");
1896 if ((frame_topBand % 2) != 0) {
1897 fprintf(stderr, "Top crop size must be a multiple of 2\n");
1900 if ((frame_topBand) >= frame_height){
1901 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
1904 frame_height -= frame_topBand;
1907 static void opt_frame_crop_bottom(const char *arg)
1909 frame_bottomBand = atoi(arg);
1910 if (frame_bottomBand < 0) {
1911 fprintf(stderr, "Incorrect bottom crop size\n");
1914 if ((frame_bottomBand % 2) != 0) {
1915 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
1918 if ((frame_bottomBand) >= frame_height){
1919 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
1922 frame_height -= frame_bottomBand;
1925 static void opt_frame_crop_left(const char *arg)
1927 frame_leftBand = atoi(arg);
1928 if (frame_leftBand < 0) {
1929 fprintf(stderr, "Incorrect left crop size\n");
1932 if ((frame_leftBand % 2) != 0) {
1933 fprintf(stderr, "Left crop size must be a multiple of 2\n");
1936 if ((frame_leftBand) >= frame_width){
1937 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
1940 frame_width -= frame_leftBand;
1943 static void opt_frame_crop_right(const char *arg)
1945 frame_rightBand = atoi(arg);
1946 if (frame_rightBand < 0) {
1947 fprintf(stderr, "Incorrect right crop size\n");
1950 if ((frame_rightBand % 2) != 0) {
1951 fprintf(stderr, "Right crop size must be a multiple of 2\n");
1954 if ((frame_rightBand) >= frame_width){
1955 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
1958 frame_width -= frame_rightBand;
1961 static void opt_frame_size(const char *arg)
1963 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
1964 fprintf(stderr, "Incorrect frame size\n");
1967 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
1968 fprintf(stderr, "Frame size must be a multiple of 2\n");
1974 #define SCALEBITS 10
1975 #define ONE_HALF (1 << (SCALEBITS - 1))
1976 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
1978 #define RGB_TO_Y(r, g, b) \
1979 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
1980 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
1982 #define RGB_TO_U(r1, g1, b1, shift)\
1983 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
1984 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
1986 #define RGB_TO_V(r1, g1, b1, shift)\
1987 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
1988 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
1990 static void opt_pad_color(const char *arg) {
1991 /* Input is expected to be six hex digits similar to
1992 how colors are expressed in html tags (but without the #) */
1993 int rgb = strtol(arg, NULL, 16);
1997 g = ((rgb >> 8) & 255);
2000 padcolor[0] = RGB_TO_Y(r,g,b);
2001 padcolor[1] = RGB_TO_U(r,g,b,0);
2002 padcolor[2] = RGB_TO_V(r,g,b,0);
2005 static void opt_frame_pad_top(const char *arg)
2007 frame_padtop = atoi(arg);
2008 if (frame_padtop < 0) {
2009 fprintf(stderr, "Incorrect top pad size\n");
2012 if ((frame_padtop % 2) != 0) {
2013 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2018 static void opt_frame_pad_bottom(const char *arg)
2020 frame_padbottom = atoi(arg);
2021 if (frame_padbottom < 0) {
2022 fprintf(stderr, "Incorrect bottom pad size\n");
2025 if ((frame_padbottom % 2) != 0) {
2026 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2032 static void opt_frame_pad_left(const char *arg)
2034 frame_padleft = atoi(arg);
2035 if (frame_padleft < 0) {
2036 fprintf(stderr, "Incorrect left pad size\n");
2039 if ((frame_padleft % 2) != 0) {
2040 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2046 static void opt_frame_pad_right(const char *arg)
2048 frame_padright = atoi(arg);
2049 if (frame_padright < 0) {
2050 fprintf(stderr, "Incorrect right pad size\n");
2053 if ((frame_padright % 2) != 0) {
2054 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2060 static void opt_frame_pix_fmt(const char *arg)
2062 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2065 static void opt_frame_aspect_ratio(const char *arg)
2071 p = strchr(arg, ':');
2073 x = strtol(arg, (char **)&arg, 10);
2075 y = strtol(arg+1, (char **)&arg, 10);
2077 ar = (double)x / (double)y;
2079 ar = strtod(arg, (char **)&arg);
2082 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2085 frame_aspect_ratio = ar;
2088 static void opt_gop_size(const char *arg)
2090 gop_size = atoi(arg);
2093 static void opt_b_frames(const char *arg)
2095 b_frames = atoi(arg);
2096 if (b_frames > FF_MAX_B_FRAMES) {
2097 fprintf(stderr, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES);
2099 } else if (b_frames < 1) {
2100 fprintf(stderr, "\nNumber of B frames must be higher than 0\n");
2105 static void opt_mb_decision(const char *arg)
2107 mb_decision = atoi(arg);
2110 static void opt_mb_cmp(const char *arg)
2115 static void opt_ildct_cmp(const char *arg)
2117 ildct_cmp = atoi(arg);
2120 static void opt_sub_cmp(const char *arg)
2122 sub_cmp = atoi(arg);
2125 static void opt_cmp(const char *arg)
2130 static void opt_pre_cmp(const char *arg)
2132 pre_cmp = atoi(arg);
2135 static void opt_pre_me(const char *arg)
2140 static void opt_lumi_mask(const char *arg)
2142 lumi_mask = atof(arg);
2145 static void opt_dark_mask(const char *arg)
2147 dark_mask = atof(arg);
2150 static void opt_scplx_mask(const char *arg)
2152 scplx_mask = atof(arg);
2155 static void opt_tcplx_mask(const char *arg)
2157 tcplx_mask = atof(arg);
2160 static void opt_p_mask(const char *arg)
2165 static void opt_qscale(const char *arg)
2167 video_qscale = atof(arg);
2168 if (video_qscale < 0.01 ||
2169 video_qscale > 255) {
2170 fprintf(stderr, "qscale must be >= 0.01 and <= 255\n");
2175 static void opt_qmin(const char *arg)
2177 video_qmin = atoi(arg);
2178 if (video_qmin < 0 ||
2180 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2185 static void opt_qmax(const char *arg)
2187 video_qmax = atoi(arg);
2188 if (video_qmax < 0 ||
2190 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2195 static void opt_mb_qmin(const char *arg)
2197 video_mb_qmin = atoi(arg);
2198 if (video_mb_qmin < 0 ||
2199 video_mb_qmin > 31) {
2200 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2205 static void opt_mb_qmax(const char *arg)
2207 video_mb_qmax = atoi(arg);
2208 if (video_mb_qmax < 0 ||
2209 video_mb_qmax > 31) {
2210 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2215 static void opt_qdiff(const char *arg)
2217 video_qdiff = atoi(arg);
2218 if (video_qdiff < 0 ||
2220 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2225 static void opt_qblur(const char *arg)
2227 video_qblur = atof(arg);
2230 static void opt_qcomp(const char *arg)
2232 video_qcomp = atof(arg);
2235 static void opt_rc_initial_cplx(const char *arg)
2237 video_rc_initial_cplx = atof(arg);
2239 static void opt_b_qfactor(const char *arg)
2241 video_b_qfactor = atof(arg);
2243 static void opt_i_qfactor(const char *arg)
2245 video_i_qfactor = atof(arg);
2247 static void opt_b_qoffset(const char *arg)
2249 video_b_qoffset = atof(arg);
2251 static void opt_i_qoffset(const char *arg)
2253 video_i_qoffset = atof(arg);
2256 static void opt_ibias(const char *arg)
2258 video_intra_quant_bias = atoi(arg);
2260 static void opt_pbias(const char *arg)
2262 video_inter_quant_bias = atoi(arg);
2265 static void opt_packet_size(const char *arg)
2267 packet_size= atoi(arg);
2270 static void opt_error_rate(const char *arg)
2272 error_rate= atoi(arg);
2275 static void opt_strict(const char *arg)
2280 static void opt_top_field_first(const char *arg)
2282 top_field_first= atoi(arg);
2285 static void opt_noise_reduction(const char *arg)
2287 noise_reduction= atoi(arg);
2290 static void opt_qns(const char *arg)
2295 static void opt_sc_threshold(const char *arg)
2297 sc_threshold= atoi(arg);
2300 static void opt_thread_count(const char *arg)
2302 thread_count= atoi(arg);
2303 #if !defined(HAVE_PTHREADS) && !defined(HAVE_W32THREADS)
2305 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2309 static void opt_audio_bitrate(const char *arg)
2311 audio_bit_rate = atoi(arg) * 1000;
2314 static void opt_audio_rate(const char *arg)
2316 audio_sample_rate = atoi(arg);
2319 static void opt_audio_channels(const char *arg)
2321 audio_channels = atoi(arg);
2324 static void opt_video_device(const char *arg)
2326 video_device = av_strdup(arg);
2329 static void opt_video_channel(const char *arg)
2331 video_channel = strtol(arg, NULL, 0);
2334 static void opt_video_standard(const char *arg)
2336 video_standard = av_strdup(arg);
2339 static void opt_audio_device(const char *arg)
2341 audio_device = av_strdup(arg);
2344 static void opt_dv1394(const char *arg)
2346 video_grab_format = "dv1394";
2347 audio_grab_format = NULL;
2350 static void opt_audio_codec(const char *arg)
2354 if (!strcmp(arg, "copy")) {
2355 audio_stream_copy = 1;
2359 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_AUDIO)
2364 fprintf(stderr, "Unknown audio codec '%s'\n", arg);
2367 audio_codec_id = p->id;
2372 static void add_frame_hooker(const char *arg)
2377 char *args = av_strdup(arg);
2381 argv[0] = strtok(args, " ");
2382 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2385 i = frame_hook_add(argc, argv);
2388 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2393 const char *motion_str[] = {
2403 static void opt_motion_estimation(const char *arg)
2409 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2412 if (!strcmp(*p, arg))
2416 me_method = (p - motion_str) + 1;
2419 static void opt_video_codec(const char *arg)
2423 if (!strcmp(arg, "copy")) {
2424 video_stream_copy = 1;
2428 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_VIDEO)
2433 fprintf(stderr, "Unknown video codec '%s'\n", arg);
2436 video_codec_id = p->id;
2441 static void opt_map(const char *arg)
2447 m = &stream_maps[nb_stream_maps++];
2449 m->file_index = strtol(arg, (char **)&p, 0);
2453 m->stream_index = strtol(p, (char **)&p, 0);
2456 static void opt_recording_time(const char *arg)
2458 recording_time = parse_date(arg, 1);
2461 static void opt_start_time(const char *arg)
2463 start_time = parse_date(arg, 1);
2466 static void opt_rec_timestamp(const char *arg)
2468 rec_timestamp = parse_date(arg, 0) / 1000000;
2471 static void opt_input_file(const char *filename)
2473 AVFormatContext *ic;
2474 AVFormatParameters params, *ap = ¶ms;
2475 int err, i, ret, rfps, rfps_base;
2477 if (!strcmp(filename, "-"))
2480 using_stdin |= !strcmp(filename, "pipe:" ) ||
2481 !strcmp( filename, "/dev/stdin" );
2483 /* get default parameters from command line */
2484 memset(ap, 0, sizeof(*ap));
2485 ap->sample_rate = audio_sample_rate;
2486 ap->channels = audio_channels;
2487 ap->frame_rate = frame_rate;
2488 ap->frame_rate_base = frame_rate_base;
2489 ap->width = frame_width + frame_padleft + frame_padright;
2490 ap->height = frame_height + frame_padtop + frame_padbottom;
2491 ap->image_format = image_format;
2492 ap->pix_fmt = frame_pix_fmt;
2494 /* open the input file with generic libav function */
2495 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2497 print_error(filename, err);
2501 /* If not enough info to get the stream parameters, we decode the
2502 first frames to get it. (used in mpeg case for example) */
2503 ret = av_find_stream_info(ic);
2504 if (ret < 0 && verbose >= 0) {
2505 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2509 /* if seeking requested, we execute it */
2510 if (start_time != 0) {
2513 timestamp = start_time;
2514 /* add the stream start time */
2515 if (ic->start_time != AV_NOPTS_VALUE)
2516 timestamp += ic->start_time;
2517 ret = av_seek_frame(ic, -1, timestamp);
2519 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2520 filename, (double)timestamp / AV_TIME_BASE);
2522 /* reset seek info */
2526 /* update the current parameters so that they match the one of the input stream */
2527 for(i=0;i<ic->nb_streams;i++) {
2528 AVCodecContext *enc = &ic->streams[i]->codec;
2529 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2531 avcodec_thread_init(enc, thread_count);
2533 enc->thread_count= thread_count;
2534 switch(enc->codec_type) {
2535 case CODEC_TYPE_AUDIO:
2536 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2537 audio_channels = enc->channels;
2538 audio_sample_rate = enc->sample_rate;
2540 case CODEC_TYPE_VIDEO:
2541 frame_height = enc->height;
2542 frame_width = enc->width;
2543 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2544 frame_pix_fmt = enc->pix_fmt;
2545 rfps = ic->streams[i]->r_frame_rate;
2546 rfps_base = ic->streams[i]->r_frame_rate_base;
2547 enc->workaround_bugs = workaround_bugs;
2548 enc->error_resilience = error_resilience;
2549 enc->error_concealment = error_concealment;
2550 enc->idct_algo = idct_algo;
2552 enc->debug_mv = debug_mv;
2554 enc->flags|= CODEC_FLAG_BITEXACT;
2556 assert(enc->frame_rate_base == rfps_base); // should be true for now
2557 if (enc->frame_rate != rfps) {
2560 fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f->%2.2f\n",
2561 i, (float)enc->frame_rate / enc->frame_rate_base,
2563 (float)rfps / rfps_base);
2565 /* update the current frame rate to match the stream frame rate */
2567 frame_rate_base = rfps_base;
2569 enc->rate_emu = rate_emu;
2571 case CODEC_TYPE_DATA:
2578 input_files[nb_input_files] = ic;
2579 /* dump the file content */
2581 dump_format(ic, nb_input_files, filename, 0);
2584 file_iformat = NULL;
2585 file_oformat = NULL;
2586 image_format = NULL;
2591 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
2593 int has_video, has_audio, i, j;
2594 AVFormatContext *ic;
2598 for(j=0;j<nb_input_files;j++) {
2599 ic = input_files[j];
2600 for(i=0;i<ic->nb_streams;i++) {
2601 AVCodecContext *enc = &ic->streams[i]->codec;
2602 switch(enc->codec_type) {
2603 case CODEC_TYPE_AUDIO:
2606 case CODEC_TYPE_VIDEO:
2609 case CODEC_TYPE_DATA:
2616 *has_video_ptr = has_video;
2617 *has_audio_ptr = has_audio;
2620 static void opt_output_file(const char *filename)
2623 AVFormatContext *oc;
2624 int use_video, use_audio, nb_streams, input_has_video, input_has_audio;
2626 AVFormatParameters params, *ap = ¶ms;
2628 if (!strcmp(filename, "-"))
2631 oc = av_alloc_format_context();
2633 if (!file_oformat) {
2634 file_oformat = guess_format(NULL, filename, NULL);
2635 if (!file_oformat) {
2636 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
2642 oc->oformat = file_oformat;
2644 if (!strcmp(file_oformat->name, "ffm") &&
2645 strstart(filename, "http:", NULL)) {
2646 /* special case for files sent to ffserver: we get the stream
2647 parameters from ffserver */
2648 if (read_ffserver_streams(oc, filename) < 0) {
2649 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
2653 use_video = file_oformat->video_codec != CODEC_ID_NONE;
2654 use_audio = file_oformat->audio_codec != CODEC_ID_NONE;
2656 /* disable if no corresponding type found and at least one
2658 if (nb_input_files > 0) {
2659 check_audio_video_inputs(&input_has_video, &input_has_audio);
2660 if (!input_has_video)
2662 if (!input_has_audio)
2666 /* manual disable */
2667 if (audio_disable) {
2670 if (video_disable) {
2676 AVCodecContext *video_enc;
2678 st = av_mallocz(sizeof(AVStream));
2680 fprintf(stderr, "Could not alloc stream\n");
2683 avcodec_get_context_defaults(&st->codec);
2684 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2686 avcodec_thread_init(&st->codec, thread_count);
2689 video_enc = &st->codec;
2691 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
2692 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2693 if (video_stream_copy) {
2694 st->stream_copy = 1;
2695 video_enc->codec_type = CODEC_TYPE_VIDEO;
2700 codec_id = file_oformat->video_codec;
2701 if (video_codec_id != CODEC_ID_NONE)
2702 codec_id = video_codec_id;
2704 video_enc->codec_id = codec_id;
2706 video_enc->bit_rate = video_bit_rate;
2707 video_enc->bit_rate_tolerance = video_bit_rate_tolerance;
2708 video_enc->frame_rate = frame_rate;
2709 video_enc->frame_rate_base = frame_rate_base;
2711 video_enc->width = frame_width + frame_padright + frame_padleft;
2712 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2713 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
2714 video_enc->pix_fmt = frame_pix_fmt;
2717 video_enc->gop_size = gop_size;
2719 video_enc->gop_size = 0;
2720 if (video_qscale || same_quality) {
2721 video_enc->flags |= CODEC_FLAG_QSCALE;
2722 st->quality = FF_QP2LAMBDA * video_qscale;
2726 video_enc->intra_matrix = intra_matrix;
2728 video_enc->inter_matrix = inter_matrix;
2731 video_enc->flags |= CODEC_FLAG_BITEXACT;
2733 video_enc->mb_decision = mb_decision;
2734 video_enc->mb_cmp = mb_cmp;
2735 video_enc->ildct_cmp = ildct_cmp;
2736 video_enc->me_sub_cmp = sub_cmp;
2737 video_enc->me_cmp = cmp;
2738 video_enc->me_pre_cmp = pre_cmp;
2739 video_enc->pre_me = pre_me;
2740 video_enc->lumi_masking = lumi_mask;
2741 video_enc->dark_masking = dark_mask;
2742 video_enc->spatial_cplx_masking = scplx_mask;
2743 video_enc->temporal_cplx_masking = tcplx_mask;
2744 video_enc->p_masking = p_mask;
2745 video_enc->quantizer_noise_shaping= qns;
2748 video_enc->flags |= CODEC_FLAG_H263P_UMV;
2751 video_enc->flags |= CODEC_FLAG_H263P_SLICE_STRUCT;
2754 video_enc->flags |= CODEC_FLAG_H263P_AIC;
2757 video_enc->flags |= CODEC_FLAG_H263P_AIV;
2760 video_enc->flags |= CODEC_FLAG_4MV;
2763 video_enc->flags |= CODEC_FLAG_OBMC;
2766 video_enc->flags |= CODEC_FLAG_LOOP_FILTER;
2770 video_enc->flags |= CODEC_FLAG_PART;
2773 video_enc->flags |= CODEC_FLAG_ALT_SCAN;
2776 video_enc->flags |= CODEC_FLAG_TRELLIS_QUANT;
2778 if (use_scan_offset) {
2779 video_enc->flags |= CODEC_FLAG_SVCD_SCAN_OFFSET;
2782 video_enc->flags |= CODEC_FLAG_CLOSED_GOP;
2785 video_enc->max_b_frames = b_frames;
2786 video_enc->b_frame_strategy = 0;
2787 video_enc->b_quant_factor = 2.0;
2789 if (do_interlace_dct) {
2790 video_enc->flags |= CODEC_FLAG_INTERLACED_DCT;
2792 if (do_interlace_me) {
2793 video_enc->flags |= CODEC_FLAG_INTERLACED_ME;
2795 video_enc->qmin = video_qmin;
2796 video_enc->qmax = video_qmax;
2797 video_enc->mb_qmin = video_mb_qmin;
2798 video_enc->mb_qmax = video_mb_qmax;
2799 video_enc->max_qdiff = video_qdiff;
2800 video_enc->qblur = video_qblur;
2801 video_enc->qcompress = video_qcomp;
2802 video_enc->rc_eq = video_rc_eq;
2803 video_enc->debug = debug;
2804 video_enc->debug_mv = debug_mv;
2805 video_enc->thread_count = thread_count;
2806 p= video_rc_override_string;
2809 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
2811 fprintf(stderr, "error parsing rc_override\n");
2814 video_enc->rc_override=
2815 av_realloc(video_enc->rc_override,
2816 sizeof(RcOverride)*(i+1));
2817 video_enc->rc_override[i].start_frame= start;
2818 video_enc->rc_override[i].end_frame = end;
2820 video_enc->rc_override[i].qscale= q;
2821 video_enc->rc_override[i].quality_factor= 1.0;
2824 video_enc->rc_override[i].qscale= 0;
2825 video_enc->rc_override[i].quality_factor= -q/100.0;
2830 video_enc->rc_override_count=i;
2832 video_enc->rc_max_rate = video_rc_max_rate;
2833 video_enc->rc_min_rate = video_rc_min_rate;
2834 video_enc->rc_buffer_size = video_rc_buffer_size;
2835 video_enc->rc_buffer_aggressivity= video_rc_buffer_aggressivity;
2836 video_enc->rc_initial_cplx= video_rc_initial_cplx;
2837 video_enc->i_quant_factor = video_i_qfactor;
2838 video_enc->b_quant_factor = video_b_qfactor;
2839 video_enc->i_quant_offset = video_i_qoffset;
2840 video_enc->b_quant_offset = video_b_qoffset;
2841 video_enc->intra_quant_bias = video_intra_quant_bias;
2842 video_enc->inter_quant_bias = video_inter_quant_bias;
2843 video_enc->dct_algo = dct_algo;
2844 video_enc->idct_algo = idct_algo;
2845 video_enc->strict_std_compliance = strict;
2846 video_enc->error_rate = error_rate;
2847 video_enc->noise_reduction= noise_reduction;
2848 video_enc->scenechange_threshold= sc_threshold;
2850 video_enc->rtp_mode= 1;
2851 video_enc->rtp_payload_size= packet_size;
2855 video_enc->flags|= CODEC_FLAG_PSNR;
2857 video_enc->me_method = me_method;
2862 video_enc->flags |= CODEC_FLAG_PASS1;
2864 video_enc->flags |= CODEC_FLAG_PASS2;
2868 oc->streams[nb_streams] = st;
2873 AVCodecContext *audio_enc;
2875 st = av_mallocz(sizeof(AVStream));
2877 fprintf(stderr, "Could not alloc stream\n");
2880 avcodec_get_context_defaults(&st->codec);
2881 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2883 avcodec_thread_init(&st->codec, thread_count);
2886 audio_enc = &st->codec;
2887 audio_enc->codec_type = CODEC_TYPE_AUDIO;
2889 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
2890 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2891 if (audio_stream_copy) {
2892 st->stream_copy = 1;
2894 codec_id = file_oformat->audio_codec;
2895 if (audio_codec_id != CODEC_ID_NONE)
2896 codec_id = audio_codec_id;
2897 audio_enc->codec_id = codec_id;
2899 audio_enc->bit_rate = audio_bit_rate;
2900 audio_enc->sample_rate = audio_sample_rate;
2901 audio_enc->strict_std_compliance = strict;
2902 audio_enc->thread_count = thread_count;
2903 /* For audio codecs other than AC3 we limit */
2904 /* the number of coded channels to stereo */
2905 if (audio_channels > 2 && codec_id != CODEC_ID_AC3) {
2906 audio_enc->channels = 2;
2908 audio_enc->channels = audio_channels;
2910 oc->streams[nb_streams] = st;
2914 oc->nb_streams = nb_streams;
2917 fprintf(stderr, "No audio or video streams available\n");
2921 oc->timestamp = rec_timestamp;
2924 pstrcpy(oc->title, sizeof(oc->title), str_title);
2926 pstrcpy(oc->author, sizeof(oc->author), str_author);
2928 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
2930 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
2933 output_files[nb_output_files++] = oc;
2935 strcpy(oc->filename, filename);
2937 /* check filename in case of an image number is expected */
2938 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
2939 if (filename_number_test(oc->filename) < 0) {
2940 print_error(oc->filename, AVERROR_NUMEXPECTED);
2945 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
2946 /* test if it already exists to avoid loosing precious files */
2947 if (!file_overwrite &&
2948 (strchr(filename, ':') == NULL ||
2949 strstart(filename, "file:", NULL))) {
2950 if (url_exist(filename)) {
2953 if ( !using_stdin ) {
2954 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
2957 if (toupper(c) != 'Y') {
2958 fprintf(stderr, "Not overwriting - exiting\n");
2963 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
2970 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
2971 fprintf(stderr, "Could not open '%s'\n", filename);
2976 memset(ap, 0, sizeof(*ap));
2977 ap->image_format = image_format;
2978 if (av_set_parameters(oc, ap) < 0) {
2979 fprintf(stderr, "%s: Invalid encoding parameters\n",
2984 /* reset some options */
2985 file_oformat = NULL;
2986 file_iformat = NULL;
2987 image_format = NULL;
2990 audio_codec_id = CODEC_ID_NONE;
2991 video_codec_id = CODEC_ID_NONE;
2992 audio_stream_copy = 0;
2993 video_stream_copy = 0;
2996 /* prepare dummy protocols for grab */
2997 static void prepare_grab(void)
2999 int has_video, has_audio, i, j;
3000 AVFormatContext *oc;
3001 AVFormatContext *ic;
3002 AVFormatParameters vp1, *vp = &vp1;
3003 AVFormatParameters ap1, *ap = &ap1;
3005 /* see if audio/video inputs are needed */
3008 memset(ap, 0, sizeof(*ap));
3009 memset(vp, 0, sizeof(*vp));
3010 for(j=0;j<nb_output_files;j++) {
3011 oc = output_files[j];
3012 for(i=0;i<oc->nb_streams;i++) {
3013 AVCodecContext *enc = &oc->streams[i]->codec;
3014 switch(enc->codec_type) {
3015 case CODEC_TYPE_AUDIO:
3016 if (enc->sample_rate > ap->sample_rate)
3017 ap->sample_rate = enc->sample_rate;
3018 if (enc->channels > ap->channels)
3019 ap->channels = enc->channels;
3022 case CODEC_TYPE_VIDEO:
3023 if (enc->width > vp->width)
3024 vp->width = enc->width;
3025 if (enc->height > vp->height)
3026 vp->height = enc->height;
3028 assert(enc->frame_rate_base == DEFAULT_FRAME_RATE_BASE);
3029 if (enc->frame_rate > vp->frame_rate){
3030 vp->frame_rate = enc->frame_rate;
3031 vp->frame_rate_base = enc->frame_rate_base;
3041 if (has_video == 0 && has_audio == 0) {
3042 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3047 AVInputFormat *fmt1;
3048 fmt1 = av_find_input_format(video_grab_format);
3049 vp->device = video_device;
3050 vp->channel = video_channel;
3051 vp->standard = video_standard;
3052 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3053 fprintf(stderr, "Could not find video grab device\n");
3056 /* If not enough info to get the stream parameters, we decode the
3057 first frames to get it. */
3058 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3059 fprintf(stderr, "Could not find video grab parameters\n");
3062 /* by now video grab has one stream */
3063 ic->streams[0]->r_frame_rate = vp->frame_rate;
3064 ic->streams[0]->r_frame_rate_base = vp->frame_rate_base;
3065 input_files[nb_input_files] = ic;
3068 dump_format(ic, nb_input_files, "", 0);
3072 if (has_audio && audio_grab_format) {
3073 AVInputFormat *fmt1;
3074 fmt1 = av_find_input_format(audio_grab_format);
3075 ap->device = audio_device;
3076 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3077 fprintf(stderr, "Could not find audio grab device\n");
3080 input_files[nb_input_files] = ic;
3083 dump_format(ic, nb_input_files, "", 0);
3089 /* same option as mencoder */
3090 static void opt_pass(const char *pass_str)
3093 pass = atoi(pass_str);
3094 if (pass != 1 && pass != 2) {
3095 fprintf(stderr, "pass number can be only 1 or 2\n");
3101 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3102 static int64_t getutime(void)
3104 return av_gettime();
3107 static int64_t getutime(void)
3109 struct rusage rusage;
3111 getrusage(RUSAGE_SELF, &rusage);
3112 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3116 extern int ffm_nopts;
3118 static void opt_bitexact(void)
3121 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3125 static void show_formats(void)
3127 AVInputFormat *ifmt;
3128 AVOutputFormat *ofmt;
3129 AVImageFormat *image_fmt;
3132 const char **pp, *last_name;
3134 printf("File formats:\n");
3139 const char *name=NULL;
3141 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3142 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3143 strcmp(ofmt->name, last_name)>0){
3148 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3149 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3150 strcmp(ifmt->name, last_name)>0){
3154 if(name && strcmp(ifmt->name, name)==0)
3169 printf("Image formats:\n");
3170 for(image_fmt = first_image_format; image_fmt != NULL;
3171 image_fmt = image_fmt->next) {
3174 image_fmt->img_read ? "D":" ",
3175 image_fmt->img_write ? "E":" ",
3180 printf("Codecs:\n");
3188 for(p = first_avcodec; p != NULL; p = p->next) {
3189 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3190 strcmp(p->name, last_name)>0){
3192 decode= encode= cap=0;
3194 if(p2 && strcmp(p->name, p2->name)==0){
3195 if(p->decode) decode=1;
3196 if(p->encode) encode=1;
3197 cap |= p->capabilities;
3202 last_name= p2->name;
3206 decode ? "D": (/*p2->decoder ? "d":*/" "),
3208 p2->type == CODEC_TYPE_AUDIO ? "A":"V",
3209 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3210 cap & CODEC_CAP_DR1 ? "D":" ",
3211 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3213 /* if(p2->decoder && decode==0)
3214 printf(" use %s for decoding", p2->decoder->name);*/
3219 printf("Supported file protocols:\n");
3220 for(up = first_protocol; up != NULL; up = up->next)
3221 printf(" %s:", up->name);
3224 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3225 printf("Motion estimation methods:\n");
3229 if ((pp - motion_str + 1) == ME_ZERO)
3230 printf("(fastest)");
3231 else if ((pp - motion_str + 1) == ME_FULL)
3232 printf("(slowest)");
3233 else if ((pp - motion_str + 1) == ME_EPZS)
3234 printf("(default)");
3239 "Note, the names of encoders and decoders dont always match, so there are\n"
3240 "several cases where the above table shows encoder only or decoder only entries\n"
3241 "even though both encoding and decoding are supported for example, the h263\n"
3242 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3247 void parse_matrix_coeffs(uint16_t *dest, const char *str)
3250 const char *p = str;
3257 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3264 void opt_inter_matrix(const char *arg)
3266 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3267 parse_matrix_coeffs(inter_matrix, arg);
3270 void opt_intra_matrix(const char *arg)
3272 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3273 parse_matrix_coeffs(intra_matrix, arg);
3276 static void opt_target(const char *arg)
3280 if(!strncmp(arg, "pal-", 4)) {
3283 } else if(!strncmp(arg, "ntsc-", 5)) {
3288 /* Calculate FR via float to avoid int overflow */
3289 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3292 } else if((fr == 29970) || (fr == 23976)) {
3295 /* Try to determine PAL/NTSC by peeking in the input files */
3296 if(nb_input_files) {
3298 for(j = 0; j < nb_input_files; j++) {
3299 for(i = 0; i < input_files[j]->nb_streams; i++) {
3300 AVCodecContext *c = &input_files[j]->streams[i]->codec;
3301 if(c->codec_type != CODEC_TYPE_VIDEO)
3303 fr = c->frame_rate * 1000 / c->frame_rate_base;
3307 } else if((fr == 29970) || (fr == 23976)) {
3317 if(verbose && norm >= 0)
3318 printf("Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3322 fprintf(stderr, "Could not determine norm (PAL/NTSC) for target.\n");
3323 fprintf(stderr, "Please prefix target with \"pal-\" or \"ntsc-\",\n");
3324 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3328 if(!strcmp(arg, "vcd")) {
3330 opt_video_codec("mpeg1video");
3331 opt_audio_codec("mp2");
3334 opt_frame_size(norm ? "352x240" : "352x288");
3336 video_bit_rate = 1150000;
3337 video_rc_max_rate = 1150000;
3338 video_rc_min_rate = 1150000;
3339 video_rc_buffer_size = 40*1024*8;
3341 audio_bit_rate = 224000;
3342 audio_sample_rate = 44100;
3344 } else if(!strcmp(arg, "svcd")) {
3346 opt_video_codec("mpeg2video");
3347 opt_audio_codec("mp2");
3350 opt_frame_size(norm ? "480x480" : "480x576");
3351 opt_gop_size(norm ? "18" : "15");
3353 video_bit_rate = 2040000;
3354 video_rc_max_rate = 2516000;
3355 video_rc_min_rate = 0; //1145000;
3356 video_rc_buffer_size = 224*1024*8;
3357 use_scan_offset = 1;
3359 audio_bit_rate = 224000;
3360 audio_sample_rate = 44100;
3362 } else if(!strcmp(arg, "dvd")) {
3364 opt_video_codec("mpeg2video");
3365 opt_audio_codec("ac3");
3368 opt_frame_size(norm ? "720x480" : "720x576");
3369 opt_gop_size(norm ? "18" : "15");
3371 video_bit_rate = 6000000;
3372 video_rc_max_rate = 9000000;
3373 video_rc_min_rate = 0; //1500000;
3374 video_rc_buffer_size = 224*1024*8;
3376 audio_bit_rate = 448000;
3377 audio_sample_rate = 48000;
3380 fprintf(stderr, "Unknown target: %s\n", arg);
3385 const OptionDef options[] = {
3387 { "L", 0, {(void*)show_license}, "show license" },
3388 { "h", 0, {(void*)show_help}, "show help" },
3389 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3390 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3391 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
3392 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3393 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3394 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream" },
3395 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3396 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3397 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3398 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3399 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3400 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3401 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3402 { "debug", HAS_ARG | OPT_EXPERT, {(void*)opt_debug}, "print specific debug info", "" },
3403 { "vismv", HAS_ARG | OPT_EXPERT, {(void*)opt_vismv}, "visualize motion vectors", "" },
3404 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3405 "add timings for benchmarking" },
3406 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3407 "dump each input packet" },
3408 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3409 "when dumping packets, also dump the payload" },
3410 { "bitexact", OPT_EXPERT, {(void*)opt_bitexact}, "only use bit exact algorithms (for codec testing)" },
3411 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3412 { "loop", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3413 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3414 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\" or \"dvd\")", "type" },
3415 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3418 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
3419 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3420 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3421 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3422 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3423 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3424 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3425 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3426 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3427 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3428 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3429 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3430 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3431 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3432 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
3433 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3434 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3435 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
3436 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
3437 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
3438 { "mbqmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmin}, "min macroblock quantiser scale (VBR)", "q" },
3439 { "mbqmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmax}, "max macroblock quantiser scale (VBR)", "q" },
3440 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
3441 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
3442 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
3443 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
3444 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
3445 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
3446 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
3447 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
3448 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
3449 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
3450 // { "b_strategy", HAS_ARG | OPT_EXPERT, {(void*)opt_b_strategy}, "dynamic b frame selection strategy", "strategy" },
3451 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3452 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3453 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
3454 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
3455 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
3456 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffere size (in kByte)", "size" },
3457 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3458 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
3460 { "dct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dct_algo}, "set dct algo", "algo" },
3461 { "idct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_idct_algo}, "set idct algo", "algo" },
3462 { "er", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_resilience}, "set error resilience", "n" },
3463 { "ec", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_concealment}, "set error concealment", "bit_mask" },
3464 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
3465 { "hq", OPT_BOOL, {(void*)&mb_decision}, "activate high quality settings" },
3466 { "mbd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_decision}, "macroblock decision", "mode" },
3467 { "mbcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_cmp}, "macroblock compare function", "cmp function" },
3468 { "ildctcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ildct_cmp}, "ildct compare function", "cmp function" },
3469 { "subcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sub_cmp}, "subpel compare function", "cmp function" },
3470 { "cmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_cmp}, "fullpel compare function", "cmp function" },
3471 { "precmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_cmp}, "pre motion estimation compare function", "cmp function" },
3472 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
3473 { "lumi_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lumi_mask}, "luminance masking", "" },
3474 { "dark_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dark_mask}, "darkness masking", "" },
3475 { "scplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_scplx_mask}, "spatial complexity masking", "" },
3476 { "tcplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_tcplx_mask}, "teporal complexity masking", "" },
3477 { "p_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_p_mask}, "inter masking", "" },
3478 { "4mv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_4mv}, "use four motion vector by macroblock (MPEG4)" },
3479 { "obmc", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_obmc}, "use overlapped block motion compensation (h263+)" },
3480 { "lf", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_loop}, "use loop filter (h263+)" },
3481 { "part", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_part}, "use data partitioning (MPEG4)" },
3482 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
3483 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
3484 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
3485 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3486 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3487 "use same video quality as source (implies VBR)" },
3488 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3489 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3490 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3491 "deinterlace pictures" },
3492 { "ildct", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_dct},
3493 "force interlaced dct support in encoder (MPEG2/MPEG4)" },
3494 { "ilme", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_me},
3495 "force interlaced me support in encoder (MPEG2/MPEG4)" },
3496 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3497 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
3498 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3499 { "aic", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aic}, "enable Advanced intra coding (h263+)" },
3500 { "aiv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aiv}, "enable Alternative inter vlc (h263+)" },
3501 { "umv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_umv}, "enable Unlimited Motion Vector (h263+)" },
3502 { "ssm", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_ss}, "enable Slice Structured mode (h263+)" },
3503 { "alt", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_alt_scan}, "enable alternate scantable (MPEG2/MPEG4)" },
3504 { "trell", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_trell}, "enable trellis quantization" },
3505 { "cgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&closed_gop}, "closed gop" },
3506 { "scan_offset", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_scan_offset}, "enable SVCD Scan Offset placeholder" },
3507 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3508 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3509 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3510 { "nr", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_noise_reduction}, "noise reduction", "" },
3511 { "qns", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qns}, "quantization noise shaping", "" },
3512 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
3515 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
3516 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3517 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3518 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3519 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3522 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
3523 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3524 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3525 { "dv1394", OPT_EXPERT | OPT_GRAB, {(void*)opt_dv1394}, "set DV1394 grab", "" },
3526 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
3530 static void show_banner(void)
3532 printf("ffmpeg version " FFMPEG_VERSION ", Copyright (c) 2000-2003 Fabrice Bellard\n");
3535 static void show_license(void)
3540 "This program is free software; you can redistribute it and/or modify\n"
3541 "it under the terms of the GNU General Public License as published by\n"
3542 "the Free Software Foundation; either version 2 of the License, or\n"
3543 "(at your option) any later version.\n"
3545 "This program is distributed in the hope that it will be useful,\n"
3546 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3547 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
3548 "GNU General Public License for more details.\n"
3550 "You should have received a copy of the GNU General Public License\n"
3551 "along with this program; if not, write to the Free Software\n"
3552 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3556 "This library is free software; you can redistribute it and/or\n"
3557 "modify it under the terms of the GNU Lesser General Public\n"
3558 "License as published by the Free Software Foundation; either\n"
3559 "version 2 of the License, or (at your option) any later version.\n"
3561 "This library is distributed in the hope that it will be useful,\n"
3562 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3563 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
3564 "Lesser General Public License for more details.\n"
3566 "You should have received a copy of the GNU Lesser General Public\n"
3567 "License along with this library; if not, write to the Free Software\n"
3568 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3574 static void show_help(void)
3577 printf("usage: ffmpeg [[options] -i input_file]... {[options] outfile}...\n"
3578 "Hyper fast Audio and Video encoder\n");
3580 show_help_options(options, "Main options:\n",
3581 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
3582 show_help_options(options, "\nVideo options:\n",
3583 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3585 show_help_options(options, "\nAdvanced Video options:\n",
3586 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3587 OPT_VIDEO | OPT_EXPERT);
3588 show_help_options(options, "\nAudio options:\n",
3589 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3591 show_help_options(options, "\nAdvanced Audio options:\n",
3592 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3593 OPT_AUDIO | OPT_EXPERT);
3594 show_help_options(options, "\nAudio/Video grab options:\n",
3597 show_help_options(options, "\nAdvanced options:\n",
3598 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3603 void parse_arg_file(const char *filename)
3605 opt_output_file(filename);
3608 int main(int argc, char **argv)
3619 parse_options(argc, argv, options);
3621 /* file converter / grab */
3622 if (nb_output_files <= 0) {
3623 fprintf(stderr, "Must supply at least one output file\n");
3627 if (nb_input_files == 0) {
3632 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3633 stream_maps, nb_stream_maps);
3634 ti = getutime() - ti;
3636 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3640 for(i=0;i<nb_output_files;i++) {
3641 /* maybe av_close_output_file ??? */
3642 AVFormatContext *s = output_files[i];
3644 if (!(s->oformat->flags & AVFMT_NOFILE))
3646 for(j=0;j<s->nb_streams;j++)
3647 av_free(s->streams[j]);
3650 for(i=0;i<nb_input_files;i++)
3651 av_close_input_file(input_files[i]);
3656 av_free(intra_matrix);
3658 av_free(inter_matrix);
3660 #ifdef POWERPC_PERFORMANCE_REPORT
3661 extern void powerpc_display_perf_report(void);
3662 powerpc_display_perf_report();
3663 #endif /* POWERPC_PERFORMANCE_REPORT */
3665 #ifndef CONFIG_WIN32
3666 if (received_sigterm) {
3668 "Received signal %d: terminating.\n",
3669 (int) received_sigterm);
3673 exit(0); /* not all OS-es handle main() return value */