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;
228 static int input_sync;
230 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
232 typedef struct AVOutputStream {
233 int file_index; /* file index */
234 int index; /* stream index in the output file */
235 int source_index; /* AVInputStream index */
236 AVStream *st; /* stream in the output file */
237 int encoding_needed; /* true if encoding needed for this stream */
239 /* input pts and corresponding output pts
241 double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
242 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
244 int video_resample; /* video_resample and video_crop are mutually exclusive */
245 AVFrame pict_tmp; /* temporary image for resampling */
246 ImgReSampleContext *img_resample_ctx; /* for image resampling */
248 int video_crop; /* video_resample and video_crop are mutually exclusive */
249 int topBand; /* cropping area sizes */
252 int video_pad; /* video_resample and video_pad are mutually exclusive */
253 int padtop; /* padding area sizes */
260 ReSampleContext *resample; /* for audio resampling */
261 FifoBuffer fifo; /* for compression: one audio fifo per codec */
265 typedef struct AVInputStream {
269 int discard; /* true if stream data should be discarded */
270 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
271 int64_t sample_index; /* current sample */
273 int64_t start; /* time when read started */
274 unsigned long frame; /* current frame */
275 int64_t next_pts; /* synthetic pts for cases where pkt.pts
277 int64_t pts; /* current pts */
280 typedef struct AVInputFile {
281 int eof_reached; /* true if eof reached */
282 int ist_index; /* index of first stream in ist_table */
283 int buffer_size; /* current total buffer size */
284 int buffer_size_max; /* buffer size at which we consider we can stop
286 int nb_streams; /* nb streams we are aware of */
291 /* init terminal so that we can grab keys */
292 static struct termios oldtty;
294 static void term_exit(void)
296 tcsetattr (0, TCSANOW, &oldtty);
299 static volatile sig_atomic_t received_sigterm = 0;
302 sigterm_handler(int sig)
304 received_sigterm = sig;
308 static void term_init(void)
315 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
316 |INLCR|IGNCR|ICRNL|IXON);
317 tty.c_oflag |= OPOST;
318 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
319 tty.c_cflag &= ~(CSIZE|PARENB);
324 tcsetattr (0, TCSANOW, &tty);
326 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
327 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
328 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
330 register a function to be called at normal program termination
333 #ifdef CONFIG_BEOS_NETSERVER
334 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
338 /* read a key without blocking */
339 static int read_key(void)
343 #ifndef CONFIG_BEOS_NETSERVER
351 n = select(1, &rfds, NULL, NULL, &tv);
363 static int decode_interrupt_cb(void)
365 return q_pressed || (q_pressed = read_key() == 'q');
370 static volatile int received_sigterm = 0;
372 /* no interactive support */
373 static void term_exit(void)
377 static void term_init(void)
381 static int read_key(void)
388 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
393 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
396 /* copy stream format */
397 s->nb_streams = ic->nb_streams;
398 for(i=0;i<ic->nb_streams;i++) {
401 st = av_mallocz(sizeof(AVStream));
402 memcpy(st, ic->streams[i], sizeof(AVStream));
406 av_close_input_file(ic);
410 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
412 static void do_audio_out(AVFormatContext *s,
415 unsigned char *buf, int size)
418 static uint8_t *audio_buf = NULL;
419 static uint8_t *audio_out = NULL;
420 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
422 int size_out, frame_bytes, ret;
425 /* SC: dynamic allocation of buffers */
427 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
429 audio_out = av_malloc(audio_out_size);
430 if (!audio_buf || !audio_out)
431 return; /* Should signal an error ! */
434 enc = &ost->st->codec;
436 if (ost->audio_resample) {
438 size_out = audio_resample(ost->resample,
439 (short *)buftmp, (short *)buf,
440 size / (ist->st->codec.channels * 2));
441 size_out = size_out * enc->channels * 2;
447 /* now encode as many frames as possible */
448 if (enc->frame_size > 1) {
449 /* output resampled raw samples */
450 fifo_write(&ost->fifo, buftmp, size_out,
453 frame_bytes = enc->frame_size * 2 * enc->channels;
455 while (fifo_read(&ost->fifo, audio_buf, frame_bytes,
456 &ost->fifo.rptr) == 0) {
458 av_init_packet(&pkt);
460 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
463 pkt.stream_index= ost->index;
467 pkt.pts= enc->coded_frame->pts;
468 pkt.flags |= PKT_FLAG_KEY;
469 av_interleaved_write_frame(s, &pkt);
473 av_init_packet(&pkt);
474 /* output a pcm frame */
475 /* XXX: change encoding codec API to avoid this ? */
476 switch(enc->codec->id) {
477 case CODEC_ID_PCM_S16LE:
478 case CODEC_ID_PCM_S16BE:
479 case CODEC_ID_PCM_U16LE:
480 case CODEC_ID_PCM_U16BE:
483 size_out = size_out >> 1;
486 ret = avcodec_encode_audio(enc, audio_out, size_out,
489 pkt.stream_index= ost->index;
493 pkt.pts= enc->coded_frame->pts;
494 pkt.flags |= PKT_FLAG_KEY;
495 av_interleaved_write_frame(s, &pkt);
499 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
503 AVPicture picture_tmp;
506 dec = &ist->st->codec;
508 /* deinterlace : must be done before any resize */
509 if (do_deinterlace || using_vhook) {
512 /* create temporary picture */
513 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
514 buf = av_malloc(size);
518 picture2 = &picture_tmp;
519 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
522 if(avpicture_deinterlace(picture2, picture,
523 dec->pix_fmt, dec->width, dec->height) < 0) {
524 /* if error, do not deinterlace */
530 if (img_convert(picture2, dec->pix_fmt, picture,
531 dec->pix_fmt, dec->width, dec->height) < 0) {
532 /* if error, do not copy */
542 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
544 if (picture != picture2)
545 *picture = *picture2;
549 /* we begin to correct av delay at this threshold */
550 #define AV_DELAY_MAX 0.100
553 /* Expects img to be yuv420 */
554 static void fill_pad_region(AVPicture* img, int height, int width,
555 int padtop, int padbottom, int padleft, int padright, int *color) {
560 for (i = 0; i < 3; i++) {
561 shift = (i == 0) ? 0 : 1;
563 if (padtop || padleft) {
564 memset(img->data[i], color[i], (((img->linesize[i] * padtop) +
568 if (padleft || padright) {
569 optr = img->data[i] + (img->linesize[i] * (padtop >> shift)) +
570 (img->linesize[i] - (padright >> shift));
572 for (y = 0; y < ((height - (padtop + padbottom)) >> shift); y++) {
573 memset(optr, color[i], (padleft + padright) >> shift);
574 optr += img->linesize[i];
579 optr = img->data[i] + (img->linesize[i] * ((height - padbottom) >> shift));
580 memset(optr, color[i], ((img->linesize[i] * padbottom) >> shift));
586 static void do_video_out(AVFormatContext *s,
590 int *frame_size, AVOutputStream *audio_sync)
592 int nb_frames, i, ret;
593 AVFrame *final_picture, *formatted_picture;
594 AVFrame picture_format_temp, picture_crop_temp;
595 static uint8_t *video_buffer= NULL;
596 uint8_t *buf = NULL, *buf1 = NULL;
597 AVCodecContext *enc, *dec;
598 enum PixelFormat target_pixfmt;
600 #define VIDEO_BUFFER_SIZE (1024*1024)
602 avcodec_get_frame_defaults(&picture_format_temp);
603 avcodec_get_frame_defaults(&picture_crop_temp);
605 enc = &ost->st->codec;
606 dec = &ist->st->codec;
608 /* by default, we output a single frame */
615 vdelta = ost->sync_ipts * enc->frame_rate / enc->frame_rate_base - ost->sync_opts;
616 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
619 else if (vdelta > 1.1)
621 //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);
625 fprintf(stderr, "*** drop!\n");
626 }else if (nb_frames == 2) {
629 fprintf(stderr, "*** dup!\n");
632 ost->sync_opts= lrintf(ost->sync_ipts * enc->frame_rate / enc->frame_rate_base);
638 video_buffer = av_malloc(VIDEO_BUFFER_SIZE);
642 /* convert pixel format if needed */
643 target_pixfmt = ost->video_resample || ost->video_pad
644 ? PIX_FMT_YUV420P : enc->pix_fmt;
645 if (dec->pix_fmt != target_pixfmt) {
648 /* create temporary picture */
649 size = avpicture_get_size(target_pixfmt, dec->width, dec->height);
650 buf = av_malloc(size);
653 formatted_picture = &picture_format_temp;
654 avpicture_fill((AVPicture*)formatted_picture, buf, target_pixfmt, dec->width, dec->height);
656 if (img_convert((AVPicture*)formatted_picture, target_pixfmt,
657 (AVPicture *)in_picture, dec->pix_fmt,
658 dec->width, dec->height) < 0) {
661 fprintf(stderr, "pixel format conversion not handled\n");
666 formatted_picture = in_picture;
669 /* XXX: resampling could be done before raw format conversion in
670 some cases to go faster */
671 /* XXX: only works for YUV420P */
672 if (ost->video_resample) {
673 final_picture = &ost->pict_tmp;
674 img_resample(ost->img_resample_ctx, (AVPicture*)final_picture, (AVPicture*)formatted_picture);
676 if (ost->padtop || ost->padbottom || ost->padleft || ost->padright) {
677 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
678 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
682 if (enc->pix_fmt != PIX_FMT_YUV420P) {
686 /* create temporary picture */
687 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
688 buf = av_malloc(size);
691 final_picture = &picture_format_temp;
692 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
694 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
695 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
696 enc->width, enc->height) < 0) {
699 fprintf(stderr, "pixel format conversion not handled\n");
704 } else if (ost->video_crop) {
705 picture_crop_temp.data[0] = formatted_picture->data[0] +
706 (ost->topBand * formatted_picture->linesize[0]) + ost->leftBand;
708 picture_crop_temp.data[1] = formatted_picture->data[1] +
709 ((ost->topBand >> 1) * formatted_picture->linesize[1]) +
710 (ost->leftBand >> 1);
712 picture_crop_temp.data[2] = formatted_picture->data[2] +
713 ((ost->topBand >> 1) * formatted_picture->linesize[2]) +
714 (ost->leftBand >> 1);
716 picture_crop_temp.linesize[0] = formatted_picture->linesize[0];
717 picture_crop_temp.linesize[1] = formatted_picture->linesize[1];
718 picture_crop_temp.linesize[2] = formatted_picture->linesize[2];
719 final_picture = &picture_crop_temp;
720 } else if (ost->video_pad) {
721 final_picture = &ost->pict_tmp;
723 for (i = 0; i < 3; i++) {
724 uint8_t *optr, *iptr;
725 int shift = (i == 0) ? 0 : 1;
728 /* set offset to start writing image into */
729 optr = final_picture->data[i] + (((final_picture->linesize[i] *
730 ost->padtop) + ost->padleft) >> shift);
731 iptr = formatted_picture->data[i];
733 yheight = (enc->height - ost->padtop - ost->padbottom) >> shift;
734 for (y = 0; y < yheight; y++) {
735 /* copy unpadded image row into padded image row */
736 memcpy(optr, iptr, formatted_picture->linesize[i]);
737 optr += final_picture->linesize[i];
738 iptr += formatted_picture->linesize[i];
742 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
743 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
746 if (enc->pix_fmt != PIX_FMT_YUV420P) {
750 /* create temporary picture */
751 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
752 buf = av_malloc(size);
755 final_picture = &picture_format_temp;
756 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
758 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
759 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
760 enc->width, enc->height) < 0) {
763 fprintf(stderr, "pixel format conversion not handled\n");
769 final_picture = formatted_picture;
771 /* duplicates frame if needed */
772 /* XXX: pb because no interleaving */
773 for(i=0;i<nb_frames;i++) {
775 av_init_packet(&pkt);
776 pkt.stream_index= ost->index;
778 if (s->oformat->flags & AVFMT_RAWPICTURE) {
779 /* raw pictures are written as AVPicture structure to
780 avoid any copies. We support temorarily the older
782 AVFrame* old_frame = enc->coded_frame;
783 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
784 pkt.data= (uint8_t *)final_picture;
785 pkt.size= sizeof(AVPicture);
787 pkt.pts= dec->coded_frame->pts;
788 if(dec->coded_frame && dec->coded_frame->key_frame)
789 pkt.flags |= PKT_FLAG_KEY;
791 av_interleaved_write_frame(s, &pkt);
792 enc->coded_frame = old_frame;
796 big_picture= *final_picture;
797 /* better than nothing: use input picture interlaced
799 big_picture.interlaced_frame = in_picture->interlaced_frame;
800 if(do_interlace_me || do_interlace_dct){
801 if(top_field_first == -1)
802 big_picture.top_field_first = in_picture->top_field_first;
804 big_picture.top_field_first = top_field_first;
807 /* handles sameq here. This is not correct because it may
808 not be a global option */
810 big_picture.quality = ist->st->quality;
812 big_picture.quality = ost->st->quality;
814 big_picture.pict_type = 0;
815 // big_picture.pts = AV_NOPTS_VALUE;
816 big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->frame_rate_base, enc->frame_rate);
817 //av_log(NULL, AV_LOG_DEBUG, "%lld -> encoder\n", ost->sync_opts);
818 ret = avcodec_encode_video(enc,
819 video_buffer, VIDEO_BUFFER_SIZE,
821 //enc->frame_number = enc->real_pict_num;
823 pkt.data= video_buffer;
826 pkt.pts= enc->coded_frame->pts;
827 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %lld/%lld\n",
828 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1,
829 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1);*/
831 if(enc->coded_frame && enc->coded_frame->key_frame)
832 pkt.flags |= PKT_FLAG_KEY;
833 av_interleaved_write_frame(s, &pkt);
835 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
836 // enc->frame_number-1, enc->real_pict_num, ret,
838 /* if two pass, output log */
839 if (ost->logfile && enc->stats_out) {
840 fprintf(ost->logfile, "%s", enc->stats_out);
852 static double psnr(double d){
853 if(d==0) return INFINITY;
854 return -10.0*log(d)/log(10.0);
857 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
860 static FILE *fvstats=NULL;
867 double ti1, bitrate, avg_bitrate;
871 today = localtime(&today2);
872 sprintf(filename, "vstats_%02d%02d%02d.log", today->tm_hour,
875 fvstats = fopen(filename,"w");
883 enc = &ost->st->codec;
884 if (enc->codec_type == CODEC_TYPE_VIDEO) {
885 frame_number = ost->frame_number;
886 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
887 if (enc->flags&CODEC_FLAG_PSNR)
888 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
890 fprintf(fvstats,"f_size= %6d ", frame_size);
891 /* compute pts value */
892 ti1 = (double)ost->sync_opts *enc->frame_rate_base / enc->frame_rate;
896 bitrate = (double)(frame_size * 8) * enc->frame_rate / enc->frame_rate_base / 1000.0;
897 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
898 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
899 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
900 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
904 static void print_report(AVFormatContext **output_files,
905 AVOutputStream **ost_table, int nb_ostreams,
910 AVFormatContext *oc, *os;
913 int frame_number, vid, i;
914 double bitrate, ti1, pts;
915 static int64_t last_time = -1;
917 if (!is_last_report) {
919 /* display the report every 0.5 seconds */
920 cur_time = av_gettime();
921 if (last_time == -1) {
922 last_time = cur_time;
925 if ((cur_time - last_time) < 500000)
927 last_time = cur_time;
931 oc = output_files[0];
933 total_size = url_ftell(&oc->pb);
938 for(i=0;i<nb_ostreams;i++) {
940 os = output_files[ost->file_index];
941 enc = &ost->st->codec;
942 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
943 sprintf(buf + strlen(buf), "q=%2.1f ",
944 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
946 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
947 frame_number = ost->frame_number;
948 sprintf(buf + strlen(buf), "frame=%5d q=%2.1f ",
949 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : 0);
951 sprintf(buf + strlen(buf), "L");
952 if (enc->flags&CODEC_FLAG_PSNR){
954 double error, error_sum=0;
955 double scale, scale_sum=0;
956 char type[3]= {'Y','U','V'};
957 sprintf(buf + strlen(buf), "PSNR=");
960 error= enc->error[j];
961 scale= enc->width*enc->height*255.0*255.0*frame_number;
963 error= enc->coded_frame->error[j];
964 scale= enc->width*enc->height*255.0*255.0;
969 sprintf(buf + strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
971 sprintf(buf + strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
975 /* compute min output value */
976 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
977 if ((pts < ti1) && (pts > 0))
983 if (verbose || is_last_report) {
984 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
986 sprintf(buf + strlen(buf),
987 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
988 (double)total_size / 1024, ti1, bitrate);
991 sprintf(buf + strlen(buf), " dup=%d drop=%d",
992 nb_frames_dup, nb_frames_drop);
995 fprintf(stderr, "%s \r", buf);
1000 if (is_last_report && verbose >= 0){
1001 int64_t raw= audio_size + video_size + extra_size;
1002 fprintf(stderr, "\n");
1003 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1007 100.0*(total_size - raw)/raw
1012 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1013 static int output_packet(AVInputStream *ist, int ist_index,
1014 AVOutputStream **ost_table, int nb_ostreams,
1015 const AVPacket *pkt)
1017 AVFormatContext *os;
1018 AVOutputStream *ost;
1022 int data_size, got_picture;
1024 short samples[AVCODEC_MAX_AUDIO_FRAME_SIZE / 2];
1025 void *buffer_to_free;
1027 if (pkt && pkt->pts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1028 ist->next_pts = ist->pts = pkt->dts;
1030 ist->pts = ist->next_pts;
1044 /* decode the packet if needed */
1045 data_buf = NULL; /* fail safe */
1047 if (ist->decoding_needed) {
1048 switch(ist->st->codec.codec_type) {
1049 case CODEC_TYPE_AUDIO:
1050 /* XXX: could avoid copy if PCM 16 bits with same
1051 endianness as CPU */
1052 ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size,
1058 /* Some bug in mpeg audio decoder gives */
1059 /* data_size < 0, it seems they are overflows */
1060 if (data_size <= 0) {
1061 /* no audio frame */
1064 data_buf = (uint8_t *)samples;
1065 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1066 (ist->st->codec.sample_rate * ist->st->codec.channels);
1068 case CODEC_TYPE_VIDEO:
1069 data_size = (ist->st->codec.width * ist->st->codec.height * 3) / 2;
1070 /* XXX: allocate picture correctly */
1071 avcodec_get_frame_defaults(&picture);
1073 ret = avcodec_decode_video(&ist->st->codec,
1074 &picture, &got_picture, ptr, len);
1075 ist->st->quality= picture.quality;
1079 /* no picture yet */
1080 goto discard_packet;
1082 if (ist->st->codec.frame_rate_base != 0) {
1083 ist->next_pts += ((int64_t)AV_TIME_BASE *
1084 ist->st->codec.frame_rate_base) /
1085 ist->st->codec.frame_rate;
1099 buffer_to_free = NULL;
1100 if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1101 pre_process_video_frame(ist, (AVPicture *)&picture,
1105 /* frame rate emulation */
1106 if (ist->st->codec.rate_emu) {
1107 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec.frame_rate_base, 1000000, ist->st->codec.frame_rate);
1108 int64_t now = av_gettime() - ist->start;
1116 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1117 is the one of the next displayed one */
1118 /* XXX: add mpeg4 too ? */
1119 if (ist->st->codec.codec_id == CODEC_ID_MPEG1VIDEO) {
1120 if (ist->st->codec.pict_type != B_TYPE) {
1122 tmp = ist->last_ip_pts;
1123 ist->last_ip_pts = ist->frac_pts.val;
1124 ist->frac_pts.val = tmp;
1128 /* if output time reached then transcode raw format,
1129 encode packets and output them */
1130 if (start_time == 0 || ist->pts >= start_time)
1131 for(i=0;i<nb_ostreams;i++) {
1135 if (ost->source_index == ist_index) {
1136 os = output_files[ost->file_index];
1139 printf("%d: got pts=%0.3f %0.3f\n", i,
1140 (double)pkt->pts / AV_TIME_BASE,
1141 ((double)ist->pts / AV_TIME_BASE) -
1142 ((double)ost->st->pts.val * ost->time_base.num / ost->time_base.den));
1144 /* set the input output pts pairs */
1145 ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index])/ AV_TIME_BASE;
1147 if (ost->encoding_needed) {
1148 switch(ost->st->codec.codec_type) {
1149 case CODEC_TYPE_AUDIO:
1150 do_audio_out(os, ost, ist, data_buf, data_size);
1152 case CODEC_TYPE_VIDEO:
1153 /* find an audio stream for synchro */
1156 AVOutputStream *audio_sync, *ost1;
1158 for(i=0;i<nb_ostreams;i++) {
1159 ost1 = ost_table[i];
1160 if (ost1->file_index == ost->file_index &&
1161 ost1->st->codec.codec_type == CODEC_TYPE_AUDIO) {
1167 do_video_out(os, ost, ist, &picture, &frame_size, audio_sync);
1168 video_size += frame_size;
1169 if (do_vstats && frame_size)
1170 do_video_stats(os, ost, frame_size);
1177 AVFrame avframe; //FIXME/XXX remove this
1179 av_init_packet(&opkt);
1181 /* no reencoding needed : output the packet directly */
1182 /* force the input stream PTS */
1184 avcodec_get_frame_defaults(&avframe);
1185 ost->st->codec.coded_frame= &avframe;
1186 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1188 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO)
1189 audio_size += data_size;
1190 else if (ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1191 video_size += data_size;
1193 opkt.stream_index= ost->index;
1194 opkt.data= data_buf;
1195 opkt.size= data_size;
1196 opkt.pts= pkt->pts + input_files_ts_offset[ist->file_index];
1197 opkt.dts= pkt->dts + input_files_ts_offset[ist->file_index];
1198 opkt.flags= pkt->flags;
1200 av_interleaved_write_frame(os, &opkt);
1201 ost->st->codec.frame_number++;
1202 ost->frame_number++;
1206 av_free(buffer_to_free);
1216 * The following code is the main loop of the file converter
1218 static int av_encode(AVFormatContext **output_files,
1219 int nb_output_files,
1220 AVFormatContext **input_files,
1222 AVStreamMap *stream_maps, int nb_stream_maps)
1224 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1225 AVFormatContext *is, *os;
1226 AVCodecContext *codec, *icodec;
1227 AVOutputStream *ost, **ost_table = NULL;
1228 AVInputStream *ist, **ist_table = NULL;
1229 AVInputFile *file_table;
1230 AVFormatContext *stream_no_data;
1233 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1237 /* input stream init */
1239 for(i=0;i<nb_input_files;i++) {
1240 is = input_files[i];
1241 file_table[i].ist_index = j;
1242 file_table[i].nb_streams = is->nb_streams;
1243 j += is->nb_streams;
1247 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1251 for(i=0;i<nb_istreams;i++) {
1252 ist = av_mallocz(sizeof(AVInputStream));
1258 for(i=0;i<nb_input_files;i++) {
1259 is = input_files[i];
1260 for(k=0;k<is->nb_streams;k++) {
1261 ist = ist_table[j++];
1262 ist->st = is->streams[k];
1263 ist->file_index = i;
1265 ist->discard = 1; /* the stream is discarded by default
1268 if (ist->st->codec.rate_emu) {
1269 ist->start = av_gettime();
1275 /* output stream init */
1277 for(i=0;i<nb_output_files;i++) {
1278 os = output_files[i];
1279 nb_ostreams += os->nb_streams;
1281 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1282 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1286 /* Sanity check the mapping args -- do the input files & streams exist? */
1287 for(i=0;i<nb_stream_maps;i++) {
1288 int fi = stream_maps[i].file_index;
1289 int si = stream_maps[i].stream_index;
1291 if (fi < 0 || fi > nb_input_files - 1 ||
1292 si < 0 || si > file_table[fi].nb_streams - 1) {
1293 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1298 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1301 for(i=0;i<nb_ostreams;i++) {
1302 ost = av_mallocz(sizeof(AVOutputStream));
1309 for(k=0;k<nb_output_files;k++) {
1310 os = output_files[k];
1311 for(i=0;i<os->nb_streams;i++) {
1313 ost = ost_table[n++];
1314 ost->file_index = k;
1316 ost->st = os->streams[i];
1317 if (nb_stream_maps > 0) {
1318 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1319 stream_maps[n-1].stream_index;
1321 /* Sanity check that the stream types match */
1322 if (ist_table[ost->source_index]->st->codec.codec_type != ost->st->codec.codec_type) {
1323 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1324 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1325 ost->file_index, ost->index);
1330 /* get corresponding input stream index : we select the first one with the right type */
1332 for(j=0;j<nb_istreams;j++) {
1335 ist->st->codec.codec_type == ost->st->codec.codec_type) {
1336 ost->source_index = j;
1342 /* try again and reuse existing stream */
1343 for(j=0;j<nb_istreams;j++) {
1345 if (ist->st->codec.codec_type == ost->st->codec.codec_type) {
1346 ost->source_index = j;
1351 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1352 ost->file_index, ost->index);
1357 ist = ist_table[ost->source_index];
1362 /* for each output stream, we compute the right encoding parameters */
1363 for(i=0;i<nb_ostreams;i++) {
1365 ist = ist_table[ost->source_index];
1367 codec = &ost->st->codec;
1368 icodec = &ist->st->codec;
1370 if (ost->st->stream_copy) {
1371 /* if stream_copy is selected, no need to decode or encode */
1372 codec->codec_id = icodec->codec_id;
1373 codec->codec_type = icodec->codec_type;
1374 codec->codec_tag = icodec->codec_tag;
1375 codec->bit_rate = icodec->bit_rate;
1376 switch(codec->codec_type) {
1377 case CODEC_TYPE_AUDIO:
1378 codec->sample_rate = icodec->sample_rate;
1379 codec->channels = icodec->channels;
1380 codec->frame_size = icodec->frame_size;
1382 case CODEC_TYPE_VIDEO:
1383 codec->frame_rate = icodec->frame_rate;
1384 codec->frame_rate_base = icodec->frame_rate_base;
1385 codec->width = icodec->width;
1386 codec->height = icodec->height;
1392 switch(codec->codec_type) {
1393 case CODEC_TYPE_AUDIO:
1394 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1397 if (codec->channels == icodec->channels &&
1398 codec->sample_rate == icodec->sample_rate) {
1399 ost->audio_resample = 0;
1401 if (codec->channels != icodec->channels &&
1402 icodec->codec_id == CODEC_ID_AC3) {
1403 /* Special case for 5:1 AC3 input */
1404 /* and mono or stereo output */
1405 /* Request specific number of channels */
1406 icodec->channels = codec->channels;
1407 if (codec->sample_rate == icodec->sample_rate)
1408 ost->audio_resample = 0;
1410 ost->audio_resample = 1;
1411 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1413 icodec->sample_rate);
1416 printf("Can't resample. Aborting.\n");
1420 /* Request specific number of channels */
1421 icodec->channels = codec->channels;
1423 ost->audio_resample = 1;
1424 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1426 icodec->sample_rate);
1429 printf("Can't resample. Aborting.\n");
1434 ist->decoding_needed = 1;
1435 ost->encoding_needed = 1;
1437 case CODEC_TYPE_VIDEO:
1438 if (codec->width == icodec->width &&
1439 codec->height == icodec->height &&
1440 frame_topBand == 0 &&
1441 frame_bottomBand == 0 &&
1442 frame_leftBand == 0 &&
1443 frame_rightBand == 0 &&
1444 frame_padtop == 0 &&
1445 frame_padbottom == 0 &&
1446 frame_padleft == 0 &&
1447 frame_padright == 0)
1449 ost->video_resample = 0;
1450 ost->video_crop = 0;
1452 } else if ((codec->width == icodec->width -
1453 (frame_leftBand + frame_rightBand)) &&
1454 (codec->height == icodec->height -
1455 (frame_topBand + frame_bottomBand)))
1457 ost->video_resample = 0;
1458 ost->video_crop = 1;
1459 ost->topBand = frame_topBand;
1460 ost->leftBand = frame_leftBand;
1461 } else if ((codec->width == icodec->width +
1462 (frame_padleft + frame_padright)) &&
1463 (codec->height == icodec->height +
1464 (frame_padtop + frame_padbottom))) {
1465 ost->video_resample = 0;
1466 ost->video_crop = 0;
1468 ost->padtop = frame_padtop;
1469 ost->padleft = frame_padleft;
1470 ost->padbottom = frame_padbottom;
1471 ost->padright = frame_padright;
1472 avcodec_get_frame_defaults(&ost->pict_tmp);
1473 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1474 codec->width, codec->height ) )
1477 ost->video_resample = 1;
1478 ost->video_crop = 0; // cropping is handled as part of resample
1479 avcodec_get_frame_defaults(&ost->pict_tmp);
1480 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1481 codec->width, codec->height ) )
1484 ost->img_resample_ctx = img_resample_full_init(
1485 ost->st->codec.width, ost->st->codec.height,
1486 ist->st->codec.width, ist->st->codec.height,
1487 frame_topBand, frame_bottomBand,
1488 frame_leftBand, frame_rightBand,
1489 frame_padtop, frame_padbottom,
1490 frame_padleft, frame_padright);
1492 ost->padtop = frame_padtop;
1493 ost->padleft = frame_padleft;
1494 ost->padbottom = frame_padbottom;
1495 ost->padright = frame_padright;
1498 ost->encoding_needed = 1;
1499 ist->decoding_needed = 1;
1505 if (ost->encoding_needed &&
1506 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1507 char logfilename[1024];
1512 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1514 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1515 if (codec->flags & CODEC_FLAG_PASS1) {
1516 f = fopen(logfilename, "w");
1518 perror(logfilename);
1523 /* read the log file */
1524 f = fopen(logfilename, "r");
1526 perror(logfilename);
1529 fseek(f, 0, SEEK_END);
1531 fseek(f, 0, SEEK_SET);
1532 logbuffer = av_malloc(size + 1);
1534 fprintf(stderr, "Could not allocate log buffer\n");
1537 size = fread(logbuffer, 1, size, f);
1539 logbuffer[size] = '\0';
1540 codec->stats_in = logbuffer;
1546 /* dump the file output parameters - cannot be done before in case
1548 for(i=0;i<nb_output_files;i++) {
1549 dump_format(output_files[i], i, output_files[i]->filename, 1);
1552 /* dump the stream mapping */
1554 fprintf(stderr, "Stream mapping:\n");
1555 for(i=0;i<nb_ostreams;i++) {
1557 fprintf(stderr, " Stream #%d.%d -> #%d.%d\n",
1558 ist_table[ost->source_index]->file_index,
1559 ist_table[ost->source_index]->index,
1565 /* open each encoder */
1566 for(i=0;i<nb_ostreams;i++) {
1568 if (ost->encoding_needed) {
1570 codec = avcodec_find_encoder(ost->st->codec.codec_id);
1572 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1573 ost->file_index, ost->index);
1576 if (avcodec_open(&ost->st->codec, codec) < 0) {
1577 fprintf(stderr, "Error while opening codec for stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1578 ost->file_index, ost->index);
1581 extra_size += ost->st->codec.extradata_size;
1585 /* open each decoder */
1586 for(i=0;i<nb_istreams;i++) {
1588 if (ist->decoding_needed) {
1590 codec = avcodec_find_decoder(ist->st->codec.codec_id);
1592 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1593 ist->st->codec.codec_id, ist->file_index, ist->index);
1596 if (avcodec_open(&ist->st->codec, codec) < 0) {
1597 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1598 ist->file_index, ist->index);
1601 //if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO)
1602 // ist->st->codec.flags |= CODEC_FLAG_REPEAT_FIELD;
1607 for(i=0;i<nb_istreams;i++) {
1609 is = input_files[ist->file_index];
1614 /* compute buffer size max (should use a complete heuristic) */
1615 for(i=0;i<nb_input_files;i++) {
1616 file_table[i].buffer_size_max = 2048;
1619 /* open files and write file headers */
1620 for(i=0;i<nb_output_files;i++) {
1621 os = output_files[i];
1622 if (av_write_header(os) < 0) {
1623 fprintf(stderr, "Could not write header for output file #%d (incorrect codec paramters ?)\n", i);
1629 #ifndef CONFIG_WIN32
1630 if ( !using_stdin && verbose >= 0) {
1631 fprintf(stderr, "Press [q] to stop encoding\n");
1632 url_set_interrupt_cb(decode_interrupt_cb);
1640 for(; received_sigterm == 0;) {
1641 int file_index, ist_index;
1646 /* if 'q' pressed, exits */
1650 /* read_key() returns 0 on EOF */
1656 /* select the stream that we must read now by looking at the
1657 smallest output pts */
1660 for(i=0;i<nb_ostreams;i++) {
1663 os = output_files[ost->file_index];
1664 ist = ist_table[ost->source_index];
1665 if (input_sync == 0) {
1666 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1667 pts = (double)ost->sync_opts * ost->st->codec.frame_rate_base / ost->st->codec.frame_rate;
1669 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1671 pts = (double)ist->pts;
1673 if (!file_table[ist->file_index].eof_reached &&
1676 file_index = ist->file_index;
1679 /* if none, if is finished */
1680 if (file_index < 0) {
1684 /* finish if recording time exhausted */
1685 if (recording_time > 0 && pts_min >= (recording_time / 1000000.0))
1688 /* read a frame from it and output it in the fifo */
1689 is = input_files[file_index];
1690 if (av_read_frame(is, &pkt) < 0) {
1691 file_table[file_index].eof_reached = 1;
1696 stream_no_data = is;
1701 av_pkt_dump(stdout, &pkt, do_hex_dump);
1703 /* the following test is needed in case new streams appear
1704 dynamically in stream : we ignore them */
1705 if (pkt.stream_index >= file_table[file_index].nb_streams)
1706 goto discard_packet;
1707 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1708 ist = ist_table[ist_index];
1710 goto discard_packet;
1712 // 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);
1713 if (pkt.dts != AV_NOPTS_VALUE) {
1714 int64_t delta= pkt.dts - ist->next_pts;
1715 if(ABS(delta) > 10LL*AV_TIME_BASE && !copy_ts){
1716 input_files_ts_offset[ist->file_index]-= delta;
1718 fprintf(stderr, "timestamp discontinuity %lld, new offset= %lld\n", delta, input_files_ts_offset[ist->file_index]);
1719 for(i=0; i<file_table[file_index].nb_streams; i++){
1720 int index= file_table[file_index].ist_index + i;
1721 ist_table[index]->next_pts += delta;
1726 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1727 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1730 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1731 ist->file_index, ist->index);
1733 av_free_packet(&pkt);
1738 av_free_packet(&pkt);
1740 /* dump report by using the output first video and audio streams */
1741 print_report(output_files, ost_table, nb_ostreams, 0);
1744 /* at the end of stream, we must flush the decoder buffers */
1745 for(i=0;i<nb_istreams;i++) {
1747 if (ist->decoding_needed) {
1748 output_packet(ist, i, ost_table, nb_ostreams, NULL);
1754 /* write the trailer if needed and close file */
1755 for(i=0;i<nb_output_files;i++) {
1756 os = output_files[i];
1757 av_write_trailer(os);
1760 /* dump report by using the first video and audio streams */
1761 print_report(output_files, ost_table, nb_ostreams, 1);
1763 /* close each encoder */
1764 for(i=0;i<nb_ostreams;i++) {
1766 if (ost->encoding_needed) {
1767 av_freep(&ost->st->codec.stats_in);
1768 avcodec_close(&ost->st->codec);
1772 /* close each decoder */
1773 for(i=0;i<nb_istreams;i++) {
1775 if (ist->decoding_needed) {
1776 avcodec_close(&ist->st->codec);
1784 av_free(file_table);
1787 for(i=0;i<nb_istreams;i++) {
1794 for(i=0;i<nb_ostreams;i++) {
1798 fclose(ost->logfile);
1799 ost->logfile = NULL;
1801 fifo_free(&ost->fifo); /* works even if fifo is not
1802 initialized but set to zero */
1803 av_free(ost->pict_tmp.data[0]);
1804 if (ost->video_resample)
1805 img_resample_close(ost->img_resample_ctx);
1806 if (ost->audio_resample)
1807 audio_resample_close(ost->resample);
1820 int file_read(const char *filename)
1823 unsigned char buffer[1024];
1826 if (url_open(&h, filename, O_RDONLY) < 0) {
1827 printf("could not open '%s'\n", filename);
1831 len = url_read(h, buffer, sizeof(buffer));
1834 for(i=0;i<len;i++) putchar(buffer[i]);
1841 static void opt_image_format(const char *arg)
1845 for(f = first_image_format; f != NULL; f = f->next) {
1846 if (!strcmp(arg, f->name))
1850 fprintf(stderr, "Unknown image format: '%s'\n", arg);
1856 static void opt_format(const char *arg)
1858 /* compatibility stuff for pgmyuv */
1859 if (!strcmp(arg, "pgmyuv")) {
1860 opt_image_format(arg);
1864 file_iformat = av_find_input_format(arg);
1865 file_oformat = guess_format(arg, NULL, NULL);
1866 if (!file_iformat && !file_oformat) {
1867 fprintf(stderr, "Unknown input or output format: %s\n", arg);
1872 static void opt_video_bitrate(const char *arg)
1874 video_bit_rate = atoi(arg) * 1000;
1877 static void opt_video_bitrate_tolerance(const char *arg)
1879 video_bit_rate_tolerance = atoi(arg) * 1000;
1882 static void opt_video_bitrate_max(const char *arg)
1884 video_rc_max_rate = atoi(arg) * 1000;
1887 static void opt_video_bitrate_min(const char *arg)
1889 video_rc_min_rate = atoi(arg) * 1000;
1892 static void opt_video_buffer_size(const char *arg)
1894 video_rc_buffer_size = atoi(arg) * 8*1024;
1897 static void opt_video_rc_eq(char *arg)
1902 static void opt_video_rc_override_string(char *arg)
1904 video_rc_override_string = arg;
1908 static void opt_workaround_bugs(const char *arg)
1910 workaround_bugs = atoi(arg);
1913 static void opt_dct_algo(const char *arg)
1915 dct_algo = atoi(arg);
1918 static void opt_idct_algo(const char *arg)
1920 idct_algo = atoi(arg);
1923 static void opt_me_threshold(const char *arg)
1925 me_threshold = atoi(arg);
1928 static void opt_mb_threshold(const char *arg)
1930 mb_threshold = atoi(arg);
1933 static void opt_error_resilience(const char *arg)
1935 error_resilience = atoi(arg);
1938 static void opt_error_concealment(const char *arg)
1940 error_concealment = atoi(arg);
1943 static void opt_debug(const char *arg)
1948 static void opt_vismv(const char *arg)
1950 debug_mv = atoi(arg);
1953 static void opt_verbose(const char *arg)
1955 verbose = atoi(arg);
1956 av_log_set_level(atoi(arg));
1959 static void opt_sync_method(const char *arg)
1961 sync_method = atoi(arg);
1964 static void opt_frame_rate(const char *arg)
1966 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
1967 fprintf(stderr, "Incorrect frame rate\n");
1972 static void opt_frame_crop_top(const char *arg)
1974 frame_topBand = atoi(arg);
1975 if (frame_topBand < 0) {
1976 fprintf(stderr, "Incorrect top crop size\n");
1979 if ((frame_topBand % 2) != 0) {
1980 fprintf(stderr, "Top crop size must be a multiple of 2\n");
1983 if ((frame_topBand) >= frame_height){
1984 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
1987 frame_height -= frame_topBand;
1990 static void opt_frame_crop_bottom(const char *arg)
1992 frame_bottomBand = atoi(arg);
1993 if (frame_bottomBand < 0) {
1994 fprintf(stderr, "Incorrect bottom crop size\n");
1997 if ((frame_bottomBand % 2) != 0) {
1998 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2001 if ((frame_bottomBand) >= frame_height){
2002 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2005 frame_height -= frame_bottomBand;
2008 static void opt_frame_crop_left(const char *arg)
2010 frame_leftBand = atoi(arg);
2011 if (frame_leftBand < 0) {
2012 fprintf(stderr, "Incorrect left crop size\n");
2015 if ((frame_leftBand % 2) != 0) {
2016 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2019 if ((frame_leftBand) >= frame_width){
2020 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2023 frame_width -= frame_leftBand;
2026 static void opt_frame_crop_right(const char *arg)
2028 frame_rightBand = atoi(arg);
2029 if (frame_rightBand < 0) {
2030 fprintf(stderr, "Incorrect right crop size\n");
2033 if ((frame_rightBand % 2) != 0) {
2034 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2037 if ((frame_rightBand) >= frame_width){
2038 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2041 frame_width -= frame_rightBand;
2044 static void opt_frame_size(const char *arg)
2046 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2047 fprintf(stderr, "Incorrect frame size\n");
2050 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2051 fprintf(stderr, "Frame size must be a multiple of 2\n");
2057 #define SCALEBITS 10
2058 #define ONE_HALF (1 << (SCALEBITS - 1))
2059 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2061 #define RGB_TO_Y(r, g, b) \
2062 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2063 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2065 #define RGB_TO_U(r1, g1, b1, shift)\
2066 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2067 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2069 #define RGB_TO_V(r1, g1, b1, shift)\
2070 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2071 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2073 static void opt_pad_color(const char *arg) {
2074 /* Input is expected to be six hex digits similar to
2075 how colors are expressed in html tags (but without the #) */
2076 int rgb = strtol(arg, NULL, 16);
2080 g = ((rgb >> 8) & 255);
2083 padcolor[0] = RGB_TO_Y(r,g,b);
2084 padcolor[1] = RGB_TO_U(r,g,b,0);
2085 padcolor[2] = RGB_TO_V(r,g,b,0);
2088 static void opt_frame_pad_top(const char *arg)
2090 frame_padtop = atoi(arg);
2091 if (frame_padtop < 0) {
2092 fprintf(stderr, "Incorrect top pad size\n");
2095 if ((frame_padtop % 2) != 0) {
2096 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2101 static void opt_frame_pad_bottom(const char *arg)
2103 frame_padbottom = atoi(arg);
2104 if (frame_padbottom < 0) {
2105 fprintf(stderr, "Incorrect bottom pad size\n");
2108 if ((frame_padbottom % 2) != 0) {
2109 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2115 static void opt_frame_pad_left(const char *arg)
2117 frame_padleft = atoi(arg);
2118 if (frame_padleft < 0) {
2119 fprintf(stderr, "Incorrect left pad size\n");
2122 if ((frame_padleft % 2) != 0) {
2123 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2129 static void opt_frame_pad_right(const char *arg)
2131 frame_padright = atoi(arg);
2132 if (frame_padright < 0) {
2133 fprintf(stderr, "Incorrect right pad size\n");
2136 if ((frame_padright % 2) != 0) {
2137 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2143 static void opt_frame_pix_fmt(const char *arg)
2145 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2148 static void opt_frame_aspect_ratio(const char *arg)
2154 p = strchr(arg, ':');
2156 x = strtol(arg, (char **)&arg, 10);
2158 y = strtol(arg+1, (char **)&arg, 10);
2160 ar = (double)x / (double)y;
2162 ar = strtod(arg, (char **)&arg);
2165 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2168 frame_aspect_ratio = ar;
2171 static void opt_gop_size(const char *arg)
2173 gop_size = atoi(arg);
2176 static void opt_b_frames(const char *arg)
2178 b_frames = atoi(arg);
2179 if (b_frames > FF_MAX_B_FRAMES) {
2180 fprintf(stderr, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES);
2182 } else if (b_frames < 1) {
2183 fprintf(stderr, "\nNumber of B frames must be higher than 0\n");
2188 static void opt_mb_decision(const char *arg)
2190 mb_decision = atoi(arg);
2193 static void opt_mb_cmp(const char *arg)
2198 static void opt_ildct_cmp(const char *arg)
2200 ildct_cmp = atoi(arg);
2203 static void opt_sub_cmp(const char *arg)
2205 sub_cmp = atoi(arg);
2208 static void opt_cmp(const char *arg)
2213 static void opt_pre_cmp(const char *arg)
2215 pre_cmp = atoi(arg);
2218 static void opt_pre_me(const char *arg)
2223 static void opt_lumi_mask(const char *arg)
2225 lumi_mask = atof(arg);
2228 static void opt_dark_mask(const char *arg)
2230 dark_mask = atof(arg);
2233 static void opt_scplx_mask(const char *arg)
2235 scplx_mask = atof(arg);
2238 static void opt_tcplx_mask(const char *arg)
2240 tcplx_mask = atof(arg);
2243 static void opt_p_mask(const char *arg)
2248 static void opt_qscale(const char *arg)
2250 video_qscale = atof(arg);
2251 if (video_qscale < 0.01 ||
2252 video_qscale > 255) {
2253 fprintf(stderr, "qscale must be >= 0.01 and <= 255\n");
2258 static void opt_lmax(const char *arg)
2260 video_lmax = atof(arg)*FF_QP2LAMBDA;
2263 static void opt_lmin(const char *arg)
2265 video_lmin = atof(arg)*FF_QP2LAMBDA;
2268 static void opt_qmin(const char *arg)
2270 video_qmin = atoi(arg);
2271 if (video_qmin < 0 ||
2273 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2278 static void opt_qmax(const char *arg)
2280 video_qmax = atoi(arg);
2281 if (video_qmax < 0 ||
2283 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2288 static void opt_mb_qmin(const char *arg)
2290 video_mb_qmin = atoi(arg);
2291 if (video_mb_qmin < 0 ||
2292 video_mb_qmin > 31) {
2293 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2298 static void opt_mb_qmax(const char *arg)
2300 video_mb_qmax = atoi(arg);
2301 if (video_mb_qmax < 0 ||
2302 video_mb_qmax > 31) {
2303 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2308 static void opt_qdiff(const char *arg)
2310 video_qdiff = atoi(arg);
2311 if (video_qdiff < 0 ||
2313 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2318 static void opt_qblur(const char *arg)
2320 video_qblur = atof(arg);
2323 static void opt_qcomp(const char *arg)
2325 video_qcomp = atof(arg);
2328 static void opt_rc_initial_cplx(const char *arg)
2330 video_rc_initial_cplx = atof(arg);
2332 static void opt_b_qfactor(const char *arg)
2334 video_b_qfactor = atof(arg);
2336 static void opt_i_qfactor(const char *arg)
2338 video_i_qfactor = atof(arg);
2340 static void opt_b_qoffset(const char *arg)
2342 video_b_qoffset = atof(arg);
2344 static void opt_i_qoffset(const char *arg)
2346 video_i_qoffset = atof(arg);
2349 static void opt_ibias(const char *arg)
2351 video_intra_quant_bias = atoi(arg);
2353 static void opt_pbias(const char *arg)
2355 video_inter_quant_bias = atoi(arg);
2358 static void opt_packet_size(const char *arg)
2360 packet_size= atoi(arg);
2363 static void opt_error_rate(const char *arg)
2365 error_rate= atoi(arg);
2368 static void opt_strict(const char *arg)
2373 static void opt_top_field_first(const char *arg)
2375 top_field_first= atoi(arg);
2378 static void opt_noise_reduction(const char *arg)
2380 noise_reduction= atoi(arg);
2383 static void opt_qns(const char *arg)
2388 static void opt_sc_threshold(const char *arg)
2390 sc_threshold= atoi(arg);
2393 static void opt_me_range(const char *arg)
2395 me_range = atoi(arg);
2398 static void opt_thread_count(const char *arg)
2400 thread_count= atoi(arg);
2401 #if !defined(HAVE_PTHREADS) && !defined(HAVE_W32THREADS)
2403 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2407 static void opt_audio_bitrate(const char *arg)
2409 audio_bit_rate = atoi(arg) * 1000;
2412 static void opt_audio_rate(const char *arg)
2414 audio_sample_rate = atoi(arg);
2417 static void opt_audio_channels(const char *arg)
2419 audio_channels = atoi(arg);
2422 static void opt_video_device(const char *arg)
2424 video_device = av_strdup(arg);
2427 static void opt_video_channel(const char *arg)
2429 video_channel = strtol(arg, NULL, 0);
2432 static void opt_video_standard(const char *arg)
2434 video_standard = av_strdup(arg);
2437 static void opt_audio_device(const char *arg)
2439 audio_device = av_strdup(arg);
2442 static void opt_dv1394(const char *arg)
2444 video_grab_format = "dv1394";
2445 audio_grab_format = NULL;
2448 static void opt_audio_codec(const char *arg)
2452 if (!strcmp(arg, "copy")) {
2453 audio_stream_copy = 1;
2457 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_AUDIO)
2462 fprintf(stderr, "Unknown audio codec '%s'\n", arg);
2465 audio_codec_id = p->id;
2470 static void add_frame_hooker(const char *arg)
2475 char *args = av_strdup(arg);
2479 argv[0] = strtok(args, " ");
2480 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2483 i = frame_hook_add(argc, argv);
2486 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2491 const char *motion_str[] = {
2501 static void opt_motion_estimation(const char *arg)
2507 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2510 if (!strcmp(*p, arg))
2514 me_method = (p - motion_str) + 1;
2517 static void opt_video_codec(const char *arg)
2521 if (!strcmp(arg, "copy")) {
2522 video_stream_copy = 1;
2526 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_VIDEO)
2531 fprintf(stderr, "Unknown video codec '%s'\n", arg);
2534 video_codec_id = p->id;
2539 static void opt_map(const char *arg)
2545 m = &stream_maps[nb_stream_maps++];
2547 m->file_index = strtol(arg, (char **)&p, 0);
2551 m->stream_index = strtol(p, (char **)&p, 0);
2554 static void opt_recording_time(const char *arg)
2556 recording_time = parse_date(arg, 1);
2559 static void opt_start_time(const char *arg)
2561 start_time = parse_date(arg, 1);
2564 static void opt_rec_timestamp(const char *arg)
2566 rec_timestamp = parse_date(arg, 0) / 1000000;
2569 static void opt_input_ts_offset(const char *arg)
2571 input_ts_offset = parse_date(arg, 1);
2574 static void opt_input_file(const char *filename)
2576 AVFormatContext *ic;
2577 AVFormatParameters params, *ap = ¶ms;
2578 int err, i, ret, rfps, rfps_base;
2580 if (!strcmp(filename, "-"))
2583 using_stdin |= !strcmp(filename, "pipe:" ) ||
2584 !strcmp( filename, "/dev/stdin" );
2586 /* get default parameters from command line */
2587 memset(ap, 0, sizeof(*ap));
2588 ap->sample_rate = audio_sample_rate;
2589 ap->channels = audio_channels;
2590 ap->frame_rate = frame_rate;
2591 ap->frame_rate_base = frame_rate_base;
2592 ap->width = frame_width + frame_padleft + frame_padright;
2593 ap->height = frame_height + frame_padtop + frame_padbottom;
2594 ap->image_format = image_format;
2595 ap->pix_fmt = frame_pix_fmt;
2597 /* open the input file with generic libav function */
2598 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2600 print_error(filename, err);
2604 /* If not enough info to get the stream parameters, we decode the
2605 first frames to get it. (used in mpeg case for example) */
2606 ret = av_find_stream_info(ic);
2607 if (ret < 0 && verbose >= 0) {
2608 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2612 /* if seeking requested, we execute it */
2613 if (start_time != 0) {
2616 timestamp = start_time;
2617 /* add the stream start time */
2618 if (ic->start_time != AV_NOPTS_VALUE)
2619 timestamp += ic->start_time;
2620 ret = av_seek_frame(ic, -1, timestamp);
2622 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2623 filename, (double)timestamp / AV_TIME_BASE);
2625 /* reset seek info */
2629 /* update the current parameters so that they match the one of the input stream */
2630 for(i=0;i<ic->nb_streams;i++) {
2631 AVCodecContext *enc = &ic->streams[i]->codec;
2632 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2634 avcodec_thread_init(enc, thread_count);
2636 enc->thread_count= thread_count;
2637 switch(enc->codec_type) {
2638 case CODEC_TYPE_AUDIO:
2639 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2640 audio_channels = enc->channels;
2641 audio_sample_rate = enc->sample_rate;
2643 case CODEC_TYPE_VIDEO:
2644 frame_height = enc->height;
2645 frame_width = enc->width;
2646 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2647 frame_pix_fmt = enc->pix_fmt;
2648 rfps = ic->streams[i]->r_frame_rate;
2649 rfps_base = ic->streams[i]->r_frame_rate_base;
2650 enc->workaround_bugs = workaround_bugs;
2651 enc->error_resilience = error_resilience;
2652 enc->error_concealment = error_concealment;
2653 enc->idct_algo = idct_algo;
2655 enc->debug_mv = debug_mv;
2657 enc->flags|= CODEC_FLAG_BITEXACT;
2659 enc->debug |= FF_DEBUG_MV;
2661 assert(enc->frame_rate_base == rfps_base); // should be true for now
2662 if (enc->frame_rate != rfps) {
2665 fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f->%2.2f\n",
2666 i, (float)enc->frame_rate / enc->frame_rate_base,
2668 (float)rfps / rfps_base);
2670 /* update the current frame rate to match the stream frame rate */
2672 frame_rate_base = rfps_base;
2674 enc->rate_emu = rate_emu;
2676 case CODEC_TYPE_DATA:
2683 input_files[nb_input_files] = ic;
2684 input_files_ts_offset[nb_input_files] = input_ts_offset;
2685 /* dump the file content */
2687 dump_format(ic, nb_input_files, filename, 0);
2690 file_iformat = NULL;
2691 file_oformat = NULL;
2692 image_format = NULL;
2697 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
2699 int has_video, has_audio, i, j;
2700 AVFormatContext *ic;
2704 for(j=0;j<nb_input_files;j++) {
2705 ic = input_files[j];
2706 for(i=0;i<ic->nb_streams;i++) {
2707 AVCodecContext *enc = &ic->streams[i]->codec;
2708 switch(enc->codec_type) {
2709 case CODEC_TYPE_AUDIO:
2712 case CODEC_TYPE_VIDEO:
2715 case CODEC_TYPE_DATA:
2722 *has_video_ptr = has_video;
2723 *has_audio_ptr = has_audio;
2726 static void opt_output_file(const char *filename)
2729 AVFormatContext *oc;
2730 int use_video, use_audio, nb_streams, input_has_video, input_has_audio;
2732 AVFormatParameters params, *ap = ¶ms;
2734 if (!strcmp(filename, "-"))
2737 oc = av_alloc_format_context();
2739 if (!file_oformat) {
2740 file_oformat = guess_format(NULL, filename, NULL);
2741 if (!file_oformat) {
2742 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
2748 oc->oformat = file_oformat;
2750 if (!strcmp(file_oformat->name, "ffm") &&
2751 strstart(filename, "http:", NULL)) {
2752 /* special case for files sent to ffserver: we get the stream
2753 parameters from ffserver */
2754 if (read_ffserver_streams(oc, filename) < 0) {
2755 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
2759 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy;
2760 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy;
2762 /* disable if no corresponding type found and at least one
2764 if (nb_input_files > 0) {
2765 check_audio_video_inputs(&input_has_video, &input_has_audio);
2766 if (!input_has_video)
2768 if (!input_has_audio)
2772 /* manual disable */
2773 if (audio_disable) {
2776 if (video_disable) {
2782 AVCodecContext *video_enc;
2784 st = av_new_stream(oc, nb_streams++);
2786 fprintf(stderr, "Could not alloc stream\n");
2789 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2791 avcodec_thread_init(&st->codec, thread_count);
2794 video_enc = &st->codec;
2796 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
2797 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2798 if (video_stream_copy) {
2799 st->stream_copy = 1;
2800 video_enc->codec_type = CODEC_TYPE_VIDEO;
2806 codec_id = file_oformat->video_codec;
2807 if (video_codec_id != CODEC_ID_NONE)
2808 codec_id = video_codec_id;
2810 video_enc->codec_id = codec_id;
2811 codec = avcodec_find_encoder(codec_id);
2813 video_enc->bit_rate = video_bit_rate;
2814 video_enc->bit_rate_tolerance = video_bit_rate_tolerance;
2815 video_enc->frame_rate = frame_rate;
2816 video_enc->frame_rate_base = frame_rate_base;
2817 if(codec && codec->supported_framerates){
2818 const AVRational *p= codec->supported_framerates;
2819 AVRational req= (AVRational){frame_rate, frame_rate_base};
2820 const AVRational *best=NULL;
2821 AVRational best_error= (AVRational){INT_MAX, 1};
2822 for(; p->den!=0; p++){
2823 AVRational error= av_sub_q(req, *p);
2824 if(error.num <0) error.num *= -1;
2825 if(av_cmp_q(error, best_error) < 0){
2830 video_enc->frame_rate = best->num;
2831 video_enc->frame_rate_base= best->den;
2834 video_enc->width = frame_width + frame_padright + frame_padleft;
2835 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2836 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
2837 video_enc->pix_fmt = frame_pix_fmt;
2839 if(codec && codec->pix_fmts){
2840 const enum PixelFormat *p= codec->pix_fmts;
2842 if(*p == video_enc->pix_fmt)
2846 video_enc->pix_fmt = codec->pix_fmts[0];
2850 video_enc->gop_size = gop_size;
2852 video_enc->gop_size = 0;
2853 if (video_qscale || same_quality) {
2854 video_enc->flags |= CODEC_FLAG_QSCALE;
2855 st->quality = FF_QP2LAMBDA * video_qscale;
2859 video_enc->intra_matrix = intra_matrix;
2861 video_enc->inter_matrix = inter_matrix;
2864 video_enc->flags |= CODEC_FLAG_BITEXACT;
2866 video_enc->mb_decision = mb_decision;
2867 video_enc->mb_cmp = mb_cmp;
2868 video_enc->ildct_cmp = ildct_cmp;
2869 video_enc->me_sub_cmp = sub_cmp;
2870 video_enc->me_cmp = cmp;
2871 video_enc->me_pre_cmp = pre_cmp;
2872 video_enc->pre_me = pre_me;
2873 video_enc->lumi_masking = lumi_mask;
2874 video_enc->dark_masking = dark_mask;
2875 video_enc->spatial_cplx_masking = scplx_mask;
2876 video_enc->temporal_cplx_masking = tcplx_mask;
2877 video_enc->p_masking = p_mask;
2878 video_enc->quantizer_noise_shaping= qns;
2881 video_enc->flags |= CODEC_FLAG_H263P_UMV;
2884 video_enc->flags |= CODEC_FLAG_H263P_SLICE_STRUCT;
2887 video_enc->flags |= CODEC_FLAG_H263P_AIC;
2890 video_enc->flags |= CODEC_FLAG_H263P_AIV;
2893 video_enc->flags |= CODEC_FLAG_4MV;
2896 video_enc->flags |= CODEC_FLAG_OBMC;
2899 video_enc->flags |= CODEC_FLAG_LOOP_FILTER;
2903 video_enc->flags |= CODEC_FLAG_PART;
2906 video_enc->flags |= CODEC_FLAG_ALT_SCAN;
2909 video_enc->flags |= CODEC_FLAG_TRELLIS_QUANT;
2911 if (use_scan_offset) {
2912 video_enc->flags |= CODEC_FLAG_SVCD_SCAN_OFFSET;
2915 video_enc->flags |= CODEC_FLAG_CLOSED_GOP;
2918 video_enc->flags |= CODEC_FLAG_QPEL;
2921 video_enc->flags |= CODEC_FLAG_QP_RD;
2924 video_enc->flags |= CODEC_FLAG_CBP_RD;
2927 video_enc->max_b_frames = b_frames;
2928 video_enc->b_frame_strategy = 0;
2929 video_enc->b_quant_factor = 2.0;
2931 if (do_interlace_dct) {
2932 video_enc->flags |= CODEC_FLAG_INTERLACED_DCT;
2934 if (do_interlace_me) {
2935 video_enc->flags |= CODEC_FLAG_INTERLACED_ME;
2937 video_enc->qmin = video_qmin;
2938 video_enc->qmax = video_qmax;
2939 video_enc->lmin = video_lmin;
2940 video_enc->lmax = video_lmax;
2941 video_enc->mb_qmin = video_mb_qmin;
2942 video_enc->mb_qmax = video_mb_qmax;
2943 video_enc->max_qdiff = video_qdiff;
2944 video_enc->qblur = video_qblur;
2945 video_enc->qcompress = video_qcomp;
2946 video_enc->rc_eq = video_rc_eq;
2947 video_enc->debug = debug;
2948 video_enc->debug_mv = debug_mv;
2949 video_enc->thread_count = thread_count;
2950 p= video_rc_override_string;
2953 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
2955 fprintf(stderr, "error parsing rc_override\n");
2958 video_enc->rc_override=
2959 av_realloc(video_enc->rc_override,
2960 sizeof(RcOverride)*(i+1));
2961 video_enc->rc_override[i].start_frame= start;
2962 video_enc->rc_override[i].end_frame = end;
2964 video_enc->rc_override[i].qscale= q;
2965 video_enc->rc_override[i].quality_factor= 1.0;
2968 video_enc->rc_override[i].qscale= 0;
2969 video_enc->rc_override[i].quality_factor= -q/100.0;
2974 video_enc->rc_override_count=i;
2976 video_enc->rc_max_rate = video_rc_max_rate;
2977 video_enc->rc_min_rate = video_rc_min_rate;
2978 video_enc->rc_buffer_size = video_rc_buffer_size;
2979 video_enc->rc_buffer_aggressivity= video_rc_buffer_aggressivity;
2980 video_enc->rc_initial_cplx= video_rc_initial_cplx;
2981 video_enc->i_quant_factor = video_i_qfactor;
2982 video_enc->b_quant_factor = video_b_qfactor;
2983 video_enc->i_quant_offset = video_i_qoffset;
2984 video_enc->b_quant_offset = video_b_qoffset;
2985 video_enc->intra_quant_bias = video_intra_quant_bias;
2986 video_enc->inter_quant_bias = video_inter_quant_bias;
2987 video_enc->dct_algo = dct_algo;
2988 video_enc->idct_algo = idct_algo;
2989 video_enc->me_threshold= me_threshold;
2990 video_enc->mb_threshold= mb_threshold;
2991 video_enc->intra_dc_precision= intra_dc_precision - 8;
2992 video_enc->strict_std_compliance = strict;
2993 video_enc->error_rate = error_rate;
2994 video_enc->noise_reduction= noise_reduction;
2995 video_enc->scenechange_threshold= sc_threshold;
2996 video_enc->me_range = me_range;
2997 video_enc->coder_type= coder;
2998 video_enc->context_model= context;
2999 video_enc->prediction_method= predictor;
3002 video_enc->rtp_mode= 1;
3003 video_enc->rtp_payload_size= packet_size;
3007 video_enc->flags|= CODEC_FLAG_PSNR;
3009 video_enc->me_method = me_method;
3014 video_enc->flags |= CODEC_FLAG_PASS1;
3016 video_enc->flags |= CODEC_FLAG_PASS2;
3023 AVCodecContext *audio_enc;
3025 st = av_new_stream(oc, nb_streams++);
3027 fprintf(stderr, "Could not alloc stream\n");
3030 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
3032 avcodec_thread_init(&st->codec, thread_count);
3035 audio_enc = &st->codec;
3036 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3038 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
3039 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3040 if (audio_stream_copy) {
3041 st->stream_copy = 1;
3042 audio_enc->channels = audio_channels;
3044 codec_id = file_oformat->audio_codec;
3045 if (audio_codec_id != CODEC_ID_NONE)
3046 codec_id = audio_codec_id;
3047 audio_enc->codec_id = codec_id;
3049 audio_enc->bit_rate = audio_bit_rate;
3050 audio_enc->strict_std_compliance = strict;
3051 audio_enc->thread_count = thread_count;
3052 /* For audio codecs other than AC3 we limit */
3053 /* the number of coded channels to stereo */
3054 if (audio_channels > 2 && codec_id != CODEC_ID_AC3) {
3055 audio_enc->channels = 2;
3057 audio_enc->channels = audio_channels;
3059 audio_enc->sample_rate = audio_sample_rate;
3062 oc->nb_streams = nb_streams;
3065 fprintf(stderr, "No audio or video streams available\n");
3069 oc->timestamp = rec_timestamp;
3072 pstrcpy(oc->title, sizeof(oc->title), str_title);
3074 pstrcpy(oc->author, sizeof(oc->author), str_author);
3076 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3078 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3081 output_files[nb_output_files++] = oc;
3083 strcpy(oc->filename, filename);
3085 /* check filename in case of an image number is expected */
3086 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3087 if (filename_number_test(oc->filename) < 0) {
3088 print_error(oc->filename, AVERROR_NUMEXPECTED);
3093 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3094 /* test if it already exists to avoid loosing precious files */
3095 if (!file_overwrite &&
3096 (strchr(filename, ':') == NULL ||
3097 strstart(filename, "file:", NULL))) {
3098 if (url_exist(filename)) {
3101 if ( !using_stdin ) {
3102 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3105 if (toupper(c) != 'Y') {
3106 fprintf(stderr, "Not overwriting - exiting\n");
3111 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3118 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3119 fprintf(stderr, "Could not open '%s'\n", filename);
3124 memset(ap, 0, sizeof(*ap));
3125 ap->image_format = image_format;
3126 if (av_set_parameters(oc, ap) < 0) {
3127 fprintf(stderr, "%s: Invalid encoding parameters\n",
3132 /* reset some options */
3133 file_oformat = NULL;
3134 file_iformat = NULL;
3135 image_format = NULL;
3138 audio_codec_id = CODEC_ID_NONE;
3139 video_codec_id = CODEC_ID_NONE;
3140 audio_stream_copy = 0;
3141 video_stream_copy = 0;
3144 /* prepare dummy protocols for grab */
3145 static void prepare_grab(void)
3147 int has_video, has_audio, i, j;
3148 AVFormatContext *oc;
3149 AVFormatContext *ic;
3150 AVFormatParameters vp1, *vp = &vp1;
3151 AVFormatParameters ap1, *ap = &ap1;
3153 /* see if audio/video inputs are needed */
3156 memset(ap, 0, sizeof(*ap));
3157 memset(vp, 0, sizeof(*vp));
3158 for(j=0;j<nb_output_files;j++) {
3159 oc = output_files[j];
3160 for(i=0;i<oc->nb_streams;i++) {
3161 AVCodecContext *enc = &oc->streams[i]->codec;
3162 switch(enc->codec_type) {
3163 case CODEC_TYPE_AUDIO:
3164 if (enc->sample_rate > ap->sample_rate)
3165 ap->sample_rate = enc->sample_rate;
3166 if (enc->channels > ap->channels)
3167 ap->channels = enc->channels;
3170 case CODEC_TYPE_VIDEO:
3171 if (enc->width > vp->width)
3172 vp->width = enc->width;
3173 if (enc->height > vp->height)
3174 vp->height = enc->height;
3176 assert(enc->frame_rate_base == DEFAULT_FRAME_RATE_BASE);
3177 if (enc->frame_rate > vp->frame_rate){
3178 vp->frame_rate = enc->frame_rate;
3179 vp->frame_rate_base = enc->frame_rate_base;
3189 if (has_video == 0 && has_audio == 0) {
3190 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3195 AVInputFormat *fmt1;
3196 fmt1 = av_find_input_format(video_grab_format);
3197 vp->device = video_device;
3198 vp->channel = video_channel;
3199 vp->standard = video_standard;
3200 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3201 fprintf(stderr, "Could not find video grab device\n");
3204 /* If not enough info to get the stream parameters, we decode the
3205 first frames to get it. */
3206 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3207 fprintf(stderr, "Could not find video grab parameters\n");
3210 /* by now video grab has one stream */
3211 ic->streams[0]->r_frame_rate = vp->frame_rate;
3212 ic->streams[0]->r_frame_rate_base = vp->frame_rate_base;
3213 input_files[nb_input_files] = ic;
3216 dump_format(ic, nb_input_files, "", 0);
3220 if (has_audio && audio_grab_format) {
3221 AVInputFormat *fmt1;
3222 fmt1 = av_find_input_format(audio_grab_format);
3223 ap->device = audio_device;
3224 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3225 fprintf(stderr, "Could not find audio grab device\n");
3228 input_files[nb_input_files] = ic;
3231 dump_format(ic, nb_input_files, "", 0);
3237 /* same option as mencoder */
3238 static void opt_pass(const char *pass_str)
3241 pass = atoi(pass_str);
3242 if (pass != 1 && pass != 2) {
3243 fprintf(stderr, "pass number can be only 1 or 2\n");
3249 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3250 static int64_t getutime(void)
3252 return av_gettime();
3255 static int64_t getutime(void)
3257 struct rusage rusage;
3259 getrusage(RUSAGE_SELF, &rusage);
3260 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3264 extern int ffm_nopts;
3266 static void opt_bitexact(void)
3269 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3273 static void show_formats(void)
3275 AVInputFormat *ifmt;
3276 AVOutputFormat *ofmt;
3277 AVImageFormat *image_fmt;
3280 const char **pp, *last_name;
3282 printf("File formats:\n");
3287 const char *name=NULL;
3289 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3290 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3291 strcmp(ofmt->name, last_name)>0){
3296 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3297 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3298 strcmp(ifmt->name, last_name)>0){
3302 if(name && strcmp(ifmt->name, name)==0)
3317 printf("Image formats:\n");
3318 for(image_fmt = first_image_format; image_fmt != NULL;
3319 image_fmt = image_fmt->next) {
3322 image_fmt->img_read ? "D":" ",
3323 image_fmt->img_write ? "E":" ",
3328 printf("Codecs:\n");
3336 for(p = first_avcodec; p != NULL; p = p->next) {
3337 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3338 strcmp(p->name, last_name)>0){
3340 decode= encode= cap=0;
3342 if(p2 && strcmp(p->name, p2->name)==0){
3343 if(p->decode) decode=1;
3344 if(p->encode) encode=1;
3345 cap |= p->capabilities;
3350 last_name= p2->name;
3354 decode ? "D": (/*p2->decoder ? "d":*/" "),
3356 p2->type == CODEC_TYPE_AUDIO ? "A":"V",
3357 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3358 cap & CODEC_CAP_DR1 ? "D":" ",
3359 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3361 /* if(p2->decoder && decode==0)
3362 printf(" use %s for decoding", p2->decoder->name);*/
3367 printf("Supported file protocols:\n");
3368 for(up = first_protocol; up != NULL; up = up->next)
3369 printf(" %s:", up->name);
3372 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3373 printf("Motion estimation methods:\n");
3377 if ((pp - motion_str + 1) == ME_ZERO)
3378 printf("(fastest)");
3379 else if ((pp - motion_str + 1) == ME_FULL)
3380 printf("(slowest)");
3381 else if ((pp - motion_str + 1) == ME_EPZS)
3382 printf("(default)");
3387 "Note, the names of encoders and decoders dont always match, so there are\n"
3388 "several cases where the above table shows encoder only or decoder only entries\n"
3389 "even though both encoding and decoding are supported for example, the h263\n"
3390 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3395 void parse_matrix_coeffs(uint16_t *dest, const char *str)
3398 const char *p = str;
3405 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3412 void opt_inter_matrix(const char *arg)
3414 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3415 parse_matrix_coeffs(inter_matrix, arg);
3418 void opt_intra_matrix(const char *arg)
3420 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3421 parse_matrix_coeffs(intra_matrix, arg);
3424 static void opt_target(const char *arg)
3428 if(!strncmp(arg, "pal-", 4)) {
3431 } else if(!strncmp(arg, "ntsc-", 5)) {
3436 /* Calculate FR via float to avoid int overflow */
3437 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3440 } else if((fr == 29970) || (fr == 23976)) {
3443 /* Try to determine PAL/NTSC by peeking in the input files */
3444 if(nb_input_files) {
3446 for(j = 0; j < nb_input_files; j++) {
3447 for(i = 0; i < input_files[j]->nb_streams; i++) {
3448 AVCodecContext *c = &input_files[j]->streams[i]->codec;
3449 if(c->codec_type != CODEC_TYPE_VIDEO)
3451 fr = c->frame_rate * 1000 / c->frame_rate_base;
3455 } else if((fr == 29970) || (fr == 23976)) {
3465 if(verbose && norm >= 0)
3466 printf("Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3470 fprintf(stderr, "Could not determine norm (PAL/NTSC) for target.\n");
3471 fprintf(stderr, "Please prefix target with \"pal-\" or \"ntsc-\",\n");
3472 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3476 if(!strcmp(arg, "vcd")) {
3478 opt_video_codec("mpeg1video");
3479 opt_audio_codec("mp2");
3482 opt_frame_size(norm ? "352x240" : "352x288");
3484 video_bit_rate = 1150000;
3485 video_rc_max_rate = 1150000;
3486 video_rc_min_rate = 1150000;
3487 video_rc_buffer_size = 40*1024*8;
3489 audio_bit_rate = 224000;
3490 audio_sample_rate = 44100;
3492 } else if(!strcmp(arg, "svcd")) {
3494 opt_video_codec("mpeg2video");
3495 opt_audio_codec("mp2");
3498 opt_frame_size(norm ? "480x480" : "480x576");
3499 opt_gop_size(norm ? "18" : "15");
3501 video_bit_rate = 2040000;
3502 video_rc_max_rate = 2516000;
3503 video_rc_min_rate = 0; //1145000;
3504 video_rc_buffer_size = 224*1024*8;
3505 use_scan_offset = 1;
3507 audio_bit_rate = 224000;
3508 audio_sample_rate = 44100;
3510 } else if(!strcmp(arg, "dvd")) {
3512 opt_video_codec("mpeg2video");
3513 opt_audio_codec("ac3");
3516 opt_frame_size(norm ? "720x480" : "720x576");
3517 opt_gop_size(norm ? "18" : "15");
3519 video_bit_rate = 6000000;
3520 video_rc_max_rate = 9000000;
3521 video_rc_min_rate = 0; //1500000;
3522 video_rc_buffer_size = 224*1024*8;
3524 audio_bit_rate = 448000;
3525 audio_sample_rate = 48000;
3528 fprintf(stderr, "Unknown target: %s\n", arg);
3533 static void show_version(void)
3535 printf("ffmpeg " FFMPEG_VERSION "\n"
3538 avcodec_build(), LIBAVFORMAT_BUILD);
3542 const OptionDef options[] = {
3544 { "L", 0, {(void*)show_license}, "show license" },
3545 { "h", 0, {(void*)show_help}, "show help" },
3546 { "version", 0, {(void*)show_version}, "show version" },
3547 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3548 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3549 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
3550 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3551 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3552 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream" },
3553 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3554 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3555 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3556 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3557 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3558 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3559 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3560 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3561 { "debug", HAS_ARG | OPT_EXPERT, {(void*)opt_debug}, "print specific debug info", "" },
3562 { "vismv", HAS_ARG | OPT_EXPERT, {(void*)opt_vismv}, "visualize motion vectors", "" },
3563 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3564 "add timings for benchmarking" },
3565 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3566 "dump each input packet" },
3567 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3568 "when dumping packets, also dump the payload" },
3569 { "bitexact", OPT_EXPERT, {(void*)opt_bitexact}, "only use bit exact algorithms (for codec testing)" },
3570 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3571 { "loop", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3572 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3573 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\" or \"dvd\")", "type" },
3574 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3575 { "sync", HAS_ARG | OPT_EXPERT, {(void*)opt_sync_method}, "sync method", "" },
3576 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3579 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
3580 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3581 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3582 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3583 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3584 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3585 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3586 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3587 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3588 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3589 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3590 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3591 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3592 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3593 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
3594 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3595 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3596 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
3597 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
3598 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
3599 { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
3600 { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
3601 { "mbqmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmin}, "min macroblock quantiser scale (VBR)", "q" },
3602 { "mbqmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmax}, "max macroblock quantiser scale (VBR)", "q" },
3603 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
3604 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
3605 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
3606 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
3607 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
3608 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
3609 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
3610 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
3611 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
3612 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
3613 // { "b_strategy", HAS_ARG | OPT_EXPERT, {(void*)opt_b_strategy}, "dynamic b frame selection strategy", "strategy" },
3614 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3615 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3616 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
3617 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
3618 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
3619 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffere size (in kByte)", "size" },
3620 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3621 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
3623 { "dct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dct_algo}, "set dct algo", "algo" },
3624 { "idct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_idct_algo}, "set idct algo", "algo" },
3625 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
3626 { "mb_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_threshold}, "macroblock threshold", "" },
3627 { "er", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_resilience}, "set error resilience", "n" },
3628 { "ec", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_concealment}, "set error concealment", "bit_mask" },
3629 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
3630 { "hq", OPT_BOOL, {(void*)&mb_decision}, "activate high quality settings" },
3631 { "mbd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_decision}, "macroblock decision", "mode" },
3632 { "mbcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_cmp}, "macroblock compare function", "cmp function" },
3633 { "ildctcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ildct_cmp}, "ildct compare function", "cmp function" },
3634 { "subcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sub_cmp}, "subpel compare function", "cmp function" },
3635 { "cmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_cmp}, "fullpel compare function", "cmp function" },
3636 { "precmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_cmp}, "pre motion estimation compare function", "cmp function" },
3637 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
3638 { "lumi_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lumi_mask}, "luminance masking", "" },
3639 { "dark_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dark_mask}, "darkness masking", "" },
3640 { "scplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_scplx_mask}, "spatial complexity masking", "" },
3641 { "tcplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_tcplx_mask}, "teporal complexity masking", "" },
3642 { "p_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_p_mask}, "inter masking", "" },
3643 { "4mv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_4mv}, "use four motion vector by macroblock (MPEG4)" },
3644 { "obmc", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_obmc}, "use overlapped block motion compensation (h263+)" },
3645 { "lf", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_loop}, "use loop filter (h263+)" },
3646 { "part", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_part}, "use data partitioning (MPEG4)" },
3647 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
3648 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
3649 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
3650 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3651 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3652 "use same video quality as source (implies VBR)" },
3653 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3654 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3655 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3656 "deinterlace pictures" },
3657 { "ildct", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_dct},
3658 "force interlaced dct support in encoder (MPEG2/MPEG4)" },
3659 { "ilme", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_me},
3660 "force interlaced me support in encoder (MPEG2/MPEG4)" },
3661 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3662 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
3663 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3664 { "aic", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aic}, "enable Advanced intra coding (h263+)" },
3665 { "aiv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aiv}, "enable Alternative inter vlc (h263+)" },
3666 { "umv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_umv}, "enable Unlimited Motion Vector (h263+)" },
3667 { "ssm", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_ss}, "enable Slice Structured mode (h263+)" },
3668 { "alt", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_alt_scan}, "enable alternate scantable (MPEG2/MPEG4)" },
3669 { "qprd", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qprd}, "" },
3670 { "cbp", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_cbprd}, "" },
3671 { "trell", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_trell}, "enable trellis quantization" },
3672 { "cgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&closed_gop}, "closed gop" },
3673 { "scan_offset", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_scan_offset}, "enable SVCD Scan Offset placeholder" },
3674 { "qpel", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qpel}, "enable 1/4-pel" },
3675 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3676 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3677 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3678 { "nr", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_noise_reduction}, "noise reduction", "" },
3679 { "qns", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qns}, "quantization noise shaping", "" },
3680 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
3681 { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
3682 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3683 { "coder", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&coder}, "coder type", "" },
3684 { "context", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&context}, "context model", "" },
3685 { "pred", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&predictor}, "prediction method", "" },
3688 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
3689 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3690 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3691 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3692 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3695 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
3696 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3697 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3698 { "dv1394", OPT_EXPERT | OPT_GRAB, {(void*)opt_dv1394}, "set DV1394 grab", "" },
3699 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
3703 static void show_banner(void)
3705 printf("ffmpeg version " FFMPEG_VERSION ", Copyright (c) 2000-2003 Fabrice Bellard\n");
3708 static void show_license(void)
3713 "This program is free software; you can redistribute it and/or modify\n"
3714 "it under the terms of the GNU General Public License as published by\n"
3715 "the Free Software Foundation; either version 2 of the License, or\n"
3716 "(at your option) any later version.\n"
3718 "This program is distributed in the hope that it will be useful,\n"
3719 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3720 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
3721 "GNU General Public License for more details.\n"
3723 "You should have received a copy of the GNU General Public License\n"
3724 "along with this program; if not, write to the Free Software\n"
3725 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3729 "This library is free software; you can redistribute it and/or\n"
3730 "modify it under the terms of the GNU Lesser General Public\n"
3731 "License as published by the Free Software Foundation; either\n"
3732 "version 2 of the License, or (at your option) any later version.\n"
3734 "This library is distributed in the hope that it will be useful,\n"
3735 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3736 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
3737 "Lesser General Public License for more details.\n"
3739 "You should have received a copy of the GNU Lesser General Public\n"
3740 "License along with this library; if not, write to the Free Software\n"
3741 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3747 static void show_help(void)
3750 printf("usage: ffmpeg [[options] -i input_file]... {[options] outfile}...\n"
3751 "Hyper fast Audio and Video encoder\n");
3753 show_help_options(options, "Main options:\n",
3754 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
3755 show_help_options(options, "\nVideo options:\n",
3756 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3758 show_help_options(options, "\nAdvanced Video options:\n",
3759 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3760 OPT_VIDEO | OPT_EXPERT);
3761 show_help_options(options, "\nAudio options:\n",
3762 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3764 show_help_options(options, "\nAdvanced Audio options:\n",
3765 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3766 OPT_AUDIO | OPT_EXPERT);
3767 show_help_options(options, "\nAudio/Video grab options:\n",
3770 show_help_options(options, "\nAdvanced options:\n",
3771 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3776 void parse_arg_file(const char *filename)
3778 opt_output_file(filename);
3781 int main(int argc, char **argv)
3792 parse_options(argc, argv, options);
3794 /* file converter / grab */
3795 if (nb_output_files <= 0) {
3796 fprintf(stderr, "Must supply at least one output file\n");
3800 if (nb_input_files == 0) {
3806 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3807 stream_maps, nb_stream_maps);
3808 ti = getutime() - ti;
3810 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3814 for(i=0;i<nb_output_files;i++) {
3815 /* maybe av_close_output_file ??? */
3816 AVFormatContext *s = output_files[i];
3818 if (!(s->oformat->flags & AVFMT_NOFILE))
3820 for(j=0;j<s->nb_streams;j++)
3821 av_free(s->streams[j]);
3824 for(i=0;i<nb_input_files;i++)
3825 av_close_input_file(input_files[i]);
3830 av_free(intra_matrix);
3832 av_free(inter_matrix);
3834 #ifdef POWERPC_PERFORMANCE_REPORT
3835 extern void powerpc_display_perf_report(void);
3836 powerpc_display_perf_report();
3837 #endif /* POWERPC_PERFORMANCE_REPORT */
3839 #ifndef CONFIG_WIN32
3840 if (received_sigterm) {
3842 "Received signal %d: terminating.\n",
3843 (int) received_sigterm);
3847 exit(0); /* not all OS-es handle main() return value */