3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #define HAVE_AV_CONFIG_H
22 #include "framehook.h"
28 #include <sys/ioctl.h>
31 #include <sys/resource.h>
35 #include <sys/types.h>
36 #include <sys/select.h>
39 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
47 #if !defined(INFINITY) && defined(HUGE_VAL)
48 #define INFINITY HUGE_VAL
51 /* select an input stream for an output stream */
52 typedef struct AVStreamMap {
57 /** select an input file for an output file */
58 typedef struct AVMetaDataMap {
63 extern const OptionDef options[];
65 static void show_help(void);
66 static void show_license(void);
70 static AVFormatContext *input_files[MAX_FILES];
71 static int64_t input_files_ts_offset[MAX_FILES];
72 static int nb_input_files = 0;
74 static AVFormatContext *output_files[MAX_FILES];
75 static int nb_output_files = 0;
77 static AVStreamMap stream_maps[MAX_FILES];
78 static int nb_stream_maps;
80 static AVMetaDataMap meta_data_maps[MAX_FILES];
81 static int nb_meta_data_maps;
83 static AVInputFormat *file_iformat;
84 static AVOutputFormat *file_oformat;
85 static AVImageFormat *image_format;
86 static int frame_width = 0;
87 static int frame_height = 0;
88 static float frame_aspect_ratio = 0;
89 static enum PixelFormat frame_pix_fmt = PIX_FMT_YUV420P;
90 static int frame_padtop = 0;
91 static int frame_padbottom = 0;
92 static int frame_padleft = 0;
93 static int frame_padright = 0;
94 static int padcolor[3] = {16,128,128}; /* default to black */
95 static int frame_topBand = 0;
96 static int frame_bottomBand = 0;
97 static int frame_leftBand = 0;
98 static int frame_rightBand = 0;
99 static int max_frames[3] = {INT_MAX, INT_MAX, INT_MAX};
100 static int frame_rate = 25;
101 static int frame_rate_base = 1;
102 static int video_bit_rate = 200*1000;
103 static int video_bit_rate_tolerance = 4000*1000;
104 static float video_qscale = 0;
105 static int video_qmin = 2;
106 static int video_qmax = 31;
107 static int video_lmin = 2*FF_QP2LAMBDA;
108 static int video_lmax = 31*FF_QP2LAMBDA;
109 static int video_mb_lmin = 2*FF_QP2LAMBDA;
110 static int video_mb_lmax = 31*FF_QP2LAMBDA;
111 static int video_qdiff = 3;
112 static int video_lelim = 0;
113 static int video_celim = 0;
114 static float video_qblur = 0.5;
115 static float video_qsquish = 0.0;
116 static float video_qcomp = 0.5;
117 static uint16_t *intra_matrix = NULL;
118 static uint16_t *inter_matrix = NULL;
119 #if 0 //experimental, (can be removed)
120 static float video_rc_qsquish=1.0;
121 static float video_rc_qmod_amp=0;
122 static int video_rc_qmod_freq=0;
124 static char *video_rc_override_string=NULL;
125 static char *video_rc_eq="tex^qComp";
126 static int video_rc_buffer_size=0;
127 static float video_rc_buffer_aggressivity=1.0;
128 static int video_rc_max_rate=0;
129 static int video_rc_min_rate=0;
130 static float video_rc_initial_cplx=0;
131 static float video_b_qfactor = 1.25;
132 static float video_b_qoffset = 1.25;
133 static float video_i_qfactor = -0.8;
134 static float video_i_qoffset = 0.0;
135 static int video_intra_quant_bias= FF_DEFAULT_QUANT_BIAS;
136 static int video_inter_quant_bias= FF_DEFAULT_QUANT_BIAS;
137 static int me_method = ME_EPZS;
138 static int video_disable = 0;
139 static int video_discard = 0;
140 static int video_codec_id = CODEC_ID_NONE;
141 static int video_codec_tag = 0;
142 static int same_quality = 0;
143 static int b_frames = 0;
144 static int mb_decision = FF_MB_DECISION_SIMPLE;
145 static int ildct_cmp = FF_CMP_VSAD;
146 static int mb_cmp = FF_CMP_SAD;
147 static int sub_cmp = FF_CMP_SAD;
148 static int cmp = FF_CMP_SAD;
149 static int pre_cmp = FF_CMP_SAD;
150 static int pre_me = 0;
151 static float lumi_mask = 0;
152 static float dark_mask = 0;
153 static float scplx_mask = 0;
154 static float tcplx_mask = 0;
155 static float p_mask = 0;
156 static int use_4mv = 0;
157 static int use_obmc = 0;
158 static int use_loop = 0;
159 static int use_aic = 0;
160 static int use_aiv = 0;
161 static int use_umv = 0;
162 static int use_ss = 0;
163 static int use_alt_scan = 0;
164 static int use_trell = 0;
165 static int use_scan_offset = 0;
166 static int use_qpel = 0;
167 static int use_qprd = 0;
168 static int use_cbprd = 0;
169 static int use_mv0 = 0;
170 static int do_normalize_aqp = 0;
172 static int closed_gop = 0;
173 static int strict_gop = 0;
174 static int no_output = 0;
175 static int do_deinterlace = 0;
176 static int do_interlace_dct = 0;
177 static int do_interlace_me = 0;
178 static int workaround_bugs = FF_BUG_AUTODETECT;
179 static int error_resilience = 2;
180 static int error_concealment = 3;
181 static int dct_algo = 0;
182 static int idct_algo = 0;
183 static int use_part = 0;
184 static int packet_size = 0;
185 static int error_rate = 0;
186 static int strict = 0;
187 static int top_field_first = -1;
188 static int noise_reduction = 0;
189 static int sc_threshold = 0;
190 static int debug = 0;
191 static int debug_mv = 0;
192 static int me_threshold = 0;
193 static int mb_threshold = 0;
194 static int intra_dc_precision = 8;
195 static int coder = 0;
196 static int context = 0;
197 static int predictor = 0;
198 static int video_profile = FF_PROFILE_UNKNOWN;
199 static int video_level = FF_LEVEL_UNKNOWN;
200 static int nsse_weight = 8;
201 static int subpel_quality= 8;
202 static int lowres= 0;
203 static int frame_skip_threshold= 0;
204 static int frame_skip_factor= 0;
205 static int frame_skip_exp= 0;
206 static int frame_skip_cmp= FF_CMP_DCTMAX;
207 extern int loop_input; /* currently a hack */
209 static int gop_size = 12;
210 static int intra_only = 0;
211 static int audio_sample_rate = 44100;
212 static int audio_bit_rate = 64000;
213 static int audio_disable = 0;
214 static int audio_channels = 1;
215 static int audio_codec_id = CODEC_ID_NONE;
216 static int audio_codec_tag = 0;
218 static int mux_rate= 0;
219 static int mux_packet_size= 0;
220 static float mux_preload= 0.5;
221 static float mux_max_delay= 0.7;
223 static int64_t recording_time = 0;
224 static int64_t start_time = 0;
225 static int64_t rec_timestamp = 0;
226 static int64_t input_ts_offset = 0;
227 static int file_overwrite = 0;
228 static char *str_title = NULL;
229 static char *str_author = NULL;
230 static char *str_copyright = NULL;
231 static char *str_comment = NULL;
232 static int do_benchmark = 0;
233 static int do_hex_dump = 0;
234 static int do_pkt_dump = 0;
235 static int do_psnr = 0;
236 static int do_vstats = 0;
237 static int do_pass = 0;
238 static int bitexact = 0;
239 static char *pass_logfilename = NULL;
240 static int audio_stream_copy = 0;
241 static int video_stream_copy = 0;
242 static int video_sync_method= 1;
243 static int audio_sync_method= 0;
244 static int copy_ts= 0;
246 static int rate_emu = 0;
248 static char *video_grab_format = "video4linux";
249 static char *video_device = NULL;
250 static char *grab_device = NULL;
251 static int video_channel = 0;
252 static char *video_standard = "ntsc";
254 static char *audio_grab_format = "audio_device";
255 static char *audio_device = NULL;
257 static int using_stdin = 0;
258 static int using_vhook = 0;
259 static int verbose = 1;
260 static int thread_count= 1;
261 static int q_pressed = 0;
262 static int me_range = 0;
263 static int64_t video_size = 0;
264 static int64_t audio_size = 0;
265 static int64_t extra_size = 0;
266 static int nb_frames_dup = 0;
267 static int nb_frames_drop = 0;
268 static int input_sync;
270 static int pgmyuv_compatibility_hack=0;
273 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
275 typedef struct AVOutputStream {
276 int file_index; /* file index */
277 int index; /* stream index in the output file */
278 int source_index; /* AVInputStream index */
279 AVStream *st; /* stream in the output file */
280 int encoding_needed; /* true if encoding needed for this stream */
282 /* input pts and corresponding output pts
284 double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
285 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
287 int video_resample; /* video_resample and video_crop are mutually exclusive */
288 AVFrame pict_tmp; /* temporary image for resampling */
289 ImgReSampleContext *img_resample_ctx; /* for image resampling */
291 int video_crop; /* video_resample and video_crop are mutually exclusive */
292 int topBand; /* cropping area sizes */
295 int video_pad; /* video_resample and video_pad are mutually exclusive */
296 int padtop; /* padding area sizes */
303 ReSampleContext *resample; /* for audio resampling */
304 FifoBuffer fifo; /* for compression: one audio fifo per codec */
308 typedef struct AVInputStream {
312 int discard; /* true if stream data should be discarded */
313 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
314 int64_t sample_index; /* current sample */
316 int64_t start; /* time when read started */
317 unsigned long frame; /* current frame */
318 int64_t next_pts; /* synthetic pts for cases where pkt.pts
320 int64_t pts; /* current pts */
321 int is_start; /* is 1 at the start and after a discontinuity */
324 typedef struct AVInputFile {
325 int eof_reached; /* true if eof reached */
326 int ist_index; /* index of first stream in ist_table */
327 int buffer_size; /* current total buffer size */
328 int buffer_size_max; /* buffer size at which we consider we can stop
330 int nb_streams; /* nb streams we are aware of */
335 /* init terminal so that we can grab keys */
336 static struct termios oldtty;
338 static void term_exit(void)
340 tcsetattr (0, TCSANOW, &oldtty);
343 static volatile sig_atomic_t received_sigterm = 0;
346 sigterm_handler(int sig)
348 received_sigterm = sig;
352 static void term_init(void)
359 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
360 |INLCR|IGNCR|ICRNL|IXON);
361 tty.c_oflag |= OPOST;
362 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
363 tty.c_cflag &= ~(CSIZE|PARENB);
368 tcsetattr (0, TCSANOW, &tty);
370 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
371 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
372 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
374 register a function to be called at normal program termination
377 #ifdef CONFIG_BEOS_NETSERVER
378 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
382 /* read a key without blocking */
383 static int read_key(void)
387 #ifndef CONFIG_BEOS_NETSERVER
395 n = select(1, &rfds, NULL, NULL, &tv);
407 static int decode_interrupt_cb(void)
409 return q_pressed || (q_pressed = read_key() == 'q');
414 static volatile int received_sigterm = 0;
416 /* no interactive support */
417 static void term_exit(void)
421 static void term_init(void)
425 static int read_key(void)
432 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
437 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
440 /* copy stream format */
441 s->nb_streams = ic->nb_streams;
442 for(i=0;i<ic->nb_streams;i++) {
445 st = av_mallocz(sizeof(AVStream));
446 memcpy(st, ic->streams[i], sizeof(AVStream));
450 av_close_input_file(ic);
454 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
456 static void do_audio_out(AVFormatContext *s,
459 unsigned char *buf, int size)
462 static uint8_t *audio_buf = NULL;
463 static uint8_t *audio_out = NULL;
464 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
466 int size_out, frame_bytes, ret;
467 AVCodecContext *enc= &ost->st->codec;
469 /* SC: dynamic allocation of buffers */
471 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
473 audio_out = av_malloc(audio_out_size);
474 if (!audio_buf || !audio_out)
475 return; /* Should signal an error ! */
477 if(audio_sync_method){
478 double delta = ost->sync_ipts * enc->sample_rate - ost->sync_opts
479 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2);
480 double idelta= delta*ist->st->codec.sample_rate / enc->sample_rate;
481 int byte_delta= ((int)idelta)*2*ist->st->codec.channels;
483 //FIXME resample delay
484 if(fabs(delta) > 50){
487 byte_delta= FFMAX(byte_delta, -size);
491 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
496 static uint8_t *input_tmp= NULL;
497 input_tmp= av_realloc(input_tmp, byte_delta + size);
499 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
502 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
504 memset(input_tmp, 0, byte_delta);
505 memcpy(input_tmp + byte_delta, buf, size);
509 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
511 }else if(audio_sync_method>1){
512 int comp= clip(delta, -audio_sync_method, audio_sync_method);
513 assert(ost->audio_resample);
515 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
516 // fprintf(stderr, "drift:%f len:%d opts:%lld ipts:%lld fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(ost->sync_ipts * enc->sample_rate), fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2));
517 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
521 ost->sync_opts= lrintf(ost->sync_ipts * enc->sample_rate)
522 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2); //FIXME wrong
524 if (ost->audio_resample) {
526 size_out = audio_resample(ost->resample,
527 (short *)buftmp, (short *)buf,
528 size / (ist->st->codec.channels * 2));
529 size_out = size_out * enc->channels * 2;
535 /* now encode as many frames as possible */
536 if (enc->frame_size > 1) {
537 /* output resampled raw samples */
538 fifo_write(&ost->fifo, buftmp, size_out,
541 frame_bytes = enc->frame_size * 2 * enc->channels;
543 while (fifo_read(&ost->fifo, audio_buf, frame_bytes,
544 &ost->fifo.rptr) == 0) {
546 av_init_packet(&pkt);
548 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
551 pkt.stream_index= ost->index;
555 pkt.pts= enc->coded_frame->pts;
556 pkt.flags |= PKT_FLAG_KEY;
557 av_interleaved_write_frame(s, &pkt);
559 ost->sync_opts += enc->frame_size;
563 av_init_packet(&pkt);
565 ost->sync_opts += size_out / (2 * enc->channels);
567 /* output a pcm frame */
568 /* XXX: change encoding codec API to avoid this ? */
569 switch(enc->codec->id) {
570 case CODEC_ID_PCM_S16LE:
571 case CODEC_ID_PCM_S16BE:
572 case CODEC_ID_PCM_U16LE:
573 case CODEC_ID_PCM_U16BE:
576 size_out = size_out >> 1;
579 ret = avcodec_encode_audio(enc, audio_out, size_out,
582 pkt.stream_index= ost->index;
586 pkt.pts= enc->coded_frame->pts;
587 pkt.flags |= PKT_FLAG_KEY;
588 av_interleaved_write_frame(s, &pkt);
592 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
596 AVPicture picture_tmp;
599 dec = &ist->st->codec;
601 /* deinterlace : must be done before any resize */
602 if (do_deinterlace || using_vhook) {
605 /* create temporary picture */
606 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
607 buf = av_malloc(size);
611 picture2 = &picture_tmp;
612 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
615 if(avpicture_deinterlace(picture2, picture,
616 dec->pix_fmt, dec->width, dec->height) < 0) {
617 /* if error, do not deinterlace */
623 if (img_convert(picture2, dec->pix_fmt, picture,
624 dec->pix_fmt, dec->width, dec->height) < 0) {
625 /* if error, do not copy */
635 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
637 if (picture != picture2)
638 *picture = *picture2;
642 /* we begin to correct av delay at this threshold */
643 #define AV_DELAY_MAX 0.100
646 /* Expects img to be yuv420 */
647 static void fill_pad_region(AVPicture* img, int height, int width,
648 int padtop, int padbottom, int padleft, int padright, int *color) {
653 for (i = 0; i < 3; i++) {
654 shift = (i == 0) ? 0 : 1;
656 if (padtop || padleft) {
657 memset(img->data[i], color[i], (((img->linesize[i] * padtop) +
661 if (padleft || padright) {
662 optr = img->data[i] + (img->linesize[i] * (padtop >> shift)) +
663 (img->linesize[i] - (padright >> shift));
665 for (y = 0; y < ((height - (padtop + padbottom) - 1) >> shift); y++) {
666 memset(optr, color[i], (padleft + padright) >> shift);
667 optr += img->linesize[i];
671 if (padbottom || padright) {
672 optr = img->data[i] + (((img->linesize[i] * (height - padbottom)) - padright) >> shift);
673 memset(optr, color[i], (((img->linesize[i] * padbottom) + padright) >> shift));
678 static int bit_buffer_size= 1024*256;
679 static uint8_t *bit_buffer= NULL;
681 static void do_video_out(AVFormatContext *s,
687 int nb_frames, i, ret;
688 AVFrame *final_picture, *formatted_picture;
689 AVFrame picture_format_temp, picture_crop_temp;
690 uint8_t *buf = NULL, *buf1 = NULL;
691 AVCodecContext *enc, *dec;
692 enum PixelFormat target_pixfmt;
694 avcodec_get_frame_defaults(&picture_format_temp);
695 avcodec_get_frame_defaults(&picture_crop_temp);
697 enc = &ost->st->codec;
698 dec = &ist->st->codec;
700 /* by default, we output a single frame */
705 if(video_sync_method){
707 vdelta = ost->sync_ipts * enc->frame_rate / enc->frame_rate_base - ost->sync_opts;
708 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
711 else if (vdelta > 1.1)
712 nb_frames = lrintf(vdelta);
713 //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);
717 fprintf(stderr, "*** drop!\n");
718 }else if (nb_frames > 1) {
719 nb_frames_dup += nb_frames;
721 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
724 ost->sync_opts= lrintf(ost->sync_ipts * enc->frame_rate / enc->frame_rate_base);
726 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
730 /* convert pixel format if needed */
731 target_pixfmt = ost->video_resample || ost->video_pad
732 ? PIX_FMT_YUV420P : enc->pix_fmt;
733 if (dec->pix_fmt != target_pixfmt) {
736 /* create temporary picture */
737 size = avpicture_get_size(target_pixfmt, dec->width, dec->height);
738 buf = av_malloc(size);
741 formatted_picture = &picture_format_temp;
742 avpicture_fill((AVPicture*)formatted_picture, buf, target_pixfmt, dec->width, dec->height);
744 if (img_convert((AVPicture*)formatted_picture, target_pixfmt,
745 (AVPicture *)in_picture, dec->pix_fmt,
746 dec->width, dec->height) < 0) {
749 fprintf(stderr, "pixel format conversion not handled\n");
754 formatted_picture = in_picture;
757 /* XXX: resampling could be done before raw format conversion in
758 some cases to go faster */
759 /* XXX: only works for YUV420P */
760 if (ost->video_resample) {
761 final_picture = &ost->pict_tmp;
762 img_resample(ost->img_resample_ctx, (AVPicture*)final_picture, (AVPicture*)formatted_picture);
764 if (ost->padtop || ost->padbottom || ost->padleft || ost->padright) {
765 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
766 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
770 if (enc->pix_fmt != PIX_FMT_YUV420P) {
774 /* create temporary picture */
775 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
776 buf = av_malloc(size);
779 final_picture = &picture_format_temp;
780 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
782 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
783 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
784 enc->width, enc->height) < 0) {
787 fprintf(stderr, "pixel format conversion not handled\n");
792 } else if (ost->video_crop) {
793 picture_crop_temp.data[0] = formatted_picture->data[0] +
794 (ost->topBand * formatted_picture->linesize[0]) + ost->leftBand;
796 picture_crop_temp.data[1] = formatted_picture->data[1] +
797 ((ost->topBand >> 1) * formatted_picture->linesize[1]) +
798 (ost->leftBand >> 1);
800 picture_crop_temp.data[2] = formatted_picture->data[2] +
801 ((ost->topBand >> 1) * formatted_picture->linesize[2]) +
802 (ost->leftBand >> 1);
804 picture_crop_temp.linesize[0] = formatted_picture->linesize[0];
805 picture_crop_temp.linesize[1] = formatted_picture->linesize[1];
806 picture_crop_temp.linesize[2] = formatted_picture->linesize[2];
807 final_picture = &picture_crop_temp;
808 } else if (ost->video_pad) {
809 final_picture = &ost->pict_tmp;
811 for (i = 0; i < 3; i++) {
812 uint8_t *optr, *iptr;
813 int shift = (i == 0) ? 0 : 1;
816 /* set offset to start writing image into */
817 optr = final_picture->data[i] + (((final_picture->linesize[i] *
818 ost->padtop) + ost->padleft) >> shift);
819 iptr = formatted_picture->data[i];
821 yheight = (enc->height - ost->padtop - ost->padbottom) >> shift;
822 for (y = 0; y < yheight; y++) {
823 /* copy unpadded image row into padded image row */
824 memcpy(optr, iptr, formatted_picture->linesize[i]);
825 optr += final_picture->linesize[i];
826 iptr += formatted_picture->linesize[i];
830 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
831 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
834 if (enc->pix_fmt != PIX_FMT_YUV420P) {
838 /* create temporary picture */
839 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
840 buf = av_malloc(size);
843 final_picture = &picture_format_temp;
844 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
846 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
847 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
848 enc->width, enc->height) < 0) {
851 fprintf(stderr, "pixel format conversion not handled\n");
857 final_picture = formatted_picture;
859 /* duplicates frame if needed */
860 for(i=0;i<nb_frames;i++) {
862 av_init_packet(&pkt);
863 pkt.stream_index= ost->index;
865 if (s->oformat->flags & AVFMT_RAWPICTURE) {
866 /* raw pictures are written as AVPicture structure to
867 avoid any copies. We support temorarily the older
869 AVFrame* old_frame = enc->coded_frame;
870 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
871 pkt.data= (uint8_t *)final_picture;
872 pkt.size= sizeof(AVPicture);
874 pkt.pts= dec->coded_frame->pts;
875 if(dec->coded_frame && dec->coded_frame->key_frame)
876 pkt.flags |= PKT_FLAG_KEY;
878 av_interleaved_write_frame(s, &pkt);
879 enc->coded_frame = old_frame;
883 big_picture= *final_picture;
884 /* better than nothing: use input picture interlaced
886 big_picture.interlaced_frame = in_picture->interlaced_frame;
887 if(do_interlace_me || do_interlace_dct){
888 if(top_field_first == -1)
889 big_picture.top_field_first = in_picture->top_field_first;
891 big_picture.top_field_first = top_field_first;
894 /* handles sameq here. This is not correct because it may
895 not be a global option */
897 big_picture.quality = ist->st->quality;
899 big_picture.quality = ost->st->quality;
901 big_picture.pict_type = 0;
902 // big_picture.pts = AV_NOPTS_VALUE;
903 big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->frame_rate_base, enc->frame_rate);
904 //av_log(NULL, AV_LOG_DEBUG, "%lld -> encoder\n", ost->sync_opts);
905 ret = avcodec_encode_video(enc,
906 bit_buffer, bit_buffer_size,
908 //enc->frame_number = enc->real_pict_num;
910 pkt.data= bit_buffer;
913 pkt.pts= enc->coded_frame->pts;
914 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %lld/%lld\n",
915 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1,
916 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1);*/
918 if(enc->coded_frame && enc->coded_frame->key_frame)
919 pkt.flags |= PKT_FLAG_KEY;
920 av_interleaved_write_frame(s, &pkt);
922 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
923 // enc->frame_number-1, enc->real_pict_num, ret,
925 /* if two pass, output log */
926 if (ost->logfile && enc->stats_out) {
927 fprintf(ost->logfile, "%s", enc->stats_out);
939 static double psnr(double d){
940 if(d==0) return INFINITY;
941 return -10.0*log(d)/log(10.0);
944 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
947 static FILE *fvstats=NULL;
954 double ti1, bitrate, avg_bitrate;
958 today = localtime(&today2);
959 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour,
962 fvstats = fopen(filename,"w");
970 enc = &ost->st->codec;
971 if (enc->codec_type == CODEC_TYPE_VIDEO) {
972 frame_number = ost->frame_number;
973 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
974 if (enc->flags&CODEC_FLAG_PSNR)
975 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
977 fprintf(fvstats,"f_size= %6d ", frame_size);
978 /* compute pts value */
979 ti1 = (double)ost->sync_opts *enc->frame_rate_base / enc->frame_rate;
983 bitrate = (double)(frame_size * 8) * enc->frame_rate / enc->frame_rate_base / 1000.0;
984 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
985 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
986 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
987 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
991 static void print_report(AVFormatContext **output_files,
992 AVOutputStream **ost_table, int nb_ostreams,
997 AVFormatContext *oc, *os;
1000 int frame_number, vid, i;
1001 double bitrate, ti1, pts;
1002 static int64_t last_time = -1;
1004 if (!is_last_report) {
1006 /* display the report every 0.5 seconds */
1007 cur_time = av_gettime();
1008 if (last_time == -1) {
1009 last_time = cur_time;
1012 if ((cur_time - last_time) < 500000)
1014 last_time = cur_time;
1018 oc = output_files[0];
1020 total_size = url_ftell(&oc->pb);
1025 for(i=0;i<nb_ostreams;i++) {
1027 os = output_files[ost->file_index];
1028 enc = &ost->st->codec;
1029 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1030 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1031 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1033 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1034 frame_number = ost->frame_number;
1035 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d q=%2.1f ",
1036 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : 0);
1038 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1039 if (enc->flags&CODEC_FLAG_PSNR){
1041 double error, error_sum=0;
1042 double scale, scale_sum=0;
1043 char type[3]= {'Y','U','V'};
1044 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1047 error= enc->error[j];
1048 scale= enc->width*enc->height*255.0*255.0*frame_number;
1050 error= enc->coded_frame->error[j];
1051 scale= enc->width*enc->height*255.0*255.0;
1056 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1058 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1062 /* compute min output value */
1063 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1064 if ((pts < ti1) && (pts > 0))
1070 if (verbose || is_last_report) {
1071 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1073 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1074 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
1075 (double)total_size / 1024, ti1, bitrate);
1078 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1079 nb_frames_dup, nb_frames_drop);
1082 fprintf(stderr, "%s \r", buf);
1087 if (is_last_report && verbose >= 0){
1088 int64_t raw= audio_size + video_size + extra_size;
1089 fprintf(stderr, "\n");
1090 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1094 100.0*(total_size - raw)/raw
1099 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1100 static int output_packet(AVInputStream *ist, int ist_index,
1101 AVOutputStream **ost_table, int nb_ostreams,
1102 const AVPacket *pkt)
1104 AVFormatContext *os;
1105 AVOutputStream *ost;
1109 int data_size, got_picture;
1111 void *buffer_to_free;
1112 static int samples_size= 0;
1113 static short *samples= NULL;
1116 ist->pts= ist->next_pts; // needed for last packet if vsync=0
1117 } else if (pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1118 ist->next_pts = ist->pts = pkt->dts;
1120 // assert(ist->pts == ist->next_pts);
1134 /* decode the packet if needed */
1135 data_buf = NULL; /* fail safe */
1137 if (ist->decoding_needed) {
1138 switch(ist->st->codec.codec_type) {
1139 case CODEC_TYPE_AUDIO:{
1141 samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE));
1142 /* XXX: could avoid copy if PCM 16 bits with same
1143 endianness as CPU */
1144 ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size,
1150 /* Some bug in mpeg audio decoder gives */
1151 /* data_size < 0, it seems they are overflows */
1152 if (data_size <= 0) {
1153 /* no audio frame */
1156 data_buf = (uint8_t *)samples;
1157 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1158 (ist->st->codec.sample_rate * ist->st->codec.channels);
1160 case CODEC_TYPE_VIDEO:
1161 data_size = (ist->st->codec.width * ist->st->codec.height * 3) / 2;
1162 /* XXX: allocate picture correctly */
1163 avcodec_get_frame_defaults(&picture);
1165 ret = avcodec_decode_video(&ist->st->codec,
1166 &picture, &got_picture, ptr, len);
1167 ist->st->quality= picture.quality;
1171 /* no picture yet */
1172 goto discard_packet;
1174 if (ist->st->codec.frame_rate_base != 0) {
1175 ist->next_pts += ((int64_t)AV_TIME_BASE *
1176 ist->st->codec.frame_rate_base) /
1177 ist->st->codec.frame_rate;
1185 switch(ist->st->codec.codec_type) {
1186 case CODEC_TYPE_AUDIO:
1187 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec.frame_size) /
1188 (ist->st->codec.sample_rate * ist->st->codec.channels);
1190 case CODEC_TYPE_VIDEO:
1191 if (ist->st->codec.frame_rate_base != 0) {
1192 ist->next_pts += ((int64_t)AV_TIME_BASE *
1193 ist->st->codec.frame_rate_base) /
1194 ist->st->codec.frame_rate;
1204 buffer_to_free = NULL;
1205 if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1206 pre_process_video_frame(ist, (AVPicture *)&picture,
1210 /* frame rate emulation */
1211 if (ist->st->codec.rate_emu) {
1212 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec.frame_rate_base, 1000000, ist->st->codec.frame_rate);
1213 int64_t now = av_gettime() - ist->start;
1221 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1222 is the one of the next displayed one */
1223 /* XXX: add mpeg4 too ? */
1224 if (ist->st->codec.codec_id == CODEC_ID_MPEG1VIDEO) {
1225 if (ist->st->codec.pict_type != B_TYPE) {
1227 tmp = ist->last_ip_pts;
1228 ist->last_ip_pts = ist->frac_pts.val;
1229 ist->frac_pts.val = tmp;
1233 /* if output time reached then transcode raw format,
1234 encode packets and output them */
1235 if (start_time == 0 || ist->pts >= start_time)
1236 for(i=0;i<nb_ostreams;i++) {
1240 if (ost->source_index == ist_index) {
1241 os = output_files[ost->file_index];
1244 printf("%d: got pts=%0.3f %0.3f\n", i,
1245 (double)pkt->pts / AV_TIME_BASE,
1246 ((double)ist->pts / AV_TIME_BASE) -
1247 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1249 /* set the input output pts pairs */
1250 ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index])/ AV_TIME_BASE;
1252 if (ost->encoding_needed) {
1253 switch(ost->st->codec.codec_type) {
1254 case CODEC_TYPE_AUDIO:
1255 do_audio_out(os, ost, ist, data_buf, data_size);
1257 case CODEC_TYPE_VIDEO:
1258 do_video_out(os, ost, ist, &picture, &frame_size);
1259 video_size += frame_size;
1260 if (do_vstats && frame_size)
1261 do_video_stats(os, ost, frame_size);
1267 AVFrame avframe; //FIXME/XXX remove this
1269 av_init_packet(&opkt);
1271 /* no reencoding needed : output the packet directly */
1272 /* force the input stream PTS */
1274 avcodec_get_frame_defaults(&avframe);
1275 ost->st->codec.coded_frame= &avframe;
1276 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1278 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO)
1279 audio_size += data_size;
1280 else if (ost->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1281 video_size += data_size;
1285 opkt.stream_index= ost->index;
1286 opkt.data= data_buf;
1287 opkt.size= data_size;
1288 if(pkt->pts != AV_NOPTS_VALUE)
1289 opkt.pts= pkt->pts + input_files_ts_offset[ist->file_index];
1291 opkt.pts= AV_NOPTS_VALUE;
1292 opkt.dts= pkt->dts + input_files_ts_offset[ist->file_index];
1293 opkt.flags= pkt->flags;
1295 av_interleaved_write_frame(os, &opkt);
1296 ost->st->codec.frame_number++;
1297 ost->frame_number++;
1301 av_free(buffer_to_free);
1307 for(i=0;i<nb_ostreams;i++) {
1309 if (ost->source_index == ist_index) {
1310 AVCodecContext *enc= &ost->st->codec;
1311 os = output_files[ost->file_index];
1313 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1315 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1318 if (ost->encoding_needed) {
1321 av_init_packet(&pkt);
1322 pkt.stream_index= ost->index;
1324 switch(ost->st->codec.codec_type) {
1325 case CODEC_TYPE_AUDIO:
1326 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1328 pkt.flags |= PKT_FLAG_KEY;
1330 case CODEC_TYPE_VIDEO:
1331 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1333 if(enc->coded_frame && enc->coded_frame->key_frame)
1334 pkt.flags |= PKT_FLAG_KEY;
1335 if (ost->logfile && enc->stats_out) {
1336 fprintf(ost->logfile, "%s", enc->stats_out);
1345 pkt.data= bit_buffer;
1347 if(enc->coded_frame)
1348 pkt.pts= enc->coded_frame->pts;
1349 av_interleaved_write_frame(os, &pkt);
1363 * The following code is the main loop of the file converter
1365 static int av_encode(AVFormatContext **output_files,
1366 int nb_output_files,
1367 AVFormatContext **input_files,
1369 AVStreamMap *stream_maps, int nb_stream_maps)
1371 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1372 AVFormatContext *is, *os;
1373 AVCodecContext *codec, *icodec;
1374 AVOutputStream *ost, **ost_table = NULL;
1375 AVInputStream *ist, **ist_table = NULL;
1376 AVInputFile *file_table;
1377 AVFormatContext *stream_no_data;
1380 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1384 /* input stream init */
1386 for(i=0;i<nb_input_files;i++) {
1387 is = input_files[i];
1388 file_table[i].ist_index = j;
1389 file_table[i].nb_streams = is->nb_streams;
1390 j += is->nb_streams;
1394 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1398 for(i=0;i<nb_istreams;i++) {
1399 ist = av_mallocz(sizeof(AVInputStream));
1405 for(i=0;i<nb_input_files;i++) {
1406 is = input_files[i];
1407 for(k=0;k<is->nb_streams;k++) {
1408 ist = ist_table[j++];
1409 ist->st = is->streams[k];
1410 ist->file_index = i;
1412 ist->discard = 1; /* the stream is discarded by default
1415 if (ist->st->codec.rate_emu) {
1416 ist->start = av_gettime();
1422 /* output stream init */
1424 for(i=0;i<nb_output_files;i++) {
1425 os = output_files[i];
1426 nb_ostreams += os->nb_streams;
1428 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1429 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1433 /* Sanity check the mapping args -- do the input files & streams exist? */
1434 for(i=0;i<nb_stream_maps;i++) {
1435 int fi = stream_maps[i].file_index;
1436 int si = stream_maps[i].stream_index;
1438 if (fi < 0 || fi > nb_input_files - 1 ||
1439 si < 0 || si > file_table[fi].nb_streams - 1) {
1440 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1445 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1448 for(i=0;i<nb_ostreams;i++) {
1449 ost = av_mallocz(sizeof(AVOutputStream));
1456 for(k=0;k<nb_output_files;k++) {
1457 os = output_files[k];
1458 for(i=0;i<os->nb_streams;i++) {
1460 ost = ost_table[n++];
1461 ost->file_index = k;
1463 ost->st = os->streams[i];
1464 if (nb_stream_maps > 0) {
1465 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1466 stream_maps[n-1].stream_index;
1468 /* Sanity check that the stream types match */
1469 if (ist_table[ost->source_index]->st->codec.codec_type != ost->st->codec.codec_type) {
1470 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1471 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1472 ost->file_index, ost->index);
1477 /* get corresponding input stream index : we select the first one with the right type */
1479 for(j=0;j<nb_istreams;j++) {
1482 ist->st->codec.codec_type == ost->st->codec.codec_type) {
1483 ost->source_index = j;
1490 /* try again and reuse existing stream */
1491 for(j=0;j<nb_istreams;j++) {
1493 if (ist->st->codec.codec_type == ost->st->codec.codec_type) {
1494 ost->source_index = j;
1499 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1500 ost->file_index, ost->index);
1505 ist = ist_table[ost->source_index];
1510 /* for each output stream, we compute the right encoding parameters */
1511 for(i=0;i<nb_ostreams;i++) {
1513 ist = ist_table[ost->source_index];
1515 codec = &ost->st->codec;
1516 icodec = &ist->st->codec;
1518 if (ost->st->stream_copy) {
1519 /* if stream_copy is selected, no need to decode or encode */
1520 codec->codec_id = icodec->codec_id;
1521 codec->codec_type = icodec->codec_type;
1522 if(!codec->codec_tag) codec->codec_tag = icodec->codec_tag;
1523 codec->bit_rate = icodec->bit_rate;
1524 switch(codec->codec_type) {
1525 case CODEC_TYPE_AUDIO:
1526 codec->sample_rate = icodec->sample_rate;
1527 codec->channels = icodec->channels;
1528 codec->frame_size = icodec->frame_size;
1529 codec->block_align= icodec->block_align;
1531 case CODEC_TYPE_VIDEO:
1532 codec->frame_rate = icodec->frame_rate;
1533 codec->frame_rate_base = icodec->frame_rate_base;
1534 codec->width = icodec->width;
1535 codec->height = icodec->height;
1536 codec->has_b_frames = icodec->has_b_frames;
1542 switch(codec->codec_type) {
1543 case CODEC_TYPE_AUDIO:
1544 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1547 if (codec->channels == icodec->channels &&
1548 codec->sample_rate == icodec->sample_rate) {
1549 ost->audio_resample = 0;
1551 if (codec->channels != icodec->channels &&
1552 (icodec->codec_id == CODEC_ID_AC3 ||
1553 icodec->codec_id == CODEC_ID_DTS)) {
1554 /* Special case for 5:1 AC3 and DTS input */
1555 /* and mono or stereo output */
1556 /* Request specific number of channels */
1557 icodec->channels = codec->channels;
1558 if (codec->sample_rate == icodec->sample_rate)
1559 ost->audio_resample = 0;
1561 ost->audio_resample = 1;
1564 ost->audio_resample = 1;
1567 if(audio_sync_method>1)
1568 ost->audio_resample = 1;
1570 if(ost->audio_resample){
1571 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1572 codec->sample_rate, icodec->sample_rate);
1574 printf("Can't resample. Aborting.\n");
1578 ist->decoding_needed = 1;
1579 ost->encoding_needed = 1;
1581 case CODEC_TYPE_VIDEO:
1582 if (codec->width == icodec->width &&
1583 codec->height == icodec->height &&
1584 frame_topBand == 0 &&
1585 frame_bottomBand == 0 &&
1586 frame_leftBand == 0 &&
1587 frame_rightBand == 0 &&
1588 frame_padtop == 0 &&
1589 frame_padbottom == 0 &&
1590 frame_padleft == 0 &&
1591 frame_padright == 0)
1593 ost->video_resample = 0;
1594 ost->video_crop = 0;
1596 } else if ((codec->width == icodec->width -
1597 (frame_leftBand + frame_rightBand)) &&
1598 (codec->height == icodec->height -
1599 (frame_topBand + frame_bottomBand)))
1601 ost->video_resample = 0;
1602 ost->video_crop = 1;
1603 ost->topBand = frame_topBand;
1604 ost->leftBand = frame_leftBand;
1605 } else if ((codec->width == icodec->width +
1606 (frame_padleft + frame_padright)) &&
1607 (codec->height == icodec->height +
1608 (frame_padtop + frame_padbottom))) {
1609 ost->video_resample = 0;
1610 ost->video_crop = 0;
1612 ost->padtop = frame_padtop;
1613 ost->padleft = frame_padleft;
1614 ost->padbottom = frame_padbottom;
1615 ost->padright = frame_padright;
1616 avcodec_get_frame_defaults(&ost->pict_tmp);
1617 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1618 codec->width, codec->height ) )
1621 ost->video_resample = 1;
1622 ost->video_crop = 0; // cropping is handled as part of resample
1623 avcodec_get_frame_defaults(&ost->pict_tmp);
1624 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1625 codec->width, codec->height ) )
1628 ost->img_resample_ctx = img_resample_full_init(
1629 ost->st->codec.width, ost->st->codec.height,
1630 ist->st->codec.width, ist->st->codec.height,
1631 frame_topBand, frame_bottomBand,
1632 frame_leftBand, frame_rightBand,
1633 frame_padtop, frame_padbottom,
1634 frame_padleft, frame_padright);
1636 ost->padtop = frame_padtop;
1637 ost->padleft = frame_padleft;
1638 ost->padbottom = frame_padbottom;
1639 ost->padright = frame_padright;
1642 ost->encoding_needed = 1;
1643 ist->decoding_needed = 1;
1649 if (ost->encoding_needed &&
1650 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1651 char logfilename[1024];
1656 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1658 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1659 if (codec->flags & CODEC_FLAG_PASS1) {
1660 f = fopen(logfilename, "w");
1662 perror(logfilename);
1667 /* read the log file */
1668 f = fopen(logfilename, "r");
1670 perror(logfilename);
1673 fseek(f, 0, SEEK_END);
1675 fseek(f, 0, SEEK_SET);
1676 logbuffer = av_malloc(size + 1);
1678 fprintf(stderr, "Could not allocate log buffer\n");
1681 size = fread(logbuffer, 1, size, f);
1683 logbuffer[size] = '\0';
1684 codec->stats_in = logbuffer;
1688 if(codec->codec_type == CODEC_TYPE_VIDEO){
1689 int size= codec->width * codec->height;
1690 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1695 bit_buffer = av_malloc(bit_buffer_size);
1699 /* dump the file output parameters - cannot be done before in case
1701 for(i=0;i<nb_output_files;i++) {
1702 dump_format(output_files[i], i, output_files[i]->filename, 1);
1705 /* dump the stream mapping */
1707 fprintf(stderr, "Stream mapping:\n");
1708 for(i=0;i<nb_ostreams;i++) {
1710 fprintf(stderr, " Stream #%d.%d -> #%d.%d\n",
1711 ist_table[ost->source_index]->file_index,
1712 ist_table[ost->source_index]->index,
1718 /* open each encoder */
1719 for(i=0;i<nb_ostreams;i++) {
1721 if (ost->encoding_needed) {
1723 codec = avcodec_find_encoder(ost->st->codec.codec_id);
1725 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1726 ost->file_index, ost->index);
1729 if (avcodec_open(&ost->st->codec, codec) < 0) {
1730 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1731 ost->file_index, ost->index);
1734 extra_size += ost->st->codec.extradata_size;
1738 /* open each decoder */
1739 for(i=0;i<nb_istreams;i++) {
1741 if (ist->decoding_needed) {
1743 codec = avcodec_find_decoder(ist->st->codec.codec_id);
1745 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1746 ist->st->codec.codec_id, ist->file_index, ist->index);
1749 if (avcodec_open(&ist->st->codec, codec) < 0) {
1750 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1751 ist->file_index, ist->index);
1754 //if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO)
1755 // ist->st->codec.flags |= CODEC_FLAG_REPEAT_FIELD;
1760 for(i=0;i<nb_istreams;i++) {
1762 is = input_files[ist->file_index];
1764 ist->next_pts = ist->st->start_time;
1765 if(ist->next_pts == AV_NOPTS_VALUE)
1767 if(input_files_ts_offset[ist->file_index])
1768 ist->next_pts= AV_NOPTS_VALUE;
1772 /* compute buffer size max (should use a complete heuristic) */
1773 for(i=0;i<nb_input_files;i++) {
1774 file_table[i].buffer_size_max = 2048;
1777 /* set meta data information from input file if required */
1778 for (i=0;i<nb_meta_data_maps;i++) {
1779 AVFormatContext *out_file;
1780 AVFormatContext *in_file;
1782 int out_file_index = meta_data_maps[i].out_file;
1783 int in_file_index = meta_data_maps[i].in_file;
1784 if ( out_file_index < 0 || out_file_index >= nb_output_files ) {
1785 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1789 if ( in_file_index < 0 || in_file_index >= nb_input_files ) {
1790 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1795 out_file = output_files[out_file_index];
1796 in_file = input_files[in_file_index];
1798 strcpy(out_file->title, in_file->title);
1799 strcpy(out_file->author, in_file->author);
1800 strcpy(out_file->copyright, in_file->copyright);
1801 strcpy(out_file->comment, in_file->comment);
1802 strcpy(out_file->album, in_file->album);
1803 out_file->year = in_file->year;
1804 out_file->track = in_file->track;
1805 strcpy(out_file->genre, in_file->genre);
1808 /* open files and write file headers */
1809 for(i=0;i<nb_output_files;i++) {
1810 os = output_files[i];
1811 if (av_write_header(os) < 0) {
1812 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1818 #ifndef CONFIG_WIN32
1819 if ( !using_stdin && verbose >= 0) {
1820 fprintf(stderr, "Press [q] to stop encoding\n");
1821 url_set_interrupt_cb(decode_interrupt_cb);
1829 for(; received_sigterm == 0;) {
1830 int file_index, ist_index;
1838 /* if 'q' pressed, exits */
1842 /* read_key() returns 0 on EOF */
1848 /* select the stream that we must read now by looking at the
1849 smallest output pts */
1851 for(i=0;i<nb_ostreams;i++) {
1854 os = output_files[ost->file_index];
1855 ist = ist_table[ost->source_index];
1856 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1857 opts = (double)ost->sync_opts * ost->st->codec.frame_rate_base / ost->st->codec.frame_rate;
1859 opts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1860 ipts = (double)ist->pts;
1861 if (!file_table[ist->file_index].eof_reached){
1862 if(ipts < ipts_min) {
1864 if(input_sync ) file_index = ist->file_index;
1866 if(opts < opts_min) {
1868 if(!input_sync) file_index = ist->file_index;
1871 if(ost->frame_number >= max_frames[ost->st->codec.codec_type]){
1876 /* if none, if is finished */
1877 if (file_index < 0) {
1881 /* finish if recording time exhausted */
1882 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
1885 /* read a frame from it and output it in the fifo */
1886 is = input_files[file_index];
1887 if (av_read_frame(is, &pkt) < 0) {
1888 file_table[file_index].eof_reached = 1;
1893 stream_no_data = is;
1898 av_pkt_dump(stdout, &pkt, do_hex_dump);
1900 /* the following test is needed in case new streams appear
1901 dynamically in stream : we ignore them */
1902 if (pkt.stream_index >= file_table[file_index].nb_streams)
1903 goto discard_packet;
1904 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1905 ist = ist_table[ist_index];
1907 goto discard_packet;
1909 // 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);
1910 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
1911 int64_t delta= pkt.dts - ist->next_pts;
1912 if(ABS(delta) > 10LL*AV_TIME_BASE && !copy_ts){
1913 input_files_ts_offset[ist->file_index]-= delta;
1915 fprintf(stderr, "timestamp discontinuity %lld, new offset= %lld\n", delta, input_files_ts_offset[ist->file_index]);
1916 for(i=0; i<file_table[file_index].nb_streams; i++){
1917 int index= file_table[file_index].ist_index + i;
1918 ist_table[index]->next_pts += delta;
1919 ist_table[index]->is_start=1;
1924 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1925 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1928 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1929 ist->file_index, ist->index);
1931 av_free_packet(&pkt);
1936 av_free_packet(&pkt);
1938 /* dump report by using the output first video and audio streams */
1939 print_report(output_files, ost_table, nb_ostreams, 0);
1942 /* at the end of stream, we must flush the decoder buffers */
1943 for(i=0;i<nb_istreams;i++) {
1945 if (ist->decoding_needed) {
1946 output_packet(ist, i, ost_table, nb_ostreams, NULL);
1952 /* write the trailer if needed and close file */
1953 for(i=0;i<nb_output_files;i++) {
1954 os = output_files[i];
1955 av_write_trailer(os);
1958 /* dump report by using the first video and audio streams */
1959 print_report(output_files, ost_table, nb_ostreams, 1);
1961 /* close each encoder */
1962 for(i=0;i<nb_ostreams;i++) {
1964 if (ost->encoding_needed) {
1965 av_freep(&ost->st->codec.stats_in);
1966 avcodec_close(&ost->st->codec);
1970 /* close each decoder */
1971 for(i=0;i<nb_istreams;i++) {
1973 if (ist->decoding_needed) {
1974 avcodec_close(&ist->st->codec);
1982 av_freep(&bit_buffer);
1983 av_free(file_table);
1986 for(i=0;i<nb_istreams;i++) {
1993 for(i=0;i<nb_ostreams;i++) {
1997 fclose(ost->logfile);
1998 ost->logfile = NULL;
2000 fifo_free(&ost->fifo); /* works even if fifo is not
2001 initialized but set to zero */
2002 av_free(ost->pict_tmp.data[0]);
2003 if (ost->video_resample)
2004 img_resample_close(ost->img_resample_ctx);
2005 if (ost->audio_resample)
2006 audio_resample_close(ost->resample);
2019 int file_read(const char *filename)
2022 unsigned char buffer[1024];
2025 if (url_open(&h, filename, O_RDONLY) < 0) {
2026 printf("could not open '%s'\n", filename);
2030 len = url_read(h, buffer, sizeof(buffer));
2033 for(i=0;i<len;i++) putchar(buffer[i]);
2040 static void opt_image_format(const char *arg)
2044 for(f = first_image_format; f != NULL; f = f->next) {
2045 if (!strcmp(arg, f->name))
2049 fprintf(stderr, "Unknown image format: '%s'\n", arg);
2055 static void opt_format(const char *arg)
2057 /* compatibility stuff for pgmyuv */
2058 if (!strcmp(arg, "pgmyuv")) {
2059 pgmyuv_compatibility_hack=1;
2060 // opt_image_format(arg);
2064 file_iformat = av_find_input_format(arg);
2065 file_oformat = guess_format(arg, NULL, NULL);
2066 if (!file_iformat && !file_oformat) {
2067 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2072 static void opt_video_bitrate(const char *arg)
2074 video_bit_rate = atoi(arg) * 1000;
2077 static void opt_video_bitrate_tolerance(const char *arg)
2079 video_bit_rate_tolerance = atoi(arg) * 1000;
2082 static void opt_video_bitrate_max(const char *arg)
2084 video_rc_max_rate = atoi(arg) * 1000;
2087 static void opt_video_bitrate_min(const char *arg)
2089 video_rc_min_rate = atoi(arg) * 1000;
2092 static void opt_video_buffer_size(const char *arg)
2094 video_rc_buffer_size = atoi(arg) * 8*1024;
2097 static void opt_video_rc_eq(char *arg)
2102 static void opt_video_rc_override_string(char *arg)
2104 video_rc_override_string = arg;
2108 static void opt_workaround_bugs(const char *arg)
2110 workaround_bugs = atoi(arg);
2113 static void opt_dct_algo(const char *arg)
2115 dct_algo = atoi(arg);
2118 static void opt_idct_algo(const char *arg)
2120 idct_algo = atoi(arg);
2123 static void opt_me_threshold(const char *arg)
2125 me_threshold = atoi(arg);
2128 static void opt_mb_threshold(const char *arg)
2130 mb_threshold = atoi(arg);
2133 static void opt_error_resilience(const char *arg)
2135 error_resilience = atoi(arg);
2138 static void opt_error_concealment(const char *arg)
2140 error_concealment = atoi(arg);
2143 static void opt_debug(const char *arg)
2148 static void opt_vismv(const char *arg)
2150 debug_mv = atoi(arg);
2153 static void opt_verbose(const char *arg)
2155 verbose = atoi(arg);
2156 av_log_set_level(atoi(arg));
2159 static void opt_frame_rate(const char *arg)
2161 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
2162 fprintf(stderr, "Incorrect frame rate\n");
2167 static void opt_frame_crop_top(const char *arg)
2169 frame_topBand = atoi(arg);
2170 if (frame_topBand < 0) {
2171 fprintf(stderr, "Incorrect top crop size\n");
2174 if ((frame_topBand % 2) != 0) {
2175 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2178 if ((frame_topBand) >= frame_height){
2179 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2182 frame_height -= frame_topBand;
2185 static void opt_frame_crop_bottom(const char *arg)
2187 frame_bottomBand = atoi(arg);
2188 if (frame_bottomBand < 0) {
2189 fprintf(stderr, "Incorrect bottom crop size\n");
2192 if ((frame_bottomBand % 2) != 0) {
2193 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2196 if ((frame_bottomBand) >= frame_height){
2197 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2200 frame_height -= frame_bottomBand;
2203 static void opt_frame_crop_left(const char *arg)
2205 frame_leftBand = atoi(arg);
2206 if (frame_leftBand < 0) {
2207 fprintf(stderr, "Incorrect left crop size\n");
2210 if ((frame_leftBand % 2) != 0) {
2211 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2214 if ((frame_leftBand) >= frame_width){
2215 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2218 frame_width -= frame_leftBand;
2221 static void opt_frame_crop_right(const char *arg)
2223 frame_rightBand = atoi(arg);
2224 if (frame_rightBand < 0) {
2225 fprintf(stderr, "Incorrect right crop size\n");
2228 if ((frame_rightBand % 2) != 0) {
2229 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2232 if ((frame_rightBand) >= frame_width){
2233 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2236 frame_width -= frame_rightBand;
2239 static void opt_frame_size(const char *arg)
2241 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2242 fprintf(stderr, "Incorrect frame size\n");
2245 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2246 fprintf(stderr, "Frame size must be a multiple of 2\n");
2252 #define SCALEBITS 10
2253 #define ONE_HALF (1 << (SCALEBITS - 1))
2254 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2256 #define RGB_TO_Y(r, g, b) \
2257 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2258 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2260 #define RGB_TO_U(r1, g1, b1, shift)\
2261 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2262 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2264 #define RGB_TO_V(r1, g1, b1, shift)\
2265 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2266 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2268 static void opt_pad_color(const char *arg) {
2269 /* Input is expected to be six hex digits similar to
2270 how colors are expressed in html tags (but without the #) */
2271 int rgb = strtol(arg, NULL, 16);
2275 g = ((rgb >> 8) & 255);
2278 padcolor[0] = RGB_TO_Y(r,g,b);
2279 padcolor[1] = RGB_TO_U(r,g,b,0);
2280 padcolor[2] = RGB_TO_V(r,g,b,0);
2283 static void opt_frame_pad_top(const char *arg)
2285 frame_padtop = atoi(arg);
2286 if (frame_padtop < 0) {
2287 fprintf(stderr, "Incorrect top pad size\n");
2290 if ((frame_padtop % 2) != 0) {
2291 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2296 static void opt_frame_pad_bottom(const char *arg)
2298 frame_padbottom = atoi(arg);
2299 if (frame_padbottom < 0) {
2300 fprintf(stderr, "Incorrect bottom pad size\n");
2303 if ((frame_padbottom % 2) != 0) {
2304 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2310 static void opt_frame_pad_left(const char *arg)
2312 frame_padleft = atoi(arg);
2313 if (frame_padleft < 0) {
2314 fprintf(stderr, "Incorrect left pad size\n");
2317 if ((frame_padleft % 2) != 0) {
2318 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2324 static void opt_frame_pad_right(const char *arg)
2326 frame_padright = atoi(arg);
2327 if (frame_padright < 0) {
2328 fprintf(stderr, "Incorrect right pad size\n");
2331 if ((frame_padright % 2) != 0) {
2332 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2338 static void opt_frame_pix_fmt(const char *arg)
2340 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2343 static void opt_frame_aspect_ratio(const char *arg)
2349 p = strchr(arg, ':');
2351 x = strtol(arg, (char **)&arg, 10);
2353 y = strtol(arg+1, (char **)&arg, 10);
2355 ar = (double)x / (double)y;
2357 ar = strtod(arg, (char **)&arg);
2360 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2363 frame_aspect_ratio = ar;
2366 static void opt_gop_size(const char *arg)
2368 gop_size = atoi(arg);
2371 static void opt_b_frames(const char *arg)
2373 b_frames = atoi(arg);
2374 if (b_frames > FF_MAX_B_FRAMES) {
2375 fprintf(stderr, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES);
2377 } else if (b_frames < 1) {
2378 fprintf(stderr, "\nNumber of B frames must be higher than 0\n");
2383 static void opt_mb_decision(const char *arg)
2385 mb_decision = atoi(arg);
2388 static void opt_mb_cmp(const char *arg)
2393 static void opt_ildct_cmp(const char *arg)
2395 ildct_cmp = atoi(arg);
2398 static void opt_sub_cmp(const char *arg)
2400 sub_cmp = atoi(arg);
2403 static void opt_cmp(const char *arg)
2408 static void opt_pre_cmp(const char *arg)
2410 pre_cmp = atoi(arg);
2413 static void opt_pre_me(const char *arg)
2418 static void opt_lumi_mask(const char *arg)
2420 lumi_mask = atof(arg);
2423 static void opt_dark_mask(const char *arg)
2425 dark_mask = atof(arg);
2428 static void opt_scplx_mask(const char *arg)
2430 scplx_mask = atof(arg);
2433 static void opt_tcplx_mask(const char *arg)
2435 tcplx_mask = atof(arg);
2438 static void opt_p_mask(const char *arg)
2443 static void opt_qscale(const char *arg)
2445 video_qscale = atof(arg);
2446 if (video_qscale < 0.01 ||
2447 video_qscale > 255) {
2448 fprintf(stderr, "qscale must be >= 0.01 and <= 255\n");
2453 static void opt_qsquish(const char *arg)
2455 video_qsquish = atof(arg);
2456 if (video_qsquish < 0.0 ||
2457 video_qsquish > 99.0) {
2458 fprintf(stderr, "qsquish must be >= 0.0 and <= 99.0\n");
2463 static void opt_lelim(const char *arg)
2465 video_lelim = atoi(arg);
2466 if (video_lelim < -99 ||
2468 fprintf(stderr, "lelim must be >= -99 and <= 99\n");
2473 static void opt_celim(const char *arg)
2475 video_celim = atoi(arg);
2476 if (video_celim < -99 ||
2478 fprintf(stderr, "celim must be >= -99 and <= 99\n");
2483 static void opt_lmax(const char *arg)
2485 video_lmax = atof(arg)*FF_QP2LAMBDA;
2488 static void opt_lmin(const char *arg)
2490 video_lmin = atof(arg)*FF_QP2LAMBDA;
2493 static void opt_qmin(const char *arg)
2495 video_qmin = atoi(arg);
2496 if (video_qmin < 1 ||
2498 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2503 static void opt_qmax(const char *arg)
2505 video_qmax = atoi(arg);
2506 if (video_qmax < 1 ||
2508 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2513 static void opt_mb_lmin(const char *arg)
2515 video_mb_lmin = atof(arg)*FF_QP2LAMBDA;
2516 if (video_mb_lmin < 1 ||
2517 video_mb_lmin > FF_LAMBDA_MAX) {
2518 fprintf(stderr, "mblmin must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
2523 static void opt_mb_lmax(const char *arg)
2525 video_mb_lmax = atof(arg)*FF_QP2LAMBDA;
2526 if (video_mb_lmax < 1 ||
2527 video_mb_lmax > FF_LAMBDA_MAX) {
2528 fprintf(stderr, "mblmax must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
2533 static void opt_qdiff(const char *arg)
2535 video_qdiff = atoi(arg);
2536 if (video_qdiff < 0 ||
2538 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2543 static void opt_qblur(const char *arg)
2545 video_qblur = atof(arg);
2548 static void opt_qcomp(const char *arg)
2550 video_qcomp = atof(arg);
2553 static void opt_rc_initial_cplx(const char *arg)
2555 video_rc_initial_cplx = atof(arg);
2557 static void opt_b_qfactor(const char *arg)
2559 video_b_qfactor = atof(arg);
2561 static void opt_i_qfactor(const char *arg)
2563 video_i_qfactor = atof(arg);
2565 static void opt_b_qoffset(const char *arg)
2567 video_b_qoffset = atof(arg);
2569 static void opt_i_qoffset(const char *arg)
2571 video_i_qoffset = atof(arg);
2574 static void opt_ibias(const char *arg)
2576 video_intra_quant_bias = atoi(arg);
2578 static void opt_pbias(const char *arg)
2580 video_inter_quant_bias = atoi(arg);
2583 static void opt_packet_size(const char *arg)
2585 packet_size= atoi(arg);
2588 static void opt_error_rate(const char *arg)
2590 error_rate= atoi(arg);
2593 static void opt_strict(const char *arg)
2598 static void opt_top_field_first(const char *arg)
2600 top_field_first= atoi(arg);
2603 static void opt_noise_reduction(const char *arg)
2605 noise_reduction= atoi(arg);
2608 static void opt_qns(const char *arg)
2613 static void opt_sc_threshold(const char *arg)
2615 sc_threshold= atoi(arg);
2618 static void opt_me_range(const char *arg)
2620 me_range = atoi(arg);
2623 static void opt_thread_count(const char *arg)
2625 thread_count= atoi(arg);
2626 #if !defined(HAVE_THREADS)
2628 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2632 static void opt_audio_bitrate(const char *arg)
2634 audio_bit_rate = atoi(arg) * 1000;
2637 static void opt_audio_rate(const char *arg)
2639 audio_sample_rate = atoi(arg);
2642 static void opt_audio_channels(const char *arg)
2644 audio_channels = atoi(arg);
2647 static void opt_video_device(const char *arg)
2649 video_device = av_strdup(arg);
2652 static void opt_grab_device(const char *arg)
2654 grab_device = av_strdup(arg);
2657 static void opt_video_channel(const char *arg)
2659 video_channel = strtol(arg, NULL, 0);
2662 static void opt_video_standard(const char *arg)
2664 video_standard = av_strdup(arg);
2667 static void opt_audio_device(const char *arg)
2669 audio_device = av_strdup(arg);
2672 static void opt_audio_codec(const char *arg)
2676 if (!strcmp(arg, "copy")) {
2677 audio_stream_copy = 1;
2681 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_AUDIO)
2686 fprintf(stderr, "Unknown audio codec '%s'\n", arg);
2689 audio_codec_id = p->id;
2694 static void opt_audio_tag(const char *arg)
2697 audio_codec_tag= strtol(arg, &tail, 0);
2700 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2703 static void opt_video_tag(const char *arg)
2706 video_codec_tag= strtol(arg, &tail, 0);
2709 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2712 static void add_frame_hooker(const char *arg)
2717 char *args = av_strdup(arg);
2721 argv[0] = strtok(args, " ");
2722 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2725 i = frame_hook_add(argc, argv);
2728 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2733 const char *motion_str[] = {
2743 static void opt_motion_estimation(const char *arg)
2749 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2752 if (!strcmp(*p, arg))
2756 me_method = (p - motion_str) + 1;
2759 static void opt_video_codec(const char *arg)
2763 if (!strcmp(arg, "copy")) {
2764 video_stream_copy = 1;
2768 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_VIDEO)
2773 fprintf(stderr, "Unknown video codec '%s'\n", arg);
2776 video_codec_id = p->id;
2781 static void opt_map(const char *arg)
2787 m = &stream_maps[nb_stream_maps++];
2789 m->file_index = strtol(arg, (char **)&p, 0);
2793 m->stream_index = strtol(p, (char **)&p, 0);
2796 static void opt_map_meta_data(const char *arg)
2802 m = &meta_data_maps[nb_meta_data_maps++];
2804 m->out_file = strtol(arg, (char **)&p, 0);
2808 m->in_file = strtol(p, (char **)&p, 0);
2811 static void opt_recording_time(const char *arg)
2813 recording_time = parse_date(arg, 1);
2816 static void opt_start_time(const char *arg)
2818 start_time = parse_date(arg, 1);
2821 static void opt_rec_timestamp(const char *arg)
2823 rec_timestamp = parse_date(arg, 0) / 1000000;
2826 static void opt_input_ts_offset(const char *arg)
2828 input_ts_offset = parse_date(arg, 1);
2831 static void opt_input_file(const char *filename)
2833 AVFormatContext *ic;
2834 AVFormatParameters params, *ap = ¶ms;
2835 int err, i, ret, rfps, rfps_base;
2838 if (!strcmp(filename, "-"))
2841 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2842 !strcmp( filename, "/dev/stdin" );
2844 /* get default parameters from command line */
2845 memset(ap, 0, sizeof(*ap));
2846 ap->sample_rate = audio_sample_rate;
2847 ap->channels = audio_channels;
2848 ap->frame_rate = frame_rate;
2849 ap->frame_rate_base = frame_rate_base;
2850 ap->width = frame_width + frame_padleft + frame_padright;
2851 ap->height = frame_height + frame_padtop + frame_padbottom;
2852 ap->image_format = image_format;
2853 ap->pix_fmt = frame_pix_fmt;
2854 ap->device = grab_device;
2855 ap->channel = video_channel;
2856 ap->standard = video_standard;
2857 ap->video_codec_id = video_codec_id;
2858 ap->audio_codec_id = audio_codec_id;
2859 if(pgmyuv_compatibility_hack)
2860 ap->video_codec_id= CODEC_ID_PGMYUV;
2862 /* open the input file with generic libav function */
2863 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2865 print_error(filename, err);
2869 /* If not enough info to get the stream parameters, we decode the
2870 first frames to get it. (used in mpeg case for example) */
2871 ret = av_find_stream_info(ic);
2872 if (ret < 0 && verbose >= 0) {
2873 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2877 timestamp = start_time;
2878 /* add the stream start time */
2879 if (ic->start_time != AV_NOPTS_VALUE)
2880 timestamp += ic->start_time;
2882 /* if seeking requested, we execute it */
2883 if (start_time != 0) {
2884 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2886 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2887 filename, (double)timestamp / AV_TIME_BASE);
2889 /* reset seek info */
2893 /* update the current parameters so that they match the one of the input stream */
2894 for(i=0;i<ic->nb_streams;i++) {
2895 AVCodecContext *enc = &ic->streams[i]->codec;
2896 #if defined(HAVE_THREADS)
2898 avcodec_thread_init(enc, thread_count);
2900 enc->thread_count= thread_count;
2901 switch(enc->codec_type) {
2902 case CODEC_TYPE_AUDIO:
2903 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2904 audio_channels = enc->channels;
2905 audio_sample_rate = enc->sample_rate;
2907 ic->streams[i]->discard= AVDISCARD_ALL;
2909 case CODEC_TYPE_VIDEO:
2910 frame_height = enc->height;
2911 frame_width = enc->width;
2912 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2913 frame_pix_fmt = enc->pix_fmt;
2914 rfps = ic->streams[i]->r_frame_rate;
2915 rfps_base = ic->streams[i]->r_frame_rate_base;
2916 enc->workaround_bugs = workaround_bugs;
2917 enc->error_resilience = error_resilience;
2918 enc->error_concealment = error_concealment;
2919 enc->idct_algo = idct_algo;
2921 enc->debug_mv = debug_mv;
2922 enc->lowres= lowres;
2924 enc->flags|= CODEC_FLAG_BITEXACT;
2926 enc->debug |= FF_DEBUG_MV;
2928 if (enc->frame_rate != rfps || enc->frame_rate_base != rfps_base) {
2931 fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2932 i, (float)enc->frame_rate / enc->frame_rate_base, enc->frame_rate, enc->frame_rate_base,
2934 (float)rfps / rfps_base, rfps, rfps_base);
2936 /* update the current frame rate to match the stream frame rate */
2938 frame_rate_base = rfps_base;
2940 enc->rate_emu = rate_emu;
2942 ic->streams[i]->discard= AVDISCARD_ALL;
2943 else if(video_discard)
2944 ic->streams[i]->discard= video_discard;
2946 case CODEC_TYPE_DATA:
2953 input_files[nb_input_files] = ic;
2954 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2955 /* dump the file content */
2957 dump_format(ic, nb_input_files, filename, 0);
2960 file_iformat = NULL;
2961 file_oformat = NULL;
2962 image_format = NULL;
2970 static void opt_grab(const char *arg)
2972 file_iformat = av_find_input_format(arg);
2976 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
2978 int has_video, has_audio, i, j;
2979 AVFormatContext *ic;
2983 for(j=0;j<nb_input_files;j++) {
2984 ic = input_files[j];
2985 for(i=0;i<ic->nb_streams;i++) {
2986 AVCodecContext *enc = &ic->streams[i]->codec;
2987 switch(enc->codec_type) {
2988 case CODEC_TYPE_AUDIO:
2991 case CODEC_TYPE_VIDEO:
2994 case CODEC_TYPE_DATA:
3001 *has_video_ptr = has_video;
3002 *has_audio_ptr = has_audio;
3005 static void opt_output_file(const char *filename)
3008 AVFormatContext *oc;
3009 int use_video, use_audio, nb_streams, input_has_video, input_has_audio;
3011 AVFormatParameters params, *ap = ¶ms;
3013 if (!strcmp(filename, "-"))
3016 oc = av_alloc_format_context();
3018 if (!file_oformat) {
3019 file_oformat = guess_format(NULL, filename, NULL);
3020 if (!file_oformat) {
3021 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
3027 oc->oformat = file_oformat;
3029 if (!strcmp(file_oformat->name, "ffm") &&
3030 strstart(filename, "http:", NULL)) {
3031 /* special case for files sent to ffserver: we get the stream
3032 parameters from ffserver */
3033 if (read_ffserver_streams(oc, filename) < 0) {
3034 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
3038 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy;
3039 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy;
3041 /* disable if no corresponding type found and at least one
3043 if (nb_input_files > 0) {
3044 check_audio_video_inputs(&input_has_video, &input_has_audio);
3045 if (!input_has_video)
3047 if (!input_has_audio)
3051 /* manual disable */
3052 if (audio_disable) {
3055 if (video_disable) {
3061 AVCodecContext *video_enc;
3063 st = av_new_stream(oc, nb_streams++);
3065 fprintf(stderr, "Could not alloc stream\n");
3068 #if defined(HAVE_THREADS)
3070 avcodec_thread_init(&st->codec, thread_count);
3073 video_enc = &st->codec;
3076 video_enc->codec_tag= video_codec_tag;
3078 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
3079 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3080 if (video_stream_copy) {
3081 st->stream_copy = 1;
3082 video_enc->codec_type = CODEC_TYPE_VIDEO;
3088 codec_id = av_guess_codec(file_oformat, NULL, filename, NULL, CODEC_TYPE_VIDEO);
3089 if (video_codec_id != CODEC_ID_NONE)
3090 codec_id = video_codec_id;
3092 video_enc->codec_id = codec_id;
3093 codec = avcodec_find_encoder(codec_id);
3095 video_enc->bit_rate = video_bit_rate;
3096 video_enc->bit_rate_tolerance = video_bit_rate_tolerance;
3097 video_enc->frame_rate = frame_rate;
3098 video_enc->frame_rate_base = frame_rate_base;
3099 if(codec && codec->supported_framerates){
3100 const AVRational *p= codec->supported_framerates;
3101 AVRational req= (AVRational){frame_rate, frame_rate_base};
3102 const AVRational *best=NULL;
3103 AVRational best_error= (AVRational){INT_MAX, 1};
3104 for(; p->den!=0; p++){
3105 AVRational error= av_sub_q(req, *p);
3106 if(error.num <0) error.num *= -1;
3107 if(av_cmp_q(error, best_error) < 0){
3112 video_enc->frame_rate = best->num;
3113 video_enc->frame_rate_base= best->den;
3116 video_enc->width = frame_width + frame_padright + frame_padleft;
3117 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3118 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3119 video_enc->pix_fmt = frame_pix_fmt;
3121 if(codec && codec->pix_fmts){
3122 const enum PixelFormat *p= codec->pix_fmts;
3124 if(*p == video_enc->pix_fmt)
3128 video_enc->pix_fmt = codec->pix_fmts[0];
3132 video_enc->gop_size = gop_size;
3134 video_enc->gop_size = 0;
3135 if (video_qscale || same_quality) {
3136 video_enc->flags |= CODEC_FLAG_QSCALE;
3137 video_enc->global_quality=
3138 st->quality = FF_QP2LAMBDA * video_qscale;
3142 video_enc->intra_matrix = intra_matrix;
3144 video_enc->inter_matrix = inter_matrix;
3147 video_enc->flags |= CODEC_FLAG_BITEXACT;
3149 video_enc->mb_decision = mb_decision;
3150 video_enc->mb_cmp = mb_cmp;
3151 video_enc->ildct_cmp = ildct_cmp;
3152 video_enc->me_sub_cmp = sub_cmp;
3153 video_enc->me_cmp = cmp;
3154 video_enc->me_pre_cmp = pre_cmp;
3155 video_enc->pre_me = pre_me;
3156 video_enc->lumi_masking = lumi_mask;
3157 video_enc->dark_masking = dark_mask;
3158 video_enc->spatial_cplx_masking = scplx_mask;
3159 video_enc->temporal_cplx_masking = tcplx_mask;
3160 video_enc->p_masking = p_mask;
3161 video_enc->quantizer_noise_shaping= qns;
3164 video_enc->flags |= CODEC_FLAG_H263P_UMV;
3167 video_enc->flags |= CODEC_FLAG_H263P_SLICE_STRUCT;
3170 video_enc->flags |= CODEC_FLAG_H263P_AIC;
3173 video_enc->flags |= CODEC_FLAG_H263P_AIV;
3176 video_enc->flags |= CODEC_FLAG_4MV;
3179 video_enc->flags |= CODEC_FLAG_OBMC;
3182 video_enc->flags |= CODEC_FLAG_LOOP_FILTER;
3186 video_enc->flags |= CODEC_FLAG_PART;
3189 video_enc->flags |= CODEC_FLAG_ALT_SCAN;
3192 video_enc->flags |= CODEC_FLAG_TRELLIS_QUANT;
3195 video_enc->flags |= CODEC_FLAG_MV0;
3197 if (do_normalize_aqp) {
3198 video_enc->flags |= CODEC_FLAG_NORMALIZE_AQP;
3200 if (use_scan_offset) {
3201 video_enc->flags |= CODEC_FLAG_SVCD_SCAN_OFFSET;
3204 video_enc->flags |= CODEC_FLAG_CLOSED_GOP;
3207 video_enc->flags2 |= CODEC_FLAG2_STRICT_GOP;
3210 video_enc->flags |= CODEC_FLAG_QPEL;
3213 video_enc->flags |= CODEC_FLAG_QP_RD;
3216 video_enc->flags |= CODEC_FLAG_CBP_RD;
3219 video_enc->max_b_frames = b_frames;
3220 video_enc->b_frame_strategy = 0;
3221 video_enc->b_quant_factor = 2.0;
3223 if (do_interlace_dct) {
3224 video_enc->flags |= CODEC_FLAG_INTERLACED_DCT;
3226 if (do_interlace_me) {
3227 video_enc->flags |= CODEC_FLAG_INTERLACED_ME;
3230 video_enc->flags2 |= CODEC_FLAG2_NO_OUTPUT;
3232 video_enc->qmin = video_qmin;
3233 video_enc->qmax = video_qmax;
3234 video_enc->lmin = video_lmin;
3235 video_enc->lmax = video_lmax;
3236 video_enc->rc_qsquish = video_qsquish;
3237 video_enc->luma_elim_threshold = video_lelim;
3238 video_enc->chroma_elim_threshold = video_celim;
3239 video_enc->mb_lmin = video_mb_lmin;
3240 video_enc->mb_lmax = video_mb_lmax;
3241 video_enc->max_qdiff = video_qdiff;
3242 video_enc->qblur = video_qblur;
3243 video_enc->qcompress = video_qcomp;
3244 video_enc->rc_eq = video_rc_eq;
3245 video_enc->debug = debug;
3246 video_enc->debug_mv = debug_mv;
3247 video_enc->thread_count = thread_count;
3248 p= video_rc_override_string;
3251 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3253 fprintf(stderr, "error parsing rc_override\n");
3256 video_enc->rc_override=
3257 av_realloc(video_enc->rc_override,
3258 sizeof(RcOverride)*(i+1));
3259 video_enc->rc_override[i].start_frame= start;
3260 video_enc->rc_override[i].end_frame = end;
3262 video_enc->rc_override[i].qscale= q;
3263 video_enc->rc_override[i].quality_factor= 1.0;
3266 video_enc->rc_override[i].qscale= 0;
3267 video_enc->rc_override[i].quality_factor= -q/100.0;
3272 video_enc->rc_override_count=i;
3274 video_enc->rc_max_rate = video_rc_max_rate;
3275 video_enc->rc_min_rate = video_rc_min_rate;
3276 video_enc->rc_buffer_size = video_rc_buffer_size;
3277 video_enc->rc_initial_buffer_occupancy = video_rc_buffer_size*3/4;
3278 video_enc->rc_buffer_aggressivity= video_rc_buffer_aggressivity;
3279 video_enc->rc_initial_cplx= video_rc_initial_cplx;
3280 video_enc->i_quant_factor = video_i_qfactor;
3281 video_enc->b_quant_factor = video_b_qfactor;
3282 video_enc->i_quant_offset = video_i_qoffset;
3283 video_enc->b_quant_offset = video_b_qoffset;
3284 video_enc->intra_quant_bias = video_intra_quant_bias;
3285 video_enc->inter_quant_bias = video_inter_quant_bias;
3286 video_enc->dct_algo = dct_algo;
3287 video_enc->idct_algo = idct_algo;
3288 video_enc->me_threshold= me_threshold;
3289 video_enc->mb_threshold= mb_threshold;
3290 video_enc->intra_dc_precision= intra_dc_precision - 8;
3291 video_enc->strict_std_compliance = strict;
3292 video_enc->error_rate = error_rate;
3293 video_enc->noise_reduction= noise_reduction;
3294 video_enc->scenechange_threshold= sc_threshold;
3295 video_enc->me_range = me_range;
3296 video_enc->coder_type= coder;
3297 video_enc->context_model= context;
3298 video_enc->prediction_method= predictor;
3299 video_enc->profile= video_profile;
3300 video_enc->level= video_level;
3301 video_enc->nsse_weight= nsse_weight;
3302 video_enc->me_subpel_quality= subpel_quality;
3303 video_enc->frame_skip_threshold= frame_skip_threshold;
3304 video_enc->frame_skip_factor= frame_skip_factor;
3305 video_enc->frame_skip_exp= frame_skip_exp;
3306 video_enc->frame_skip_cmp= frame_skip_cmp;
3309 video_enc->rtp_mode= 1;
3310 video_enc->rtp_payload_size= packet_size;
3314 video_enc->flags|= CODEC_FLAG_PSNR;
3316 video_enc->me_method = me_method;
3321 video_enc->flags |= CODEC_FLAG_PASS1;
3323 video_enc->flags |= CODEC_FLAG_PASS2;
3330 AVCodecContext *audio_enc;
3332 st = av_new_stream(oc, nb_streams++);
3334 fprintf(stderr, "Could not alloc stream\n");
3337 #if defined(HAVE_THREADS)
3339 avcodec_thread_init(&st->codec, thread_count);
3342 audio_enc = &st->codec;
3343 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3346 audio_enc->codec_tag= audio_codec_tag;
3348 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
3349 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3350 if (audio_stream_copy) {
3351 st->stream_copy = 1;
3352 audio_enc->channels = audio_channels;
3354 codec_id = av_guess_codec(file_oformat, NULL, filename, NULL, CODEC_TYPE_AUDIO);
3355 if (audio_codec_id != CODEC_ID_NONE)
3356 codec_id = audio_codec_id;
3357 audio_enc->codec_id = codec_id;
3359 audio_enc->bit_rate = audio_bit_rate;
3360 audio_enc->strict_std_compliance = strict;
3361 audio_enc->thread_count = thread_count;
3362 /* For audio codecs other than AC3 or DTS we limit */
3363 /* the number of coded channels to stereo */
3364 if (audio_channels > 2 && codec_id != CODEC_ID_AC3
3365 && codec_id != CODEC_ID_DTS) {
3366 audio_enc->channels = 2;
3368 audio_enc->channels = audio_channels;
3370 audio_enc->sample_rate = audio_sample_rate;
3373 oc->nb_streams = nb_streams;
3376 fprintf(stderr, "No audio or video streams available\n");
3380 oc->timestamp = rec_timestamp;
3383 pstrcpy(oc->title, sizeof(oc->title), str_title);
3385 pstrcpy(oc->author, sizeof(oc->author), str_author);
3387 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3389 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3392 output_files[nb_output_files++] = oc;
3394 pstrcpy(oc->filename, sizeof(oc->filename), filename);
3396 /* check filename in case of an image number is expected */
3397 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3398 if (filename_number_test(oc->filename) < 0) {
3399 print_error(oc->filename, AVERROR_NUMEXPECTED);
3404 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3405 /* test if it already exists to avoid loosing precious files */
3406 if (!file_overwrite &&
3407 (strchr(filename, ':') == NULL ||
3408 strstart(filename, "file:", NULL))) {
3409 if (url_exist(filename)) {
3412 if ( !using_stdin ) {
3413 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3416 if (toupper(c) != 'Y') {
3417 fprintf(stderr, "Not overwriting - exiting\n");
3422 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3429 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3430 fprintf(stderr, "Could not open '%s'\n", filename);
3435 memset(ap, 0, sizeof(*ap));
3436 ap->image_format = image_format;
3437 if (av_set_parameters(oc, ap) < 0) {
3438 fprintf(stderr, "%s: Invalid encoding parameters\n",
3443 oc->packet_size= mux_packet_size;
3444 oc->mux_rate= mux_rate;
3445 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3446 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3448 /* reset some options */
3449 file_oformat = NULL;
3450 file_iformat = NULL;
3451 image_format = NULL;
3454 audio_codec_id = CODEC_ID_NONE;
3455 video_codec_id = CODEC_ID_NONE;
3456 audio_stream_copy = 0;
3457 video_stream_copy = 0;
3460 /* prepare dummy protocols for grab */
3461 static void prepare_grab(void)
3463 int has_video, has_audio, i, j;
3464 AVFormatContext *oc;
3465 AVFormatContext *ic;
3466 AVFormatParameters vp1, *vp = &vp1;
3467 AVFormatParameters ap1, *ap = &ap1;
3469 /* see if audio/video inputs are needed */
3472 memset(ap, 0, sizeof(*ap));
3473 memset(vp, 0, sizeof(*vp));
3474 vp->frame_rate_base= 1;
3475 for(j=0;j<nb_output_files;j++) {
3476 oc = output_files[j];
3477 for(i=0;i<oc->nb_streams;i++) {
3478 AVCodecContext *enc = &oc->streams[i]->codec;
3479 switch(enc->codec_type) {
3480 case CODEC_TYPE_AUDIO:
3481 if (enc->sample_rate > ap->sample_rate)
3482 ap->sample_rate = enc->sample_rate;
3483 if (enc->channels > ap->channels)
3484 ap->channels = enc->channels;
3487 case CODEC_TYPE_VIDEO:
3488 if (enc->width > vp->width)
3489 vp->width = enc->width;
3490 if (enc->height > vp->height)
3491 vp->height = enc->height;
3493 if (vp->frame_rate_base*(int64_t)enc->frame_rate > enc->frame_rate_base*(int64_t)vp->frame_rate){
3494 vp->frame_rate = enc->frame_rate;
3495 vp->frame_rate_base = enc->frame_rate_base;
3505 if (has_video == 0 && has_audio == 0) {
3506 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3511 AVInputFormat *fmt1;
3512 fmt1 = av_find_input_format(video_grab_format);
3513 vp->device = video_device;
3514 vp->channel = video_channel;
3515 vp->standard = video_standard;
3516 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3517 fprintf(stderr, "Could not find video grab device\n");
3520 /* If not enough info to get the stream parameters, we decode the
3521 first frames to get it. */
3522 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3523 fprintf(stderr, "Could not find video grab parameters\n");
3526 /* by now video grab has one stream */
3527 ic->streams[0]->r_frame_rate = vp->frame_rate;
3528 ic->streams[0]->r_frame_rate_base = vp->frame_rate_base;
3529 input_files[nb_input_files] = ic;
3532 dump_format(ic, nb_input_files, "", 0);
3536 if (has_audio && audio_grab_format) {
3537 AVInputFormat *fmt1;
3538 fmt1 = av_find_input_format(audio_grab_format);
3539 ap->device = audio_device;
3540 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3541 fprintf(stderr, "Could not find audio grab device\n");
3544 input_files[nb_input_files] = ic;
3547 dump_format(ic, nb_input_files, "", 0);
3553 /* same option as mencoder */
3554 static void opt_pass(const char *pass_str)
3557 pass = atoi(pass_str);
3558 if (pass != 1 && pass != 2) {
3559 fprintf(stderr, "pass number can be only 1 or 2\n");
3565 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3566 static int64_t getutime(void)
3568 return av_gettime();
3571 static int64_t getutime(void)
3573 struct rusage rusage;
3575 getrusage(RUSAGE_SELF, &rusage);
3576 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3580 extern int ffm_nopts;
3582 static void opt_bitexact(void)
3585 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3589 static void show_formats(void)
3591 AVInputFormat *ifmt;
3592 AVOutputFormat *ofmt;
3593 AVImageFormat *image_fmt;
3596 const char **pp, *last_name;
3598 printf("File formats:\n");
3603 const char *name=NULL;
3604 const char *long_name=NULL;
3606 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3607 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3608 strcmp(ofmt->name, last_name)>0){
3610 long_name= ofmt->long_name;
3614 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3615 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3616 strcmp(ifmt->name, last_name)>0){
3618 long_name= ifmt->long_name;
3621 if(name && strcmp(ifmt->name, name)==0)
3633 long_name ? long_name:" ");
3637 printf("Image formats (filename extensions, if any, follow):\n");
3638 for(image_fmt = first_image_format; image_fmt != NULL;
3639 image_fmt = image_fmt->next) {
3642 image_fmt->img_read ? "D":" ",
3643 image_fmt->img_write ? "E":" ",
3645 image_fmt->extensions ? image_fmt->extensions:" ");
3649 printf("Codecs:\n");
3657 for(p = first_avcodec; p != NULL; p = p->next) {
3658 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3659 strcmp(p->name, last_name)>0){
3661 decode= encode= cap=0;
3663 if(p2 && strcmp(p->name, p2->name)==0){
3664 if(p->decode) decode=1;
3665 if(p->encode) encode=1;
3666 cap |= p->capabilities;
3671 last_name= p2->name;
3675 decode ? "D": (/*p2->decoder ? "d":*/" "),
3677 p2->type == CODEC_TYPE_AUDIO ? "A":"V",
3678 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3679 cap & CODEC_CAP_DR1 ? "D":" ",
3680 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3682 /* if(p2->decoder && decode==0)
3683 printf(" use %s for decoding", p2->decoder->name);*/
3688 printf("Supported file protocols:\n");
3689 for(up = first_protocol; up != NULL; up = up->next)
3690 printf(" %s:", up->name);
3693 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3694 printf("Motion estimation methods:\n");
3698 if ((pp - motion_str + 1) == ME_ZERO)
3699 printf("(fastest)");
3700 else if ((pp - motion_str + 1) == ME_FULL)
3701 printf("(slowest)");
3702 else if ((pp - motion_str + 1) == ME_EPZS)
3703 printf("(default)");
3708 "Note, the names of encoders and decoders dont always match, so there are\n"
3709 "several cases where the above table shows encoder only or decoder only entries\n"
3710 "even though both encoding and decoding are supported for example, the h263\n"
3711 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3716 void parse_matrix_coeffs(uint16_t *dest, const char *str)
3719 const char *p = str;
3726 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3733 void opt_inter_matrix(const char *arg)
3735 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3736 parse_matrix_coeffs(inter_matrix, arg);
3739 void opt_intra_matrix(const char *arg)
3741 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3742 parse_matrix_coeffs(intra_matrix, arg);
3745 static void opt_target(const char *arg)
3748 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3750 if(!strncmp(arg, "pal-", 4)) {
3753 } else if(!strncmp(arg, "ntsc-", 5)) {
3756 } else if(!strncmp(arg, "film-", 5)) {
3761 /* Calculate FR via float to avoid int overflow */
3762 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3765 } else if((fr == 29970) || (fr == 23976)) {
3768 /* Try to determine PAL/NTSC by peeking in the input files */
3769 if(nb_input_files) {
3771 for(j = 0; j < nb_input_files; j++) {
3772 for(i = 0; i < input_files[j]->nb_streams; i++) {
3773 AVCodecContext *c = &input_files[j]->streams[i]->codec;
3774 if(c->codec_type != CODEC_TYPE_VIDEO)
3776 fr = c->frame_rate * 1000 / c->frame_rate_base;
3780 } else if((fr == 29970) || (fr == 23976)) {
3790 if(verbose && norm >= 0)
3791 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3795 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3796 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3797 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3801 if(!strcmp(arg, "vcd")) {
3803 opt_video_codec("mpeg1video");
3804 opt_audio_codec("mp2");
3807 opt_frame_size(norm ? "352x240" : "352x288");
3808 opt_frame_rate(frame_rates[norm]);
3809 opt_gop_size(norm ? "18" : "15");
3811 video_bit_rate = 1150000;
3812 video_rc_max_rate = 1150000;
3813 video_rc_min_rate = 1150000;
3814 video_rc_buffer_size = 40*1024*8;
3816 audio_bit_rate = 224000;
3817 audio_sample_rate = 44100;
3819 mux_packet_size= 2324;
3820 mux_rate= 2352 * 75 * 8;
3822 /* We have to offset the PTS, so that it is consistent with the SCR.
3823 SCR starts at 36000, but the first two packs contain only padding
3824 and the first pack from the other stream, respectively, may also have
3825 been written before.
3826 So the real data starts at SCR 36000+3*1200. */
3827 mux_preload= (36000+3*1200) / 90000.0; //0.44
3828 } else if(!strcmp(arg, "svcd")) {
3830 opt_video_codec("mpeg2video");
3831 opt_audio_codec("mp2");
3834 opt_frame_size(norm ? "480x480" : "480x576");
3835 opt_frame_rate(frame_rates[norm]);
3836 opt_gop_size(norm ? "18" : "15");
3838 video_bit_rate = 2040000;
3839 video_rc_max_rate = 2516000;
3840 video_rc_min_rate = 0; //1145000;
3841 video_rc_buffer_size = 224*1024*8;
3842 use_scan_offset = 1;
3844 audio_bit_rate = 224000;
3845 audio_sample_rate = 44100;
3847 mux_packet_size= 2324;
3849 } else if(!strcmp(arg, "dvd")) {
3851 opt_video_codec("mpeg2video");
3852 opt_audio_codec("ac3");
3855 opt_frame_size(norm ? "720x480" : "720x576");
3856 opt_frame_rate(frame_rates[norm]);
3857 opt_gop_size(norm ? "18" : "15");
3859 video_bit_rate = 6000000;
3860 video_rc_max_rate = 9000000;
3861 video_rc_min_rate = 0; //1500000;
3862 video_rc_buffer_size = 224*1024*8;
3864 mux_packet_size= 2048; // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3865 mux_rate = 10080000; // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3867 audio_bit_rate = 448000;
3868 audio_sample_rate = 48000;
3870 } else if(!strcmp(arg, "dv")) {
3874 opt_frame_size(norm ? "720x480" : "720x576");
3875 opt_frame_rate(frame_rates[norm]);
3877 audio_sample_rate = 48000;
3881 fprintf(stderr, "Unknown target: %s\n", arg);
3886 static void show_version(void)
3888 fprintf(stderr, "ffmpeg " FFMPEG_VERSION "\n"
3891 avcodec_build(), LIBAVFORMAT_BUILD);
3895 const OptionDef options[] = {
3897 { "L", 0, {(void*)show_license}, "show license" },
3898 { "h", 0, {(void*)show_help}, "show help" },
3899 { "version", 0, {(void*)show_version}, "show version" },
3900 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3901 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3902 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
3903 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3904 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3905 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream" },
3906 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3907 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3908 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3909 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3910 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3911 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3912 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3913 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3914 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3915 { "debug", HAS_ARG | OPT_EXPERT, {(void*)opt_debug}, "print specific debug info", "" },
3916 { "vismv", HAS_ARG | OPT_EXPERT, {(void*)opt_vismv}, "visualize motion vectors", "" },
3917 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3918 "add timings for benchmarking" },
3919 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3920 "dump each input packet" },
3921 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3922 "when dumping packets, also dump the payload" },
3923 { "bitexact", OPT_EXPERT, {(void*)opt_bitexact}, "only use bit exact algorithms (for codec testing)" },
3924 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3925 { "loop", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3926 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3927 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3928 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3929 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3930 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3931 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3934 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
3935 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3936 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3937 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3938 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3939 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3940 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3941 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3942 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3943 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3944 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3945 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3946 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3947 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3948 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3949 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3950 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3951 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
3952 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3953 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3954 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3955 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
3956 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
3957 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
3958 { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
3959 { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
3960 { "mblmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmin}, "min macroblock quantiser scale (VBR)", "q" },
3961 { "mblmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmax}, "max macroblock quantiser scale (VBR)", "q" },
3962 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
3963 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
3964 { "qsquish", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qsquish}, "how to keep quantiser between qmin and qmax (0 = clip, 1 = use differentiable function)", "squish" },
3965 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
3966 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
3967 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
3968 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
3969 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
3970 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
3971 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
3972 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
3973 // { "b_strategy", HAS_ARG | OPT_EXPERT, {(void*)opt_b_strategy}, "dynamic b frame selection strategy", "strategy" },
3974 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3975 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3976 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
3977 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
3978 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
3979 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffer size (in kByte)", "size" },
3980 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3981 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
3983 { "dct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dct_algo}, "set dct algo", "algo" },
3984 { "idct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_idct_algo}, "set idct algo", "algo" },
3985 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
3986 { "mb_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_threshold}, "macroblock threshold", "" },
3987 { "er", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_resilience}, "set error resilience", "n" },
3988 { "ec", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_concealment}, "set error concealment", "bit_mask" },
3989 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
3990 { "hq", OPT_BOOL, {(void*)&mb_decision}, "activate high quality settings" },
3991 { "mbd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_decision}, "macroblock decision", "mode" },
3992 { "mbcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_cmp}, "macroblock compare function", "cmp function" },
3993 { "ildctcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ildct_cmp}, "ildct compare function", "cmp function" },
3994 { "subcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sub_cmp}, "subpel compare function", "cmp function" },
3995 { "cmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_cmp}, "fullpel compare function", "cmp function" },
3996 { "precmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_cmp}, "pre motion estimation compare function", "cmp function" },
3997 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
3998 { "lelim", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lelim}, "single coefficient elimination threshold for luminance (negative values also consider DC coefficient)", "elim" },
3999 { "celim", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_celim}, "single coefficient elimination threshold for chrominance (negative values also consider DC coefficient)", "elim" },
4000 { "lumi_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lumi_mask}, "luminance masking", "" },
4001 { "dark_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dark_mask}, "darkness masking", "" },
4002 { "scplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_scplx_mask}, "spatial complexity masking", "" },
4003 { "tcplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_tcplx_mask}, "temporal complexity masking", "" },
4004 { "p_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_p_mask}, "inter masking", "" },
4005 { "4mv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_4mv}, "use four motion vector by macroblock (MPEG4)" },
4006 { "obmc", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_obmc}, "use overlapped block motion compensation (h263+)" },
4007 { "lf", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_loop}, "use loop filter (h263+)" },
4008 { "part", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_part}, "use data partitioning (MPEG4)" },
4009 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
4010 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
4011 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
4012 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
4013 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4014 "use same video quality as source (implies VBR)" },
4015 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4016 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
4017 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4018 "deinterlace pictures" },
4019 { "ildct", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_dct},
4020 "force interlaced dct support in encoder (MPEG2/MPEG4)" },
4021 { "ilme", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_me},
4022 "force interlaced me support in encoder (MPEG2/MPEG4)" },
4023 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4024 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
4025 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
4026 { "aic", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aic}, "enable Advanced intra coding (h263+)" },
4027 { "aiv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aiv}, "enable Alternative inter vlc (h263+)" },
4028 { "umv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_umv}, "enable Unlimited Motion Vector (h263+)" },
4029 { "ssm", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_ss}, "enable Slice Structured mode (h263+)" },
4030 { "alt", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_alt_scan}, "enable alternate scantable (MPEG2/MPEG4)" },
4031 { "qprd", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qprd}, "" },
4032 { "cbp", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_cbprd}, "" },
4033 { "trell", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_trell}, "enable trellis quantization" },
4034 { "mv0", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_mv0}, "try to encode each MB with MV=<0,0> and choose the better one (has no effect if mbd=0)" },
4035 { "naq", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_normalize_aqp}, "normalize adaptive quantization" },
4036 { "cgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&closed_gop}, "closed gop" },
4037 { "sgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&strict_gop}, "strict gop" },
4038 { "noout", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&no_output}, "skip bitstream encoding" },
4039 { "scan_offset", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_scan_offset}, "enable SVCD Scan Offset placeholder" },
4040 { "qpel", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qpel}, "enable 1/4-pel" },
4041 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4042 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4043 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4044 { "nr", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_noise_reduction}, "noise reduction", "" },
4045 { "qns", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qns}, "quantization noise shaping", "" },
4046 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
4047 { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
4048 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4049 { "coder", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&coder}, "coder type", "" },
4050 { "context", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&context}, "context model", "" },
4051 { "pred", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&predictor}, "prediction method", "" },
4052 { "vprofile", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_profile}, "profile", "" },
4053 { "vlevel", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_level}, "level", "" },
4054 { "nssew", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&nsse_weight}, "weight", "" },
4055 { "subq", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&subpel_quality}, "", "" },
4056 { "lowres", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&lowres}, "", "" },
4057 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4058 { "skip_threshold", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_threshold}, "frame skip threshold", "threshold" },
4059 { "skip_factor", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_factor}, "frame skip factor", "factor" },
4060 { "skip_exp", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_exp}, "frame skip exponent", "exponent" },
4061 { "skip_cmp", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_cmp}, "frame skip compare function", "compare function" },
4064 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
4065 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4066 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4067 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4068 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4069 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4072 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
4073 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4074 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4075 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
4077 /* G.2 grab options */
4078 { "grab", HAS_ARG | OPT_EXPERT | OPT_GRAB, {(void*)opt_grab}, "request grabbing using", "format" },
4079 { "gd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_grab_device}, "set grab device", "device" },
4082 { "muxrate", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_rate}, "set mux rate", "rate" },
4083 { "packetsize", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_packet_size}, "set packet size", "size" },
4084 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4085 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4089 static void show_banner(void)
4091 fprintf(stderr, "ffmpeg version " FFMPEG_VERSION ", build %d, Copyright (c) 2000-2004 Fabrice Bellard\n",
4093 fprintf(stderr, " configuration: %s\n", FFMPEG_CONFIGURATION);
4094 fprintf(stderr, " built on " __DATE__ " " __TIME__);
4096 fprintf(stderr, ", gcc: %s\n", __VERSION__);
4098 fprintf(stderr, ", using a non-gcc compiler\n");
4102 static void show_license(void)
4107 "This program is free software; you can redistribute it and/or modify\n"
4108 "it under the terms of the GNU General Public License as published by\n"
4109 "the Free Software Foundation; either version 2 of the License, or\n"
4110 "(at your option) any later version.\n"
4112 "This program is distributed in the hope that it will be useful,\n"
4113 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
4114 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
4115 "GNU General Public License for more details.\n"
4117 "You should have received a copy of the GNU General Public License\n"
4118 "along with this program; if not, write to the Free Software\n"
4119 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
4123 "This library is free software; you can redistribute it and/or\n"
4124 "modify it under the terms of the GNU Lesser General Public\n"
4125 "License as published by the Free Software Foundation; either\n"
4126 "version 2 of the License, or (at your option) any later version.\n"
4128 "This library is distributed in the hope that it will be useful,\n"
4129 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
4130 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
4131 "Lesser General Public License for more details.\n"
4133 "You should have received a copy of the GNU Lesser General Public\n"
4134 "License along with this library; if not, write to the Free Software\n"
4135 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
4141 static void show_help(void)
4144 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
4145 "Hyper fast Audio and Video encoder\n");
4147 show_help_options(options, "Main options:\n",
4148 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
4149 show_help_options(options, "\nVideo options:\n",
4150 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4152 show_help_options(options, "\nAdvanced Video options:\n",
4153 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4154 OPT_VIDEO | OPT_EXPERT);
4155 show_help_options(options, "\nAudio options:\n",
4156 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4158 show_help_options(options, "\nAdvanced Audio options:\n",
4159 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4160 OPT_AUDIO | OPT_EXPERT);
4161 show_help_options(options, "\nAudio/Video grab options:\n",
4164 show_help_options(options, "\nAdvanced options:\n",
4165 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4170 void parse_arg_file(const char *filename)
4172 opt_output_file(filename);
4175 int main(int argc, char **argv)
4188 parse_options(argc, argv, options);
4190 /* file converter / grab */
4191 if (nb_output_files <= 0) {
4192 fprintf(stderr, "Must supply at least one output file\n");
4196 if (nb_input_files == 0) {
4202 av_encode(output_files, nb_output_files, input_files, nb_input_files,
4203 stream_maps, nb_stream_maps);
4204 ti = getutime() - ti;
4206 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
4210 for(i=0;i<nb_output_files;i++) {
4211 /* maybe av_close_output_file ??? */
4212 AVFormatContext *s = output_files[i];
4214 if (!(s->oformat->flags & AVFMT_NOFILE))
4216 for(j=0;j<s->nb_streams;j++)
4217 av_free(s->streams[j]);
4220 for(i=0;i<nb_input_files;i++)
4221 av_close_input_file(input_files[i]);
4226 av_free(intra_matrix);
4228 av_free(inter_matrix);
4230 #ifdef POWERPC_PERFORMANCE_REPORT
4231 extern void powerpc_display_perf_report(void);
4232 powerpc_display_perf_report();
4233 #endif /* POWERPC_PERFORMANCE_REPORT */
4235 #ifndef CONFIG_WIN32
4236 if (received_sigterm) {
4238 "Received signal %d: terminating.\n",
4239 (int) received_sigterm);
4243 exit(0); /* not all OS-es handle main() return value */