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 {
56 int sync_stream_index;
59 /** select an input file for an output file */
60 typedef struct AVMetaDataMap {
65 extern const OptionDef options[];
67 static void show_help(void);
68 static void show_license(void);
72 static AVFormatContext *input_files[MAX_FILES];
73 static int64_t input_files_ts_offset[MAX_FILES];
74 static int nb_input_files = 0;
76 static AVFormatContext *output_files[MAX_FILES];
77 static int nb_output_files = 0;
79 static AVStreamMap stream_maps[MAX_FILES];
80 static int nb_stream_maps;
82 static AVMetaDataMap meta_data_maps[MAX_FILES];
83 static int nb_meta_data_maps;
85 static AVInputFormat *file_iformat;
86 static AVOutputFormat *file_oformat;
87 static AVImageFormat *image_format;
88 static int frame_width = 0;
89 static int frame_height = 0;
90 static float frame_aspect_ratio = 0;
91 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
92 static int frame_padtop = 0;
93 static int frame_padbottom = 0;
94 static int frame_padleft = 0;
95 static int frame_padright = 0;
96 static int padcolor[3] = {16,128,128}; /* default to black */
97 static int frame_topBand = 0;
98 static int frame_bottomBand = 0;
99 static int frame_leftBand = 0;
100 static int frame_rightBand = 0;
101 static int max_frames[3] = {INT_MAX, INT_MAX, INT_MAX};
102 static int frame_rate = 25;
103 static int frame_rate_base = 1;
104 static int video_bit_rate = 200*1000;
105 static int video_bit_rate_tolerance = 4000*1000;
106 static float video_qscale = 0;
107 static int video_qmin = 2;
108 static int video_qmax = 31;
109 static int video_lmin = 2*FF_QP2LAMBDA;
110 static int video_lmax = 31*FF_QP2LAMBDA;
111 static int video_mb_lmin = 2*FF_QP2LAMBDA;
112 static int video_mb_lmax = 31*FF_QP2LAMBDA;
113 static int video_qdiff = 3;
114 static int video_lelim = 0;
115 static int video_celim = 0;
116 static float video_qblur = 0.5;
117 static float video_qsquish = 0.0;
118 static float video_qcomp = 0.5;
119 static uint16_t *intra_matrix = NULL;
120 static uint16_t *inter_matrix = NULL;
121 #if 0 //experimental, (can be removed)
122 static float video_rc_qsquish=1.0;
123 static float video_rc_qmod_amp=0;
124 static int video_rc_qmod_freq=0;
126 static char *video_rc_override_string=NULL;
127 static char *video_rc_eq="tex^qComp";
128 static int video_rc_buffer_size=0;
129 static float video_rc_buffer_aggressivity=1.0;
130 static int video_rc_max_rate=0;
131 static int video_rc_min_rate=0;
132 static float video_rc_initial_cplx=0;
133 static float video_b_qfactor = 1.25;
134 static float video_b_qoffset = 1.25;
135 static float video_i_qfactor = -0.8;
136 static float video_i_qoffset = 0.0;
137 static int video_intra_quant_bias= FF_DEFAULT_QUANT_BIAS;
138 static int video_inter_quant_bias= FF_DEFAULT_QUANT_BIAS;
139 static int me_method = ME_EPZS;
140 static int video_disable = 0;
141 static int video_discard = 0;
142 static int video_codec_id = CODEC_ID_NONE;
143 static int video_codec_tag = 0;
144 static int same_quality = 0;
145 static int b_frames = 0;
146 static int b_strategy = 0;
147 static int mb_decision = FF_MB_DECISION_SIMPLE;
148 static int ildct_cmp = FF_CMP_VSAD;
149 static int mb_cmp = FF_CMP_SAD;
150 static int sub_cmp = FF_CMP_SAD;
151 static int cmp = FF_CMP_SAD;
152 static int pre_cmp = FF_CMP_SAD;
153 static int pre_me = 0;
154 static float lumi_mask = 0;
155 static float dark_mask = 0;
156 static float scplx_mask = 0;
157 static float tcplx_mask = 0;
158 static float p_mask = 0;
159 static int use_4mv = 0;
160 static int use_obmc = 0;
161 static int use_loop = 0;
162 static int use_aic = 0;
163 static int use_aiv = 0;
164 static int use_umv = 0;
165 static int use_ss = 0;
166 static int use_alt_scan = 0;
167 static int use_trell = 0;
168 static int use_scan_offset = 0;
169 static int use_qpel = 0;
170 static int use_qprd = 0;
171 static int use_cbprd = 0;
172 static int use_mv0 = 0;
173 static int do_normalize_aqp = 0;
175 static int closed_gop = 0;
176 static int strict_gop = 0;
177 static int no_output = 0;
178 static int do_deinterlace = 0;
179 static int do_interlace_dct = 0;
180 static int do_interlace_me = 0;
181 static int workaround_bugs = FF_BUG_AUTODETECT;
182 static int error_resilience = 2;
183 static int error_concealment = 3;
184 static int dct_algo = 0;
185 static int idct_algo = 0;
186 static int use_part = 0;
187 static int packet_size = 0;
188 static int error_rate = 0;
189 static int strict = 0;
190 static int top_field_first = -1;
191 static int noise_reduction = 0;
192 static int sc_threshold = 0;
193 static int debug = 0;
194 static int debug_mv = 0;
195 static int me_threshold = 0;
196 static int mb_threshold = 0;
197 static int intra_dc_precision = 8;
198 static int coder = 0;
199 static int context = 0;
200 static int predictor = 0;
201 static int video_profile = FF_PROFILE_UNKNOWN;
202 static int video_level = FF_LEVEL_UNKNOWN;
203 static int nsse_weight = 8;
204 static int subpel_quality= 8;
205 static int me_penalty_compensation= 256;
206 static int lowres= 0;
207 static int frame_skip_threshold= 0;
208 static int frame_skip_factor= 0;
209 static int frame_skip_exp= 0;
210 static int frame_skip_cmp= FF_CMP_DCTMAX;
211 extern int loop_input; /* currently a hack */
212 static int gray_only = 0;
214 static int gop_size = 12;
215 static int intra_only = 0;
216 static int audio_sample_rate = 44100;
217 static int audio_bit_rate = 64000;
218 static int audio_disable = 0;
219 static int audio_channels = 1;
220 static int audio_codec_id = CODEC_ID_NONE;
221 static int audio_codec_tag = 0;
223 static int mux_rate= 0;
224 static int mux_packet_size= 0;
225 static float mux_preload= 0.5;
226 static float mux_max_delay= 0.7;
228 static int64_t recording_time = 0;
229 static int64_t start_time = 0;
230 static int64_t rec_timestamp = 0;
231 static int64_t input_ts_offset = 0;
232 static int file_overwrite = 0;
233 static char *str_title = NULL;
234 static char *str_author = NULL;
235 static char *str_copyright = NULL;
236 static char *str_comment = NULL;
237 static int do_benchmark = 0;
238 static int do_hex_dump = 0;
239 static int do_pkt_dump = 0;
240 static int do_psnr = 0;
241 static int do_vstats = 0;
242 static int do_pass = 0;
243 static int bitexact = 0;
244 static char *pass_logfilename = NULL;
245 static int audio_stream_copy = 0;
246 static int video_stream_copy = 0;
247 static int video_sync_method= 1;
248 static int audio_sync_method= 0;
249 static int copy_ts= 0;
250 static int opt_shortest = 0; //
252 static int rate_emu = 0;
254 static char *video_grab_format = "video4linux";
255 static char *video_device = NULL;
256 static char *grab_device = NULL;
257 static int video_channel = 0;
258 static char *video_standard = "ntsc";
260 static char *audio_grab_format = "audio_device";
261 static char *audio_device = NULL;
262 static int audio_volume = 256;
264 static int using_stdin = 0;
265 static int using_vhook = 0;
266 static int verbose = 1;
267 static int thread_count= 1;
268 static int q_pressed = 0;
269 static int me_range = 0;
270 static int64_t video_size = 0;
271 static int64_t audio_size = 0;
272 static int64_t extra_size = 0;
273 static int nb_frames_dup = 0;
274 static int nb_frames_drop = 0;
275 static int input_sync;
276 static int limit_filesize = 0; //
278 static int pgmyuv_compatibility_hack=0;
281 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
283 struct AVInputStream;
285 typedef struct AVOutputStream {
286 int file_index; /* file index */
287 int index; /* stream index in the output file */
288 int source_index; /* AVInputStream index */
289 AVStream *st; /* stream in the output file */
290 int encoding_needed; /* true if encoding needed for this stream */
292 /* input pts and corresponding output pts
294 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
295 struct AVInputStream *sync_ist; /* input stream to sync against */
296 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
298 int video_resample; /* video_resample and video_crop are mutually exclusive */
299 AVFrame pict_tmp; /* temporary image for resampling */
300 ImgReSampleContext *img_resample_ctx; /* for image resampling */
302 int video_crop; /* video_resample and video_crop are mutually exclusive */
303 int topBand; /* cropping area sizes */
306 int video_pad; /* video_resample and video_pad are mutually exclusive */
307 int padtop; /* padding area sizes */
314 ReSampleContext *resample; /* for audio resampling */
315 FifoBuffer fifo; /* for compression: one audio fifo per codec */
319 typedef struct AVInputStream {
323 int discard; /* true if stream data should be discarded */
324 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
325 int64_t sample_index; /* current sample */
327 int64_t start; /* time when read started */
328 unsigned long frame; /* current frame */
329 int64_t next_pts; /* synthetic pts for cases where pkt.pts
331 int64_t pts; /* current pts */
332 int is_start; /* is 1 at the start and after a discontinuity */
335 typedef struct AVInputFile {
336 int eof_reached; /* true if eof reached */
337 int ist_index; /* index of first stream in ist_table */
338 int buffer_size; /* current total buffer size */
339 int buffer_size_max; /* buffer size at which we consider we can stop
341 int nb_streams; /* nb streams we are aware of */
346 /* init terminal so that we can grab keys */
347 static struct termios oldtty;
349 static void term_exit(void)
351 tcsetattr (0, TCSANOW, &oldtty);
354 static volatile sig_atomic_t received_sigterm = 0;
357 sigterm_handler(int sig)
359 received_sigterm = sig;
363 static void term_init(void)
370 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
371 |INLCR|IGNCR|ICRNL|IXON);
372 tty.c_oflag |= OPOST;
373 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
374 tty.c_cflag &= ~(CSIZE|PARENB);
379 tcsetattr (0, TCSANOW, &tty);
381 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
382 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
383 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
385 register a function to be called at normal program termination
388 #ifdef CONFIG_BEOS_NETSERVER
389 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
393 /* read a key without blocking */
394 static int read_key(void)
398 #ifndef CONFIG_BEOS_NETSERVER
406 n = select(1, &rfds, NULL, NULL, &tv);
418 static int decode_interrupt_cb(void)
420 return q_pressed || (q_pressed = read_key() == 'q');
425 static volatile int received_sigterm = 0;
427 /* no interactive support */
428 static void term_exit(void)
432 static void term_init(void)
436 static int read_key(void)
443 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
448 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
451 /* copy stream format */
452 s->nb_streams = ic->nb_streams;
453 for(i=0;i<ic->nb_streams;i++) {
456 st = av_mallocz(sizeof(AVStream));
457 memcpy(st, ic->streams[i], sizeof(AVStream));
461 av_close_input_file(ic);
466 get_sync_ipts(const AVOutputStream *ost)
468 const AVInputStream *ist = ost->sync_ist;
469 return (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/AV_TIME_BASE;
472 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
474 static void do_audio_out(AVFormatContext *s,
477 unsigned char *buf, int size)
480 static uint8_t *audio_buf = NULL;
481 static uint8_t *audio_out = NULL;
482 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
484 int size_out, frame_bytes, ret;
485 AVCodecContext *enc= &ost->st->codec;
487 /* SC: dynamic allocation of buffers */
489 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
491 audio_out = av_malloc(audio_out_size);
492 if (!audio_buf || !audio_out)
493 return; /* Should signal an error ! */
495 if(audio_sync_method){
496 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
497 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2);
498 double idelta= delta*ist->st->codec.sample_rate / enc->sample_rate;
499 int byte_delta= ((int)idelta)*2*ist->st->codec.channels;
501 //FIXME resample delay
502 if(fabs(delta) > 50){
505 byte_delta= FFMAX(byte_delta, -size);
509 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
514 static uint8_t *input_tmp= NULL;
515 input_tmp= av_realloc(input_tmp, byte_delta + size);
517 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
520 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
522 memset(input_tmp, 0, byte_delta);
523 memcpy(input_tmp + byte_delta, buf, size);
527 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
529 }else if(audio_sync_method>1){
530 int comp= clip(delta, -audio_sync_method, audio_sync_method);
531 assert(ost->audio_resample);
533 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
534 // fprintf(stderr, "drift:%f len:%d opts:%lld ipts:%lld fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(get_sync_ipts(ost) * enc->sample_rate), fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2));
535 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
539 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
540 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2); //FIXME wrong
542 if (ost->audio_resample) {
544 size_out = audio_resample(ost->resample,
545 (short *)buftmp, (short *)buf,
546 size / (ist->st->codec.channels * 2));
547 size_out = size_out * enc->channels * 2;
553 /* now encode as many frames as possible */
554 if (enc->frame_size > 1) {
555 /* output resampled raw samples */
556 fifo_write(&ost->fifo, buftmp, size_out,
559 frame_bytes = enc->frame_size * 2 * enc->channels;
561 while (fifo_read(&ost->fifo, audio_buf, frame_bytes,
562 &ost->fifo.rptr) == 0) {
564 av_init_packet(&pkt);
566 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
569 pkt.stream_index= ost->index;
573 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
574 pkt.flags |= PKT_FLAG_KEY;
575 av_interleaved_write_frame(s, &pkt);
577 ost->sync_opts += enc->frame_size;
581 av_init_packet(&pkt);
583 ost->sync_opts += size_out / (2 * enc->channels);
585 /* output a pcm frame */
586 /* XXX: change encoding codec API to avoid this ? */
587 switch(enc->codec->id) {
588 case CODEC_ID_PCM_S16LE:
589 case CODEC_ID_PCM_S16BE:
590 case CODEC_ID_PCM_U16LE:
591 case CODEC_ID_PCM_U16BE:
594 size_out = size_out >> 1;
597 ret = avcodec_encode_audio(enc, audio_out, size_out,
600 pkt.stream_index= ost->index;
604 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
605 pkt.flags |= PKT_FLAG_KEY;
606 av_interleaved_write_frame(s, &pkt);
610 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
614 AVPicture picture_tmp;
617 dec = &ist->st->codec;
619 /* deinterlace : must be done before any resize */
620 if (do_deinterlace || using_vhook) {
623 /* create temporary picture */
624 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
625 buf = av_malloc(size);
629 picture2 = &picture_tmp;
630 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
633 if(avpicture_deinterlace(picture2, picture,
634 dec->pix_fmt, dec->width, dec->height) < 0) {
635 /* if error, do not deinterlace */
641 if (img_convert(picture2, dec->pix_fmt, picture,
642 dec->pix_fmt, dec->width, dec->height) < 0) {
643 /* if error, do not copy */
653 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
655 if (picture != picture2)
656 *picture = *picture2;
660 /* we begin to correct av delay at this threshold */
661 #define AV_DELAY_MAX 0.100
664 /* Expects img to be yuv420 */
665 static void fill_pad_region(AVPicture* img, int height, int width,
666 int padtop, int padbottom, int padleft, int padright, int *color) {
671 for (i = 0; i < 3; i++) {
672 shift = (i == 0) ? 0 : 1;
674 if (padtop || padleft) {
675 memset(img->data[i], color[i], (((img->linesize[i] * padtop) +
679 if (padleft || padright) {
680 optr = img->data[i] + (img->linesize[i] * (padtop >> shift)) +
681 (img->linesize[i] - (padright >> shift));
683 for (y = 0; y < ((height - (padtop + padbottom) - 1) >> shift); y++) {
684 memset(optr, color[i], (padleft + padright) >> shift);
685 optr += img->linesize[i];
689 if (padbottom || padright) {
690 optr = img->data[i] + (((img->linesize[i] * (height - padbottom)) - padright) >> shift);
691 memset(optr, color[i], (((img->linesize[i] * padbottom) + padright) >> shift));
696 static int bit_buffer_size= 1024*256;
697 static uint8_t *bit_buffer= NULL;
699 static void do_video_out(AVFormatContext *s,
705 int nb_frames, i, ret;
706 AVFrame *final_picture, *formatted_picture;
707 AVFrame picture_format_temp, picture_crop_temp;
708 uint8_t *buf = NULL, *buf1 = NULL;
709 AVCodecContext *enc, *dec;
710 enum PixelFormat target_pixfmt;
712 avcodec_get_frame_defaults(&picture_format_temp);
713 avcodec_get_frame_defaults(&picture_crop_temp);
715 enc = &ost->st->codec;
716 dec = &ist->st->codec;
718 /* by default, we output a single frame */
723 if(video_sync_method){
725 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
726 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
729 else if (vdelta > 1.1)
730 nb_frames = lrintf(vdelta);
731 //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);
735 fprintf(stderr, "*** drop!\n");
736 }else if (nb_frames > 1) {
737 nb_frames_dup += nb_frames;
739 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
742 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
744 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
748 /* convert pixel format if needed */
749 target_pixfmt = ost->video_resample || ost->video_pad
750 ? PIX_FMT_YUV420P : enc->pix_fmt;
751 if (dec->pix_fmt != target_pixfmt) {
754 /* create temporary picture */
755 size = avpicture_get_size(target_pixfmt, dec->width, dec->height);
756 buf = av_malloc(size);
759 formatted_picture = &picture_format_temp;
760 avpicture_fill((AVPicture*)formatted_picture, buf, target_pixfmt, dec->width, dec->height);
762 if (img_convert((AVPicture*)formatted_picture, target_pixfmt,
763 (AVPicture *)in_picture, dec->pix_fmt,
764 dec->width, dec->height) < 0) {
767 fprintf(stderr, "pixel format conversion not handled\n");
772 formatted_picture = in_picture;
775 /* XXX: resampling could be done before raw format conversion in
776 some cases to go faster */
777 /* XXX: only works for YUV420P */
778 if (ost->video_resample) {
779 final_picture = &ost->pict_tmp;
780 img_resample(ost->img_resample_ctx, (AVPicture*)final_picture, (AVPicture*)formatted_picture);
782 if (ost->padtop || ost->padbottom || ost->padleft || ost->padright) {
783 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
784 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
788 if (enc->pix_fmt != PIX_FMT_YUV420P) {
792 /* create temporary picture */
793 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
794 buf = av_malloc(size);
797 final_picture = &picture_format_temp;
798 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
800 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
801 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
802 enc->width, enc->height) < 0) {
805 fprintf(stderr, "pixel format conversion not handled\n");
810 } else if (ost->video_crop) {
811 picture_crop_temp.data[0] = formatted_picture->data[0] +
812 (ost->topBand * formatted_picture->linesize[0]) + ost->leftBand;
814 picture_crop_temp.data[1] = formatted_picture->data[1] +
815 ((ost->topBand >> 1) * formatted_picture->linesize[1]) +
816 (ost->leftBand >> 1);
818 picture_crop_temp.data[2] = formatted_picture->data[2] +
819 ((ost->topBand >> 1) * formatted_picture->linesize[2]) +
820 (ost->leftBand >> 1);
822 picture_crop_temp.linesize[0] = formatted_picture->linesize[0];
823 picture_crop_temp.linesize[1] = formatted_picture->linesize[1];
824 picture_crop_temp.linesize[2] = formatted_picture->linesize[2];
825 final_picture = &picture_crop_temp;
826 } else if (ost->video_pad) {
827 final_picture = &ost->pict_tmp;
829 for (i = 0; i < 3; i++) {
830 uint8_t *optr, *iptr;
831 int shift = (i == 0) ? 0 : 1;
834 /* set offset to start writing image into */
835 optr = final_picture->data[i] + (((final_picture->linesize[i] *
836 ost->padtop) + ost->padleft) >> shift);
837 iptr = formatted_picture->data[i];
839 yheight = (enc->height - ost->padtop - ost->padbottom) >> shift;
840 for (y = 0; y < yheight; y++) {
841 /* copy unpadded image row into padded image row */
842 memcpy(optr, iptr, formatted_picture->linesize[i]);
843 optr += final_picture->linesize[i];
844 iptr += formatted_picture->linesize[i];
848 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
849 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
852 if (enc->pix_fmt != PIX_FMT_YUV420P) {
856 /* create temporary picture */
857 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
858 buf = av_malloc(size);
861 final_picture = &picture_format_temp;
862 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
864 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
865 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
866 enc->width, enc->height) < 0) {
869 fprintf(stderr, "pixel format conversion not handled\n");
875 final_picture = formatted_picture;
877 /* duplicates frame if needed */
878 for(i=0;i<nb_frames;i++) {
880 av_init_packet(&pkt);
881 pkt.stream_index= ost->index;
883 if (s->oformat->flags & AVFMT_RAWPICTURE) {
884 /* raw pictures are written as AVPicture structure to
885 avoid any copies. We support temorarily the older
887 AVFrame* old_frame = enc->coded_frame;
888 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
889 pkt.data= (uint8_t *)final_picture;
890 pkt.size= sizeof(AVPicture);
892 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
893 if(dec->coded_frame && dec->coded_frame->key_frame)
894 pkt.flags |= PKT_FLAG_KEY;
896 av_interleaved_write_frame(s, &pkt);
897 enc->coded_frame = old_frame;
901 big_picture= *final_picture;
902 /* better than nothing: use input picture interlaced
904 big_picture.interlaced_frame = in_picture->interlaced_frame;
905 if(do_interlace_me || do_interlace_dct){
906 if(top_field_first == -1)
907 big_picture.top_field_first = in_picture->top_field_first;
909 big_picture.top_field_first = top_field_first;
912 /* handles sameq here. This is not correct because it may
913 not be a global option */
915 big_picture.quality = ist->st->quality;
917 big_picture.quality = ost->st->quality;
919 big_picture.pict_type = 0;
920 // big_picture.pts = AV_NOPTS_VALUE;
921 big_picture.pts= ost->sync_opts;
922 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
923 //av_log(NULL, AV_LOG_DEBUG, "%lld -> encoder\n", ost->sync_opts);
924 ret = avcodec_encode_video(enc,
925 bit_buffer, bit_buffer_size,
927 //enc->frame_number = enc->real_pict_num;
929 pkt.data= bit_buffer;
932 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
933 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %lld/%lld\n",
934 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
935 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
937 if(enc->coded_frame && enc->coded_frame->key_frame)
938 pkt.flags |= PKT_FLAG_KEY;
939 av_interleaved_write_frame(s, &pkt);
941 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
942 // enc->frame_number-1, enc->real_pict_num, ret,
944 /* if two pass, output log */
945 if (ost->logfile && enc->stats_out) {
946 fprintf(ost->logfile, "%s", enc->stats_out);
958 static double psnr(double d){
959 if(d==0) return INFINITY;
960 return -10.0*log(d)/log(10.0);
963 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
966 static FILE *fvstats=NULL;
973 double ti1, bitrate, avg_bitrate;
977 today = localtime(&today2);
978 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour,
981 fvstats = fopen(filename,"w");
989 enc = &ost->st->codec;
990 if (enc->codec_type == CODEC_TYPE_VIDEO) {
991 frame_number = ost->frame_number;
992 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
993 if (enc->flags&CODEC_FLAG_PSNR)
994 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
996 fprintf(fvstats,"f_size= %6d ", frame_size);
997 /* compute pts value */
998 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1002 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1003 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1004 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1005 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1006 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1010 static void print_report(AVFormatContext **output_files,
1011 AVOutputStream **ost_table, int nb_ostreams,
1015 AVOutputStream *ost;
1016 AVFormatContext *oc, *os;
1018 AVCodecContext *enc;
1019 int frame_number, vid, i;
1020 double bitrate, ti1, pts;
1021 static int64_t last_time = -1;
1023 if (!is_last_report) {
1025 /* display the report every 0.5 seconds */
1026 cur_time = av_gettime();
1027 if (last_time == -1) {
1028 last_time = cur_time;
1031 if ((cur_time - last_time) < 500000)
1033 last_time = cur_time;
1037 oc = output_files[0];
1039 total_size = url_ftell(&oc->pb);
1044 for(i=0;i<nb_ostreams;i++) {
1046 os = output_files[ost->file_index];
1047 enc = &ost->st->codec;
1048 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1049 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1050 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1052 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1053 frame_number = ost->frame_number;
1054 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d q=%2.1f ",
1055 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : 0);
1057 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1058 if (enc->flags&CODEC_FLAG_PSNR){
1060 double error, error_sum=0;
1061 double scale, scale_sum=0;
1062 char type[3]= {'Y','U','V'};
1063 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1066 error= enc->error[j];
1067 scale= enc->width*enc->height*255.0*255.0*frame_number;
1069 error= enc->coded_frame->error[j];
1070 scale= enc->width*enc->height*255.0*255.0;
1075 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1077 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1081 /* compute min output value */
1082 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1083 if ((pts < ti1) && (pts > 0))
1089 if (verbose || is_last_report) {
1090 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1092 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1093 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
1094 (double)total_size / 1024, ti1, bitrate);
1097 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1098 nb_frames_dup, nb_frames_drop);
1101 fprintf(stderr, "%s \r", buf);
1106 if (is_last_report && verbose >= 0){
1107 int64_t raw= audio_size + video_size + extra_size;
1108 fprintf(stderr, "\n");
1109 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1113 100.0*(total_size - raw)/raw
1118 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1119 static int output_packet(AVInputStream *ist, int ist_index,
1120 AVOutputStream **ost_table, int nb_ostreams,
1121 const AVPacket *pkt)
1123 AVFormatContext *os;
1124 AVOutputStream *ost;
1128 int data_size, got_picture;
1130 void *buffer_to_free;
1131 static int samples_size= 0;
1132 static short *samples= NULL;
1135 ist->pts= ist->next_pts; // needed for last packet if vsync=0
1136 } else if (pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1137 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1139 // assert(ist->pts == ist->next_pts);
1153 /* decode the packet if needed */
1154 data_buf = NULL; /* fail safe */
1156 if (ist->decoding_needed) {
1157 switch(ist->st->codec.codec_type) {
1158 case CODEC_TYPE_AUDIO:{
1160 samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE));
1161 /* XXX: could avoid copy if PCM 16 bits with same
1162 endianness as CPU */
1163 ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size,
1169 /* Some bug in mpeg audio decoder gives */
1170 /* data_size < 0, it seems they are overflows */
1171 if (data_size <= 0) {
1172 /* no audio frame */
1175 data_buf = (uint8_t *)samples;
1176 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1177 (ist->st->codec.sample_rate * ist->st->codec.channels);
1179 case CODEC_TYPE_VIDEO:
1180 data_size = (ist->st->codec.width * ist->st->codec.height * 3) / 2;
1181 /* XXX: allocate picture correctly */
1182 avcodec_get_frame_defaults(&picture);
1184 ret = avcodec_decode_video(&ist->st->codec,
1185 &picture, &got_picture, ptr, len);
1186 ist->st->quality= picture.quality;
1190 /* no picture yet */
1191 goto discard_packet;
1193 if (ist->st->codec.time_base.num != 0) {
1194 ist->next_pts += ((int64_t)AV_TIME_BASE *
1195 ist->st->codec.time_base.num) /
1196 ist->st->codec.time_base.den;
1204 switch(ist->st->codec.codec_type) {
1205 case CODEC_TYPE_AUDIO:
1206 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec.frame_size) /
1207 (ist->st->codec.sample_rate * ist->st->codec.channels);
1209 case CODEC_TYPE_VIDEO:
1210 if (ist->st->codec.time_base.num != 0) {
1211 ist->next_pts += ((int64_t)AV_TIME_BASE *
1212 ist->st->codec.time_base.num) /
1213 ist->st->codec.time_base.den;
1223 buffer_to_free = NULL;
1224 if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1225 pre_process_video_frame(ist, (AVPicture *)&picture,
1229 // preprocess audio (volume)
1230 if (ist->st->codec.codec_type == CODEC_TYPE_AUDIO) {
1231 if (audio_volume != 256) {
1234 for(i=0;i<(data_size / sizeof(short));i++) {
1235 int v = ((*volp) * audio_volume + 128) >> 8;
1236 if (v < -32768) v = -32768;
1237 if (v > 32767) v = 32767;
1243 /* frame rate emulation */
1244 if (ist->st->codec.rate_emu) {
1245 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec.time_base.num, 1000000, ist->st->codec.time_base.den);
1246 int64_t now = av_gettime() - ist->start;
1254 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1255 is the one of the next displayed one */
1256 /* XXX: add mpeg4 too ? */
1257 if (ist->st->codec.codec_id == CODEC_ID_MPEG1VIDEO) {
1258 if (ist->st->codec.pict_type != B_TYPE) {
1260 tmp = ist->last_ip_pts;
1261 ist->last_ip_pts = ist->frac_pts.val;
1262 ist->frac_pts.val = tmp;
1266 /* if output time reached then transcode raw format,
1267 encode packets and output them */
1268 if (start_time == 0 || ist->pts >= start_time)
1269 for(i=0;i<nb_ostreams;i++) {
1273 if (ost->source_index == ist_index) {
1274 os = output_files[ost->file_index];
1277 printf("%d: got pts=%0.3f %0.3f\n", i,
1278 (double)pkt->pts / AV_TIME_BASE,
1279 ((double)ist->pts / AV_TIME_BASE) -
1280 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1282 /* set the input output pts pairs */
1283 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1285 if (ost->encoding_needed) {
1286 switch(ost->st->codec.codec_type) {
1287 case CODEC_TYPE_AUDIO:
1288 do_audio_out(os, ost, ist, data_buf, data_size);
1290 case CODEC_TYPE_VIDEO:
1291 do_video_out(os, ost, ist, &picture, &frame_size);
1292 video_size += frame_size;
1293 if (do_vstats && frame_size)
1294 do_video_stats(os, ost, frame_size);
1300 AVFrame avframe; //FIXME/XXX remove this
1302 av_init_packet(&opkt);
1304 /* no reencoding needed : output the packet directly */
1305 /* force the input stream PTS */
1307 avcodec_get_frame_defaults(&avframe);
1308 ost->st->codec.coded_frame= &avframe;
1309 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1311 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO)
1312 audio_size += data_size;
1313 else if (ost->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1314 video_size += data_size;
1318 opkt.stream_index= ost->index;
1319 opkt.data= data_buf;
1320 opkt.size= data_size;
1321 if(pkt->pts != AV_NOPTS_VALUE)
1322 opkt.pts= av_rescale_q(av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q) + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
1324 opkt.pts= AV_NOPTS_VALUE;
1325 opkt.dts= av_rescale_q(av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q) + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
1326 opkt.flags= pkt->flags;
1328 av_interleaved_write_frame(os, &opkt);
1329 ost->st->codec.frame_number++;
1330 ost->frame_number++;
1334 av_free(buffer_to_free);
1340 for(i=0;i<nb_ostreams;i++) {
1342 if (ost->source_index == ist_index) {
1343 AVCodecContext *enc= &ost->st->codec;
1344 os = output_files[ost->file_index];
1346 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1348 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1351 if (ost->encoding_needed) {
1354 av_init_packet(&pkt);
1355 pkt.stream_index= ost->index;
1357 switch(ost->st->codec.codec_type) {
1358 case CODEC_TYPE_AUDIO:
1359 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1361 pkt.flags |= PKT_FLAG_KEY;
1363 case CODEC_TYPE_VIDEO:
1364 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1366 if(enc->coded_frame && enc->coded_frame->key_frame)
1367 pkt.flags |= PKT_FLAG_KEY;
1368 if (ost->logfile && enc->stats_out) {
1369 fprintf(ost->logfile, "%s", enc->stats_out);
1378 pkt.data= bit_buffer;
1380 if(enc->coded_frame)
1381 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1382 av_interleaved_write_frame(os, &pkt);
1396 * The following code is the main loop of the file converter
1398 static int av_encode(AVFormatContext **output_files,
1399 int nb_output_files,
1400 AVFormatContext **input_files,
1402 AVStreamMap *stream_maps, int nb_stream_maps)
1404 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1405 AVFormatContext *is, *os;
1406 AVCodecContext *codec, *icodec;
1407 AVOutputStream *ost, **ost_table = NULL;
1408 AVInputStream *ist, **ist_table = NULL;
1409 AVInputFile *file_table;
1410 AVFormatContext *stream_no_data;
1413 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1417 /* input stream init */
1419 for(i=0;i<nb_input_files;i++) {
1420 is = input_files[i];
1421 file_table[i].ist_index = j;
1422 file_table[i].nb_streams = is->nb_streams;
1423 j += is->nb_streams;
1427 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1431 for(i=0;i<nb_istreams;i++) {
1432 ist = av_mallocz(sizeof(AVInputStream));
1438 for(i=0;i<nb_input_files;i++) {
1439 is = input_files[i];
1440 for(k=0;k<is->nb_streams;k++) {
1441 ist = ist_table[j++];
1442 ist->st = is->streams[k];
1443 ist->file_index = i;
1445 ist->discard = 1; /* the stream is discarded by default
1448 if (ist->st->codec.rate_emu) {
1449 ist->start = av_gettime();
1455 /* output stream init */
1457 for(i=0;i<nb_output_files;i++) {
1458 os = output_files[i];
1459 nb_ostreams += os->nb_streams;
1461 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1462 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1466 /* Sanity check the mapping args -- do the input files & streams exist? */
1467 for(i=0;i<nb_stream_maps;i++) {
1468 int fi = stream_maps[i].file_index;
1469 int si = stream_maps[i].stream_index;
1471 if (fi < 0 || fi > nb_input_files - 1 ||
1472 si < 0 || si > file_table[fi].nb_streams - 1) {
1473 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1476 fi = stream_maps[i].sync_file_index;
1477 si = stream_maps[i].sync_stream_index;
1478 if (fi < 0 || fi > nb_input_files - 1 ||
1479 si < 0 || si > file_table[fi].nb_streams - 1) {
1480 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1485 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1488 for(i=0;i<nb_ostreams;i++) {
1489 ost = av_mallocz(sizeof(AVOutputStream));
1496 for(k=0;k<nb_output_files;k++) {
1497 os = output_files[k];
1498 for(i=0;i<os->nb_streams;i++) {
1500 ost = ost_table[n++];
1501 ost->file_index = k;
1503 ost->st = os->streams[i];
1504 if (nb_stream_maps > 0) {
1505 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1506 stream_maps[n-1].stream_index;
1508 /* Sanity check that the stream types match */
1509 if (ist_table[ost->source_index]->st->codec.codec_type != ost->st->codec.codec_type) {
1510 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1511 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1512 ost->file_index, ost->index);
1517 /* get corresponding input stream index : we select the first one with the right type */
1519 for(j=0;j<nb_istreams;j++) {
1522 ist->st->codec.codec_type == ost->st->codec.codec_type) {
1523 ost->source_index = j;
1530 /* try again and reuse existing stream */
1531 for(j=0;j<nb_istreams;j++) {
1533 if (ist->st->codec.codec_type == ost->st->codec.codec_type) {
1534 ost->source_index = j;
1539 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1540 ost->file_index, ost->index);
1545 ist = ist_table[ost->source_index];
1547 ost->sync_ist = (nb_stream_maps > 0) ?
1548 ist_table[file_table[stream_maps[n-1].sync_file_index].ist_index +
1549 stream_maps[n-1].sync_stream_index] : ist;
1553 /* for each output stream, we compute the right encoding parameters */
1554 for(i=0;i<nb_ostreams;i++) {
1556 ist = ist_table[ost->source_index];
1558 codec = &ost->st->codec;
1559 icodec = &ist->st->codec;
1561 if (ost->st->stream_copy) {
1562 /* if stream_copy is selected, no need to decode or encode */
1563 codec->codec_id = icodec->codec_id;
1564 codec->codec_type = icodec->codec_type;
1565 if(!codec->codec_tag) codec->codec_tag = icodec->codec_tag;
1566 codec->bit_rate = icodec->bit_rate;
1567 codec->extradata= icodec->extradata;
1568 codec->extradata_size= icodec->extradata_size;
1569 switch(codec->codec_type) {
1570 case CODEC_TYPE_AUDIO:
1571 codec->sample_rate = icodec->sample_rate;
1572 codec->channels = icodec->channels;
1573 codec->frame_size = icodec->frame_size;
1574 codec->block_align= icodec->block_align;
1576 case CODEC_TYPE_VIDEO:
1577 codec->time_base = icodec->time_base;
1578 codec->width = icodec->width;
1579 codec->height = icodec->height;
1580 codec->has_b_frames = icodec->has_b_frames;
1586 switch(codec->codec_type) {
1587 case CODEC_TYPE_AUDIO:
1588 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1591 if (codec->channels == icodec->channels &&
1592 codec->sample_rate == icodec->sample_rate) {
1593 ost->audio_resample = 0;
1595 if (codec->channels != icodec->channels &&
1596 (icodec->codec_id == CODEC_ID_AC3 ||
1597 icodec->codec_id == CODEC_ID_DTS)) {
1598 /* Special case for 5:1 AC3 and DTS input */
1599 /* and mono or stereo output */
1600 /* Request specific number of channels */
1601 icodec->channels = codec->channels;
1602 if (codec->sample_rate == icodec->sample_rate)
1603 ost->audio_resample = 0;
1605 ost->audio_resample = 1;
1608 ost->audio_resample = 1;
1611 if(audio_sync_method>1)
1612 ost->audio_resample = 1;
1614 if(ost->audio_resample){
1615 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1616 codec->sample_rate, icodec->sample_rate);
1618 printf("Can't resample. Aborting.\n");
1622 ist->decoding_needed = 1;
1623 ost->encoding_needed = 1;
1625 case CODEC_TYPE_VIDEO:
1626 if (codec->width == icodec->width &&
1627 codec->height == icodec->height &&
1628 frame_topBand == 0 &&
1629 frame_bottomBand == 0 &&
1630 frame_leftBand == 0 &&
1631 frame_rightBand == 0 &&
1632 frame_padtop == 0 &&
1633 frame_padbottom == 0 &&
1634 frame_padleft == 0 &&
1635 frame_padright == 0)
1637 ost->video_resample = 0;
1638 ost->video_crop = 0;
1640 } else if ((codec->width == icodec->width -
1641 (frame_leftBand + frame_rightBand)) &&
1642 (codec->height == icodec->height -
1643 (frame_topBand + frame_bottomBand)))
1645 ost->video_resample = 0;
1646 ost->video_crop = 1;
1647 ost->topBand = frame_topBand;
1648 ost->leftBand = frame_leftBand;
1649 } else if ((codec->width == icodec->width +
1650 (frame_padleft + frame_padright)) &&
1651 (codec->height == icodec->height +
1652 (frame_padtop + frame_padbottom))) {
1653 ost->video_resample = 0;
1654 ost->video_crop = 0;
1656 ost->padtop = frame_padtop;
1657 ost->padleft = frame_padleft;
1658 ost->padbottom = frame_padbottom;
1659 ost->padright = frame_padright;
1660 avcodec_get_frame_defaults(&ost->pict_tmp);
1661 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1662 codec->width, codec->height ) )
1665 ost->video_resample = 1;
1666 ost->video_crop = 0; // cropping is handled as part of resample
1667 avcodec_get_frame_defaults(&ost->pict_tmp);
1668 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1669 codec->width, codec->height ) )
1672 ost->img_resample_ctx = img_resample_full_init(
1673 ost->st->codec.width, ost->st->codec.height,
1674 ist->st->codec.width, ist->st->codec.height,
1675 frame_topBand, frame_bottomBand,
1676 frame_leftBand, frame_rightBand,
1677 frame_padtop, frame_padbottom,
1678 frame_padleft, frame_padright);
1680 ost->padtop = frame_padtop;
1681 ost->padleft = frame_padleft;
1682 ost->padbottom = frame_padbottom;
1683 ost->padright = frame_padright;
1686 ost->encoding_needed = 1;
1687 ist->decoding_needed = 1;
1693 if (ost->encoding_needed &&
1694 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1695 char logfilename[1024];
1700 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1702 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1703 if (codec->flags & CODEC_FLAG_PASS1) {
1704 f = fopen(logfilename, "w");
1706 perror(logfilename);
1711 /* read the log file */
1712 f = fopen(logfilename, "r");
1714 perror(logfilename);
1717 fseek(f, 0, SEEK_END);
1719 fseek(f, 0, SEEK_SET);
1720 logbuffer = av_malloc(size + 1);
1722 fprintf(stderr, "Could not allocate log buffer\n");
1725 size = fread(logbuffer, 1, size, f);
1727 logbuffer[size] = '\0';
1728 codec->stats_in = logbuffer;
1732 if(codec->codec_type == CODEC_TYPE_VIDEO){
1733 int size= codec->width * codec->height;
1734 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1739 bit_buffer = av_malloc(bit_buffer_size);
1743 /* dump the file output parameters - cannot be done before in case
1745 for(i=0;i<nb_output_files;i++) {
1746 dump_format(output_files[i], i, output_files[i]->filename, 1);
1749 /* dump the stream mapping */
1751 fprintf(stderr, "Stream mapping:\n");
1752 for(i=0;i<nb_ostreams;i++) {
1754 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1755 ist_table[ost->source_index]->file_index,
1756 ist_table[ost->source_index]->index,
1759 if (ost->sync_ist != ist_table[ost->source_index])
1760 fprintf(stderr, " [sync #%d.%d]",
1761 ost->sync_ist->file_index,
1762 ost->sync_ist->index);
1763 fprintf(stderr, "\n");
1767 /* open each encoder */
1768 for(i=0;i<nb_ostreams;i++) {
1770 if (ost->encoding_needed) {
1772 codec = avcodec_find_encoder(ost->st->codec.codec_id);
1774 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1775 ost->file_index, ost->index);
1778 if (avcodec_open(&ost->st->codec, codec) < 0) {
1779 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1780 ost->file_index, ost->index);
1783 extra_size += ost->st->codec.extradata_size;
1787 /* open each decoder */
1788 for(i=0;i<nb_istreams;i++) {
1790 if (ist->decoding_needed) {
1792 codec = avcodec_find_decoder(ist->st->codec.codec_id);
1794 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1795 ist->st->codec.codec_id, ist->file_index, ist->index);
1798 if (avcodec_open(&ist->st->codec, codec) < 0) {
1799 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1800 ist->file_index, ist->index);
1803 //if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO)
1804 // ist->st->codec.flags |= CODEC_FLAG_REPEAT_FIELD;
1809 for(i=0;i<nb_istreams;i++) {
1811 is = input_files[ist->file_index];
1813 ist->next_pts = av_rescale_q(ist->st->start_time, ist->st->time_base, AV_TIME_BASE_Q);
1814 if(ist->st->start_time == AV_NOPTS_VALUE)
1816 if(input_files_ts_offset[ist->file_index])
1817 ist->next_pts= AV_NOPTS_VALUE;
1821 /* compute buffer size max (should use a complete heuristic) */
1822 for(i=0;i<nb_input_files;i++) {
1823 file_table[i].buffer_size_max = 2048;
1826 /* set meta data information from input file if required */
1827 for (i=0;i<nb_meta_data_maps;i++) {
1828 AVFormatContext *out_file;
1829 AVFormatContext *in_file;
1831 int out_file_index = meta_data_maps[i].out_file;
1832 int in_file_index = meta_data_maps[i].in_file;
1833 if ( out_file_index < 0 || out_file_index >= nb_output_files ) {
1834 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1838 if ( in_file_index < 0 || in_file_index >= nb_input_files ) {
1839 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1844 out_file = output_files[out_file_index];
1845 in_file = input_files[in_file_index];
1847 strcpy(out_file->title, in_file->title);
1848 strcpy(out_file->author, in_file->author);
1849 strcpy(out_file->copyright, in_file->copyright);
1850 strcpy(out_file->comment, in_file->comment);
1851 strcpy(out_file->album, in_file->album);
1852 out_file->year = in_file->year;
1853 out_file->track = in_file->track;
1854 strcpy(out_file->genre, in_file->genre);
1857 /* open files and write file headers */
1858 for(i=0;i<nb_output_files;i++) {
1859 os = output_files[i];
1860 if (av_write_header(os) < 0) {
1861 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1867 #ifndef CONFIG_WIN32
1868 if ( !using_stdin && verbose >= 0) {
1869 fprintf(stderr, "Press [q] to stop encoding\n");
1870 url_set_interrupt_cb(decode_interrupt_cb);
1878 for(; received_sigterm == 0;) {
1879 int file_index, ist_index;
1887 /* if 'q' pressed, exits */
1891 /* read_key() returns 0 on EOF */
1897 /* select the stream that we must read now by looking at the
1898 smallest output pts */
1900 for(i=0;i<nb_ostreams;i++) {
1903 os = output_files[ost->file_index];
1904 ist = ist_table[ost->source_index];
1905 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1906 opts = ost->sync_opts * av_q2d(ost->st->codec.time_base);
1908 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
1909 ipts = (double)ist->pts;
1910 if (!file_table[ist->file_index].eof_reached){
1911 if(ipts < ipts_min) {
1913 if(input_sync ) file_index = ist->file_index;
1915 if(opts < opts_min) {
1917 if(!input_sync) file_index = ist->file_index;
1920 if(ost->frame_number >= max_frames[ost->st->codec.codec_type]){
1925 /* if none, if is finished */
1926 if (file_index < 0) {
1930 /* finish if recording time exhausted */
1931 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
1934 /* finish if limit size exhausted */
1935 if (limit_filesize != 0 && (limit_filesize * 1024) < url_ftell(&output_files[0]->pb))
1938 /* read a frame from it and output it in the fifo */
1939 is = input_files[file_index];
1940 if (av_read_frame(is, &pkt) < 0) {
1941 file_table[file_index].eof_reached = 1;
1942 if (opt_shortest) break; else continue; //
1946 stream_no_data = is;
1951 av_pkt_dump(stdout, &pkt, do_hex_dump);
1953 /* the following test is needed in case new streams appear
1954 dynamically in stream : we ignore them */
1955 if (pkt.stream_index >= file_table[file_index].nb_streams)
1956 goto discard_packet;
1957 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1958 ist = ist_table[ist_index];
1960 goto discard_packet;
1962 // 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);
1963 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
1964 int64_t delta= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q) - ist->next_pts;
1965 if(ABS(delta) > 10LL*AV_TIME_BASE && !copy_ts){
1966 input_files_ts_offset[ist->file_index]-= delta;
1968 fprintf(stderr, "timestamp discontinuity %lld, new offset= %lld\n", delta, input_files_ts_offset[ist->file_index]);
1969 for(i=0; i<file_table[file_index].nb_streams; i++){
1970 int index= file_table[file_index].ist_index + i;
1971 ist_table[index]->next_pts += delta;
1972 ist_table[index]->is_start=1;
1977 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1978 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1981 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1982 ist->file_index, ist->index);
1984 av_free_packet(&pkt);
1989 av_free_packet(&pkt);
1991 /* dump report by using the output first video and audio streams */
1992 print_report(output_files, ost_table, nb_ostreams, 0);
1995 /* at the end of stream, we must flush the decoder buffers */
1996 for(i=0;i<nb_istreams;i++) {
1998 if (ist->decoding_needed) {
1999 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2005 /* write the trailer if needed and close file */
2006 for(i=0;i<nb_output_files;i++) {
2007 os = output_files[i];
2008 av_write_trailer(os);
2011 /* dump report by using the first video and audio streams */
2012 print_report(output_files, ost_table, nb_ostreams, 1);
2014 /* close each encoder */
2015 for(i=0;i<nb_ostreams;i++) {
2017 if (ost->encoding_needed) {
2018 av_freep(&ost->st->codec.stats_in);
2019 avcodec_close(&ost->st->codec);
2023 /* close each decoder */
2024 for(i=0;i<nb_istreams;i++) {
2026 if (ist->decoding_needed) {
2027 avcodec_close(&ist->st->codec);
2035 av_freep(&bit_buffer);
2036 av_free(file_table);
2039 for(i=0;i<nb_istreams;i++) {
2046 for(i=0;i<nb_ostreams;i++) {
2050 fclose(ost->logfile);
2051 ost->logfile = NULL;
2053 fifo_free(&ost->fifo); /* works even if fifo is not
2054 initialized but set to zero */
2055 av_free(ost->pict_tmp.data[0]);
2056 if (ost->video_resample)
2057 img_resample_close(ost->img_resample_ctx);
2058 if (ost->audio_resample)
2059 audio_resample_close(ost->resample);
2072 int file_read(const char *filename)
2075 unsigned char buffer[1024];
2078 if (url_open(&h, filename, O_RDONLY) < 0) {
2079 printf("could not open '%s'\n", filename);
2083 len = url_read(h, buffer, sizeof(buffer));
2086 for(i=0;i<len;i++) putchar(buffer[i]);
2093 static void opt_image_format(const char *arg)
2097 for(f = first_image_format; f != NULL; f = f->next) {
2098 if (!strcmp(arg, f->name))
2102 fprintf(stderr, "Unknown image format: '%s'\n", arg);
2108 static void opt_format(const char *arg)
2110 /* compatibility stuff for pgmyuv */
2111 if (!strcmp(arg, "pgmyuv")) {
2112 pgmyuv_compatibility_hack=1;
2113 // opt_image_format(arg);
2117 file_iformat = av_find_input_format(arg);
2118 file_oformat = guess_format(arg, NULL, NULL);
2119 if (!file_iformat && !file_oformat) {
2120 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2125 static void opt_video_bitrate(const char *arg)
2127 video_bit_rate = atoi(arg) * 1000;
2130 static void opt_video_bitrate_tolerance(const char *arg)
2132 video_bit_rate_tolerance = atoi(arg) * 1000;
2135 static void opt_video_bitrate_max(const char *arg)
2137 video_rc_max_rate = atoi(arg) * 1000;
2140 static void opt_video_bitrate_min(const char *arg)
2142 video_rc_min_rate = atoi(arg) * 1000;
2145 static void opt_video_buffer_size(const char *arg)
2147 video_rc_buffer_size = atoi(arg) * 8*1024;
2150 static void opt_video_rc_eq(char *arg)
2155 static void opt_video_rc_override_string(char *arg)
2157 video_rc_override_string = arg;
2161 static void opt_workaround_bugs(const char *arg)
2163 workaround_bugs = atoi(arg);
2166 static void opt_dct_algo(const char *arg)
2168 dct_algo = atoi(arg);
2171 static void opt_idct_algo(const char *arg)
2173 idct_algo = atoi(arg);
2176 static void opt_me_threshold(const char *arg)
2178 me_threshold = atoi(arg);
2181 static void opt_mb_threshold(const char *arg)
2183 mb_threshold = atoi(arg);
2186 static void opt_error_resilience(const char *arg)
2188 error_resilience = atoi(arg);
2191 static void opt_error_concealment(const char *arg)
2193 error_concealment = atoi(arg);
2196 static void opt_debug(const char *arg)
2201 static void opt_vismv(const char *arg)
2203 debug_mv = atoi(arg);
2206 static void opt_verbose(const char *arg)
2208 verbose = atoi(arg);
2209 av_log_set_level(atoi(arg));
2212 static void opt_frame_rate(const char *arg)
2214 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
2215 fprintf(stderr, "Incorrect frame rate\n");
2220 static void opt_frame_crop_top(const char *arg)
2222 frame_topBand = atoi(arg);
2223 if (frame_topBand < 0) {
2224 fprintf(stderr, "Incorrect top crop size\n");
2227 if ((frame_topBand % 2) != 0) {
2228 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2231 if ((frame_topBand) >= frame_height){
2232 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2235 frame_height -= frame_topBand;
2238 static void opt_frame_crop_bottom(const char *arg)
2240 frame_bottomBand = atoi(arg);
2241 if (frame_bottomBand < 0) {
2242 fprintf(stderr, "Incorrect bottom crop size\n");
2245 if ((frame_bottomBand % 2) != 0) {
2246 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2249 if ((frame_bottomBand) >= frame_height){
2250 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2253 frame_height -= frame_bottomBand;
2256 static void opt_frame_crop_left(const char *arg)
2258 frame_leftBand = atoi(arg);
2259 if (frame_leftBand < 0) {
2260 fprintf(stderr, "Incorrect left crop size\n");
2263 if ((frame_leftBand % 2) != 0) {
2264 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2267 if ((frame_leftBand) >= frame_width){
2268 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2271 frame_width -= frame_leftBand;
2274 static void opt_frame_crop_right(const char *arg)
2276 frame_rightBand = atoi(arg);
2277 if (frame_rightBand < 0) {
2278 fprintf(stderr, "Incorrect right crop size\n");
2281 if ((frame_rightBand % 2) != 0) {
2282 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2285 if ((frame_rightBand) >= frame_width){
2286 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2289 frame_width -= frame_rightBand;
2292 static void opt_frame_size(const char *arg)
2294 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2295 fprintf(stderr, "Incorrect frame size\n");
2298 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2299 fprintf(stderr, "Frame size must be a multiple of 2\n");
2305 #define SCALEBITS 10
2306 #define ONE_HALF (1 << (SCALEBITS - 1))
2307 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2309 #define RGB_TO_Y(r, g, b) \
2310 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2311 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2313 #define RGB_TO_U(r1, g1, b1, shift)\
2314 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2315 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2317 #define RGB_TO_V(r1, g1, b1, shift)\
2318 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2319 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2321 static void opt_pad_color(const char *arg) {
2322 /* Input is expected to be six hex digits similar to
2323 how colors are expressed in html tags (but without the #) */
2324 int rgb = strtol(arg, NULL, 16);
2328 g = ((rgb >> 8) & 255);
2331 padcolor[0] = RGB_TO_Y(r,g,b);
2332 padcolor[1] = RGB_TO_U(r,g,b,0);
2333 padcolor[2] = RGB_TO_V(r,g,b,0);
2336 static void opt_frame_pad_top(const char *arg)
2338 frame_padtop = atoi(arg);
2339 if (frame_padtop < 0) {
2340 fprintf(stderr, "Incorrect top pad size\n");
2343 if ((frame_padtop % 2) != 0) {
2344 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2349 static void opt_frame_pad_bottom(const char *arg)
2351 frame_padbottom = atoi(arg);
2352 if (frame_padbottom < 0) {
2353 fprintf(stderr, "Incorrect bottom pad size\n");
2356 if ((frame_padbottom % 2) != 0) {
2357 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2363 static void opt_frame_pad_left(const char *arg)
2365 frame_padleft = atoi(arg);
2366 if (frame_padleft < 0) {
2367 fprintf(stderr, "Incorrect left pad size\n");
2370 if ((frame_padleft % 2) != 0) {
2371 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2377 static void opt_frame_pad_right(const char *arg)
2379 frame_padright = atoi(arg);
2380 if (frame_padright < 0) {
2381 fprintf(stderr, "Incorrect right pad size\n");
2384 if ((frame_padright % 2) != 0) {
2385 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2391 static void opt_frame_pix_fmt(const char *arg)
2393 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2396 static void opt_frame_aspect_ratio(const char *arg)
2402 p = strchr(arg, ':');
2404 x = strtol(arg, (char **)&arg, 10);
2406 y = strtol(arg+1, (char **)&arg, 10);
2408 ar = (double)x / (double)y;
2410 ar = strtod(arg, (char **)&arg);
2413 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2416 frame_aspect_ratio = ar;
2419 static void opt_gop_size(const char *arg)
2421 gop_size = atoi(arg);
2424 static void opt_b_frames(const char *arg)
2426 b_frames = atoi(arg);
2427 if (b_frames > FF_MAX_B_FRAMES) {
2428 fprintf(stderr, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES);
2430 } else if (b_frames < 1) {
2431 fprintf(stderr, "\nNumber of B frames must be higher than 0\n");
2436 static void opt_mb_decision(const char *arg)
2438 mb_decision = atoi(arg);
2441 static void opt_mb_cmp(const char *arg)
2446 static void opt_ildct_cmp(const char *arg)
2448 ildct_cmp = atoi(arg);
2451 static void opt_sub_cmp(const char *arg)
2453 sub_cmp = atoi(arg);
2456 static void opt_cmp(const char *arg)
2461 static void opt_pre_cmp(const char *arg)
2463 pre_cmp = atoi(arg);
2466 static void opt_pre_me(const char *arg)
2471 static void opt_lumi_mask(const char *arg)
2473 lumi_mask = atof(arg);
2476 static void opt_dark_mask(const char *arg)
2478 dark_mask = atof(arg);
2481 static void opt_scplx_mask(const char *arg)
2483 scplx_mask = atof(arg);
2486 static void opt_tcplx_mask(const char *arg)
2488 tcplx_mask = atof(arg);
2491 static void opt_p_mask(const char *arg)
2496 static void opt_qscale(const char *arg)
2498 video_qscale = atof(arg);
2499 if (video_qscale < 0.01 ||
2500 video_qscale > 255) {
2501 fprintf(stderr, "qscale must be >= 0.01 and <= 255\n");
2506 static void opt_qsquish(const char *arg)
2508 video_qsquish = atof(arg);
2509 if (video_qsquish < 0.0 ||
2510 video_qsquish > 99.0) {
2511 fprintf(stderr, "qsquish must be >= 0.0 and <= 99.0\n");
2516 static void opt_lelim(const char *arg)
2518 video_lelim = atoi(arg);
2519 if (video_lelim < -99 ||
2521 fprintf(stderr, "lelim must be >= -99 and <= 99\n");
2526 static void opt_celim(const char *arg)
2528 video_celim = atoi(arg);
2529 if (video_celim < -99 ||
2531 fprintf(stderr, "celim must be >= -99 and <= 99\n");
2536 static void opt_lmax(const char *arg)
2538 video_lmax = atof(arg)*FF_QP2LAMBDA;
2541 static void opt_lmin(const char *arg)
2543 video_lmin = atof(arg)*FF_QP2LAMBDA;
2546 static void opt_qmin(const char *arg)
2548 video_qmin = atoi(arg);
2549 if (video_qmin < 1 ||
2551 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2556 static void opt_qmax(const char *arg)
2558 video_qmax = atoi(arg);
2559 if (video_qmax < 1 ||
2561 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2566 static void opt_mb_lmin(const char *arg)
2568 video_mb_lmin = atof(arg)*FF_QP2LAMBDA;
2569 if (video_mb_lmin < 1 ||
2570 video_mb_lmin > FF_LAMBDA_MAX) {
2571 fprintf(stderr, "mblmin must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
2576 static void opt_mb_lmax(const char *arg)
2578 video_mb_lmax = atof(arg)*FF_QP2LAMBDA;
2579 if (video_mb_lmax < 1 ||
2580 video_mb_lmax > FF_LAMBDA_MAX) {
2581 fprintf(stderr, "mblmax must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
2586 static void opt_qdiff(const char *arg)
2588 video_qdiff = atoi(arg);
2589 if (video_qdiff < 0 ||
2591 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2596 static void opt_qblur(const char *arg)
2598 video_qblur = atof(arg);
2601 static void opt_qcomp(const char *arg)
2603 video_qcomp = atof(arg);
2606 static void opt_rc_initial_cplx(const char *arg)
2608 video_rc_initial_cplx = atof(arg);
2610 static void opt_b_qfactor(const char *arg)
2612 video_b_qfactor = atof(arg);
2614 static void opt_i_qfactor(const char *arg)
2616 video_i_qfactor = atof(arg);
2618 static void opt_b_qoffset(const char *arg)
2620 video_b_qoffset = atof(arg);
2622 static void opt_i_qoffset(const char *arg)
2624 video_i_qoffset = atof(arg);
2627 static void opt_ibias(const char *arg)
2629 video_intra_quant_bias = atoi(arg);
2631 static void opt_pbias(const char *arg)
2633 video_inter_quant_bias = atoi(arg);
2636 static void opt_packet_size(const char *arg)
2638 packet_size= atoi(arg);
2641 static void opt_error_rate(const char *arg)
2643 error_rate= atoi(arg);
2646 static void opt_strict(const char *arg)
2651 static void opt_top_field_first(const char *arg)
2653 top_field_first= atoi(arg);
2656 static void opt_noise_reduction(const char *arg)
2658 noise_reduction= atoi(arg);
2661 static void opt_qns(const char *arg)
2666 static void opt_sc_threshold(const char *arg)
2668 sc_threshold= atoi(arg);
2671 static void opt_me_range(const char *arg)
2673 me_range = atoi(arg);
2676 static void opt_thread_count(const char *arg)
2678 thread_count= atoi(arg);
2679 #if !defined(HAVE_THREADS)
2681 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2685 static void opt_audio_bitrate(const char *arg)
2687 audio_bit_rate = atoi(arg) * 1000;
2690 static void opt_audio_rate(const char *arg)
2692 audio_sample_rate = atoi(arg);
2695 static void opt_audio_channels(const char *arg)
2697 audio_channels = atoi(arg);
2700 static void opt_video_device(const char *arg)
2702 video_device = av_strdup(arg);
2705 static void opt_grab_device(const char *arg)
2707 grab_device = av_strdup(arg);
2710 static void opt_video_channel(const char *arg)
2712 video_channel = strtol(arg, NULL, 0);
2715 static void opt_video_standard(const char *arg)
2717 video_standard = av_strdup(arg);
2720 static void opt_audio_device(const char *arg)
2722 audio_device = av_strdup(arg);
2725 static void opt_audio_codec(const char *arg)
2729 if (!strcmp(arg, "copy")) {
2730 audio_stream_copy = 1;
2734 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_AUDIO)
2739 fprintf(stderr, "Unknown audio codec '%s'\n", arg);
2742 audio_codec_id = p->id;
2747 static void opt_audio_tag(const char *arg)
2750 audio_codec_tag= strtol(arg, &tail, 0);
2753 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2756 static void opt_video_tag(const char *arg)
2759 video_codec_tag= strtol(arg, &tail, 0);
2762 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2765 static void add_frame_hooker(const char *arg)
2770 char *args = av_strdup(arg);
2774 argv[0] = strtok(args, " ");
2775 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2778 i = frame_hook_add(argc, argv);
2781 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2786 const char *motion_str[] = {
2796 static void opt_motion_estimation(const char *arg)
2802 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2805 if (!strcmp(*p, arg))
2809 me_method = (p - motion_str) + 1;
2812 static void opt_video_codec(const char *arg)
2816 if (!strcmp(arg, "copy")) {
2817 video_stream_copy = 1;
2821 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_VIDEO)
2826 fprintf(stderr, "Unknown video codec '%s'\n", arg);
2829 video_codec_id = p->id;
2834 static void opt_map(const char *arg)
2840 m = &stream_maps[nb_stream_maps++];
2842 m->file_index = strtol(arg, (char **)&p, 0);
2846 m->stream_index = strtol(p, (char **)&p, 0);
2849 m->sync_file_index = strtol(p, (char **)&p, 0);
2852 m->sync_stream_index = strtol(p, (char **)&p, 0);
2854 m->sync_file_index = m->file_index;
2855 m->sync_stream_index = m->stream_index;
2859 static void opt_map_meta_data(const char *arg)
2865 m = &meta_data_maps[nb_meta_data_maps++];
2867 m->out_file = strtol(arg, (char **)&p, 0);
2871 m->in_file = strtol(p, (char **)&p, 0);
2874 static void opt_recording_time(const char *arg)
2876 recording_time = parse_date(arg, 1);
2879 static void opt_start_time(const char *arg)
2881 start_time = parse_date(arg, 1);
2884 static void opt_rec_timestamp(const char *arg)
2886 rec_timestamp = parse_date(arg, 0) / 1000000;
2889 static void opt_input_ts_offset(const char *arg)
2891 input_ts_offset = parse_date(arg, 1);
2894 static void opt_input_file(const char *filename)
2896 AVFormatContext *ic;
2897 AVFormatParameters params, *ap = ¶ms;
2898 int err, i, ret, rfps, rfps_base;
2901 if (!strcmp(filename, "-"))
2904 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2905 !strcmp( filename, "/dev/stdin" );
2907 /* get default parameters from command line */
2908 memset(ap, 0, sizeof(*ap));
2909 ap->sample_rate = audio_sample_rate;
2910 ap->channels = audio_channels;
2911 ap->time_base.den = frame_rate;
2912 ap->time_base.num = frame_rate_base;
2913 ap->width = frame_width + frame_padleft + frame_padright;
2914 ap->height = frame_height + frame_padtop + frame_padbottom;
2915 ap->image_format = image_format;
2916 ap->pix_fmt = frame_pix_fmt;
2917 ap->device = grab_device;
2918 ap->channel = video_channel;
2919 ap->standard = video_standard;
2920 ap->video_codec_id = video_codec_id;
2921 ap->audio_codec_id = audio_codec_id;
2922 if(pgmyuv_compatibility_hack)
2923 ap->video_codec_id= CODEC_ID_PGMYUV;
2925 /* open the input file with generic libav function */
2926 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2928 print_error(filename, err);
2932 /* If not enough info to get the stream parameters, we decode the
2933 first frames to get it. (used in mpeg case for example) */
2934 ret = av_find_stream_info(ic);
2935 if (ret < 0 && verbose >= 0) {
2936 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2940 timestamp = start_time;
2941 /* add the stream start time */
2942 if (ic->start_time != AV_NOPTS_VALUE)
2943 timestamp += ic->start_time;
2945 /* if seeking requested, we execute it */
2946 if (start_time != 0) {
2947 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2949 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2950 filename, (double)timestamp / AV_TIME_BASE);
2952 /* reset seek info */
2956 /* update the current parameters so that they match the one of the input stream */
2957 for(i=0;i<ic->nb_streams;i++) {
2958 AVCodecContext *enc = &ic->streams[i]->codec;
2959 #if defined(HAVE_THREADS)
2961 avcodec_thread_init(enc, thread_count);
2963 enc->thread_count= thread_count;
2964 switch(enc->codec_type) {
2965 case CODEC_TYPE_AUDIO:
2966 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2967 audio_channels = enc->channels;
2968 audio_sample_rate = enc->sample_rate;
2970 ic->streams[i]->discard= AVDISCARD_ALL;
2972 case CODEC_TYPE_VIDEO:
2973 frame_height = enc->height;
2974 frame_width = enc->width;
2975 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2976 frame_pix_fmt = enc->pix_fmt;
2977 rfps = ic->streams[i]->r_frame_rate.num;
2978 rfps_base = ic->streams[i]->r_frame_rate.den;
2979 enc->workaround_bugs = workaround_bugs;
2980 enc->error_resilience = error_resilience;
2981 enc->error_concealment = error_concealment;
2982 enc->idct_algo = idct_algo;
2984 enc->debug_mv = debug_mv;
2985 enc->lowres= lowres;
2986 if(lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2988 enc->flags|= CODEC_FLAG_BITEXACT;
2990 enc->debug |= FF_DEBUG_MV;
2992 enc->flags |= CODEC_FLAG_GRAY;
2994 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2997 fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2998 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
3000 (float)rfps / rfps_base, rfps, rfps_base);
3002 /* update the current frame rate to match the stream frame rate */
3004 frame_rate_base = rfps_base;
3006 enc->rate_emu = rate_emu;
3008 ic->streams[i]->discard= AVDISCARD_ALL;
3009 else if(video_discard)
3010 ic->streams[i]->discard= video_discard;
3012 case CODEC_TYPE_DATA:
3019 input_files[nb_input_files] = ic;
3020 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3021 /* dump the file content */
3023 dump_format(ic, nb_input_files, filename, 0);
3026 file_iformat = NULL;
3027 file_oformat = NULL;
3028 image_format = NULL;
3036 static void opt_grab(const char *arg)
3038 file_iformat = av_find_input_format(arg);
3042 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
3044 int has_video, has_audio, i, j;
3045 AVFormatContext *ic;
3049 for(j=0;j<nb_input_files;j++) {
3050 ic = input_files[j];
3051 for(i=0;i<ic->nb_streams;i++) {
3052 AVCodecContext *enc = &ic->streams[i]->codec;
3053 switch(enc->codec_type) {
3054 case CODEC_TYPE_AUDIO:
3057 case CODEC_TYPE_VIDEO:
3060 case CODEC_TYPE_DATA:
3067 *has_video_ptr = has_video;
3068 *has_audio_ptr = has_audio;
3071 static void opt_output_file(const char *filename)
3074 AVFormatContext *oc;
3075 int use_video, use_audio, nb_streams, input_has_video, input_has_audio;
3077 AVFormatParameters params, *ap = ¶ms;
3079 if (!strcmp(filename, "-"))
3082 oc = av_alloc_format_context();
3084 if (!file_oformat) {
3085 file_oformat = guess_format(NULL, filename, NULL);
3086 if (!file_oformat) {
3087 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
3093 oc->oformat = file_oformat;
3095 if (!strcmp(file_oformat->name, "ffm") &&
3096 strstart(filename, "http:", NULL)) {
3097 /* special case for files sent to ffserver: we get the stream
3098 parameters from ffserver */
3099 if (read_ffserver_streams(oc, filename) < 0) {
3100 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
3104 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy;
3105 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy;
3107 /* disable if no corresponding type found and at least one
3109 if (nb_input_files > 0) {
3110 check_audio_video_inputs(&input_has_video, &input_has_audio);
3111 if (!input_has_video)
3113 if (!input_has_audio)
3117 /* manual disable */
3118 if (audio_disable) {
3121 if (video_disable) {
3127 AVCodecContext *video_enc;
3129 st = av_new_stream(oc, nb_streams++);
3131 fprintf(stderr, "Could not alloc stream\n");
3134 #if defined(HAVE_THREADS)
3136 avcodec_thread_init(&st->codec, thread_count);
3139 video_enc = &st->codec;
3142 video_enc->codec_tag= video_codec_tag;
3144 if (file_oformat->flags & AVFMT_GLOBALHEADER)
3145 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3146 if (video_stream_copy) {
3147 st->stream_copy = 1;
3148 video_enc->codec_type = CODEC_TYPE_VIDEO;
3154 codec_id = av_guess_codec(file_oformat, NULL, filename, NULL, CODEC_TYPE_VIDEO);
3155 if (video_codec_id != CODEC_ID_NONE)
3156 codec_id = video_codec_id;
3158 video_enc->codec_id = codec_id;
3159 codec = avcodec_find_encoder(codec_id);
3161 video_enc->bit_rate = video_bit_rate;
3162 video_enc->bit_rate_tolerance = video_bit_rate_tolerance;
3163 video_enc->time_base.den = frame_rate;
3164 video_enc->time_base.num = frame_rate_base;
3165 if(codec && codec->supported_framerates){
3166 const AVRational *p= codec->supported_framerates;
3167 AVRational req= (AVRational){frame_rate, frame_rate_base};
3168 const AVRational *best=NULL;
3169 AVRational best_error= (AVRational){INT_MAX, 1};
3170 for(; p->den!=0; p++){
3171 AVRational error= av_sub_q(req, *p);
3172 if(error.num <0) error.num *= -1;
3173 if(av_cmp_q(error, best_error) < 0){
3178 video_enc->time_base.den= best->num;
3179 video_enc->time_base.num= best->den;
3182 video_enc->width = frame_width + frame_padright + frame_padleft;
3183 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3184 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3185 video_enc->pix_fmt = frame_pix_fmt;
3187 if(codec && codec->pix_fmts){
3188 const enum PixelFormat *p= codec->pix_fmts;
3190 if(*p == video_enc->pix_fmt)
3194 video_enc->pix_fmt = codec->pix_fmts[0];
3198 video_enc->gop_size = gop_size;
3200 video_enc->gop_size = 0;
3201 if (video_qscale || same_quality) {
3202 video_enc->flags |= CODEC_FLAG_QSCALE;
3203 video_enc->global_quality=
3204 st->quality = FF_QP2LAMBDA * video_qscale;
3208 video_enc->intra_matrix = intra_matrix;
3210 video_enc->inter_matrix = inter_matrix;
3213 video_enc->flags |= CODEC_FLAG_BITEXACT;
3215 video_enc->mb_decision = mb_decision;
3216 video_enc->mb_cmp = mb_cmp;
3217 video_enc->ildct_cmp = ildct_cmp;
3218 video_enc->me_sub_cmp = sub_cmp;
3219 video_enc->me_cmp = cmp;
3220 video_enc->me_pre_cmp = pre_cmp;
3221 video_enc->pre_me = pre_me;
3222 video_enc->lumi_masking = lumi_mask;
3223 video_enc->dark_masking = dark_mask;
3224 video_enc->spatial_cplx_masking = scplx_mask;
3225 video_enc->temporal_cplx_masking = tcplx_mask;
3226 video_enc->p_masking = p_mask;
3227 video_enc->quantizer_noise_shaping= qns;
3230 video_enc->flags |= CODEC_FLAG_H263P_UMV;
3233 video_enc->flags |= CODEC_FLAG_H263P_SLICE_STRUCT;
3236 video_enc->flags |= CODEC_FLAG_H263P_AIC;
3239 video_enc->flags |= CODEC_FLAG_H263P_AIV;
3242 video_enc->flags |= CODEC_FLAG_4MV;
3245 video_enc->flags |= CODEC_FLAG_OBMC;
3248 video_enc->flags |= CODEC_FLAG_LOOP_FILTER;
3252 video_enc->flags |= CODEC_FLAG_PART;
3255 video_enc->flags |= CODEC_FLAG_ALT_SCAN;
3258 video_enc->flags |= CODEC_FLAG_TRELLIS_QUANT;
3261 video_enc->flags |= CODEC_FLAG_MV0;
3263 if (do_normalize_aqp) {
3264 video_enc->flags |= CODEC_FLAG_NORMALIZE_AQP;
3266 if (use_scan_offset) {
3267 video_enc->flags |= CODEC_FLAG_SVCD_SCAN_OFFSET;
3270 video_enc->flags |= CODEC_FLAG_CLOSED_GOP;
3273 video_enc->flags2 |= CODEC_FLAG2_STRICT_GOP;
3276 video_enc->flags |= CODEC_FLAG_QPEL;
3279 video_enc->flags |= CODEC_FLAG_QP_RD;
3282 video_enc->flags |= CODEC_FLAG_CBP_RD;
3285 video_enc->max_b_frames = b_frames;
3286 video_enc->b_frame_strategy = b_strategy;
3287 video_enc->b_quant_factor = 2.0;
3289 if (do_interlace_dct) {
3290 video_enc->flags |= CODEC_FLAG_INTERLACED_DCT;
3292 if (do_interlace_me) {
3293 video_enc->flags |= CODEC_FLAG_INTERLACED_ME;
3296 video_enc->flags2 |= CODEC_FLAG2_NO_OUTPUT;
3299 video_enc->flags |= CODEC_FLAG_GRAY;
3301 video_enc->qmin = video_qmin;
3302 video_enc->qmax = video_qmax;
3303 video_enc->lmin = video_lmin;
3304 video_enc->lmax = video_lmax;
3305 video_enc->rc_qsquish = video_qsquish;
3306 video_enc->luma_elim_threshold = video_lelim;
3307 video_enc->chroma_elim_threshold = video_celim;
3308 video_enc->mb_lmin = video_mb_lmin;
3309 video_enc->mb_lmax = video_mb_lmax;
3310 video_enc->max_qdiff = video_qdiff;
3311 video_enc->qblur = video_qblur;
3312 video_enc->qcompress = video_qcomp;
3313 video_enc->rc_eq = video_rc_eq;
3314 video_enc->debug = debug;
3315 video_enc->debug_mv = debug_mv;
3316 video_enc->workaround_bugs = workaround_bugs;
3317 video_enc->thread_count = thread_count;
3318 p= video_rc_override_string;
3321 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3323 fprintf(stderr, "error parsing rc_override\n");
3326 video_enc->rc_override=
3327 av_realloc(video_enc->rc_override,
3328 sizeof(RcOverride)*(i+1));
3329 video_enc->rc_override[i].start_frame= start;
3330 video_enc->rc_override[i].end_frame = end;
3332 video_enc->rc_override[i].qscale= q;
3333 video_enc->rc_override[i].quality_factor= 1.0;
3336 video_enc->rc_override[i].qscale= 0;
3337 video_enc->rc_override[i].quality_factor= -q/100.0;
3342 video_enc->rc_override_count=i;
3344 video_enc->rc_max_rate = video_rc_max_rate;
3345 video_enc->rc_min_rate = video_rc_min_rate;
3346 video_enc->rc_buffer_size = video_rc_buffer_size;
3347 video_enc->rc_initial_buffer_occupancy = video_rc_buffer_size*3/4;
3348 video_enc->rc_buffer_aggressivity= video_rc_buffer_aggressivity;
3349 video_enc->rc_initial_cplx= video_rc_initial_cplx;
3350 video_enc->i_quant_factor = video_i_qfactor;
3351 video_enc->b_quant_factor = video_b_qfactor;
3352 video_enc->i_quant_offset = video_i_qoffset;
3353 video_enc->b_quant_offset = video_b_qoffset;
3354 video_enc->intra_quant_bias = video_intra_quant_bias;
3355 video_enc->inter_quant_bias = video_inter_quant_bias;
3356 video_enc->dct_algo = dct_algo;
3357 video_enc->idct_algo = idct_algo;
3358 video_enc->me_threshold= me_threshold;
3359 video_enc->mb_threshold= mb_threshold;
3360 video_enc->intra_dc_precision= intra_dc_precision - 8;
3361 video_enc->strict_std_compliance = strict;
3362 video_enc->error_rate = error_rate;
3363 video_enc->noise_reduction= noise_reduction;
3364 video_enc->scenechange_threshold= sc_threshold;
3365 video_enc->me_range = me_range;
3366 video_enc->coder_type= coder;
3367 video_enc->context_model= context;
3368 video_enc->prediction_method= predictor;
3369 video_enc->profile= video_profile;
3370 video_enc->level= video_level;
3371 video_enc->nsse_weight= nsse_weight;
3372 video_enc->me_subpel_quality= subpel_quality;
3373 video_enc->me_penalty_compensation= me_penalty_compensation;
3374 video_enc->frame_skip_threshold= frame_skip_threshold;
3375 video_enc->frame_skip_factor= frame_skip_factor;
3376 video_enc->frame_skip_exp= frame_skip_exp;
3377 video_enc->frame_skip_cmp= frame_skip_cmp;
3380 video_enc->rtp_mode= 1;
3381 video_enc->rtp_payload_size= packet_size;
3385 video_enc->flags|= CODEC_FLAG_PSNR;
3387 video_enc->me_method = me_method;
3392 video_enc->flags |= CODEC_FLAG_PASS1;
3394 video_enc->flags |= CODEC_FLAG_PASS2;
3401 AVCodecContext *audio_enc;
3403 st = av_new_stream(oc, nb_streams++);
3405 fprintf(stderr, "Could not alloc stream\n");
3408 #if defined(HAVE_THREADS)
3410 avcodec_thread_init(&st->codec, thread_count);
3413 audio_enc = &st->codec;
3414 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3417 audio_enc->codec_tag= audio_codec_tag;
3419 if (file_oformat->flags & AVFMT_GLOBALHEADER)
3420 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3421 if (audio_stream_copy) {
3422 st->stream_copy = 1;
3423 audio_enc->channels = audio_channels;
3425 codec_id = av_guess_codec(file_oformat, NULL, filename, NULL, CODEC_TYPE_AUDIO);
3426 if (audio_codec_id != CODEC_ID_NONE)
3427 codec_id = audio_codec_id;
3428 audio_enc->codec_id = codec_id;
3430 audio_enc->bit_rate = audio_bit_rate;
3431 audio_enc->strict_std_compliance = strict;
3432 audio_enc->thread_count = thread_count;
3433 /* For audio codecs other than AC3 or DTS we limit */
3434 /* the number of coded channels to stereo */
3435 if (audio_channels > 2 && codec_id != CODEC_ID_AC3
3436 && codec_id != CODEC_ID_DTS) {
3437 audio_enc->channels = 2;
3439 audio_enc->channels = audio_channels;
3441 audio_enc->sample_rate = audio_sample_rate;
3444 oc->nb_streams = nb_streams;
3447 fprintf(stderr, "No audio or video streams available\n");
3451 oc->timestamp = rec_timestamp;
3454 pstrcpy(oc->title, sizeof(oc->title), str_title);
3456 pstrcpy(oc->author, sizeof(oc->author), str_author);
3458 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3460 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3463 output_files[nb_output_files++] = oc;
3465 pstrcpy(oc->filename, sizeof(oc->filename), filename);
3467 /* check filename in case of an image number is expected */
3468 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3469 if (filename_number_test(oc->filename) < 0) {
3470 print_error(oc->filename, AVERROR_NUMEXPECTED);
3475 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3476 /* test if it already exists to avoid loosing precious files */
3477 if (!file_overwrite &&
3478 (strchr(filename, ':') == NULL ||
3479 strstart(filename, "file:", NULL))) {
3480 if (url_exist(filename)) {
3483 if ( !using_stdin ) {
3484 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3487 if (toupper(c) != 'Y') {
3488 fprintf(stderr, "Not overwriting - exiting\n");
3493 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3500 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3501 fprintf(stderr, "Could not open '%s'\n", filename);
3506 memset(ap, 0, sizeof(*ap));
3507 ap->image_format = image_format;
3508 if (av_set_parameters(oc, ap) < 0) {
3509 fprintf(stderr, "%s: Invalid encoding parameters\n",
3514 oc->packet_size= mux_packet_size;
3515 oc->mux_rate= mux_rate;
3516 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3517 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3519 /* reset some options */
3520 file_oformat = NULL;
3521 file_iformat = NULL;
3522 image_format = NULL;
3525 audio_codec_id = CODEC_ID_NONE;
3526 video_codec_id = CODEC_ID_NONE;
3527 audio_stream_copy = 0;
3528 video_stream_copy = 0;
3531 /* prepare dummy protocols for grab */
3532 static void prepare_grab(void)
3534 int has_video, has_audio, i, j;
3535 AVFormatContext *oc;
3536 AVFormatContext *ic;
3537 AVFormatParameters vp1, *vp = &vp1;
3538 AVFormatParameters ap1, *ap = &ap1;
3540 /* see if audio/video inputs are needed */
3543 memset(ap, 0, sizeof(*ap));
3544 memset(vp, 0, sizeof(*vp));
3545 vp->time_base.num= 1;
3546 for(j=0;j<nb_output_files;j++) {
3547 oc = output_files[j];
3548 for(i=0;i<oc->nb_streams;i++) {
3549 AVCodecContext *enc = &oc->streams[i]->codec;
3550 switch(enc->codec_type) {
3551 case CODEC_TYPE_AUDIO:
3552 if (enc->sample_rate > ap->sample_rate)
3553 ap->sample_rate = enc->sample_rate;
3554 if (enc->channels > ap->channels)
3555 ap->channels = enc->channels;
3558 case CODEC_TYPE_VIDEO:
3559 if (enc->width > vp->width)
3560 vp->width = enc->width;
3561 if (enc->height > vp->height)
3562 vp->height = enc->height;
3564 if (vp->time_base.num*(int64_t)enc->time_base.den > enc->time_base.num*(int64_t)vp->time_base.den){
3565 vp->time_base = enc->time_base;
3575 if (has_video == 0 && has_audio == 0) {
3576 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3581 AVInputFormat *fmt1;
3582 fmt1 = av_find_input_format(video_grab_format);
3583 vp->device = video_device;
3584 vp->channel = video_channel;
3585 vp->standard = video_standard;
3586 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3587 fprintf(stderr, "Could not find video grab device\n");
3590 /* If not enough info to get the stream parameters, we decode the
3591 first frames to get it. */
3592 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3593 fprintf(stderr, "Could not find video grab parameters\n");
3596 /* by now video grab has one stream */
3597 ic->streams[0]->r_frame_rate.num = vp->time_base.den;
3598 ic->streams[0]->r_frame_rate.den = vp->time_base.num;
3599 input_files[nb_input_files] = ic;
3602 dump_format(ic, nb_input_files, "", 0);
3606 if (has_audio && audio_grab_format) {
3607 AVInputFormat *fmt1;
3608 fmt1 = av_find_input_format(audio_grab_format);
3609 ap->device = audio_device;
3610 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3611 fprintf(stderr, "Could not find audio grab device\n");
3614 input_files[nb_input_files] = ic;
3617 dump_format(ic, nb_input_files, "", 0);
3623 /* same option as mencoder */
3624 static void opt_pass(const char *pass_str)
3627 pass = atoi(pass_str);
3628 if (pass != 1 && pass != 2) {
3629 fprintf(stderr, "pass number can be only 1 or 2\n");
3635 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3636 static int64_t getutime(void)
3638 return av_gettime();
3641 static int64_t getutime(void)
3643 struct rusage rusage;
3645 getrusage(RUSAGE_SELF, &rusage);
3646 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3650 extern int ffm_nopts;
3652 static void opt_bitexact(void)
3655 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3659 static void show_formats(void)
3661 AVInputFormat *ifmt;
3662 AVOutputFormat *ofmt;
3663 AVImageFormat *image_fmt;
3666 const char **pp, *last_name;
3668 printf("File formats:\n");
3673 const char *name=NULL;
3674 const char *long_name=NULL;
3676 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3677 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3678 strcmp(ofmt->name, last_name)>0){
3680 long_name= ofmt->long_name;
3684 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3685 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3686 strcmp(ifmt->name, last_name)>0){
3688 long_name= ifmt->long_name;
3691 if(name && strcmp(ifmt->name, name)==0)
3703 long_name ? long_name:" ");
3707 printf("Image formats (filename extensions, if any, follow):\n");
3708 for(image_fmt = first_image_format; image_fmt != NULL;
3709 image_fmt = image_fmt->next) {
3712 image_fmt->img_read ? "D":" ",
3713 image_fmt->img_write ? "E":" ",
3715 image_fmt->extensions ? image_fmt->extensions:" ");
3719 printf("Codecs:\n");
3727 for(p = first_avcodec; p != NULL; p = p->next) {
3728 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3729 strcmp(p->name, last_name)>0){
3731 decode= encode= cap=0;
3733 if(p2 && strcmp(p->name, p2->name)==0){
3734 if(p->decode) decode=1;
3735 if(p->encode) encode=1;
3736 cap |= p->capabilities;
3741 last_name= p2->name;
3745 decode ? "D": (/*p2->decoder ? "d":*/" "),
3747 p2->type == CODEC_TYPE_AUDIO ? "A":"V",
3748 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3749 cap & CODEC_CAP_DR1 ? "D":" ",
3750 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3752 /* if(p2->decoder && decode==0)
3753 printf(" use %s for decoding", p2->decoder->name);*/
3758 printf("Supported file protocols:\n");
3759 for(up = first_protocol; up != NULL; up = up->next)
3760 printf(" %s:", up->name);
3763 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3764 printf("Motion estimation methods:\n");
3768 if ((pp - motion_str + 1) == ME_ZERO)
3769 printf("(fastest)");
3770 else if ((pp - motion_str + 1) == ME_FULL)
3771 printf("(slowest)");
3772 else if ((pp - motion_str + 1) == ME_EPZS)
3773 printf("(default)");
3778 "Note, the names of encoders and decoders dont always match, so there are\n"
3779 "several cases where the above table shows encoder only or decoder only entries\n"
3780 "even though both encoding and decoding are supported for example, the h263\n"
3781 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3786 void parse_matrix_coeffs(uint16_t *dest, const char *str)
3789 const char *p = str;
3796 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3803 void opt_inter_matrix(const char *arg)
3805 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3806 parse_matrix_coeffs(inter_matrix, arg);
3809 void opt_intra_matrix(const char *arg)
3811 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3812 parse_matrix_coeffs(intra_matrix, arg);
3815 static void opt_target(const char *arg)
3818 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3820 if(!strncmp(arg, "pal-", 4)) {
3823 } else if(!strncmp(arg, "ntsc-", 5)) {
3826 } else if(!strncmp(arg, "film-", 5)) {
3831 /* Calculate FR via float to avoid int overflow */
3832 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3835 } else if((fr == 29970) || (fr == 23976)) {
3838 /* Try to determine PAL/NTSC by peeking in the input files */
3839 if(nb_input_files) {
3841 for(j = 0; j < nb_input_files; j++) {
3842 for(i = 0; i < input_files[j]->nb_streams; i++) {
3843 AVCodecContext *c = &input_files[j]->streams[i]->codec;
3844 if(c->codec_type != CODEC_TYPE_VIDEO)
3846 fr = c->time_base.den * 1000 / c->time_base.num;
3850 } else if((fr == 29970) || (fr == 23976)) {
3860 if(verbose && norm >= 0)
3861 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3865 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3866 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3867 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3871 if(!strcmp(arg, "vcd")) {
3873 opt_video_codec("mpeg1video");
3874 opt_audio_codec("mp2");
3877 opt_frame_size(norm ? "352x240" : "352x288");
3878 opt_frame_rate(frame_rates[norm]);
3879 opt_gop_size(norm ? "18" : "15");
3881 video_bit_rate = 1150000;
3882 video_rc_max_rate = 1150000;
3883 video_rc_min_rate = 1150000;
3884 video_rc_buffer_size = 40*1024*8;
3886 audio_bit_rate = 224000;
3887 audio_sample_rate = 44100;
3889 mux_packet_size= 2324;
3890 mux_rate= 2352 * 75 * 8;
3892 /* We have to offset the PTS, so that it is consistent with the SCR.
3893 SCR starts at 36000, but the first two packs contain only padding
3894 and the first pack from the other stream, respectively, may also have
3895 been written before.
3896 So the real data starts at SCR 36000+3*1200. */
3897 mux_preload= (36000+3*1200) / 90000.0; //0.44
3898 } else if(!strcmp(arg, "svcd")) {
3900 opt_video_codec("mpeg2video");
3901 opt_audio_codec("mp2");
3904 opt_frame_size(norm ? "480x480" : "480x576");
3905 opt_frame_rate(frame_rates[norm]);
3906 opt_gop_size(norm ? "18" : "15");
3908 video_bit_rate = 2040000;
3909 video_rc_max_rate = 2516000;
3910 video_rc_min_rate = 0; //1145000;
3911 video_rc_buffer_size = 224*1024*8;
3912 use_scan_offset = 1;
3914 audio_bit_rate = 224000;
3915 audio_sample_rate = 44100;
3917 mux_packet_size= 2324;
3919 } else if(!strcmp(arg, "dvd")) {
3921 opt_video_codec("mpeg2video");
3922 opt_audio_codec("ac3");
3925 opt_frame_size(norm ? "720x480" : "720x576");
3926 opt_frame_rate(frame_rates[norm]);
3927 opt_gop_size(norm ? "18" : "15");
3929 video_bit_rate = 6000000;
3930 video_rc_max_rate = 9000000;
3931 video_rc_min_rate = 0; //1500000;
3932 video_rc_buffer_size = 224*1024*8;
3934 mux_packet_size= 2048; // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3935 mux_rate = 10080000; // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3937 audio_bit_rate = 448000;
3938 audio_sample_rate = 48000;
3940 } else if(!strcmp(arg, "dv")) {
3944 opt_frame_size(norm ? "720x480" : "720x576");
3945 opt_frame_rate(frame_rates[norm]);
3947 audio_sample_rate = 48000;
3951 fprintf(stderr, "Unknown target: %s\n", arg);
3956 static void show_version(void)
3958 fprintf(stderr, "ffmpeg " FFMPEG_VERSION "\n"
3961 avcodec_build(), LIBAVFORMAT_BUILD);
3965 const OptionDef options[] = {
3967 { "L", 0, {(void*)show_license}, "show license" },
3968 { "h", 0, {(void*)show_help}, "show help" },
3969 { "version", 0, {(void*)show_version}, "show version" },
3970 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3971 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3972 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
3973 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3974 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3975 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3976 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3977 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3978 { "fs", HAS_ARG | OPT_INT, {(void*)&limit_filesize}, "set the limit file size", "limit_size" }, //
3979 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3980 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3981 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3982 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3983 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3984 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3985 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3986 { "debug", HAS_ARG | OPT_EXPERT, {(void*)opt_debug}, "print specific debug info", "" },
3987 { "vismv", HAS_ARG | OPT_EXPERT, {(void*)opt_vismv}, "visualize motion vectors", "" },
3988 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3989 "add timings for benchmarking" },
3990 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3991 "dump each input packet" },
3992 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3993 "when dumping packets, also dump the payload" },
3994 { "bitexact", OPT_EXPERT, {(void*)opt_bitexact}, "only use bit exact algorithms (for codec testing)" },
3995 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3996 { "loop", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3997 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3998 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3999 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4000 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4001 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4002 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4003 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4006 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
4007 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4008 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4009 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
4010 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4011 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4012 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4013 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
4014 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
4015 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
4016 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
4017 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
4018 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
4019 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
4020 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
4021 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
4022 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
4023 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
4024 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4025 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4026 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4027 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
4028 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
4029 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
4030 { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
4031 { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
4032 { "mblmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmin}, "min macroblock quantiser scale (VBR)", "q" },
4033 { "mblmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmax}, "max macroblock quantiser scale (VBR)", "q" },
4034 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
4035 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
4036 { "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" },
4037 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
4038 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
4039 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
4040 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
4041 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
4042 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
4043 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
4044 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
4045 { "b_strategy", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&b_strategy}, "dynamic b frame selection strategy", "strategy" },
4046 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
4047 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4048 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
4049 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
4050 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
4051 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffer size (in kByte)", "size" },
4052 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4053 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
4055 { "dct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dct_algo}, "set dct algo", "algo" },
4056 { "idct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_idct_algo}, "set idct algo", "algo" },
4057 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
4058 { "mb_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_threshold}, "macroblock threshold", "" },
4059 { "er", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_resilience}, "set error resilience", "n" },
4060 { "ec", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_concealment}, "set error concealment", "bit_mask" },
4061 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
4062 { "hq", OPT_BOOL, {(void*)&mb_decision}, "activate high quality settings" },
4063 { "mbd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_decision}, "macroblock decision", "mode" },
4064 { "mbcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_cmp}, "macroblock compare function", "cmp function" },
4065 { "ildctcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ildct_cmp}, "ildct compare function", "cmp function" },
4066 { "subcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sub_cmp}, "subpel compare function", "cmp function" },
4067 { "cmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_cmp}, "fullpel compare function", "cmp function" },
4068 { "precmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_cmp}, "pre motion estimation compare function", "cmp function" },
4069 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
4070 { "lelim", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lelim}, "single coefficient elimination threshold for luminance (negative values also consider DC coefficient)", "elim" },
4071 { "celim", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_celim}, "single coefficient elimination threshold for chrominance (negative values also consider DC coefficient)", "elim" },
4072 { "lumi_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lumi_mask}, "luminance masking", "" },
4073 { "dark_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dark_mask}, "darkness masking", "" },
4074 { "scplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_scplx_mask}, "spatial complexity masking", "" },
4075 { "tcplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_tcplx_mask}, "temporal complexity masking", "" },
4076 { "p_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_p_mask}, "inter masking", "" },
4077 { "4mv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_4mv}, "use four motion vector by macroblock (MPEG4)" },
4078 { "obmc", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_obmc}, "use overlapped block motion compensation (h263+)" },
4079 { "lf", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_loop}, "use loop filter (h263+)" },
4080 { "part", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_part}, "use data partitioning (MPEG4)" },
4081 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
4082 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
4083 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
4084 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
4085 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4086 "use same video quality as source (implies VBR)" },
4087 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4088 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
4089 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4090 "deinterlace pictures" },
4091 { "ildct", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_dct},
4092 "force interlaced dct support in encoder (MPEG2/MPEG4)" },
4093 { "ilme", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_me},
4094 "force interlaced me support in encoder (MPEG2/MPEG4)" },
4095 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4096 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
4097 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
4098 { "aic", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aic}, "enable Advanced intra coding (h263+)" },
4099 { "aiv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aiv}, "enable Alternative inter vlc (h263+)" },
4100 { "umv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_umv}, "enable Unlimited Motion Vector (h263+)" },
4101 { "ssm", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_ss}, "enable Slice Structured mode (h263+)" },
4102 { "alt", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_alt_scan}, "enable alternate scantable (MPEG2/MPEG4)" },
4103 { "qprd", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qprd}, "" },
4104 { "cbp", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_cbprd}, "" },
4105 { "trell", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_trell}, "enable trellis quantization" },
4106 { "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)" },
4107 { "naq", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_normalize_aqp}, "normalize adaptive quantization" },
4108 { "cgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&closed_gop}, "closed gop" },
4109 { "sgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&strict_gop}, "strict gop" },
4110 { "noout", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&no_output}, "skip bitstream encoding" },
4111 { "scan_offset", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_scan_offset}, "enable SVCD Scan Offset placeholder" },
4112 { "qpel", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qpel}, "enable 1/4-pel" },
4113 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4114 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4115 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4116 { "nr", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_noise_reduction}, "noise reduction", "" },
4117 { "qns", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qns}, "quantization noise shaping", "" },
4118 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
4119 { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
4120 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4121 { "coder", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&coder}, "coder type", "" },
4122 { "context", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&context}, "context model", "" },
4123 { "pred", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&predictor}, "prediction method", "" },
4124 { "vprofile", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_profile}, "profile", "" },
4125 { "vlevel", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_level}, "level", "" },
4126 { "nssew", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&nsse_weight}, "weight", "" },
4127 { "subq", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&subpel_quality}, "", "" },
4128 { "mepc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&me_penalty_compensation}, "motion estimation bitrate penalty compensation", "factor (1.0 = 256)" },
4129 { "lowres", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&lowres}, "", "" },
4130 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4131 { "skip_threshold", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_threshold}, "frame skip threshold", "threshold" },
4132 { "skip_factor", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_factor}, "frame skip factor", "factor" },
4133 { "skip_exp", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_exp}, "frame skip exponent", "exponent" },
4134 { "skip_cmp", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_cmp}, "frame skip compare function", "compare function" },
4135 { "gray", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { &gray_only }, "encode/decode grayscale" },
4138 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
4139 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4140 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4141 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4142 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4143 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4144 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4147 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
4148 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4149 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4150 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
4152 /* G.2 grab options */
4153 { "grab", HAS_ARG | OPT_EXPERT | OPT_GRAB, {(void*)opt_grab}, "request grabbing using", "format" },
4154 { "gd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_grab_device}, "set grab device", "device" },
4157 { "muxrate", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_rate}, "set mux rate", "rate" },
4158 { "packetsize", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_packet_size}, "set packet size", "size" },
4159 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4160 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4164 static void show_banner(void)
4166 fprintf(stderr, "ffmpeg version " FFMPEG_VERSION ", build %d, Copyright (c) 2000-2004 Fabrice Bellard\n",
4168 fprintf(stderr, " configuration: %s\n", FFMPEG_CONFIGURATION);
4169 fprintf(stderr, " built on " __DATE__ " " __TIME__);
4171 fprintf(stderr, ", gcc: %s\n", __VERSION__);
4173 fprintf(stderr, ", using a non-gcc compiler\n");
4177 static void show_license(void)
4182 "This program is free software; you can redistribute it and/or modify\n"
4183 "it under the terms of the GNU General Public License as published by\n"
4184 "the Free Software Foundation; either version 2 of the License, or\n"
4185 "(at your option) any later version.\n"
4187 "This program is distributed in the hope that it will be useful,\n"
4188 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
4189 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
4190 "GNU General Public License for more details.\n"
4192 "You should have received a copy of the GNU General Public License\n"
4193 "along with this program; if not, write to the Free Software\n"
4194 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
4198 "This library is free software; you can redistribute it and/or\n"
4199 "modify it under the terms of the GNU Lesser General Public\n"
4200 "License as published by the Free Software Foundation; either\n"
4201 "version 2 of the License, or (at your option) any later version.\n"
4203 "This library is distributed in the hope that it will be useful,\n"
4204 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
4205 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
4206 "Lesser General Public License for more details.\n"
4208 "You should have received a copy of the GNU Lesser General Public\n"
4209 "License along with this library; if not, write to the Free Software\n"
4210 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
4216 static void show_help(void)
4219 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
4220 "Hyper fast Audio and Video encoder\n");
4222 show_help_options(options, "Main options:\n",
4223 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
4224 show_help_options(options, "\nVideo options:\n",
4225 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4227 show_help_options(options, "\nAdvanced Video options:\n",
4228 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4229 OPT_VIDEO | OPT_EXPERT);
4230 show_help_options(options, "\nAudio options:\n",
4231 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4233 show_help_options(options, "\nAdvanced Audio options:\n",
4234 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4235 OPT_AUDIO | OPT_EXPERT);
4236 show_help_options(options, "\nAudio/Video grab options:\n",
4239 show_help_options(options, "\nAdvanced options:\n",
4240 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4245 void parse_arg_file(const char *filename)
4247 opt_output_file(filename);
4250 int main(int argc, char **argv)
4263 parse_options(argc, argv, options);
4265 /* file converter / grab */
4266 if (nb_output_files <= 0) {
4267 fprintf(stderr, "Must supply at least one output file\n");
4271 if (nb_input_files == 0) {
4277 av_encode(output_files, nb_output_files, input_files, nb_input_files,
4278 stream_maps, nb_stream_maps);
4279 ti = getutime() - ti;
4281 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
4285 for(i=0;i<nb_output_files;i++) {
4286 /* maybe av_close_output_file ??? */
4287 AVFormatContext *s = output_files[i];
4289 if (!(s->oformat->flags & AVFMT_NOFILE))
4291 for(j=0;j<s->nb_streams;j++)
4292 av_free(s->streams[j]);
4295 for(i=0;i<nb_input_files;i++)
4296 av_close_input_file(input_files[i]);
4301 av_free(intra_matrix);
4303 av_free(inter_matrix);
4305 #ifdef POWERPC_PERFORMANCE_REPORT
4306 extern void powerpc_display_perf_report(void);
4307 powerpc_display_perf_report();
4308 #endif /* POWERPC_PERFORMANCE_REPORT */
4310 #ifndef CONFIG_WIN32
4311 if (received_sigterm) {
4313 "Received signal %d: terminating.\n",
4314 (int) received_sigterm);
4318 exit(0); /* not all OS-es handle main() return value */