3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #define HAVE_AV_CONFIG_H
22 #include "framehook.h"
27 #include <sys/ioctl.h>
30 #include <sys/resource.h>
34 #include <sys/types.h>
35 #include <sys/select.h>
38 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
43 #if !defined(INFINITY) && defined(HUGE_VAL)
44 #define INFINITY HUGE_VAL
47 /* select an input stream for an output stream */
48 typedef struct AVStreamMap {
53 extern const OptionDef options[];
55 static void show_help(void);
56 static void show_license(void);
60 static AVFormatContext *input_files[MAX_FILES];
61 static int64_t input_files_ts_offset[MAX_FILES];
62 static int nb_input_files = 0;
64 static AVFormatContext *output_files[MAX_FILES];
65 static int nb_output_files = 0;
67 static AVStreamMap stream_maps[MAX_FILES];
68 static int nb_stream_maps;
70 static AVInputFormat *file_iformat;
71 static AVOutputFormat *file_oformat;
72 static AVImageFormat *image_format;
73 static int frame_width = 160;
74 static int frame_height = 128;
75 static float frame_aspect_ratio = 0;
76 static enum PixelFormat frame_pix_fmt = PIX_FMT_YUV420P;
77 static int frame_padtop = 0;
78 static int frame_padbottom = 0;
79 static int frame_padleft = 0;
80 static int frame_padright = 0;
81 static int padcolor[3] = {16,128,128}; /* default to black */
82 static int frame_topBand = 0;
83 static int frame_bottomBand = 0;
84 static int frame_leftBand = 0;
85 static int frame_rightBand = 0;
86 static int frame_rate = 25;
87 static int frame_rate_base = 1;
88 static int video_bit_rate = 200*1000;
89 static int video_bit_rate_tolerance = 4000*1000;
90 static float video_qscale = 0;
91 static int video_qmin = 2;
92 static int video_qmax = 31;
93 static int video_lmin = 2*FF_QP2LAMBDA;
94 static int video_lmax = 31*FF_QP2LAMBDA;
95 static int video_mb_qmin = 2;
96 static int video_mb_qmax = 31;
97 static int video_qdiff = 3;
98 static float video_qblur = 0.5;
99 static float video_qcomp = 0.5;
100 static uint16_t *intra_matrix = NULL;
101 static uint16_t *inter_matrix = NULL;
102 #if 0 //experimental, (can be removed)
103 static float video_rc_qsquish=1.0;
104 static float video_rc_qmod_amp=0;
105 static int video_rc_qmod_freq=0;
107 static char *video_rc_override_string=NULL;
108 static char *video_rc_eq="tex^qComp";
109 static int video_rc_buffer_size=0;
110 static float video_rc_buffer_aggressivity=1.0;
111 static int video_rc_max_rate=0;
112 static int video_rc_min_rate=0;
113 static float video_rc_initial_cplx=0;
114 static float video_b_qfactor = 1.25;
115 static float video_b_qoffset = 1.25;
116 static float video_i_qfactor = -0.8;
117 static float video_i_qoffset = 0.0;
118 static int video_intra_quant_bias= FF_DEFAULT_QUANT_BIAS;
119 static int video_inter_quant_bias= FF_DEFAULT_QUANT_BIAS;
120 static int me_method = ME_EPZS;
121 static int video_disable = 0;
122 static int video_codec_id = CODEC_ID_NONE;
123 static int same_quality = 0;
124 static int b_frames = 0;
125 static int mb_decision = FF_MB_DECISION_SIMPLE;
126 static int ildct_cmp = FF_CMP_VSAD;
127 static int mb_cmp = FF_CMP_SAD;
128 static int sub_cmp = FF_CMP_SAD;
129 static int cmp = FF_CMP_SAD;
130 static int pre_cmp = FF_CMP_SAD;
131 static int pre_me = 0;
132 static float lumi_mask = 0;
133 static float dark_mask = 0;
134 static float scplx_mask = 0;
135 static float tcplx_mask = 0;
136 static float p_mask = 0;
137 static int use_4mv = 0;
138 static int use_obmc = 0;
139 static int use_loop = 0;
140 static int use_aic = 0;
141 static int use_aiv = 0;
142 static int use_umv = 0;
143 static int use_ss = 0;
144 static int use_alt_scan = 0;
145 static int use_trell = 0;
146 static int use_scan_offset = 0;
147 static int use_qpel = 0;
148 static int use_qprd = 0;
149 static int use_cbprd = 0;
151 static int closed_gop = 0;
152 static int do_deinterlace = 0;
153 static int do_interlace_dct = 0;
154 static int do_interlace_me = 0;
155 static int workaround_bugs = FF_BUG_AUTODETECT;
156 static int error_resilience = 2;
157 static int error_concealment = 3;
158 static int dct_algo = 0;
159 static int idct_algo = 0;
160 static int use_part = 0;
161 static int packet_size = 0;
162 static int error_rate = 0;
163 static int strict = 0;
164 static int top_field_first = -1;
165 static int noise_reduction = 0;
166 static int sc_threshold = 0;
167 static int debug = 0;
168 static int debug_mv = 0;
169 static int me_threshold = 0;
170 static int mb_threshold = 0;
171 static int intra_dc_precision = 8;
172 static int coder = 0;
173 static int context = 0;
174 static int predictor = 0;
175 extern int loop_input; /* currently a hack */
177 static int gop_size = 12;
178 static int intra_only = 0;
179 static int audio_sample_rate = 44100;
180 static int audio_bit_rate = 64000;
181 static int audio_disable = 0;
182 static int audio_channels = 1;
183 static int audio_codec_id = CODEC_ID_NONE;
185 static int64_t recording_time = 0;
186 static int64_t start_time = 0;
187 static int64_t rec_timestamp = 0;
188 static int64_t input_ts_offset = 0;
189 static int file_overwrite = 0;
190 static char *str_title = NULL;
191 static char *str_author = NULL;
192 static char *str_copyright = NULL;
193 static char *str_comment = NULL;
194 static int do_benchmark = 0;
195 static int do_hex_dump = 0;
196 static int do_pkt_dump = 0;
197 static int do_psnr = 0;
198 static int do_vstats = 0;
199 static int do_pass = 0;
200 static int bitexact = 0;
201 static char *pass_logfilename = NULL;
202 static int audio_stream_copy = 0;
203 static int video_stream_copy = 0;
204 static int sync_method= 1;
205 static int copy_ts= 0;
207 static int rate_emu = 0;
209 static char *video_grab_format = "video4linux";
210 static char *video_device = NULL;
211 static int video_channel = 0;
212 static char *video_standard = "ntsc";
214 static char *audio_grab_format = "audio_device";
215 static char *audio_device = NULL;
217 static int using_stdin = 0;
218 static int using_vhook = 0;
219 static int verbose = 1;
220 static int thread_count= 1;
221 static int q_pressed = 0;
222 static int me_range = 0;
223 static int64_t video_size = 0;
224 static int64_t audio_size = 0;
225 static int64_t extra_size = 0;
226 static int nb_frames_dup = 0;
227 static int nb_frames_drop = 0;
229 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
231 typedef struct AVOutputStream {
232 int file_index; /* file index */
233 int index; /* stream index in the output file */
234 int source_index; /* AVInputStream index */
235 AVStream *st; /* stream in the output file */
236 int encoding_needed; /* true if encoding needed for this stream */
238 /* input pts and corresponding output pts
240 double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
241 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
243 int video_resample; /* video_resample and video_crop are mutually exclusive */
244 AVFrame pict_tmp; /* temporary image for resampling */
245 ImgReSampleContext *img_resample_ctx; /* for image resampling */
247 int video_crop; /* video_resample and video_crop are mutually exclusive */
248 int topBand; /* cropping area sizes */
251 int video_pad; /* video_resample and video_pad are mutually exclusive */
252 int padtop; /* padding area sizes */
259 ReSampleContext *resample; /* for audio resampling */
260 FifoBuffer fifo; /* for compression: one audio fifo per codec */
264 typedef struct AVInputStream {
268 int discard; /* true if stream data should be discarded */
269 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
270 int64_t sample_index; /* current sample */
272 int64_t start; /* time when read started */
273 unsigned long frame; /* current frame */
274 int64_t next_pts; /* synthetic pts for cases where pkt.pts
276 int64_t pts; /* current pts */
279 typedef struct AVInputFile {
280 int eof_reached; /* true if eof reached */
281 int ist_index; /* index of first stream in ist_table */
282 int buffer_size; /* current total buffer size */
283 int buffer_size_max; /* buffer size at which we consider we can stop
285 int nb_streams; /* nb streams we are aware of */
290 /* init terminal so that we can grab keys */
291 static struct termios oldtty;
293 static void term_exit(void)
295 tcsetattr (0, TCSANOW, &oldtty);
298 static volatile sig_atomic_t received_sigterm = 0;
301 sigterm_handler(int sig)
303 received_sigterm = sig;
307 static void term_init(void)
314 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
315 |INLCR|IGNCR|ICRNL|IXON);
316 tty.c_oflag |= OPOST;
317 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
318 tty.c_cflag &= ~(CSIZE|PARENB);
323 tcsetattr (0, TCSANOW, &tty);
325 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
326 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
327 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
329 register a function to be called at normal program termination
332 #ifdef CONFIG_BEOS_NETSERVER
333 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
337 /* read a key without blocking */
338 static int read_key(void)
342 #ifndef CONFIG_BEOS_NETSERVER
350 n = select(1, &rfds, NULL, NULL, &tv);
362 static int decode_interrupt_cb(void)
364 return q_pressed || (q_pressed = read_key() == 'q');
369 static volatile int received_sigterm = 0;
371 /* no interactive support */
372 static void term_exit(void)
376 static void term_init(void)
380 static int read_key(void)
387 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
392 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
395 /* copy stream format */
396 s->nb_streams = ic->nb_streams;
397 for(i=0;i<ic->nb_streams;i++) {
400 st = av_mallocz(sizeof(AVStream));
401 memcpy(st, ic->streams[i], sizeof(AVStream));
405 av_close_input_file(ic);
409 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
411 static void do_audio_out(AVFormatContext *s,
414 unsigned char *buf, int size)
417 static uint8_t *audio_buf = NULL;
418 static uint8_t *audio_out = NULL;
419 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
421 int size_out, frame_bytes, ret;
424 /* SC: dynamic allocation of buffers */
426 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
428 audio_out = av_malloc(audio_out_size);
429 if (!audio_buf || !audio_out)
430 return; /* Should signal an error ! */
433 enc = &ost->st->codec;
435 if (ost->audio_resample) {
437 size_out = audio_resample(ost->resample,
438 (short *)buftmp, (short *)buf,
439 size / (ist->st->codec.channels * 2));
440 size_out = size_out * enc->channels * 2;
446 /* now encode as many frames as possible */
447 if (enc->frame_size > 1) {
448 /* output resampled raw samples */
449 fifo_write(&ost->fifo, buftmp, size_out,
452 frame_bytes = enc->frame_size * 2 * enc->channels;
454 while (fifo_read(&ost->fifo, audio_buf, frame_bytes,
455 &ost->fifo.rptr) == 0) {
457 av_init_packet(&pkt);
459 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
462 pkt.stream_index= ost->index;
466 pkt.pts= enc->coded_frame->pts;
467 pkt.flags |= PKT_FLAG_KEY;
468 av_interleaved_write_frame(s, &pkt);
472 av_init_packet(&pkt);
473 /* output a pcm frame */
474 /* XXX: change encoding codec API to avoid this ? */
475 switch(enc->codec->id) {
476 case CODEC_ID_PCM_S16LE:
477 case CODEC_ID_PCM_S16BE:
478 case CODEC_ID_PCM_U16LE:
479 case CODEC_ID_PCM_U16BE:
482 size_out = size_out >> 1;
485 ret = avcodec_encode_audio(enc, audio_out, size_out,
488 pkt.stream_index= ost->index;
492 pkt.pts= enc->coded_frame->pts;
493 pkt.flags |= PKT_FLAG_KEY;
494 av_interleaved_write_frame(s, &pkt);
498 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
502 AVPicture picture_tmp;
505 dec = &ist->st->codec;
507 /* deinterlace : must be done before any resize */
508 if (do_deinterlace || using_vhook) {
511 /* create temporary picture */
512 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
513 buf = av_malloc(size);
517 picture2 = &picture_tmp;
518 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
521 if(avpicture_deinterlace(picture2, picture,
522 dec->pix_fmt, dec->width, dec->height) < 0) {
523 /* if error, do not deinterlace */
529 if (img_convert(picture2, dec->pix_fmt, picture,
530 dec->pix_fmt, dec->width, dec->height) < 0) {
531 /* if error, do not copy */
541 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
543 if (picture != picture2)
544 *picture = *picture2;
548 /* we begin to correct av delay at this threshold */
549 #define AV_DELAY_MAX 0.100
552 /* Expects img to be yuv420 */
553 static void fill_pad_region(AVPicture* img, int height, int width,
554 int padtop, int padbottom, int padleft, int padright, int *color) {
559 for (i = 0; i < 3; i++) {
560 shift = (i == 0) ? 0 : 1;
562 if (padtop || padleft) {
563 memset(img->data[i], color[i], (((img->linesize[i] * padtop) +
567 if (padleft || padright) {
568 optr = img->data[i] + (img->linesize[i] * (padtop >> shift)) +
569 (img->linesize[i] - (padright >> shift));
571 for (y = 0; y < ((height - (padtop + padbottom)) >> shift); y++) {
572 memset(optr, color[i], (padleft + padright) >> shift);
573 optr += img->linesize[i];
578 optr = img->data[i] + (img->linesize[i] * ((height - padbottom) >> shift));
579 memset(optr, color[i], ((img->linesize[i] * padbottom) >> shift));
585 static void do_video_out(AVFormatContext *s,
589 int *frame_size, AVOutputStream *audio_sync)
591 int nb_frames, i, ret;
592 AVFrame *final_picture, *formatted_picture;
593 AVFrame picture_format_temp, picture_crop_temp;
594 static uint8_t *video_buffer= NULL;
595 uint8_t *buf = NULL, *buf1 = NULL;
596 AVCodecContext *enc, *dec;
597 enum PixelFormat target_pixfmt;
599 #define VIDEO_BUFFER_SIZE (1024*1024)
601 avcodec_get_frame_defaults(&picture_format_temp);
602 avcodec_get_frame_defaults(&picture_crop_temp);
604 enc = &ost->st->codec;
605 dec = &ist->st->codec;
607 /* by default, we output a single frame */
614 vdelta = ost->sync_ipts * enc->frame_rate / enc->frame_rate_base - ost->sync_opts;
615 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
618 else if (vdelta > 1.1)
620 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%lld, ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, ost->sync_ipts, nb_frames);
624 fprintf(stderr, "*** drop!\n");
625 }else if (nb_frames == 2) {
628 fprintf(stderr, "*** dup!\n");
631 ost->sync_opts= lrintf(ost->sync_ipts * enc->frame_rate / enc->frame_rate_base);
637 video_buffer = av_malloc(VIDEO_BUFFER_SIZE);
641 /* convert pixel format if needed */
642 target_pixfmt = ost->video_resample || ost->video_pad
643 ? PIX_FMT_YUV420P : enc->pix_fmt;
644 if (dec->pix_fmt != target_pixfmt) {
647 /* create temporary picture */
648 size = avpicture_get_size(target_pixfmt, dec->width, dec->height);
649 buf = av_malloc(size);
652 formatted_picture = &picture_format_temp;
653 avpicture_fill((AVPicture*)formatted_picture, buf, target_pixfmt, dec->width, dec->height);
655 if (img_convert((AVPicture*)formatted_picture, target_pixfmt,
656 (AVPicture *)in_picture, dec->pix_fmt,
657 dec->width, dec->height) < 0) {
660 fprintf(stderr, "pixel format conversion not handled\n");
665 formatted_picture = in_picture;
668 /* XXX: resampling could be done before raw format conversion in
669 some cases to go faster */
670 /* XXX: only works for YUV420P */
671 if (ost->video_resample) {
672 final_picture = &ost->pict_tmp;
673 img_resample(ost->img_resample_ctx, (AVPicture*)final_picture, (AVPicture*)formatted_picture);
675 if (ost->padtop || ost->padbottom || ost->padleft || ost->padright) {
676 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
677 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
681 if (enc->pix_fmt != PIX_FMT_YUV420P) {
685 /* create temporary picture */
686 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
687 buf = av_malloc(size);
690 final_picture = &picture_format_temp;
691 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
693 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
694 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
695 enc->width, enc->height) < 0) {
698 fprintf(stderr, "pixel format conversion not handled\n");
703 } else if (ost->video_crop) {
704 picture_crop_temp.data[0] = formatted_picture->data[0] +
705 (ost->topBand * formatted_picture->linesize[0]) + ost->leftBand;
707 picture_crop_temp.data[1] = formatted_picture->data[1] +
708 ((ost->topBand >> 1) * formatted_picture->linesize[1]) +
709 (ost->leftBand >> 1);
711 picture_crop_temp.data[2] = formatted_picture->data[2] +
712 ((ost->topBand >> 1) * formatted_picture->linesize[2]) +
713 (ost->leftBand >> 1);
715 picture_crop_temp.linesize[0] = formatted_picture->linesize[0];
716 picture_crop_temp.linesize[1] = formatted_picture->linesize[1];
717 picture_crop_temp.linesize[2] = formatted_picture->linesize[2];
718 final_picture = &picture_crop_temp;
719 } else if (ost->video_pad) {
720 final_picture = &ost->pict_tmp;
722 for (i = 0; i < 3; i++) {
723 uint8_t *optr, *iptr;
724 int shift = (i == 0) ? 0 : 1;
727 /* set offset to start writing image into */
728 optr = final_picture->data[i] + (((final_picture->linesize[i] *
729 ost->padtop) + ost->padleft) >> shift);
730 iptr = formatted_picture->data[i];
732 yheight = (enc->height - ost->padtop - ost->padbottom) >> shift;
733 for (y = 0; y < yheight; y++) {
734 /* copy unpadded image row into padded image row */
735 memcpy(optr, iptr, formatted_picture->linesize[i]);
736 optr += final_picture->linesize[i];
737 iptr += formatted_picture->linesize[i];
741 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
742 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
745 if (enc->pix_fmt != PIX_FMT_YUV420P) {
749 /* create temporary picture */
750 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
751 buf = av_malloc(size);
754 final_picture = &picture_format_temp;
755 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
757 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
758 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
759 enc->width, enc->height) < 0) {
762 fprintf(stderr, "pixel format conversion not handled\n");
768 final_picture = formatted_picture;
770 /* duplicates frame if needed */
771 /* XXX: pb because no interleaving */
772 for(i=0;i<nb_frames;i++) {
774 av_init_packet(&pkt);
775 pkt.stream_index= ost->index;
777 if (s->oformat->flags & AVFMT_RAWPICTURE) {
778 /* raw pictures are written as AVPicture structure to
779 avoid any copies. We support temorarily the older
781 AVFrame* old_frame = enc->coded_frame;
782 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
783 pkt.data= (uint8_t *)final_picture;
784 pkt.size= sizeof(AVPicture);
786 pkt.pts= dec->coded_frame->pts;
787 if(dec->coded_frame && dec->coded_frame->key_frame)
788 pkt.flags |= PKT_FLAG_KEY;
790 av_interleaved_write_frame(s, &pkt);
791 enc->coded_frame = old_frame;
795 big_picture= *final_picture;
796 /* better than nothing: use input picture interlaced
798 big_picture.interlaced_frame = in_picture->interlaced_frame;
799 if(do_interlace_me || do_interlace_dct){
800 if(top_field_first == -1)
801 big_picture.top_field_first = in_picture->top_field_first;
803 big_picture.top_field_first = top_field_first;
806 /* handles sameq here. This is not correct because it may
807 not be a global option */
809 big_picture.quality = ist->st->quality;
811 big_picture.quality = ost->st->quality;
813 big_picture.pict_type = 0;
814 // big_picture.pts = AV_NOPTS_VALUE;
815 big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->frame_rate_base, enc->frame_rate);
816 //av_log(NULL, AV_LOG_DEBUG, "%lld -> encoder\n", ost->sync_opts);
817 ret = avcodec_encode_video(enc,
818 video_buffer, VIDEO_BUFFER_SIZE,
820 //enc->frame_number = enc->real_pict_num;
822 pkt.data= video_buffer;
825 pkt.pts= enc->coded_frame->pts;
826 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %lld/%lld\n",
827 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1,
828 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1);*/
830 if(enc->coded_frame && enc->coded_frame->key_frame)
831 pkt.flags |= PKT_FLAG_KEY;
832 av_interleaved_write_frame(s, &pkt);
834 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
835 // enc->frame_number-1, enc->real_pict_num, ret,
837 /* if two pass, output log */
838 if (ost->logfile && enc->stats_out) {
839 fprintf(ost->logfile, "%s", enc->stats_out);
851 static double psnr(double d){
852 if(d==0) return INFINITY;
853 return -10.0*log(d)/log(10.0);
856 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
859 static FILE *fvstats=NULL;
866 double ti1, bitrate, avg_bitrate;
870 today = localtime(&today2);
871 sprintf(filename, "vstats_%02d%02d%02d.log", today->tm_hour,
874 fvstats = fopen(filename,"w");
882 enc = &ost->st->codec;
883 if (enc->codec_type == CODEC_TYPE_VIDEO) {
884 frame_number = ost->frame_number;
885 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
886 if (enc->flags&CODEC_FLAG_PSNR)
887 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
889 fprintf(fvstats,"f_size= %6d ", frame_size);
890 /* compute pts value */
891 ti1 = (double)ost->sync_opts *enc->frame_rate_base / enc->frame_rate;
895 bitrate = (double)(frame_size * 8) * enc->frame_rate / enc->frame_rate_base / 1000.0;
896 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
897 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
898 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
899 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
903 static void print_report(AVFormatContext **output_files,
904 AVOutputStream **ost_table, int nb_ostreams,
909 AVFormatContext *oc, *os;
912 int frame_number, vid, i;
913 double bitrate, ti1, pts;
914 static int64_t last_time = -1;
916 if (!is_last_report) {
918 /* display the report every 0.5 seconds */
919 cur_time = av_gettime();
920 if (last_time == -1) {
921 last_time = cur_time;
924 if ((cur_time - last_time) < 500000)
926 last_time = cur_time;
930 oc = output_files[0];
932 total_size = url_ftell(&oc->pb);
937 for(i=0;i<nb_ostreams;i++) {
939 os = output_files[ost->file_index];
940 enc = &ost->st->codec;
941 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
942 sprintf(buf + strlen(buf), "q=%2.1f ",
943 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
945 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
946 frame_number = ost->frame_number;
947 sprintf(buf + strlen(buf), "frame=%5d q=%2.1f ",
948 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : 0);
950 sprintf(buf + strlen(buf), "L");
951 if (enc->flags&CODEC_FLAG_PSNR){
953 double error, error_sum=0;
954 double scale, scale_sum=0;
955 char type[3]= {'Y','U','V'};
956 sprintf(buf + strlen(buf), "PSNR=");
959 error= enc->error[j];
960 scale= enc->width*enc->height*255.0*255.0*frame_number;
962 error= enc->coded_frame->error[j];
963 scale= enc->width*enc->height*255.0*255.0;
968 sprintf(buf + strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
970 sprintf(buf + strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
974 /* compute min output value */
975 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
976 if ((pts < ti1) && (pts > 0))
982 if (verbose || is_last_report) {
983 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
985 sprintf(buf + strlen(buf),
986 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
987 (double)total_size / 1024, ti1, bitrate);
990 sprintf(buf + strlen(buf), " dup=%d drop=%d",
991 nb_frames_dup, nb_frames_drop);
994 fprintf(stderr, "%s \r", buf);
999 if (is_last_report && verbose >= 0){
1000 int64_t raw= audio_size + video_size + extra_size;
1001 fprintf(stderr, "\n");
1002 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1006 100.0*(total_size - raw)/raw
1011 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1012 static int output_packet(AVInputStream *ist, int ist_index,
1013 AVOutputStream **ost_table, int nb_ostreams,
1014 const AVPacket *pkt)
1016 AVFormatContext *os;
1017 AVOutputStream *ost;
1021 int data_size, got_picture;
1023 short samples[AVCODEC_MAX_AUDIO_FRAME_SIZE / 2];
1024 void *buffer_to_free;
1026 if (pkt && pkt->pts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1027 ist->next_pts = ist->pts = pkt->dts;
1029 ist->pts = ist->next_pts;
1043 /* decode the packet if needed */
1044 data_buf = NULL; /* fail safe */
1046 if (ist->decoding_needed) {
1047 switch(ist->st->codec.codec_type) {
1048 case CODEC_TYPE_AUDIO:
1049 /* XXX: could avoid copy if PCM 16 bits with same
1050 endianness as CPU */
1051 ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size,
1057 /* Some bug in mpeg audio decoder gives */
1058 /* data_size < 0, it seems they are overflows */
1059 if (data_size <= 0) {
1060 /* no audio frame */
1063 data_buf = (uint8_t *)samples;
1064 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1065 (ist->st->codec.sample_rate * ist->st->codec.channels);
1067 case CODEC_TYPE_VIDEO:
1068 data_size = (ist->st->codec.width * ist->st->codec.height * 3) / 2;
1069 /* XXX: allocate picture correctly */
1070 avcodec_get_frame_defaults(&picture);
1072 ret = avcodec_decode_video(&ist->st->codec,
1073 &picture, &got_picture, ptr, len);
1074 ist->st->quality= picture.quality;
1078 /* no picture yet */
1079 goto discard_packet;
1081 if (ist->st->codec.frame_rate_base != 0) {
1082 ist->next_pts += ((int64_t)AV_TIME_BASE *
1083 ist->st->codec.frame_rate_base) /
1084 ist->st->codec.frame_rate;
1098 buffer_to_free = NULL;
1099 if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1100 pre_process_video_frame(ist, (AVPicture *)&picture,
1104 /* frame rate emulation */
1105 if (ist->st->codec.rate_emu) {
1106 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec.frame_rate_base, 1000000, ist->st->codec.frame_rate);
1107 int64_t now = av_gettime() - ist->start;
1115 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1116 is the one of the next displayed one */
1117 /* XXX: add mpeg4 too ? */
1118 if (ist->st->codec.codec_id == CODEC_ID_MPEG1VIDEO) {
1119 if (ist->st->codec.pict_type != B_TYPE) {
1121 tmp = ist->last_ip_pts;
1122 ist->last_ip_pts = ist->frac_pts.val;
1123 ist->frac_pts.val = tmp;
1127 /* if output time reached then transcode raw format,
1128 encode packets and output them */
1129 if (start_time == 0 || ist->pts >= start_time)
1130 for(i=0;i<nb_ostreams;i++) {
1134 if (ost->source_index == ist_index) {
1135 os = output_files[ost->file_index];
1138 printf("%d: got pts=%0.3f %0.3f\n", i,
1139 (double)pkt->pts / AV_TIME_BASE,
1140 ((double)ist->pts / AV_TIME_BASE) -
1141 ((double)ost->st->pts.val * ost->time_base.num / ost->time_base.den));
1143 /* set the input output pts pairs */
1144 ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index])/ AV_TIME_BASE;
1146 if (ost->encoding_needed) {
1147 switch(ost->st->codec.codec_type) {
1148 case CODEC_TYPE_AUDIO:
1149 do_audio_out(os, ost, ist, data_buf, data_size);
1151 case CODEC_TYPE_VIDEO:
1152 /* find an audio stream for synchro */
1155 AVOutputStream *audio_sync, *ost1;
1157 for(i=0;i<nb_ostreams;i++) {
1158 ost1 = ost_table[i];
1159 if (ost1->file_index == ost->file_index &&
1160 ost1->st->codec.codec_type == CODEC_TYPE_AUDIO) {
1166 do_video_out(os, ost, ist, &picture, &frame_size, audio_sync);
1167 video_size += frame_size;
1168 if (do_vstats && frame_size)
1169 do_video_stats(os, ost, frame_size);
1176 AVFrame avframe; //FIXME/XXX remove this
1178 av_init_packet(&opkt);
1180 /* no reencoding needed : output the packet directly */
1181 /* force the input stream PTS */
1183 avcodec_get_frame_defaults(&avframe);
1184 ost->st->codec.coded_frame= &avframe;
1185 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1187 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO)
1188 audio_size += data_size;
1189 else if (ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1190 video_size += data_size;
1192 opkt.stream_index= ost->index;
1193 opkt.data= data_buf;
1194 opkt.size= data_size;
1195 opkt.pts= pkt->pts + input_files_ts_offset[ist->file_index];
1196 opkt.dts= pkt->dts + input_files_ts_offset[ist->file_index];
1197 opkt.flags= pkt->flags;
1199 av_interleaved_write_frame(os, &opkt);
1200 ost->st->codec.frame_number++;
1201 ost->frame_number++;
1205 av_free(buffer_to_free);
1215 * The following code is the main loop of the file converter
1217 static int av_encode(AVFormatContext **output_files,
1218 int nb_output_files,
1219 AVFormatContext **input_files,
1221 AVStreamMap *stream_maps, int nb_stream_maps)
1223 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1224 AVFormatContext *is, *os;
1225 AVCodecContext *codec, *icodec;
1226 AVOutputStream *ost, **ost_table = NULL;
1227 AVInputStream *ist, **ist_table = NULL;
1228 AVInputFile *file_table;
1229 AVFormatContext *stream_no_data;
1232 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1236 /* input stream init */
1238 for(i=0;i<nb_input_files;i++) {
1239 is = input_files[i];
1240 file_table[i].ist_index = j;
1241 file_table[i].nb_streams = is->nb_streams;
1242 j += is->nb_streams;
1246 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1250 for(i=0;i<nb_istreams;i++) {
1251 ist = av_mallocz(sizeof(AVInputStream));
1257 for(i=0;i<nb_input_files;i++) {
1258 is = input_files[i];
1259 for(k=0;k<is->nb_streams;k++) {
1260 ist = ist_table[j++];
1261 ist->st = is->streams[k];
1262 ist->file_index = i;
1264 ist->discard = 1; /* the stream is discarded by default
1267 if (ist->st->codec.rate_emu) {
1268 ist->start = av_gettime();
1274 /* output stream init */
1276 for(i=0;i<nb_output_files;i++) {
1277 os = output_files[i];
1278 nb_ostreams += os->nb_streams;
1280 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1281 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1285 /* Sanity check the mapping args -- do the input files & streams exist? */
1286 for(i=0;i<nb_stream_maps;i++) {
1287 int fi = stream_maps[i].file_index;
1288 int si = stream_maps[i].stream_index;
1290 if (fi < 0 || fi > nb_input_files - 1 ||
1291 si < 0 || si > file_table[fi].nb_streams - 1) {
1292 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1297 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1300 for(i=0;i<nb_ostreams;i++) {
1301 ost = av_mallocz(sizeof(AVOutputStream));
1308 for(k=0;k<nb_output_files;k++) {
1309 os = output_files[k];
1310 for(i=0;i<os->nb_streams;i++) {
1312 ost = ost_table[n++];
1313 ost->file_index = k;
1315 ost->st = os->streams[i];
1316 if (nb_stream_maps > 0) {
1317 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1318 stream_maps[n-1].stream_index;
1320 /* Sanity check that the stream types match */
1321 if (ist_table[ost->source_index]->st->codec.codec_type != ost->st->codec.codec_type) {
1322 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1323 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1324 ost->file_index, ost->index);
1329 /* get corresponding input stream index : we select the first one with the right type */
1331 for(j=0;j<nb_istreams;j++) {
1334 ist->st->codec.codec_type == ost->st->codec.codec_type) {
1335 ost->source_index = j;
1341 /* try again and reuse existing stream */
1342 for(j=0;j<nb_istreams;j++) {
1344 if (ist->st->codec.codec_type == ost->st->codec.codec_type) {
1345 ost->source_index = j;
1350 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1351 ost->file_index, ost->index);
1356 ist = ist_table[ost->source_index];
1361 /* for each output stream, we compute the right encoding parameters */
1362 for(i=0;i<nb_ostreams;i++) {
1364 ist = ist_table[ost->source_index];
1366 codec = &ost->st->codec;
1367 icodec = &ist->st->codec;
1369 if (ost->st->stream_copy) {
1370 /* if stream_copy is selected, no need to decode or encode */
1371 codec->codec_id = icodec->codec_id;
1372 codec->codec_type = icodec->codec_type;
1373 codec->codec_tag = icodec->codec_tag;
1374 codec->bit_rate = icodec->bit_rate;
1375 switch(codec->codec_type) {
1376 case CODEC_TYPE_AUDIO:
1377 codec->sample_rate = icodec->sample_rate;
1378 codec->channels = icodec->channels;
1379 codec->frame_size = icodec->frame_size;
1381 case CODEC_TYPE_VIDEO:
1382 codec->frame_rate = icodec->frame_rate;
1383 codec->frame_rate_base = icodec->frame_rate_base;
1384 codec->width = icodec->width;
1385 codec->height = icodec->height;
1391 switch(codec->codec_type) {
1392 case CODEC_TYPE_AUDIO:
1393 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1396 if (codec->channels == icodec->channels &&
1397 codec->sample_rate == icodec->sample_rate) {
1398 ost->audio_resample = 0;
1400 if (codec->channels != icodec->channels &&
1401 icodec->codec_id == CODEC_ID_AC3) {
1402 /* Special case for 5:1 AC3 input */
1403 /* and mono or stereo output */
1404 /* Request specific number of channels */
1405 icodec->channels = codec->channels;
1406 if (codec->sample_rate == icodec->sample_rate)
1407 ost->audio_resample = 0;
1409 ost->audio_resample = 1;
1410 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1412 icodec->sample_rate);
1415 printf("Can't resample. Aborting.\n");
1419 /* Request specific number of channels */
1420 icodec->channels = codec->channels;
1422 ost->audio_resample = 1;
1423 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1425 icodec->sample_rate);
1428 printf("Can't resample. Aborting.\n");
1433 ist->decoding_needed = 1;
1434 ost->encoding_needed = 1;
1436 case CODEC_TYPE_VIDEO:
1437 if (codec->width == icodec->width &&
1438 codec->height == icodec->height &&
1439 frame_topBand == 0 &&
1440 frame_bottomBand == 0 &&
1441 frame_leftBand == 0 &&
1442 frame_rightBand == 0 &&
1443 frame_padtop == 0 &&
1444 frame_padbottom == 0 &&
1445 frame_padleft == 0 &&
1446 frame_padright == 0)
1448 ost->video_resample = 0;
1449 ost->video_crop = 0;
1451 } else if ((codec->width == icodec->width -
1452 (frame_leftBand + frame_rightBand)) &&
1453 (codec->height == icodec->height -
1454 (frame_topBand + frame_bottomBand)))
1456 ost->video_resample = 0;
1457 ost->video_crop = 1;
1458 ost->topBand = frame_topBand;
1459 ost->leftBand = frame_leftBand;
1460 } else if ((codec->width == icodec->width +
1461 (frame_padleft + frame_padright)) &&
1462 (codec->height == icodec->height +
1463 (frame_padtop + frame_padbottom))) {
1464 ost->video_resample = 0;
1465 ost->video_crop = 0;
1467 ost->padtop = frame_padtop;
1468 ost->padleft = frame_padleft;
1469 ost->padbottom = frame_padbottom;
1470 ost->padright = frame_padright;
1471 avcodec_get_frame_defaults(&ost->pict_tmp);
1472 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1473 codec->width, codec->height ) )
1476 ost->video_resample = 1;
1477 ost->video_crop = 0; // cropping is handled as part of resample
1478 avcodec_get_frame_defaults(&ost->pict_tmp);
1479 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1480 codec->width, codec->height ) )
1483 ost->img_resample_ctx = img_resample_full_init(
1484 ost->st->codec.width, ost->st->codec.height,
1485 ist->st->codec.width, ist->st->codec.height,
1486 frame_topBand, frame_bottomBand,
1487 frame_leftBand, frame_rightBand,
1488 frame_padtop, frame_padbottom,
1489 frame_padleft, frame_padright);
1491 ost->padtop = frame_padtop;
1492 ost->padleft = frame_padleft;
1493 ost->padbottom = frame_padbottom;
1494 ost->padright = frame_padright;
1497 ost->encoding_needed = 1;
1498 ist->decoding_needed = 1;
1504 if (ost->encoding_needed &&
1505 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1506 char logfilename[1024];
1511 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1513 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1514 if (codec->flags & CODEC_FLAG_PASS1) {
1515 f = fopen(logfilename, "w");
1517 perror(logfilename);
1522 /* read the log file */
1523 f = fopen(logfilename, "r");
1525 perror(logfilename);
1528 fseek(f, 0, SEEK_END);
1530 fseek(f, 0, SEEK_SET);
1531 logbuffer = av_malloc(size + 1);
1533 fprintf(stderr, "Could not allocate log buffer\n");
1536 size = fread(logbuffer, 1, size, f);
1538 logbuffer[size] = '\0';
1539 codec->stats_in = logbuffer;
1545 /* dump the file output parameters - cannot be done before in case
1547 for(i=0;i<nb_output_files;i++) {
1548 dump_format(output_files[i], i, output_files[i]->filename, 1);
1551 /* dump the stream mapping */
1553 fprintf(stderr, "Stream mapping:\n");
1554 for(i=0;i<nb_ostreams;i++) {
1556 fprintf(stderr, " Stream #%d.%d -> #%d.%d\n",
1557 ist_table[ost->source_index]->file_index,
1558 ist_table[ost->source_index]->index,
1564 /* open each encoder */
1565 for(i=0;i<nb_ostreams;i++) {
1567 if (ost->encoding_needed) {
1569 codec = avcodec_find_encoder(ost->st->codec.codec_id);
1571 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1572 ost->file_index, ost->index);
1575 if (avcodec_open(&ost->st->codec, codec) < 0) {
1576 fprintf(stderr, "Error while opening codec for stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1577 ost->file_index, ost->index);
1580 extra_size += ost->st->codec.extradata_size;
1584 /* open each decoder */
1585 for(i=0;i<nb_istreams;i++) {
1587 if (ist->decoding_needed) {
1589 codec = avcodec_find_decoder(ist->st->codec.codec_id);
1591 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1592 ist->st->codec.codec_id, ist->file_index, ist->index);
1595 if (avcodec_open(&ist->st->codec, codec) < 0) {
1596 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1597 ist->file_index, ist->index);
1600 //if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO)
1601 // ist->st->codec.flags |= CODEC_FLAG_REPEAT_FIELD;
1606 for(i=0;i<nb_istreams;i++) {
1608 is = input_files[ist->file_index];
1613 /* compute buffer size max (should use a complete heuristic) */
1614 for(i=0;i<nb_input_files;i++) {
1615 file_table[i].buffer_size_max = 2048;
1618 /* open files and write file headers */
1619 for(i=0;i<nb_output_files;i++) {
1620 os = output_files[i];
1621 if (av_write_header(os) < 0) {
1622 fprintf(stderr, "Could not write header for output file #%d (incorrect codec paramters ?)\n", i);
1628 #ifndef CONFIG_WIN32
1629 if ( !using_stdin && verbose >= 0) {
1630 fprintf(stderr, "Press [q] to stop encoding\n");
1631 url_set_interrupt_cb(decode_interrupt_cb);
1639 for(; received_sigterm == 0;) {
1640 int file_index, ist_index;
1645 /* if 'q' pressed, exits */
1649 /* read_key() returns 0 on EOF */
1655 /* select the stream that we must read now by looking at the
1656 smallest output pts */
1659 for(i=0;i<nb_ostreams;i++) {
1662 os = output_files[ost->file_index];
1663 ist = ist_table[ost->source_index];
1664 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1665 pts = (double)ost->sync_opts * ost->st->codec.frame_rate_base / ost->st->codec.frame_rate;
1667 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1668 if (!file_table[ist->file_index].eof_reached &&
1671 file_index = ist->file_index;
1674 /* if none, if is finished */
1675 if (file_index < 0) {
1679 /* finish if recording time exhausted */
1680 if (recording_time > 0 && pts_min >= (recording_time / 1000000.0))
1683 /* read a frame from it and output it in the fifo */
1684 is = input_files[file_index];
1685 if (av_read_frame(is, &pkt) < 0) {
1686 file_table[file_index].eof_reached = 1;
1691 stream_no_data = is;
1696 av_pkt_dump(stdout, &pkt, do_hex_dump);
1698 /* the following test is needed in case new streams appear
1699 dynamically in stream : we ignore them */
1700 if (pkt.stream_index >= file_table[file_index].nb_streams)
1701 goto discard_packet;
1702 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1703 ist = ist_table[ist_index];
1705 goto discard_packet;
1707 // fprintf(stderr, "next:%lld dts:%lld off:%lld %d\n", ist->next_pts, pkt.dts, input_files_ts_offset[ist->file_index], ist->st->codec.codec_type);
1708 if (pkt.dts != AV_NOPTS_VALUE) {
1709 int64_t delta= pkt.dts - ist->next_pts;
1710 if(ABS(delta) > 10LL*AV_TIME_BASE && !copy_ts){
1711 input_files_ts_offset[ist->file_index]-= delta;
1713 fprintf(stderr, "timestamp discontinuity %lld, new offset= %lld\n", delta, input_files_ts_offset[ist->file_index]);
1714 for(i=0; i<file_table[file_index].nb_streams; i++){
1715 int index= file_table[file_index].ist_index + i;
1716 ist_table[index]->next_pts += delta;
1721 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1722 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1725 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1726 ist->file_index, ist->index);
1728 av_free_packet(&pkt);
1733 av_free_packet(&pkt);
1735 /* dump report by using the output first video and audio streams */
1736 print_report(output_files, ost_table, nb_ostreams, 0);
1739 /* at the end of stream, we must flush the decoder buffers */
1740 for(i=0;i<nb_istreams;i++) {
1742 if (ist->decoding_needed) {
1743 output_packet(ist, i, ost_table, nb_ostreams, NULL);
1749 /* write the trailer if needed and close file */
1750 for(i=0;i<nb_output_files;i++) {
1751 os = output_files[i];
1752 av_write_trailer(os);
1755 /* dump report by using the first video and audio streams */
1756 print_report(output_files, ost_table, nb_ostreams, 1);
1758 /* close each encoder */
1759 for(i=0;i<nb_ostreams;i++) {
1761 if (ost->encoding_needed) {
1762 av_freep(&ost->st->codec.stats_in);
1763 avcodec_close(&ost->st->codec);
1767 /* close each decoder */
1768 for(i=0;i<nb_istreams;i++) {
1770 if (ist->decoding_needed) {
1771 avcodec_close(&ist->st->codec);
1779 av_free(file_table);
1782 for(i=0;i<nb_istreams;i++) {
1789 for(i=0;i<nb_ostreams;i++) {
1793 fclose(ost->logfile);
1794 ost->logfile = NULL;
1796 fifo_free(&ost->fifo); /* works even if fifo is not
1797 initialized but set to zero */
1798 av_free(ost->pict_tmp.data[0]);
1799 if (ost->video_resample)
1800 img_resample_close(ost->img_resample_ctx);
1801 if (ost->audio_resample)
1802 audio_resample_close(ost->resample);
1815 int file_read(const char *filename)
1818 unsigned char buffer[1024];
1821 if (url_open(&h, filename, O_RDONLY) < 0) {
1822 printf("could not open '%s'\n", filename);
1826 len = url_read(h, buffer, sizeof(buffer));
1829 for(i=0;i<len;i++) putchar(buffer[i]);
1836 static void opt_image_format(const char *arg)
1840 for(f = first_image_format; f != NULL; f = f->next) {
1841 if (!strcmp(arg, f->name))
1845 fprintf(stderr, "Unknown image format: '%s'\n", arg);
1851 static void opt_format(const char *arg)
1853 /* compatibility stuff for pgmyuv */
1854 if (!strcmp(arg, "pgmyuv")) {
1855 opt_image_format(arg);
1859 file_iformat = av_find_input_format(arg);
1860 file_oformat = guess_format(arg, NULL, NULL);
1861 if (!file_iformat && !file_oformat) {
1862 fprintf(stderr, "Unknown input or output format: %s\n", arg);
1867 static void opt_video_bitrate(const char *arg)
1869 video_bit_rate = atoi(arg) * 1000;
1872 static void opt_video_bitrate_tolerance(const char *arg)
1874 video_bit_rate_tolerance = atoi(arg) * 1000;
1877 static void opt_video_bitrate_max(const char *arg)
1879 video_rc_max_rate = atoi(arg) * 1000;
1882 static void opt_video_bitrate_min(const char *arg)
1884 video_rc_min_rate = atoi(arg) * 1000;
1887 static void opt_video_buffer_size(const char *arg)
1889 video_rc_buffer_size = atoi(arg) * 8*1024;
1892 static void opt_video_rc_eq(char *arg)
1897 static void opt_video_rc_override_string(char *arg)
1899 video_rc_override_string = arg;
1903 static void opt_workaround_bugs(const char *arg)
1905 workaround_bugs = atoi(arg);
1908 static void opt_dct_algo(const char *arg)
1910 dct_algo = atoi(arg);
1913 static void opt_idct_algo(const char *arg)
1915 idct_algo = atoi(arg);
1918 static void opt_me_threshold(const char *arg)
1920 me_threshold = atoi(arg);
1923 static void opt_mb_threshold(const char *arg)
1925 mb_threshold = atoi(arg);
1928 static void opt_error_resilience(const char *arg)
1930 error_resilience = atoi(arg);
1933 static void opt_error_concealment(const char *arg)
1935 error_concealment = atoi(arg);
1938 static void opt_debug(const char *arg)
1943 static void opt_vismv(const char *arg)
1945 debug_mv = atoi(arg);
1948 static void opt_verbose(const char *arg)
1950 verbose = atoi(arg);
1951 av_log_set_level(atoi(arg));
1954 static void opt_sync_method(const char *arg)
1956 sync_method = atoi(arg);
1959 static void opt_frame_rate(const char *arg)
1961 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
1962 fprintf(stderr, "Incorrect frame rate\n");
1967 static void opt_frame_crop_top(const char *arg)
1969 frame_topBand = atoi(arg);
1970 if (frame_topBand < 0) {
1971 fprintf(stderr, "Incorrect top crop size\n");
1974 if ((frame_topBand % 2) != 0) {
1975 fprintf(stderr, "Top crop size must be a multiple of 2\n");
1978 if ((frame_topBand) >= frame_height){
1979 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
1982 frame_height -= frame_topBand;
1985 static void opt_frame_crop_bottom(const char *arg)
1987 frame_bottomBand = atoi(arg);
1988 if (frame_bottomBand < 0) {
1989 fprintf(stderr, "Incorrect bottom crop size\n");
1992 if ((frame_bottomBand % 2) != 0) {
1993 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
1996 if ((frame_bottomBand) >= frame_height){
1997 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2000 frame_height -= frame_bottomBand;
2003 static void opt_frame_crop_left(const char *arg)
2005 frame_leftBand = atoi(arg);
2006 if (frame_leftBand < 0) {
2007 fprintf(stderr, "Incorrect left crop size\n");
2010 if ((frame_leftBand % 2) != 0) {
2011 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2014 if ((frame_leftBand) >= frame_width){
2015 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2018 frame_width -= frame_leftBand;
2021 static void opt_frame_crop_right(const char *arg)
2023 frame_rightBand = atoi(arg);
2024 if (frame_rightBand < 0) {
2025 fprintf(stderr, "Incorrect right crop size\n");
2028 if ((frame_rightBand % 2) != 0) {
2029 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2032 if ((frame_rightBand) >= frame_width){
2033 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2036 frame_width -= frame_rightBand;
2039 static void opt_frame_size(const char *arg)
2041 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2042 fprintf(stderr, "Incorrect frame size\n");
2045 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2046 fprintf(stderr, "Frame size must be a multiple of 2\n");
2052 #define SCALEBITS 10
2053 #define ONE_HALF (1 << (SCALEBITS - 1))
2054 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2056 #define RGB_TO_Y(r, g, b) \
2057 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2058 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2060 #define RGB_TO_U(r1, g1, b1, shift)\
2061 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2062 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2064 #define RGB_TO_V(r1, g1, b1, shift)\
2065 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2066 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2068 static void opt_pad_color(const char *arg) {
2069 /* Input is expected to be six hex digits similar to
2070 how colors are expressed in html tags (but without the #) */
2071 int rgb = strtol(arg, NULL, 16);
2075 g = ((rgb >> 8) & 255);
2078 padcolor[0] = RGB_TO_Y(r,g,b);
2079 padcolor[1] = RGB_TO_U(r,g,b,0);
2080 padcolor[2] = RGB_TO_V(r,g,b,0);
2083 static void opt_frame_pad_top(const char *arg)
2085 frame_padtop = atoi(arg);
2086 if (frame_padtop < 0) {
2087 fprintf(stderr, "Incorrect top pad size\n");
2090 if ((frame_padtop % 2) != 0) {
2091 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2096 static void opt_frame_pad_bottom(const char *arg)
2098 frame_padbottom = atoi(arg);
2099 if (frame_padbottom < 0) {
2100 fprintf(stderr, "Incorrect bottom pad size\n");
2103 if ((frame_padbottom % 2) != 0) {
2104 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2110 static void opt_frame_pad_left(const char *arg)
2112 frame_padleft = atoi(arg);
2113 if (frame_padleft < 0) {
2114 fprintf(stderr, "Incorrect left pad size\n");
2117 if ((frame_padleft % 2) != 0) {
2118 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2124 static void opt_frame_pad_right(const char *arg)
2126 frame_padright = atoi(arg);
2127 if (frame_padright < 0) {
2128 fprintf(stderr, "Incorrect right pad size\n");
2131 if ((frame_padright % 2) != 0) {
2132 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2138 static void opt_frame_pix_fmt(const char *arg)
2140 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2143 static void opt_frame_aspect_ratio(const char *arg)
2149 p = strchr(arg, ':');
2151 x = strtol(arg, (char **)&arg, 10);
2153 y = strtol(arg+1, (char **)&arg, 10);
2155 ar = (double)x / (double)y;
2157 ar = strtod(arg, (char **)&arg);
2160 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2163 frame_aspect_ratio = ar;
2166 static void opt_gop_size(const char *arg)
2168 gop_size = atoi(arg);
2171 static void opt_b_frames(const char *arg)
2173 b_frames = atoi(arg);
2174 if (b_frames > FF_MAX_B_FRAMES) {
2175 fprintf(stderr, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES);
2177 } else if (b_frames < 1) {
2178 fprintf(stderr, "\nNumber of B frames must be higher than 0\n");
2183 static void opt_mb_decision(const char *arg)
2185 mb_decision = atoi(arg);
2188 static void opt_mb_cmp(const char *arg)
2193 static void opt_ildct_cmp(const char *arg)
2195 ildct_cmp = atoi(arg);
2198 static void opt_sub_cmp(const char *arg)
2200 sub_cmp = atoi(arg);
2203 static void opt_cmp(const char *arg)
2208 static void opt_pre_cmp(const char *arg)
2210 pre_cmp = atoi(arg);
2213 static void opt_pre_me(const char *arg)
2218 static void opt_lumi_mask(const char *arg)
2220 lumi_mask = atof(arg);
2223 static void opt_dark_mask(const char *arg)
2225 dark_mask = atof(arg);
2228 static void opt_scplx_mask(const char *arg)
2230 scplx_mask = atof(arg);
2233 static void opt_tcplx_mask(const char *arg)
2235 tcplx_mask = atof(arg);
2238 static void opt_p_mask(const char *arg)
2243 static void opt_qscale(const char *arg)
2245 video_qscale = atof(arg);
2246 if (video_qscale < 0.01 ||
2247 video_qscale > 255) {
2248 fprintf(stderr, "qscale must be >= 0.01 and <= 255\n");
2253 static void opt_lmax(const char *arg)
2255 video_lmax = atof(arg)*FF_QP2LAMBDA;
2258 static void opt_lmin(const char *arg)
2260 video_lmin = atof(arg)*FF_QP2LAMBDA;
2263 static void opt_qmin(const char *arg)
2265 video_qmin = atoi(arg);
2266 if (video_qmin < 0 ||
2268 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2273 static void opt_qmax(const char *arg)
2275 video_qmax = atoi(arg);
2276 if (video_qmax < 0 ||
2278 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2283 static void opt_mb_qmin(const char *arg)
2285 video_mb_qmin = atoi(arg);
2286 if (video_mb_qmin < 0 ||
2287 video_mb_qmin > 31) {
2288 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2293 static void opt_mb_qmax(const char *arg)
2295 video_mb_qmax = atoi(arg);
2296 if (video_mb_qmax < 0 ||
2297 video_mb_qmax > 31) {
2298 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2303 static void opt_qdiff(const char *arg)
2305 video_qdiff = atoi(arg);
2306 if (video_qdiff < 0 ||
2308 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2313 static void opt_qblur(const char *arg)
2315 video_qblur = atof(arg);
2318 static void opt_qcomp(const char *arg)
2320 video_qcomp = atof(arg);
2323 static void opt_rc_initial_cplx(const char *arg)
2325 video_rc_initial_cplx = atof(arg);
2327 static void opt_b_qfactor(const char *arg)
2329 video_b_qfactor = atof(arg);
2331 static void opt_i_qfactor(const char *arg)
2333 video_i_qfactor = atof(arg);
2335 static void opt_b_qoffset(const char *arg)
2337 video_b_qoffset = atof(arg);
2339 static void opt_i_qoffset(const char *arg)
2341 video_i_qoffset = atof(arg);
2344 static void opt_ibias(const char *arg)
2346 video_intra_quant_bias = atoi(arg);
2348 static void opt_pbias(const char *arg)
2350 video_inter_quant_bias = atoi(arg);
2353 static void opt_packet_size(const char *arg)
2355 packet_size= atoi(arg);
2358 static void opt_error_rate(const char *arg)
2360 error_rate= atoi(arg);
2363 static void opt_strict(const char *arg)
2368 static void opt_top_field_first(const char *arg)
2370 top_field_first= atoi(arg);
2373 static void opt_noise_reduction(const char *arg)
2375 noise_reduction= atoi(arg);
2378 static void opt_qns(const char *arg)
2383 static void opt_sc_threshold(const char *arg)
2385 sc_threshold= atoi(arg);
2388 static void opt_me_range(const char *arg)
2390 me_range = atoi(arg);
2393 static void opt_thread_count(const char *arg)
2395 thread_count= atoi(arg);
2396 #if !defined(HAVE_PTHREADS) && !defined(HAVE_W32THREADS)
2398 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2402 static void opt_audio_bitrate(const char *arg)
2404 audio_bit_rate = atoi(arg) * 1000;
2407 static void opt_audio_rate(const char *arg)
2409 audio_sample_rate = atoi(arg);
2412 static void opt_audio_channels(const char *arg)
2414 audio_channels = atoi(arg);
2417 static void opt_video_device(const char *arg)
2419 video_device = av_strdup(arg);
2422 static void opt_video_channel(const char *arg)
2424 video_channel = strtol(arg, NULL, 0);
2427 static void opt_video_standard(const char *arg)
2429 video_standard = av_strdup(arg);
2432 static void opt_audio_device(const char *arg)
2434 audio_device = av_strdup(arg);
2437 static void opt_dv1394(const char *arg)
2439 video_grab_format = "dv1394";
2440 audio_grab_format = NULL;
2443 static void opt_audio_codec(const char *arg)
2447 if (!strcmp(arg, "copy")) {
2448 audio_stream_copy = 1;
2452 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_AUDIO)
2457 fprintf(stderr, "Unknown audio codec '%s'\n", arg);
2460 audio_codec_id = p->id;
2465 static void add_frame_hooker(const char *arg)
2470 char *args = av_strdup(arg);
2474 argv[0] = strtok(args, " ");
2475 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2478 i = frame_hook_add(argc, argv);
2481 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2486 const char *motion_str[] = {
2496 static void opt_motion_estimation(const char *arg)
2502 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2505 if (!strcmp(*p, arg))
2509 me_method = (p - motion_str) + 1;
2512 static void opt_video_codec(const char *arg)
2516 if (!strcmp(arg, "copy")) {
2517 video_stream_copy = 1;
2521 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_VIDEO)
2526 fprintf(stderr, "Unknown video codec '%s'\n", arg);
2529 video_codec_id = p->id;
2534 static void opt_map(const char *arg)
2540 m = &stream_maps[nb_stream_maps++];
2542 m->file_index = strtol(arg, (char **)&p, 0);
2546 m->stream_index = strtol(p, (char **)&p, 0);
2549 static void opt_recording_time(const char *arg)
2551 recording_time = parse_date(arg, 1);
2554 static void opt_start_time(const char *arg)
2556 start_time = parse_date(arg, 1);
2559 static void opt_rec_timestamp(const char *arg)
2561 rec_timestamp = parse_date(arg, 0) / 1000000;
2564 static void opt_input_ts_offset(const char *arg)
2566 input_ts_offset = parse_date(arg, 1);
2569 static void opt_input_file(const char *filename)
2571 AVFormatContext *ic;
2572 AVFormatParameters params, *ap = ¶ms;
2573 int err, i, ret, rfps, rfps_base;
2575 if (!strcmp(filename, "-"))
2578 using_stdin |= !strcmp(filename, "pipe:" ) ||
2579 !strcmp( filename, "/dev/stdin" );
2581 /* get default parameters from command line */
2582 memset(ap, 0, sizeof(*ap));
2583 ap->sample_rate = audio_sample_rate;
2584 ap->channels = audio_channels;
2585 ap->frame_rate = frame_rate;
2586 ap->frame_rate_base = frame_rate_base;
2587 ap->width = frame_width + frame_padleft + frame_padright;
2588 ap->height = frame_height + frame_padtop + frame_padbottom;
2589 ap->image_format = image_format;
2590 ap->pix_fmt = frame_pix_fmt;
2592 /* open the input file with generic libav function */
2593 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2595 print_error(filename, err);
2599 /* If not enough info to get the stream parameters, we decode the
2600 first frames to get it. (used in mpeg case for example) */
2601 ret = av_find_stream_info(ic);
2602 if (ret < 0 && verbose >= 0) {
2603 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2607 /* if seeking requested, we execute it */
2608 if (start_time != 0) {
2611 timestamp = start_time;
2612 /* add the stream start time */
2613 if (ic->start_time != AV_NOPTS_VALUE)
2614 timestamp += ic->start_time;
2615 ret = av_seek_frame(ic, -1, timestamp);
2617 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2618 filename, (double)timestamp / AV_TIME_BASE);
2620 /* reset seek info */
2624 /* update the current parameters so that they match the one of the input stream */
2625 for(i=0;i<ic->nb_streams;i++) {
2626 AVCodecContext *enc = &ic->streams[i]->codec;
2627 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2629 avcodec_thread_init(enc, thread_count);
2631 enc->thread_count= thread_count;
2632 switch(enc->codec_type) {
2633 case CODEC_TYPE_AUDIO:
2634 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2635 audio_channels = enc->channels;
2636 audio_sample_rate = enc->sample_rate;
2638 case CODEC_TYPE_VIDEO:
2639 frame_height = enc->height;
2640 frame_width = enc->width;
2641 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2642 frame_pix_fmt = enc->pix_fmt;
2643 rfps = ic->streams[i]->r_frame_rate;
2644 rfps_base = ic->streams[i]->r_frame_rate_base;
2645 enc->workaround_bugs = workaround_bugs;
2646 enc->error_resilience = error_resilience;
2647 enc->error_concealment = error_concealment;
2648 enc->idct_algo = idct_algo;
2650 enc->debug_mv = debug_mv;
2652 enc->flags|= CODEC_FLAG_BITEXACT;
2654 enc->debug |= FF_DEBUG_MV;
2656 assert(enc->frame_rate_base == rfps_base); // should be true for now
2657 if (enc->frame_rate != rfps) {
2660 fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f->%2.2f\n",
2661 i, (float)enc->frame_rate / enc->frame_rate_base,
2663 (float)rfps / rfps_base);
2665 /* update the current frame rate to match the stream frame rate */
2667 frame_rate_base = rfps_base;
2669 enc->rate_emu = rate_emu;
2671 case CODEC_TYPE_DATA:
2678 input_files[nb_input_files] = ic;
2679 input_files_ts_offset[nb_input_files] = input_ts_offset;
2680 /* dump the file content */
2682 dump_format(ic, nb_input_files, filename, 0);
2685 file_iformat = NULL;
2686 file_oformat = NULL;
2687 image_format = NULL;
2692 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
2694 int has_video, has_audio, i, j;
2695 AVFormatContext *ic;
2699 for(j=0;j<nb_input_files;j++) {
2700 ic = input_files[j];
2701 for(i=0;i<ic->nb_streams;i++) {
2702 AVCodecContext *enc = &ic->streams[i]->codec;
2703 switch(enc->codec_type) {
2704 case CODEC_TYPE_AUDIO:
2707 case CODEC_TYPE_VIDEO:
2710 case CODEC_TYPE_DATA:
2717 *has_video_ptr = has_video;
2718 *has_audio_ptr = has_audio;
2721 static void opt_output_file(const char *filename)
2724 AVFormatContext *oc;
2725 int use_video, use_audio, nb_streams, input_has_video, input_has_audio;
2727 AVFormatParameters params, *ap = ¶ms;
2729 if (!strcmp(filename, "-"))
2732 oc = av_alloc_format_context();
2734 if (!file_oformat) {
2735 file_oformat = guess_format(NULL, filename, NULL);
2736 if (!file_oformat) {
2737 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
2743 oc->oformat = file_oformat;
2745 if (!strcmp(file_oformat->name, "ffm") &&
2746 strstart(filename, "http:", NULL)) {
2747 /* special case for files sent to ffserver: we get the stream
2748 parameters from ffserver */
2749 if (read_ffserver_streams(oc, filename) < 0) {
2750 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
2754 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy;
2755 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy;
2757 /* disable if no corresponding type found and at least one
2759 if (nb_input_files > 0) {
2760 check_audio_video_inputs(&input_has_video, &input_has_audio);
2761 if (!input_has_video)
2763 if (!input_has_audio)
2767 /* manual disable */
2768 if (audio_disable) {
2771 if (video_disable) {
2777 AVCodecContext *video_enc;
2779 st = av_new_stream(oc, nb_streams++);
2781 fprintf(stderr, "Could not alloc stream\n");
2784 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2786 avcodec_thread_init(&st->codec, thread_count);
2789 video_enc = &st->codec;
2791 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
2792 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2793 if (video_stream_copy) {
2794 st->stream_copy = 1;
2795 video_enc->codec_type = CODEC_TYPE_VIDEO;
2801 codec_id = file_oformat->video_codec;
2802 if (video_codec_id != CODEC_ID_NONE)
2803 codec_id = video_codec_id;
2805 video_enc->codec_id = codec_id;
2806 codec = avcodec_find_encoder(codec_id);
2808 video_enc->bit_rate = video_bit_rate;
2809 video_enc->bit_rate_tolerance = video_bit_rate_tolerance;
2810 video_enc->frame_rate = frame_rate;
2811 video_enc->frame_rate_base = frame_rate_base;
2812 if(codec && codec->supported_framerates){
2813 const AVRational *p= codec->supported_framerates;
2814 AVRational req= (AVRational){frame_rate, frame_rate_base};
2815 const AVRational *best=NULL;
2816 AVRational best_error= (AVRational){INT_MAX, 1};
2817 for(; p->den!=0; p++){
2818 AVRational error= av_sub_q(req, *p);
2819 if(error.num <0) error.num *= -1;
2820 if(av_cmp_q(error, best_error) < 0){
2825 video_enc->frame_rate = best->num;
2826 video_enc->frame_rate_base= best->den;
2829 video_enc->width = frame_width + frame_padright + frame_padleft;
2830 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2831 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
2832 video_enc->pix_fmt = frame_pix_fmt;
2834 if(codec && codec->pix_fmts){
2835 const enum PixelFormat *p= codec->pix_fmts;
2837 if(*p == video_enc->pix_fmt)
2841 video_enc->pix_fmt = codec->pix_fmts[0];
2845 video_enc->gop_size = gop_size;
2847 video_enc->gop_size = 0;
2848 if (video_qscale || same_quality) {
2849 video_enc->flags |= CODEC_FLAG_QSCALE;
2850 st->quality = FF_QP2LAMBDA * video_qscale;
2854 video_enc->intra_matrix = intra_matrix;
2856 video_enc->inter_matrix = inter_matrix;
2859 video_enc->flags |= CODEC_FLAG_BITEXACT;
2861 video_enc->mb_decision = mb_decision;
2862 video_enc->mb_cmp = mb_cmp;
2863 video_enc->ildct_cmp = ildct_cmp;
2864 video_enc->me_sub_cmp = sub_cmp;
2865 video_enc->me_cmp = cmp;
2866 video_enc->me_pre_cmp = pre_cmp;
2867 video_enc->pre_me = pre_me;
2868 video_enc->lumi_masking = lumi_mask;
2869 video_enc->dark_masking = dark_mask;
2870 video_enc->spatial_cplx_masking = scplx_mask;
2871 video_enc->temporal_cplx_masking = tcplx_mask;
2872 video_enc->p_masking = p_mask;
2873 video_enc->quantizer_noise_shaping= qns;
2876 video_enc->flags |= CODEC_FLAG_H263P_UMV;
2879 video_enc->flags |= CODEC_FLAG_H263P_SLICE_STRUCT;
2882 video_enc->flags |= CODEC_FLAG_H263P_AIC;
2885 video_enc->flags |= CODEC_FLAG_H263P_AIV;
2888 video_enc->flags |= CODEC_FLAG_4MV;
2891 video_enc->flags |= CODEC_FLAG_OBMC;
2894 video_enc->flags |= CODEC_FLAG_LOOP_FILTER;
2898 video_enc->flags |= CODEC_FLAG_PART;
2901 video_enc->flags |= CODEC_FLAG_ALT_SCAN;
2904 video_enc->flags |= CODEC_FLAG_TRELLIS_QUANT;
2906 if (use_scan_offset) {
2907 video_enc->flags |= CODEC_FLAG_SVCD_SCAN_OFFSET;
2910 video_enc->flags |= CODEC_FLAG_CLOSED_GOP;
2913 video_enc->flags |= CODEC_FLAG_QPEL;
2916 video_enc->flags |= CODEC_FLAG_QP_RD;
2919 video_enc->flags |= CODEC_FLAG_CBP_RD;
2922 video_enc->max_b_frames = b_frames;
2923 video_enc->b_frame_strategy = 0;
2924 video_enc->b_quant_factor = 2.0;
2926 if (do_interlace_dct) {
2927 video_enc->flags |= CODEC_FLAG_INTERLACED_DCT;
2929 if (do_interlace_me) {
2930 video_enc->flags |= CODEC_FLAG_INTERLACED_ME;
2932 video_enc->qmin = video_qmin;
2933 video_enc->qmax = video_qmax;
2934 video_enc->lmin = video_lmin;
2935 video_enc->lmax = video_lmax;
2936 video_enc->mb_qmin = video_mb_qmin;
2937 video_enc->mb_qmax = video_mb_qmax;
2938 video_enc->max_qdiff = video_qdiff;
2939 video_enc->qblur = video_qblur;
2940 video_enc->qcompress = video_qcomp;
2941 video_enc->rc_eq = video_rc_eq;
2942 video_enc->debug = debug;
2943 video_enc->debug_mv = debug_mv;
2944 video_enc->thread_count = thread_count;
2945 p= video_rc_override_string;
2948 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
2950 fprintf(stderr, "error parsing rc_override\n");
2953 video_enc->rc_override=
2954 av_realloc(video_enc->rc_override,
2955 sizeof(RcOverride)*(i+1));
2956 video_enc->rc_override[i].start_frame= start;
2957 video_enc->rc_override[i].end_frame = end;
2959 video_enc->rc_override[i].qscale= q;
2960 video_enc->rc_override[i].quality_factor= 1.0;
2963 video_enc->rc_override[i].qscale= 0;
2964 video_enc->rc_override[i].quality_factor= -q/100.0;
2969 video_enc->rc_override_count=i;
2971 video_enc->rc_max_rate = video_rc_max_rate;
2972 video_enc->rc_min_rate = video_rc_min_rate;
2973 video_enc->rc_buffer_size = video_rc_buffer_size;
2974 video_enc->rc_buffer_aggressivity= video_rc_buffer_aggressivity;
2975 video_enc->rc_initial_cplx= video_rc_initial_cplx;
2976 video_enc->i_quant_factor = video_i_qfactor;
2977 video_enc->b_quant_factor = video_b_qfactor;
2978 video_enc->i_quant_offset = video_i_qoffset;
2979 video_enc->b_quant_offset = video_b_qoffset;
2980 video_enc->intra_quant_bias = video_intra_quant_bias;
2981 video_enc->inter_quant_bias = video_inter_quant_bias;
2982 video_enc->dct_algo = dct_algo;
2983 video_enc->idct_algo = idct_algo;
2984 video_enc->me_threshold= me_threshold;
2985 video_enc->mb_threshold= mb_threshold;
2986 video_enc->intra_dc_precision= intra_dc_precision - 8;
2987 video_enc->strict_std_compliance = strict;
2988 video_enc->error_rate = error_rate;
2989 video_enc->noise_reduction= noise_reduction;
2990 video_enc->scenechange_threshold= sc_threshold;
2991 video_enc->me_range = me_range;
2992 video_enc->coder_type= coder;
2993 video_enc->context_model= context;
2994 video_enc->prediction_method= predictor;
2997 video_enc->rtp_mode= 1;
2998 video_enc->rtp_payload_size= packet_size;
3002 video_enc->flags|= CODEC_FLAG_PSNR;
3004 video_enc->me_method = me_method;
3009 video_enc->flags |= CODEC_FLAG_PASS1;
3011 video_enc->flags |= CODEC_FLAG_PASS2;
3018 AVCodecContext *audio_enc;
3020 st = av_new_stream(oc, nb_streams++);
3022 fprintf(stderr, "Could not alloc stream\n");
3025 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
3027 avcodec_thread_init(&st->codec, thread_count);
3030 audio_enc = &st->codec;
3031 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3033 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
3034 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3035 if (audio_stream_copy) {
3036 st->stream_copy = 1;
3038 codec_id = file_oformat->audio_codec;
3039 if (audio_codec_id != CODEC_ID_NONE)
3040 codec_id = audio_codec_id;
3041 audio_enc->codec_id = codec_id;
3043 audio_enc->bit_rate = audio_bit_rate;
3044 audio_enc->sample_rate = audio_sample_rate;
3045 audio_enc->strict_std_compliance = strict;
3046 audio_enc->thread_count = thread_count;
3047 /* For audio codecs other than AC3 we limit */
3048 /* the number of coded channels to stereo */
3049 if (audio_channels > 2 && codec_id != CODEC_ID_AC3) {
3050 audio_enc->channels = 2;
3052 audio_enc->channels = audio_channels;
3056 oc->nb_streams = nb_streams;
3059 fprintf(stderr, "No audio or video streams available\n");
3063 oc->timestamp = rec_timestamp;
3066 pstrcpy(oc->title, sizeof(oc->title), str_title);
3068 pstrcpy(oc->author, sizeof(oc->author), str_author);
3070 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3072 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3075 output_files[nb_output_files++] = oc;
3077 strcpy(oc->filename, filename);
3079 /* check filename in case of an image number is expected */
3080 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3081 if (filename_number_test(oc->filename) < 0) {
3082 print_error(oc->filename, AVERROR_NUMEXPECTED);
3087 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3088 /* test if it already exists to avoid loosing precious files */
3089 if (!file_overwrite &&
3090 (strchr(filename, ':') == NULL ||
3091 strstart(filename, "file:", NULL))) {
3092 if (url_exist(filename)) {
3095 if ( !using_stdin ) {
3096 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3099 if (toupper(c) != 'Y') {
3100 fprintf(stderr, "Not overwriting - exiting\n");
3105 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3112 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3113 fprintf(stderr, "Could not open '%s'\n", filename);
3118 memset(ap, 0, sizeof(*ap));
3119 ap->image_format = image_format;
3120 if (av_set_parameters(oc, ap) < 0) {
3121 fprintf(stderr, "%s: Invalid encoding parameters\n",
3126 /* reset some options */
3127 file_oformat = NULL;
3128 file_iformat = NULL;
3129 image_format = NULL;
3132 audio_codec_id = CODEC_ID_NONE;
3133 video_codec_id = CODEC_ID_NONE;
3134 audio_stream_copy = 0;
3135 video_stream_copy = 0;
3138 /* prepare dummy protocols for grab */
3139 static void prepare_grab(void)
3141 int has_video, has_audio, i, j;
3142 AVFormatContext *oc;
3143 AVFormatContext *ic;
3144 AVFormatParameters vp1, *vp = &vp1;
3145 AVFormatParameters ap1, *ap = &ap1;
3147 /* see if audio/video inputs are needed */
3150 memset(ap, 0, sizeof(*ap));
3151 memset(vp, 0, sizeof(*vp));
3152 for(j=0;j<nb_output_files;j++) {
3153 oc = output_files[j];
3154 for(i=0;i<oc->nb_streams;i++) {
3155 AVCodecContext *enc = &oc->streams[i]->codec;
3156 switch(enc->codec_type) {
3157 case CODEC_TYPE_AUDIO:
3158 if (enc->sample_rate > ap->sample_rate)
3159 ap->sample_rate = enc->sample_rate;
3160 if (enc->channels > ap->channels)
3161 ap->channels = enc->channels;
3164 case CODEC_TYPE_VIDEO:
3165 if (enc->width > vp->width)
3166 vp->width = enc->width;
3167 if (enc->height > vp->height)
3168 vp->height = enc->height;
3170 assert(enc->frame_rate_base == DEFAULT_FRAME_RATE_BASE);
3171 if (enc->frame_rate > vp->frame_rate){
3172 vp->frame_rate = enc->frame_rate;
3173 vp->frame_rate_base = enc->frame_rate_base;
3183 if (has_video == 0 && has_audio == 0) {
3184 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3189 AVInputFormat *fmt1;
3190 fmt1 = av_find_input_format(video_grab_format);
3191 vp->device = video_device;
3192 vp->channel = video_channel;
3193 vp->standard = video_standard;
3194 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3195 fprintf(stderr, "Could not find video grab device\n");
3198 /* If not enough info to get the stream parameters, we decode the
3199 first frames to get it. */
3200 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3201 fprintf(stderr, "Could not find video grab parameters\n");
3204 /* by now video grab has one stream */
3205 ic->streams[0]->r_frame_rate = vp->frame_rate;
3206 ic->streams[0]->r_frame_rate_base = vp->frame_rate_base;
3207 input_files[nb_input_files] = ic;
3210 dump_format(ic, nb_input_files, "", 0);
3214 if (has_audio && audio_grab_format) {
3215 AVInputFormat *fmt1;
3216 fmt1 = av_find_input_format(audio_grab_format);
3217 ap->device = audio_device;
3218 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3219 fprintf(stderr, "Could not find audio grab device\n");
3222 input_files[nb_input_files] = ic;
3225 dump_format(ic, nb_input_files, "", 0);
3231 /* same option as mencoder */
3232 static void opt_pass(const char *pass_str)
3235 pass = atoi(pass_str);
3236 if (pass != 1 && pass != 2) {
3237 fprintf(stderr, "pass number can be only 1 or 2\n");
3243 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3244 static int64_t getutime(void)
3246 return av_gettime();
3249 static int64_t getutime(void)
3251 struct rusage rusage;
3253 getrusage(RUSAGE_SELF, &rusage);
3254 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3258 extern int ffm_nopts;
3260 static void opt_bitexact(void)
3263 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3267 static void show_formats(void)
3269 AVInputFormat *ifmt;
3270 AVOutputFormat *ofmt;
3271 AVImageFormat *image_fmt;
3274 const char **pp, *last_name;
3276 printf("File formats:\n");
3281 const char *name=NULL;
3283 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3284 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3285 strcmp(ofmt->name, last_name)>0){
3290 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3291 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3292 strcmp(ifmt->name, last_name)>0){
3296 if(name && strcmp(ifmt->name, name)==0)
3311 printf("Image formats:\n");
3312 for(image_fmt = first_image_format; image_fmt != NULL;
3313 image_fmt = image_fmt->next) {
3316 image_fmt->img_read ? "D":" ",
3317 image_fmt->img_write ? "E":" ",
3322 printf("Codecs:\n");
3330 for(p = first_avcodec; p != NULL; p = p->next) {
3331 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3332 strcmp(p->name, last_name)>0){
3334 decode= encode= cap=0;
3336 if(p2 && strcmp(p->name, p2->name)==0){
3337 if(p->decode) decode=1;
3338 if(p->encode) encode=1;
3339 cap |= p->capabilities;
3344 last_name= p2->name;
3348 decode ? "D": (/*p2->decoder ? "d":*/" "),
3350 p2->type == CODEC_TYPE_AUDIO ? "A":"V",
3351 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3352 cap & CODEC_CAP_DR1 ? "D":" ",
3353 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3355 /* if(p2->decoder && decode==0)
3356 printf(" use %s for decoding", p2->decoder->name);*/
3361 printf("Supported file protocols:\n");
3362 for(up = first_protocol; up != NULL; up = up->next)
3363 printf(" %s:", up->name);
3366 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3367 printf("Motion estimation methods:\n");
3371 if ((pp - motion_str + 1) == ME_ZERO)
3372 printf("(fastest)");
3373 else if ((pp - motion_str + 1) == ME_FULL)
3374 printf("(slowest)");
3375 else if ((pp - motion_str + 1) == ME_EPZS)
3376 printf("(default)");
3381 "Note, the names of encoders and decoders dont always match, so there are\n"
3382 "several cases where the above table shows encoder only or decoder only entries\n"
3383 "even though both encoding and decoding are supported for example, the h263\n"
3384 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3389 void parse_matrix_coeffs(uint16_t *dest, const char *str)
3392 const char *p = str;
3399 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3406 void opt_inter_matrix(const char *arg)
3408 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3409 parse_matrix_coeffs(inter_matrix, arg);
3412 void opt_intra_matrix(const char *arg)
3414 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3415 parse_matrix_coeffs(intra_matrix, arg);
3418 static void opt_target(const char *arg)
3422 if(!strncmp(arg, "pal-", 4)) {
3425 } else if(!strncmp(arg, "ntsc-", 5)) {
3430 /* Calculate FR via float to avoid int overflow */
3431 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3434 } else if((fr == 29970) || (fr == 23976)) {
3437 /* Try to determine PAL/NTSC by peeking in the input files */
3438 if(nb_input_files) {
3440 for(j = 0; j < nb_input_files; j++) {
3441 for(i = 0; i < input_files[j]->nb_streams; i++) {
3442 AVCodecContext *c = &input_files[j]->streams[i]->codec;
3443 if(c->codec_type != CODEC_TYPE_VIDEO)
3445 fr = c->frame_rate * 1000 / c->frame_rate_base;
3449 } else if((fr == 29970) || (fr == 23976)) {
3459 if(verbose && norm >= 0)
3460 printf("Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3464 fprintf(stderr, "Could not determine norm (PAL/NTSC) for target.\n");
3465 fprintf(stderr, "Please prefix target with \"pal-\" or \"ntsc-\",\n");
3466 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3470 if(!strcmp(arg, "vcd")) {
3472 opt_video_codec("mpeg1video");
3473 opt_audio_codec("mp2");
3476 opt_frame_size(norm ? "352x240" : "352x288");
3478 video_bit_rate = 1150000;
3479 video_rc_max_rate = 1150000;
3480 video_rc_min_rate = 1150000;
3481 video_rc_buffer_size = 40*1024*8;
3483 audio_bit_rate = 224000;
3484 audio_sample_rate = 44100;
3486 } else if(!strcmp(arg, "svcd")) {
3488 opt_video_codec("mpeg2video");
3489 opt_audio_codec("mp2");
3492 opt_frame_size(norm ? "480x480" : "480x576");
3493 opt_gop_size(norm ? "18" : "15");
3495 video_bit_rate = 2040000;
3496 video_rc_max_rate = 2516000;
3497 video_rc_min_rate = 0; //1145000;
3498 video_rc_buffer_size = 224*1024*8;
3499 use_scan_offset = 1;
3501 audio_bit_rate = 224000;
3502 audio_sample_rate = 44100;
3504 } else if(!strcmp(arg, "dvd")) {
3506 opt_video_codec("mpeg2video");
3507 opt_audio_codec("ac3");
3510 opt_frame_size(norm ? "720x480" : "720x576");
3511 opt_gop_size(norm ? "18" : "15");
3513 video_bit_rate = 6000000;
3514 video_rc_max_rate = 9000000;
3515 video_rc_min_rate = 0; //1500000;
3516 video_rc_buffer_size = 224*1024*8;
3518 audio_bit_rate = 448000;
3519 audio_sample_rate = 48000;
3522 fprintf(stderr, "Unknown target: %s\n", arg);
3527 static void show_version(void)
3529 printf("ffmpeg " FFMPEG_VERSION "\n"
3532 avcodec_build(), LIBAVFORMAT_BUILD);
3536 const OptionDef options[] = {
3538 { "L", 0, {(void*)show_license}, "show license" },
3539 { "h", 0, {(void*)show_help}, "show help" },
3540 { "version", 0, {(void*)show_version}, "show version" },
3541 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3542 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3543 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
3544 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3545 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3546 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream" },
3547 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3548 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3549 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3550 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3551 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3552 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3553 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3554 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3555 { "debug", HAS_ARG | OPT_EXPERT, {(void*)opt_debug}, "print specific debug info", "" },
3556 { "vismv", HAS_ARG | OPT_EXPERT, {(void*)opt_vismv}, "visualize motion vectors", "" },
3557 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3558 "add timings for benchmarking" },
3559 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3560 "dump each input packet" },
3561 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3562 "when dumping packets, also dump the payload" },
3563 { "bitexact", OPT_EXPERT, {(void*)opt_bitexact}, "only use bit exact algorithms (for codec testing)" },
3564 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3565 { "loop", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3566 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3567 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\" or \"dvd\")", "type" },
3568 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3569 { "sync", HAS_ARG | OPT_EXPERT, {(void*)opt_sync_method}, "sync method", "" },
3570 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3573 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
3574 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3575 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3576 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3577 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3578 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3579 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3580 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3581 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3582 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3583 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3584 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3585 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3586 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3587 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
3588 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3589 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3590 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
3591 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
3592 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
3593 { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
3594 { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
3595 { "mbqmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmin}, "min macroblock quantiser scale (VBR)", "q" },
3596 { "mbqmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmax}, "max macroblock quantiser scale (VBR)", "q" },
3597 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
3598 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
3599 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
3600 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
3601 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
3602 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
3603 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
3604 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
3605 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
3606 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
3607 // { "b_strategy", HAS_ARG | OPT_EXPERT, {(void*)opt_b_strategy}, "dynamic b frame selection strategy", "strategy" },
3608 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3609 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3610 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
3611 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
3612 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
3613 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffere size (in kByte)", "size" },
3614 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3615 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
3617 { "dct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dct_algo}, "set dct algo", "algo" },
3618 { "idct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_idct_algo}, "set idct algo", "algo" },
3619 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
3620 { "mb_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_threshold}, "macroblock threshold", "" },
3621 { "er", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_resilience}, "set error resilience", "n" },
3622 { "ec", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_concealment}, "set error concealment", "bit_mask" },
3623 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
3624 { "hq", OPT_BOOL, {(void*)&mb_decision}, "activate high quality settings" },
3625 { "mbd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_decision}, "macroblock decision", "mode" },
3626 { "mbcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_cmp}, "macroblock compare function", "cmp function" },
3627 { "ildctcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ildct_cmp}, "ildct compare function", "cmp function" },
3628 { "subcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sub_cmp}, "subpel compare function", "cmp function" },
3629 { "cmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_cmp}, "fullpel compare function", "cmp function" },
3630 { "precmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_cmp}, "pre motion estimation compare function", "cmp function" },
3631 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
3632 { "lumi_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lumi_mask}, "luminance masking", "" },
3633 { "dark_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dark_mask}, "darkness masking", "" },
3634 { "scplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_scplx_mask}, "spatial complexity masking", "" },
3635 { "tcplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_tcplx_mask}, "teporal complexity masking", "" },
3636 { "p_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_p_mask}, "inter masking", "" },
3637 { "4mv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_4mv}, "use four motion vector by macroblock (MPEG4)" },
3638 { "obmc", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_obmc}, "use overlapped block motion compensation (h263+)" },
3639 { "lf", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_loop}, "use loop filter (h263+)" },
3640 { "part", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_part}, "use data partitioning (MPEG4)" },
3641 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
3642 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
3643 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
3644 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3645 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3646 "use same video quality as source (implies VBR)" },
3647 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3648 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3649 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3650 "deinterlace pictures" },
3651 { "ildct", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_dct},
3652 "force interlaced dct support in encoder (MPEG2/MPEG4)" },
3653 { "ilme", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_me},
3654 "force interlaced me support in encoder (MPEG2/MPEG4)" },
3655 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3656 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
3657 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3658 { "aic", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aic}, "enable Advanced intra coding (h263+)" },
3659 { "aiv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aiv}, "enable Alternative inter vlc (h263+)" },
3660 { "umv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_umv}, "enable Unlimited Motion Vector (h263+)" },
3661 { "ssm", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_ss}, "enable Slice Structured mode (h263+)" },
3662 { "alt", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_alt_scan}, "enable alternate scantable (MPEG2/MPEG4)" },
3663 { "qprd", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qprd}, "" },
3664 { "cbp", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_cbprd}, "" },
3665 { "trell", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_trell}, "enable trellis quantization" },
3666 { "cgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&closed_gop}, "closed gop" },
3667 { "scan_offset", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_scan_offset}, "enable SVCD Scan Offset placeholder" },
3668 { "qpel", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qpel}, "enable 1/4-pel" },
3669 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3670 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3671 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3672 { "nr", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_noise_reduction}, "noise reduction", "" },
3673 { "qns", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qns}, "quantization noise shaping", "" },
3674 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
3675 { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
3676 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3677 { "coder", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&coder}, "coder type", "" },
3678 { "context", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&context}, "context model", "" },
3679 { "pred", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&predictor}, "prediction method", "" },
3682 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
3683 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3684 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3685 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3686 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3689 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
3690 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3691 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3692 { "dv1394", OPT_EXPERT | OPT_GRAB, {(void*)opt_dv1394}, "set DV1394 grab", "" },
3693 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
3697 static void show_banner(void)
3699 printf("ffmpeg version " FFMPEG_VERSION ", Copyright (c) 2000-2003 Fabrice Bellard\n");
3702 static void show_license(void)
3707 "This program is free software; you can redistribute it and/or modify\n"
3708 "it under the terms of the GNU General Public License as published by\n"
3709 "the Free Software Foundation; either version 2 of the License, or\n"
3710 "(at your option) any later version.\n"
3712 "This program is distributed in the hope that it will be useful,\n"
3713 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3714 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
3715 "GNU General Public License for more details.\n"
3717 "You should have received a copy of the GNU General Public License\n"
3718 "along with this program; if not, write to the Free Software\n"
3719 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3723 "This library is free software; you can redistribute it and/or\n"
3724 "modify it under the terms of the GNU Lesser General Public\n"
3725 "License as published by the Free Software Foundation; either\n"
3726 "version 2 of the License, or (at your option) any later version.\n"
3728 "This library is distributed in the hope that it will be useful,\n"
3729 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3730 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
3731 "Lesser General Public License for more details.\n"
3733 "You should have received a copy of the GNU Lesser General Public\n"
3734 "License along with this library; if not, write to the Free Software\n"
3735 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3741 static void show_help(void)
3744 printf("usage: ffmpeg [[options] -i input_file]... {[options] outfile}...\n"
3745 "Hyper fast Audio and Video encoder\n");
3747 show_help_options(options, "Main options:\n",
3748 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
3749 show_help_options(options, "\nVideo options:\n",
3750 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3752 show_help_options(options, "\nAdvanced Video options:\n",
3753 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3754 OPT_VIDEO | OPT_EXPERT);
3755 show_help_options(options, "\nAudio options:\n",
3756 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3758 show_help_options(options, "\nAdvanced Audio options:\n",
3759 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3760 OPT_AUDIO | OPT_EXPERT);
3761 show_help_options(options, "\nAudio/Video grab options:\n",
3764 show_help_options(options, "\nAdvanced options:\n",
3765 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3770 void parse_arg_file(const char *filename)
3772 opt_output_file(filename);
3775 int main(int argc, char **argv)
3786 parse_options(argc, argv, options);
3788 /* file converter / grab */
3789 if (nb_output_files <= 0) {
3790 fprintf(stderr, "Must supply at least one output file\n");
3794 if (nb_input_files == 0) {
3799 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3800 stream_maps, nb_stream_maps);
3801 ti = getutime() - ti;
3803 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3807 for(i=0;i<nb_output_files;i++) {
3808 /* maybe av_close_output_file ??? */
3809 AVFormatContext *s = output_files[i];
3811 if (!(s->oformat->flags & AVFMT_NOFILE))
3813 for(j=0;j<s->nb_streams;j++)
3814 av_free(s->streams[j]);
3817 for(i=0;i<nb_input_files;i++)
3818 av_close_input_file(input_files[i]);
3823 av_free(intra_matrix);
3825 av_free(inter_matrix);
3827 #ifdef POWERPC_PERFORMANCE_REPORT
3828 extern void powerpc_display_perf_report(void);
3829 powerpc_display_perf_report();
3830 #endif /* POWERPC_PERFORMANCE_REPORT */
3832 #ifndef CONFIG_WIN32
3833 if (received_sigterm) {
3835 "Received signal %d: terminating.\n",
3836 (int) received_sigterm);
3840 exit(0); /* not all OS-es handle main() return value */