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
44 #if !defined(INFINITY) && defined(HUGE_VAL)
45 #define INFINITY HUGE_VAL
48 /* select an input stream for an output stream */
49 typedef struct AVStreamMap {
54 extern const OptionDef options[];
56 static void show_help(void);
57 static void show_license(void);
61 static AVFormatContext *input_files[MAX_FILES];
62 static int64_t input_files_ts_offset[MAX_FILES];
63 static int nb_input_files = 0;
65 static AVFormatContext *output_files[MAX_FILES];
66 static int nb_output_files = 0;
68 static AVStreamMap stream_maps[MAX_FILES];
69 static int nb_stream_maps;
71 static AVInputFormat *file_iformat;
72 static AVOutputFormat *file_oformat;
73 static AVImageFormat *image_format;
74 static int frame_width = 160;
75 static int frame_height = 128;
76 static float frame_aspect_ratio = 0;
77 static enum PixelFormat frame_pix_fmt = PIX_FMT_YUV420P;
78 static int frame_padtop = 0;
79 static int frame_padbottom = 0;
80 static int frame_padleft = 0;
81 static int frame_padright = 0;
82 static int padcolor[3] = {16,128,128}; /* default to black */
83 static int frame_topBand = 0;
84 static int frame_bottomBand = 0;
85 static int frame_leftBand = 0;
86 static int frame_rightBand = 0;
87 static int frame_rate = 25;
88 static int frame_rate_base = 1;
89 static int video_bit_rate = 200*1000;
90 static int video_bit_rate_tolerance = 4000*1000;
91 static float video_qscale = 0;
92 static int video_qmin = 2;
93 static int video_qmax = 31;
94 static int video_lmin = 2*FF_QP2LAMBDA;
95 static int video_lmax = 31*FF_QP2LAMBDA;
96 static int video_mb_qmin = 2;
97 static int video_mb_qmax = 31;
98 static int video_qdiff = 3;
99 static float video_qblur = 0.5;
100 static float video_qcomp = 0.5;
101 static uint16_t *intra_matrix = NULL;
102 static uint16_t *inter_matrix = NULL;
103 #if 0 //experimental, (can be removed)
104 static float video_rc_qsquish=1.0;
105 static float video_rc_qmod_amp=0;
106 static int video_rc_qmod_freq=0;
108 static char *video_rc_override_string=NULL;
109 static char *video_rc_eq="tex^qComp";
110 static int video_rc_buffer_size=0;
111 static float video_rc_buffer_aggressivity=1.0;
112 static int video_rc_max_rate=0;
113 static int video_rc_min_rate=0;
114 static float video_rc_initial_cplx=0;
115 static float video_b_qfactor = 1.25;
116 static float video_b_qoffset = 1.25;
117 static float video_i_qfactor = -0.8;
118 static float video_i_qoffset = 0.0;
119 static int video_intra_quant_bias= FF_DEFAULT_QUANT_BIAS;
120 static int video_inter_quant_bias= FF_DEFAULT_QUANT_BIAS;
121 static int me_method = ME_EPZS;
122 static int video_disable = 0;
123 static int video_codec_id = CODEC_ID_NONE;
124 static int same_quality = 0;
125 static int b_frames = 0;
126 static int mb_decision = FF_MB_DECISION_SIMPLE;
127 static int ildct_cmp = FF_CMP_VSAD;
128 static int mb_cmp = FF_CMP_SAD;
129 static int sub_cmp = FF_CMP_SAD;
130 static int cmp = FF_CMP_SAD;
131 static int pre_cmp = FF_CMP_SAD;
132 static int pre_me = 0;
133 static float lumi_mask = 0;
134 static float dark_mask = 0;
135 static float scplx_mask = 0;
136 static float tcplx_mask = 0;
137 static float p_mask = 0;
138 static int use_4mv = 0;
139 static int use_obmc = 0;
140 static int use_loop = 0;
141 static int use_aic = 0;
142 static int use_aiv = 0;
143 static int use_umv = 0;
144 static int use_ss = 0;
145 static int use_alt_scan = 0;
146 static int use_trell = 0;
147 static int use_scan_offset = 0;
148 static int use_qpel = 0;
149 static int use_qprd = 0;
150 static int use_cbprd = 0;
152 static int closed_gop = 0;
153 static int do_deinterlace = 0;
154 static int do_interlace_dct = 0;
155 static int do_interlace_me = 0;
156 static int workaround_bugs = FF_BUG_AUTODETECT;
157 static int error_resilience = 2;
158 static int error_concealment = 3;
159 static int dct_algo = 0;
160 static int idct_algo = 0;
161 static int use_part = 0;
162 static int packet_size = 0;
163 static int error_rate = 0;
164 static int strict = 0;
165 static int top_field_first = -1;
166 static int noise_reduction = 0;
167 static int sc_threshold = 0;
168 static int debug = 0;
169 static int debug_mv = 0;
170 static int me_threshold = 0;
171 static int mb_threshold = 0;
172 static int intra_dc_precision = 8;
173 static int coder = 0;
174 static int context = 0;
175 static int predictor = 0;
176 extern int loop_input; /* currently a hack */
178 static int gop_size = 12;
179 static int intra_only = 0;
180 static int audio_sample_rate = 44100;
181 static int audio_bit_rate = 64000;
182 static int audio_disable = 0;
183 static int audio_channels = 1;
184 static int audio_codec_id = CODEC_ID_NONE;
186 static int64_t recording_time = 0;
187 static int64_t start_time = 0;
188 static int64_t rec_timestamp = 0;
189 static int64_t input_ts_offset = 0;
190 static int file_overwrite = 0;
191 static char *str_title = NULL;
192 static char *str_author = NULL;
193 static char *str_copyright = NULL;
194 static char *str_comment = NULL;
195 static int do_benchmark = 0;
196 static int do_hex_dump = 0;
197 static int do_pkt_dump = 0;
198 static int do_psnr = 0;
199 static int do_vstats = 0;
200 static int do_pass = 0;
201 static int bitexact = 0;
202 static char *pass_logfilename = NULL;
203 static int audio_stream_copy = 0;
204 static int video_stream_copy = 0;
205 static int video_sync_method= 1;
206 static int audio_sync_method= 0;
207 static int copy_ts= 0;
209 static int rate_emu = 0;
211 static char *video_grab_format = "video4linux";
212 static char *video_device = NULL;
213 static int video_channel = 0;
214 static char *video_standard = "ntsc";
216 static char *audio_grab_format = "audio_device";
217 static char *audio_device = NULL;
219 static int using_stdin = 0;
220 static int using_vhook = 0;
221 static int verbose = 1;
222 static int thread_count= 1;
223 static int q_pressed = 0;
224 static int me_range = 0;
225 static int64_t video_size = 0;
226 static int64_t audio_size = 0;
227 static int64_t extra_size = 0;
228 static int nb_frames_dup = 0;
229 static int nb_frames_drop = 0;
230 static int input_sync;
232 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
234 typedef struct AVOutputStream {
235 int file_index; /* file index */
236 int index; /* stream index in the output file */
237 int source_index; /* AVInputStream index */
238 AVStream *st; /* stream in the output file */
239 int encoding_needed; /* true if encoding needed for this stream */
241 /* input pts and corresponding output pts
243 double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
244 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
246 int video_resample; /* video_resample and video_crop are mutually exclusive */
247 AVFrame pict_tmp; /* temporary image for resampling */
248 ImgReSampleContext *img_resample_ctx; /* for image resampling */
250 int video_crop; /* video_resample and video_crop are mutually exclusive */
251 int topBand; /* cropping area sizes */
254 int video_pad; /* video_resample and video_pad are mutually exclusive */
255 int padtop; /* padding area sizes */
262 ReSampleContext *resample; /* for audio resampling */
263 FifoBuffer fifo; /* for compression: one audio fifo per codec */
267 typedef struct AVInputStream {
271 int discard; /* true if stream data should be discarded */
272 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
273 int64_t sample_index; /* current sample */
275 int64_t start; /* time when read started */
276 unsigned long frame; /* current frame */
277 int64_t next_pts; /* synthetic pts for cases where pkt.pts
279 int64_t pts; /* current pts */
280 int is_start; /* is 1 at the start and after a discontinuity */
283 typedef struct AVInputFile {
284 int eof_reached; /* true if eof reached */
285 int ist_index; /* index of first stream in ist_table */
286 int buffer_size; /* current total buffer size */
287 int buffer_size_max; /* buffer size at which we consider we can stop
289 int nb_streams; /* nb streams we are aware of */
294 /* init terminal so that we can grab keys */
295 static struct termios oldtty;
297 static void term_exit(void)
299 tcsetattr (0, TCSANOW, &oldtty);
302 static volatile sig_atomic_t received_sigterm = 0;
305 sigterm_handler(int sig)
307 received_sigterm = sig;
311 static void term_init(void)
318 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
319 |INLCR|IGNCR|ICRNL|IXON);
320 tty.c_oflag |= OPOST;
321 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
322 tty.c_cflag &= ~(CSIZE|PARENB);
327 tcsetattr (0, TCSANOW, &tty);
329 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
330 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
331 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
333 register a function to be called at normal program termination
336 #ifdef CONFIG_BEOS_NETSERVER
337 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
341 /* read a key without blocking */
342 static int read_key(void)
346 #ifndef CONFIG_BEOS_NETSERVER
354 n = select(1, &rfds, NULL, NULL, &tv);
366 static int decode_interrupt_cb(void)
368 return q_pressed || (q_pressed = read_key() == 'q');
373 static volatile int received_sigterm = 0;
375 /* no interactive support */
376 static void term_exit(void)
380 static void term_init(void)
384 static int read_key(void)
391 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
396 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
399 /* copy stream format */
400 s->nb_streams = ic->nb_streams;
401 for(i=0;i<ic->nb_streams;i++) {
404 st = av_mallocz(sizeof(AVStream));
405 memcpy(st, ic->streams[i], sizeof(AVStream));
409 av_close_input_file(ic);
413 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
415 static void do_audio_out(AVFormatContext *s,
418 unsigned char *buf, int size)
421 static uint8_t *audio_buf = NULL;
422 static uint8_t *audio_out = NULL;
423 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
425 int size_out, frame_bytes, ret;
426 AVCodecContext *enc= &ost->st->codec;
428 /* SC: dynamic allocation of buffers */
430 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
432 audio_out = av_malloc(audio_out_size);
433 if (!audio_buf || !audio_out)
434 return; /* Should signal an error ! */
436 if(audio_sync_method){
437 double delta = ost->sync_ipts * enc->sample_rate - ost->sync_opts
438 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2);
439 double idelta= delta*ist->st->codec.sample_rate / enc->sample_rate;
440 int byte_delta= ((int)idelta)*2*ist->st->codec.channels;
442 //FIXME resample delay
443 if(fabs(delta) > 50){
446 byte_delta= FFMAX(byte_delta, -size);
450 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
455 static uint8_t *input_tmp= NULL;
456 input_tmp= av_realloc(input_tmp, byte_delta + size);
458 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
461 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
463 memset(input_tmp, 0, byte_delta);
464 memcpy(input_tmp + byte_delta, buf, size);
468 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
470 }else if(audio_sync_method>1){
471 int comp= clip(delta, -audio_sync_method, audio_sync_method);
472 assert(ost->audio_resample);
474 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
475 fprintf(stderr, "drift:%f len:%d opts:%lld ipts:%lld fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(ost->sync_ipts * enc->sample_rate), fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2));
476 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
480 ost->sync_opts= lrintf(ost->sync_ipts * enc->sample_rate)
481 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2); //FIXME wrong
483 if (ost->audio_resample) {
485 size_out = audio_resample(ost->resample,
486 (short *)buftmp, (short *)buf,
487 size / (ist->st->codec.channels * 2));
488 size_out = size_out * enc->channels * 2;
494 /* now encode as many frames as possible */
495 if (enc->frame_size > 1) {
496 /* output resampled raw samples */
497 fifo_write(&ost->fifo, buftmp, size_out,
500 frame_bytes = enc->frame_size * 2 * enc->channels;
502 while (fifo_read(&ost->fifo, audio_buf, frame_bytes,
503 &ost->fifo.rptr) == 0) {
505 av_init_packet(&pkt);
507 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
510 pkt.stream_index= ost->index;
514 pkt.pts= enc->coded_frame->pts;
515 pkt.flags |= PKT_FLAG_KEY;
516 av_interleaved_write_frame(s, &pkt);
518 ost->sync_opts += enc->frame_size;
522 av_init_packet(&pkt);
524 ost->sync_opts += size_out / (2 * enc->channels);
526 /* output a pcm frame */
527 /* XXX: change encoding codec API to avoid this ? */
528 switch(enc->codec->id) {
529 case CODEC_ID_PCM_S16LE:
530 case CODEC_ID_PCM_S16BE:
531 case CODEC_ID_PCM_U16LE:
532 case CODEC_ID_PCM_U16BE:
535 size_out = size_out >> 1;
538 ret = avcodec_encode_audio(enc, audio_out, size_out,
541 pkt.stream_index= ost->index;
545 pkt.pts= enc->coded_frame->pts;
546 pkt.flags |= PKT_FLAG_KEY;
547 av_interleaved_write_frame(s, &pkt);
551 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
555 AVPicture picture_tmp;
558 dec = &ist->st->codec;
560 /* deinterlace : must be done before any resize */
561 if (do_deinterlace || using_vhook) {
564 /* create temporary picture */
565 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
566 buf = av_malloc(size);
570 picture2 = &picture_tmp;
571 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
574 if(avpicture_deinterlace(picture2, picture,
575 dec->pix_fmt, dec->width, dec->height) < 0) {
576 /* if error, do not deinterlace */
582 if (img_convert(picture2, dec->pix_fmt, picture,
583 dec->pix_fmt, dec->width, dec->height) < 0) {
584 /* if error, do not copy */
594 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
596 if (picture != picture2)
597 *picture = *picture2;
601 /* we begin to correct av delay at this threshold */
602 #define AV_DELAY_MAX 0.100
605 /* Expects img to be yuv420 */
606 static void fill_pad_region(AVPicture* img, int height, int width,
607 int padtop, int padbottom, int padleft, int padright, int *color) {
612 for (i = 0; i < 3; i++) {
613 shift = (i == 0) ? 0 : 1;
615 if (padtop || padleft) {
616 memset(img->data[i], color[i], (((img->linesize[i] * padtop) +
620 if (padleft || padright) {
621 optr = img->data[i] + (img->linesize[i] * (padtop >> shift)) +
622 (img->linesize[i] - (padright >> shift));
624 for (y = 0; y < ((height - (padtop + padbottom)) >> shift); y++) {
625 memset(optr, color[i], (padleft + padright) >> shift);
626 optr += img->linesize[i];
631 optr = img->data[i] + (img->linesize[i] * ((height - padbottom) >> shift));
632 memset(optr, color[i], ((img->linesize[i] * padbottom) >> shift));
637 static uint8_t *bit_buffer= NULL;
639 static void do_video_out(AVFormatContext *s,
645 int nb_frames, i, ret;
646 AVFrame *final_picture, *formatted_picture;
647 AVFrame picture_format_temp, picture_crop_temp;
648 uint8_t *buf = NULL, *buf1 = NULL;
649 AVCodecContext *enc, *dec;
650 enum PixelFormat target_pixfmt;
652 #define VIDEO_BUFFER_SIZE (1024*1024)
654 avcodec_get_frame_defaults(&picture_format_temp);
655 avcodec_get_frame_defaults(&picture_crop_temp);
657 enc = &ost->st->codec;
658 dec = &ist->st->codec;
660 /* by default, we output a single frame */
665 if(video_sync_method){
667 vdelta = ost->sync_ipts * enc->frame_rate / enc->frame_rate_base - ost->sync_opts;
668 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
671 else if (vdelta > 1.1)
673 //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);
677 fprintf(stderr, "*** drop!\n");
678 }else if (nb_frames == 2) {
681 fprintf(stderr, "*** dup!\n");
684 ost->sync_opts= lrintf(ost->sync_ipts * enc->frame_rate / enc->frame_rate_base);
689 /* convert pixel format if needed */
690 target_pixfmt = ost->video_resample || ost->video_pad
691 ? PIX_FMT_YUV420P : enc->pix_fmt;
692 if (dec->pix_fmt != target_pixfmt) {
695 /* create temporary picture */
696 size = avpicture_get_size(target_pixfmt, dec->width, dec->height);
697 buf = av_malloc(size);
700 formatted_picture = &picture_format_temp;
701 avpicture_fill((AVPicture*)formatted_picture, buf, target_pixfmt, dec->width, dec->height);
703 if (img_convert((AVPicture*)formatted_picture, target_pixfmt,
704 (AVPicture *)in_picture, dec->pix_fmt,
705 dec->width, dec->height) < 0) {
708 fprintf(stderr, "pixel format conversion not handled\n");
713 formatted_picture = in_picture;
716 /* XXX: resampling could be done before raw format conversion in
717 some cases to go faster */
718 /* XXX: only works for YUV420P */
719 if (ost->video_resample) {
720 final_picture = &ost->pict_tmp;
721 img_resample(ost->img_resample_ctx, (AVPicture*)final_picture, (AVPicture*)formatted_picture);
723 if (ost->padtop || ost->padbottom || ost->padleft || ost->padright) {
724 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
725 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
729 if (enc->pix_fmt != PIX_FMT_YUV420P) {
733 /* create temporary picture */
734 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
735 buf = av_malloc(size);
738 final_picture = &picture_format_temp;
739 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
741 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
742 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
743 enc->width, enc->height) < 0) {
746 fprintf(stderr, "pixel format conversion not handled\n");
751 } else if (ost->video_crop) {
752 picture_crop_temp.data[0] = formatted_picture->data[0] +
753 (ost->topBand * formatted_picture->linesize[0]) + ost->leftBand;
755 picture_crop_temp.data[1] = formatted_picture->data[1] +
756 ((ost->topBand >> 1) * formatted_picture->linesize[1]) +
757 (ost->leftBand >> 1);
759 picture_crop_temp.data[2] = formatted_picture->data[2] +
760 ((ost->topBand >> 1) * formatted_picture->linesize[2]) +
761 (ost->leftBand >> 1);
763 picture_crop_temp.linesize[0] = formatted_picture->linesize[0];
764 picture_crop_temp.linesize[1] = formatted_picture->linesize[1];
765 picture_crop_temp.linesize[2] = formatted_picture->linesize[2];
766 final_picture = &picture_crop_temp;
767 } else if (ost->video_pad) {
768 final_picture = &ost->pict_tmp;
770 for (i = 0; i < 3; i++) {
771 uint8_t *optr, *iptr;
772 int shift = (i == 0) ? 0 : 1;
775 /* set offset to start writing image into */
776 optr = final_picture->data[i] + (((final_picture->linesize[i] *
777 ost->padtop) + ost->padleft) >> shift);
778 iptr = formatted_picture->data[i];
780 yheight = (enc->height - ost->padtop - ost->padbottom) >> shift;
781 for (y = 0; y < yheight; y++) {
782 /* copy unpadded image row into padded image row */
783 memcpy(optr, iptr, formatted_picture->linesize[i]);
784 optr += final_picture->linesize[i];
785 iptr += formatted_picture->linesize[i];
789 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
790 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
793 if (enc->pix_fmt != PIX_FMT_YUV420P) {
797 /* create temporary picture */
798 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
799 buf = av_malloc(size);
802 final_picture = &picture_format_temp;
803 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
805 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
806 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
807 enc->width, enc->height) < 0) {
810 fprintf(stderr, "pixel format conversion not handled\n");
816 final_picture = formatted_picture;
818 /* duplicates frame if needed */
819 for(i=0;i<nb_frames;i++) {
821 av_init_packet(&pkt);
822 pkt.stream_index= ost->index;
824 if (s->oformat->flags & AVFMT_RAWPICTURE) {
825 /* raw pictures are written as AVPicture structure to
826 avoid any copies. We support temorarily the older
828 AVFrame* old_frame = enc->coded_frame;
829 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
830 pkt.data= (uint8_t *)final_picture;
831 pkt.size= sizeof(AVPicture);
833 pkt.pts= dec->coded_frame->pts;
834 if(dec->coded_frame && dec->coded_frame->key_frame)
835 pkt.flags |= PKT_FLAG_KEY;
837 av_interleaved_write_frame(s, &pkt);
838 enc->coded_frame = old_frame;
842 big_picture= *final_picture;
843 /* better than nothing: use input picture interlaced
845 big_picture.interlaced_frame = in_picture->interlaced_frame;
846 if(do_interlace_me || do_interlace_dct){
847 if(top_field_first == -1)
848 big_picture.top_field_first = in_picture->top_field_first;
850 big_picture.top_field_first = top_field_first;
853 /* handles sameq here. This is not correct because it may
854 not be a global option */
856 big_picture.quality = ist->st->quality;
858 big_picture.quality = ost->st->quality;
860 big_picture.pict_type = 0;
861 // big_picture.pts = AV_NOPTS_VALUE;
862 big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->frame_rate_base, enc->frame_rate);
863 //av_log(NULL, AV_LOG_DEBUG, "%lld -> encoder\n", ost->sync_opts);
864 ret = avcodec_encode_video(enc,
865 bit_buffer, VIDEO_BUFFER_SIZE,
867 //enc->frame_number = enc->real_pict_num;
869 pkt.data= bit_buffer;
872 pkt.pts= enc->coded_frame->pts;
873 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %lld/%lld\n",
874 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1,
875 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1);*/
877 if(enc->coded_frame && enc->coded_frame->key_frame)
878 pkt.flags |= PKT_FLAG_KEY;
879 av_interleaved_write_frame(s, &pkt);
881 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
882 // enc->frame_number-1, enc->real_pict_num, ret,
884 /* if two pass, output log */
885 if (ost->logfile && enc->stats_out) {
886 fprintf(ost->logfile, "%s", enc->stats_out);
898 static double psnr(double d){
899 if(d==0) return INFINITY;
900 return -10.0*log(d)/log(10.0);
903 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
906 static FILE *fvstats=NULL;
913 double ti1, bitrate, avg_bitrate;
917 today = localtime(&today2);
918 sprintf(filename, "vstats_%02d%02d%02d.log", today->tm_hour,
921 fvstats = fopen(filename,"w");
929 enc = &ost->st->codec;
930 if (enc->codec_type == CODEC_TYPE_VIDEO) {
931 frame_number = ost->frame_number;
932 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
933 if (enc->flags&CODEC_FLAG_PSNR)
934 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
936 fprintf(fvstats,"f_size= %6d ", frame_size);
937 /* compute pts value */
938 ti1 = (double)ost->sync_opts *enc->frame_rate_base / enc->frame_rate;
942 bitrate = (double)(frame_size * 8) * enc->frame_rate / enc->frame_rate_base / 1000.0;
943 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
944 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
945 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
946 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
950 static void print_report(AVFormatContext **output_files,
951 AVOutputStream **ost_table, int nb_ostreams,
956 AVFormatContext *oc, *os;
959 int frame_number, vid, i;
960 double bitrate, ti1, pts;
961 static int64_t last_time = -1;
963 if (!is_last_report) {
965 /* display the report every 0.5 seconds */
966 cur_time = av_gettime();
967 if (last_time == -1) {
968 last_time = cur_time;
971 if ((cur_time - last_time) < 500000)
973 last_time = cur_time;
977 oc = output_files[0];
979 total_size = url_ftell(&oc->pb);
984 for(i=0;i<nb_ostreams;i++) {
986 os = output_files[ost->file_index];
987 enc = &ost->st->codec;
988 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
989 sprintf(buf + strlen(buf), "q=%2.1f ",
990 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
992 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
993 frame_number = ost->frame_number;
994 sprintf(buf + strlen(buf), "frame=%5d q=%2.1f ",
995 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : 0);
997 sprintf(buf + strlen(buf), "L");
998 if (enc->flags&CODEC_FLAG_PSNR){
1000 double error, error_sum=0;
1001 double scale, scale_sum=0;
1002 char type[3]= {'Y','U','V'};
1003 sprintf(buf + strlen(buf), "PSNR=");
1006 error= enc->error[j];
1007 scale= enc->width*enc->height*255.0*255.0*frame_number;
1009 error= enc->coded_frame->error[j];
1010 scale= enc->width*enc->height*255.0*255.0;
1015 sprintf(buf + strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1017 sprintf(buf + strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1021 /* compute min output value */
1022 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1023 if ((pts < ti1) && (pts > 0))
1029 if (verbose || is_last_report) {
1030 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1032 sprintf(buf + strlen(buf),
1033 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
1034 (double)total_size / 1024, ti1, bitrate);
1037 sprintf(buf + strlen(buf), " dup=%d drop=%d",
1038 nb_frames_dup, nb_frames_drop);
1041 fprintf(stderr, "%s \r", buf);
1046 if (is_last_report && verbose >= 0){
1047 int64_t raw= audio_size + video_size + extra_size;
1048 fprintf(stderr, "\n");
1049 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1053 100.0*(total_size - raw)/raw
1058 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1059 static int output_packet(AVInputStream *ist, int ist_index,
1060 AVOutputStream **ost_table, int nb_ostreams,
1061 const AVPacket *pkt)
1063 AVFormatContext *os;
1064 AVOutputStream *ost;
1068 int data_size, got_picture;
1070 short samples[AVCODEC_MAX_AUDIO_FRAME_SIZE / 2];
1071 void *buffer_to_free;
1073 if (pkt && pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1074 ist->next_pts = ist->pts = pkt->dts;
1076 assert(ist->pts == ist->next_pts);
1090 /* decode the packet if needed */
1091 data_buf = NULL; /* fail safe */
1093 if (ist->decoding_needed) {
1094 switch(ist->st->codec.codec_type) {
1095 case CODEC_TYPE_AUDIO:
1096 /* XXX: could avoid copy if PCM 16 bits with same
1097 endianness as CPU */
1098 ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size,
1104 /* Some bug in mpeg audio decoder gives */
1105 /* data_size < 0, it seems they are overflows */
1106 if (data_size <= 0) {
1107 /* no audio frame */
1110 data_buf = (uint8_t *)samples;
1111 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1112 (ist->st->codec.sample_rate * ist->st->codec.channels);
1114 case CODEC_TYPE_VIDEO:
1115 data_size = (ist->st->codec.width * ist->st->codec.height * 3) / 2;
1116 /* XXX: allocate picture correctly */
1117 avcodec_get_frame_defaults(&picture);
1119 ret = avcodec_decode_video(&ist->st->codec,
1120 &picture, &got_picture, ptr, len);
1121 ist->st->quality= picture.quality;
1125 /* no picture yet */
1126 goto discard_packet;
1128 if (ist->st->codec.frame_rate_base != 0) {
1129 ist->next_pts += ((int64_t)AV_TIME_BASE *
1130 ist->st->codec.frame_rate_base) /
1131 ist->st->codec.frame_rate;
1145 buffer_to_free = NULL;
1146 if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1147 pre_process_video_frame(ist, (AVPicture *)&picture,
1151 /* frame rate emulation */
1152 if (ist->st->codec.rate_emu) {
1153 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec.frame_rate_base, 1000000, ist->st->codec.frame_rate);
1154 int64_t now = av_gettime() - ist->start;
1162 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1163 is the one of the next displayed one */
1164 /* XXX: add mpeg4 too ? */
1165 if (ist->st->codec.codec_id == CODEC_ID_MPEG1VIDEO) {
1166 if (ist->st->codec.pict_type != B_TYPE) {
1168 tmp = ist->last_ip_pts;
1169 ist->last_ip_pts = ist->frac_pts.val;
1170 ist->frac_pts.val = tmp;
1174 /* if output time reached then transcode raw format,
1175 encode packets and output them */
1176 if (start_time == 0 || ist->pts >= start_time)
1177 for(i=0;i<nb_ostreams;i++) {
1181 if (ost->source_index == ist_index) {
1182 os = output_files[ost->file_index];
1185 printf("%d: got pts=%0.3f %0.3f\n", i,
1186 (double)pkt->pts / AV_TIME_BASE,
1187 ((double)ist->pts / AV_TIME_BASE) -
1188 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1190 /* set the input output pts pairs */
1191 ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index])/ AV_TIME_BASE;
1193 if (ost->encoding_needed) {
1194 switch(ost->st->codec.codec_type) {
1195 case CODEC_TYPE_AUDIO:
1196 do_audio_out(os, ost, ist, data_buf, data_size);
1198 case CODEC_TYPE_VIDEO:
1199 /* find an audio stream for synchro */
1202 AVOutputStream *audio_sync, *ost1;
1204 for(i=0;i<nb_ostreams;i++) {
1205 ost1 = ost_table[i];
1206 if (ost1->file_index == ost->file_index &&
1207 ost1->st->codec.codec_type == CODEC_TYPE_AUDIO) {
1213 do_video_out(os, ost, ist, &picture, &frame_size);
1214 video_size += frame_size;
1215 if (do_vstats && frame_size)
1216 do_video_stats(os, ost, frame_size);
1223 AVFrame avframe; //FIXME/XXX remove this
1225 av_init_packet(&opkt);
1227 /* no reencoding needed : output the packet directly */
1228 /* force the input stream PTS */
1230 avcodec_get_frame_defaults(&avframe);
1231 ost->st->codec.coded_frame= &avframe;
1232 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1234 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO)
1235 audio_size += data_size;
1236 else if (ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1237 video_size += data_size;
1239 opkt.stream_index= ost->index;
1240 opkt.data= data_buf;
1241 opkt.size= data_size;
1242 opkt.pts= pkt->pts + input_files_ts_offset[ist->file_index];
1243 opkt.dts= pkt->dts + input_files_ts_offset[ist->file_index];
1244 opkt.flags= pkt->flags;
1246 av_interleaved_write_frame(os, &opkt);
1247 ost->st->codec.frame_number++;
1248 ost->frame_number++;
1252 av_free(buffer_to_free);
1258 for(i=0;i<nb_ostreams;i++) {
1260 if (ost->source_index == ist_index) {
1261 AVCodecContext *enc= &ost->st->codec;
1262 os = output_files[ost->file_index];
1264 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1266 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1269 if (ost->encoding_needed) {
1272 av_init_packet(&pkt);
1273 pkt.stream_index= ost->index;
1275 switch(ost->st->codec.codec_type) {
1276 case CODEC_TYPE_AUDIO:
1277 ret = avcodec_encode_audio(enc, bit_buffer, VIDEO_BUFFER_SIZE, NULL);
1279 pkt.flags |= PKT_FLAG_KEY;
1281 case CODEC_TYPE_VIDEO:
1282 ret = avcodec_encode_video(enc, bit_buffer, VIDEO_BUFFER_SIZE, NULL);
1284 if(enc->coded_frame && enc->coded_frame->key_frame)
1285 pkt.flags |= PKT_FLAG_KEY;
1286 if (ost->logfile && enc->stats_out) {
1287 fprintf(ost->logfile, "%s", enc->stats_out);
1296 pkt.data= bit_buffer;
1298 if(enc->coded_frame)
1299 pkt.pts= enc->coded_frame->pts;
1300 av_interleaved_write_frame(os, &pkt);
1314 * The following code is the main loop of the file converter
1316 static int av_encode(AVFormatContext **output_files,
1317 int nb_output_files,
1318 AVFormatContext **input_files,
1320 AVStreamMap *stream_maps, int nb_stream_maps)
1322 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1323 AVFormatContext *is, *os;
1324 AVCodecContext *codec, *icodec;
1325 AVOutputStream *ost, **ost_table = NULL;
1326 AVInputStream *ist, **ist_table = NULL;
1327 AVInputFile *file_table;
1328 AVFormatContext *stream_no_data;
1331 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1336 bit_buffer = av_malloc(VIDEO_BUFFER_SIZE);
1340 /* input stream init */
1342 for(i=0;i<nb_input_files;i++) {
1343 is = input_files[i];
1344 file_table[i].ist_index = j;
1345 file_table[i].nb_streams = is->nb_streams;
1346 j += is->nb_streams;
1350 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1354 for(i=0;i<nb_istreams;i++) {
1355 ist = av_mallocz(sizeof(AVInputStream));
1361 for(i=0;i<nb_input_files;i++) {
1362 is = input_files[i];
1363 for(k=0;k<is->nb_streams;k++) {
1364 ist = ist_table[j++];
1365 ist->st = is->streams[k];
1366 ist->file_index = i;
1368 ist->discard = 1; /* the stream is discarded by default
1371 if (ist->st->codec.rate_emu) {
1372 ist->start = av_gettime();
1378 /* output stream init */
1380 for(i=0;i<nb_output_files;i++) {
1381 os = output_files[i];
1382 nb_ostreams += os->nb_streams;
1384 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1385 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1389 /* Sanity check the mapping args -- do the input files & streams exist? */
1390 for(i=0;i<nb_stream_maps;i++) {
1391 int fi = stream_maps[i].file_index;
1392 int si = stream_maps[i].stream_index;
1394 if (fi < 0 || fi > nb_input_files - 1 ||
1395 si < 0 || si > file_table[fi].nb_streams - 1) {
1396 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1401 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1404 for(i=0;i<nb_ostreams;i++) {
1405 ost = av_mallocz(sizeof(AVOutputStream));
1412 for(k=0;k<nb_output_files;k++) {
1413 os = output_files[k];
1414 for(i=0;i<os->nb_streams;i++) {
1416 ost = ost_table[n++];
1417 ost->file_index = k;
1419 ost->st = os->streams[i];
1420 if (nb_stream_maps > 0) {
1421 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1422 stream_maps[n-1].stream_index;
1424 /* Sanity check that the stream types match */
1425 if (ist_table[ost->source_index]->st->codec.codec_type != ost->st->codec.codec_type) {
1426 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1427 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1428 ost->file_index, ost->index);
1433 /* get corresponding input stream index : we select the first one with the right type */
1435 for(j=0;j<nb_istreams;j++) {
1438 ist->st->codec.codec_type == ost->st->codec.codec_type) {
1439 ost->source_index = j;
1445 /* try again and reuse existing stream */
1446 for(j=0;j<nb_istreams;j++) {
1448 if (ist->st->codec.codec_type == ost->st->codec.codec_type) {
1449 ost->source_index = j;
1454 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1455 ost->file_index, ost->index);
1460 ist = ist_table[ost->source_index];
1465 /* for each output stream, we compute the right encoding parameters */
1466 for(i=0;i<nb_ostreams;i++) {
1468 ist = ist_table[ost->source_index];
1470 codec = &ost->st->codec;
1471 icodec = &ist->st->codec;
1473 if (ost->st->stream_copy) {
1474 /* if stream_copy is selected, no need to decode or encode */
1475 codec->codec_id = icodec->codec_id;
1476 codec->codec_type = icodec->codec_type;
1477 codec->codec_tag = icodec->codec_tag;
1478 codec->bit_rate = icodec->bit_rate;
1479 switch(codec->codec_type) {
1480 case CODEC_TYPE_AUDIO:
1481 codec->sample_rate = icodec->sample_rate;
1482 codec->channels = icodec->channels;
1483 codec->frame_size = icodec->frame_size;
1485 case CODEC_TYPE_VIDEO:
1486 codec->frame_rate = icodec->frame_rate;
1487 codec->frame_rate_base = icodec->frame_rate_base;
1488 codec->width = icodec->width;
1489 codec->height = icodec->height;
1495 switch(codec->codec_type) {
1496 case CODEC_TYPE_AUDIO:
1497 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1500 if (codec->channels == icodec->channels &&
1501 codec->sample_rate == icodec->sample_rate) {
1502 ost->audio_resample = 0;
1504 if (codec->channels != icodec->channels &&
1505 (icodec->codec_id == CODEC_ID_AC3 ||
1506 icodec->codec_id == CODEC_ID_DTS)) {
1507 /* Special case for 5:1 AC3 and DTS input */
1508 /* and mono or stereo output */
1509 /* Request specific number of channels */
1510 icodec->channels = codec->channels;
1511 if (codec->sample_rate == icodec->sample_rate)
1512 ost->audio_resample = 0;
1514 ost->audio_resample = 1;
1517 ost->audio_resample = 1;
1520 if(audio_sync_method>1)
1521 ost->audio_resample = 1;
1523 if(ost->audio_resample){
1524 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1525 codec->sample_rate, icodec->sample_rate);
1527 printf("Can't resample. Aborting.\n");
1531 ist->decoding_needed = 1;
1532 ost->encoding_needed = 1;
1534 case CODEC_TYPE_VIDEO:
1535 if (codec->width == icodec->width &&
1536 codec->height == icodec->height &&
1537 frame_topBand == 0 &&
1538 frame_bottomBand == 0 &&
1539 frame_leftBand == 0 &&
1540 frame_rightBand == 0 &&
1541 frame_padtop == 0 &&
1542 frame_padbottom == 0 &&
1543 frame_padleft == 0 &&
1544 frame_padright == 0)
1546 ost->video_resample = 0;
1547 ost->video_crop = 0;
1549 } else if ((codec->width == icodec->width -
1550 (frame_leftBand + frame_rightBand)) &&
1551 (codec->height == icodec->height -
1552 (frame_topBand + frame_bottomBand)))
1554 ost->video_resample = 0;
1555 ost->video_crop = 1;
1556 ost->topBand = frame_topBand;
1557 ost->leftBand = frame_leftBand;
1558 } else if ((codec->width == icodec->width +
1559 (frame_padleft + frame_padright)) &&
1560 (codec->height == icodec->height +
1561 (frame_padtop + frame_padbottom))) {
1562 ost->video_resample = 0;
1563 ost->video_crop = 0;
1565 ost->padtop = frame_padtop;
1566 ost->padleft = frame_padleft;
1567 ost->padbottom = frame_padbottom;
1568 ost->padright = frame_padright;
1569 avcodec_get_frame_defaults(&ost->pict_tmp);
1570 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1571 codec->width, codec->height ) )
1574 ost->video_resample = 1;
1575 ost->video_crop = 0; // cropping is handled as part of resample
1576 avcodec_get_frame_defaults(&ost->pict_tmp);
1577 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1578 codec->width, codec->height ) )
1581 ost->img_resample_ctx = img_resample_full_init(
1582 ost->st->codec.width, ost->st->codec.height,
1583 ist->st->codec.width, ist->st->codec.height,
1584 frame_topBand, frame_bottomBand,
1585 frame_leftBand, frame_rightBand,
1586 frame_padtop, frame_padbottom,
1587 frame_padleft, frame_padright);
1589 ost->padtop = frame_padtop;
1590 ost->padleft = frame_padleft;
1591 ost->padbottom = frame_padbottom;
1592 ost->padright = frame_padright;
1595 ost->encoding_needed = 1;
1596 ist->decoding_needed = 1;
1602 if (ost->encoding_needed &&
1603 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1604 char logfilename[1024];
1609 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1611 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1612 if (codec->flags & CODEC_FLAG_PASS1) {
1613 f = fopen(logfilename, "w");
1615 perror(logfilename);
1620 /* read the log file */
1621 f = fopen(logfilename, "r");
1623 perror(logfilename);
1626 fseek(f, 0, SEEK_END);
1628 fseek(f, 0, SEEK_SET);
1629 logbuffer = av_malloc(size + 1);
1631 fprintf(stderr, "Could not allocate log buffer\n");
1634 size = fread(logbuffer, 1, size, f);
1636 logbuffer[size] = '\0';
1637 codec->stats_in = logbuffer;
1643 /* dump the file output parameters - cannot be done before in case
1645 for(i=0;i<nb_output_files;i++) {
1646 dump_format(output_files[i], i, output_files[i]->filename, 1);
1649 /* dump the stream mapping */
1651 fprintf(stderr, "Stream mapping:\n");
1652 for(i=0;i<nb_ostreams;i++) {
1654 fprintf(stderr, " Stream #%d.%d -> #%d.%d\n",
1655 ist_table[ost->source_index]->file_index,
1656 ist_table[ost->source_index]->index,
1662 /* open each encoder */
1663 for(i=0;i<nb_ostreams;i++) {
1665 if (ost->encoding_needed) {
1667 codec = avcodec_find_encoder(ost->st->codec.codec_id);
1669 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1670 ost->file_index, ost->index);
1673 if (avcodec_open(&ost->st->codec, codec) < 0) {
1674 fprintf(stderr, "Error while opening codec for stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1675 ost->file_index, ost->index);
1678 extra_size += ost->st->codec.extradata_size;
1682 /* open each decoder */
1683 for(i=0;i<nb_istreams;i++) {
1685 if (ist->decoding_needed) {
1687 codec = avcodec_find_decoder(ist->st->codec.codec_id);
1689 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1690 ist->st->codec.codec_id, ist->file_index, ist->index);
1693 if (avcodec_open(&ist->st->codec, codec) < 0) {
1694 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1695 ist->file_index, ist->index);
1698 //if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO)
1699 // ist->st->codec.flags |= CODEC_FLAG_REPEAT_FIELD;
1704 for(i=0;i<nb_istreams;i++) {
1706 is = input_files[ist->file_index];
1712 /* compute buffer size max (should use a complete heuristic) */
1713 for(i=0;i<nb_input_files;i++) {
1714 file_table[i].buffer_size_max = 2048;
1717 /* open files and write file headers */
1718 for(i=0;i<nb_output_files;i++) {
1719 os = output_files[i];
1720 if (av_write_header(os) < 0) {
1721 fprintf(stderr, "Could not write header for output file #%d (incorrect codec paramters ?)\n", i);
1727 #ifndef CONFIG_WIN32
1728 if ( !using_stdin && verbose >= 0) {
1729 fprintf(stderr, "Press [q] to stop encoding\n");
1730 url_set_interrupt_cb(decode_interrupt_cb);
1738 for(; received_sigterm == 0;) {
1739 int file_index, ist_index;
1741 double ipts_min= 1e100;
1742 double opts_min= 1e100;
1745 /* if 'q' pressed, exits */
1749 /* read_key() returns 0 on EOF */
1755 /* select the stream that we must read now by looking at the
1756 smallest output pts */
1758 for(i=0;i<nb_ostreams;i++) {
1761 os = output_files[ost->file_index];
1762 ist = ist_table[ost->source_index];
1763 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1764 opts = (double)ost->sync_opts * ost->st->codec.frame_rate_base / ost->st->codec.frame_rate;
1766 opts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1767 ipts = (double)ist->pts;
1768 if (!file_table[ist->file_index].eof_reached){
1769 if(ipts < ipts_min) {
1771 if(input_sync ) file_index = ist->file_index;
1773 if(opts < opts_min) {
1775 if(!input_sync) file_index = ist->file_index;
1779 /* if none, if is finished */
1780 if (file_index < 0) {
1784 /* finish if recording time exhausted */
1785 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
1788 /* read a frame from it and output it in the fifo */
1789 is = input_files[file_index];
1790 if (av_read_frame(is, &pkt) < 0) {
1791 file_table[file_index].eof_reached = 1;
1796 stream_no_data = is;
1801 av_pkt_dump(stdout, &pkt, do_hex_dump);
1803 /* the following test is needed in case new streams appear
1804 dynamically in stream : we ignore them */
1805 if (pkt.stream_index >= file_table[file_index].nb_streams)
1806 goto discard_packet;
1807 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1808 ist = ist_table[ist_index];
1810 goto discard_packet;
1812 // 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);
1813 if (pkt.dts != AV_NOPTS_VALUE) {
1814 int64_t delta= pkt.dts - ist->next_pts;
1815 if(ABS(delta) > 10LL*AV_TIME_BASE && !copy_ts){
1816 input_files_ts_offset[ist->file_index]-= delta;
1818 fprintf(stderr, "timestamp discontinuity %lld, new offset= %lld\n", delta, input_files_ts_offset[ist->file_index]);
1819 for(i=0; i<file_table[file_index].nb_streams; i++){
1820 int index= file_table[file_index].ist_index + i;
1821 ist_table[index]->next_pts += delta;
1822 ist_table[index]->is_start=1;
1827 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1828 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1831 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1832 ist->file_index, ist->index);
1834 av_free_packet(&pkt);
1839 av_free_packet(&pkt);
1841 /* dump report by using the output first video and audio streams */
1842 print_report(output_files, ost_table, nb_ostreams, 0);
1845 /* at the end of stream, we must flush the decoder buffers */
1846 for(i=0;i<nb_istreams;i++) {
1848 if (ist->decoding_needed) {
1849 output_packet(ist, i, ost_table, nb_ostreams, NULL);
1855 /* write the trailer if needed and close file */
1856 for(i=0;i<nb_output_files;i++) {
1857 os = output_files[i];
1858 av_write_trailer(os);
1861 /* dump report by using the first video and audio streams */
1862 print_report(output_files, ost_table, nb_ostreams, 1);
1864 /* close each encoder */
1865 for(i=0;i<nb_ostreams;i++) {
1867 if (ost->encoding_needed) {
1868 av_freep(&ost->st->codec.stats_in);
1869 avcodec_close(&ost->st->codec);
1873 /* close each decoder */
1874 for(i=0;i<nb_istreams;i++) {
1876 if (ist->decoding_needed) {
1877 avcodec_close(&ist->st->codec);
1885 av_free(file_table);
1888 for(i=0;i<nb_istreams;i++) {
1895 for(i=0;i<nb_ostreams;i++) {
1899 fclose(ost->logfile);
1900 ost->logfile = NULL;
1902 fifo_free(&ost->fifo); /* works even if fifo is not
1903 initialized but set to zero */
1904 av_free(ost->pict_tmp.data[0]);
1905 if (ost->video_resample)
1906 img_resample_close(ost->img_resample_ctx);
1907 if (ost->audio_resample)
1908 audio_resample_close(ost->resample);
1921 int file_read(const char *filename)
1924 unsigned char buffer[1024];
1927 if (url_open(&h, filename, O_RDONLY) < 0) {
1928 printf("could not open '%s'\n", filename);
1932 len = url_read(h, buffer, sizeof(buffer));
1935 for(i=0;i<len;i++) putchar(buffer[i]);
1942 static void opt_image_format(const char *arg)
1946 for(f = first_image_format; f != NULL; f = f->next) {
1947 if (!strcmp(arg, f->name))
1951 fprintf(stderr, "Unknown image format: '%s'\n", arg);
1957 static void opt_format(const char *arg)
1959 /* compatibility stuff for pgmyuv */
1960 if (!strcmp(arg, "pgmyuv")) {
1961 opt_image_format(arg);
1965 file_iformat = av_find_input_format(arg);
1966 file_oformat = guess_format(arg, NULL, NULL);
1967 if (!file_iformat && !file_oformat) {
1968 fprintf(stderr, "Unknown input or output format: %s\n", arg);
1973 static void opt_video_bitrate(const char *arg)
1975 video_bit_rate = atoi(arg) * 1000;
1978 static void opt_video_bitrate_tolerance(const char *arg)
1980 video_bit_rate_tolerance = atoi(arg) * 1000;
1983 static void opt_video_bitrate_max(const char *arg)
1985 video_rc_max_rate = atoi(arg) * 1000;
1988 static void opt_video_bitrate_min(const char *arg)
1990 video_rc_min_rate = atoi(arg) * 1000;
1993 static void opt_video_buffer_size(const char *arg)
1995 video_rc_buffer_size = atoi(arg) * 8*1024;
1998 static void opt_video_rc_eq(char *arg)
2003 static void opt_video_rc_override_string(char *arg)
2005 video_rc_override_string = arg;
2009 static void opt_workaround_bugs(const char *arg)
2011 workaround_bugs = atoi(arg);
2014 static void opt_dct_algo(const char *arg)
2016 dct_algo = atoi(arg);
2019 static void opt_idct_algo(const char *arg)
2021 idct_algo = atoi(arg);
2024 static void opt_me_threshold(const char *arg)
2026 me_threshold = atoi(arg);
2029 static void opt_mb_threshold(const char *arg)
2031 mb_threshold = atoi(arg);
2034 static void opt_error_resilience(const char *arg)
2036 error_resilience = atoi(arg);
2039 static void opt_error_concealment(const char *arg)
2041 error_concealment = atoi(arg);
2044 static void opt_debug(const char *arg)
2049 static void opt_vismv(const char *arg)
2051 debug_mv = atoi(arg);
2054 static void opt_verbose(const char *arg)
2056 verbose = atoi(arg);
2057 av_log_set_level(atoi(arg));
2060 static void opt_frame_rate(const char *arg)
2062 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
2063 fprintf(stderr, "Incorrect frame rate\n");
2068 static void opt_frame_crop_top(const char *arg)
2070 frame_topBand = atoi(arg);
2071 if (frame_topBand < 0) {
2072 fprintf(stderr, "Incorrect top crop size\n");
2075 if ((frame_topBand % 2) != 0) {
2076 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2079 if ((frame_topBand) >= frame_height){
2080 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2083 frame_height -= frame_topBand;
2086 static void opt_frame_crop_bottom(const char *arg)
2088 frame_bottomBand = atoi(arg);
2089 if (frame_bottomBand < 0) {
2090 fprintf(stderr, "Incorrect bottom crop size\n");
2093 if ((frame_bottomBand % 2) != 0) {
2094 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2097 if ((frame_bottomBand) >= frame_height){
2098 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2101 frame_height -= frame_bottomBand;
2104 static void opt_frame_crop_left(const char *arg)
2106 frame_leftBand = atoi(arg);
2107 if (frame_leftBand < 0) {
2108 fprintf(stderr, "Incorrect left crop size\n");
2111 if ((frame_leftBand % 2) != 0) {
2112 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2115 if ((frame_leftBand) >= frame_width){
2116 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2119 frame_width -= frame_leftBand;
2122 static void opt_frame_crop_right(const char *arg)
2124 frame_rightBand = atoi(arg);
2125 if (frame_rightBand < 0) {
2126 fprintf(stderr, "Incorrect right crop size\n");
2129 if ((frame_rightBand % 2) != 0) {
2130 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2133 if ((frame_rightBand) >= frame_width){
2134 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2137 frame_width -= frame_rightBand;
2140 static void opt_frame_size(const char *arg)
2142 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2143 fprintf(stderr, "Incorrect frame size\n");
2146 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2147 fprintf(stderr, "Frame size must be a multiple of 2\n");
2153 #define SCALEBITS 10
2154 #define ONE_HALF (1 << (SCALEBITS - 1))
2155 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2157 #define RGB_TO_Y(r, g, b) \
2158 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2159 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2161 #define RGB_TO_U(r1, g1, b1, shift)\
2162 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2163 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2165 #define RGB_TO_V(r1, g1, b1, shift)\
2166 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2167 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2169 static void opt_pad_color(const char *arg) {
2170 /* Input is expected to be six hex digits similar to
2171 how colors are expressed in html tags (but without the #) */
2172 int rgb = strtol(arg, NULL, 16);
2176 g = ((rgb >> 8) & 255);
2179 padcolor[0] = RGB_TO_Y(r,g,b);
2180 padcolor[1] = RGB_TO_U(r,g,b,0);
2181 padcolor[2] = RGB_TO_V(r,g,b,0);
2184 static void opt_frame_pad_top(const char *arg)
2186 frame_padtop = atoi(arg);
2187 if (frame_padtop < 0) {
2188 fprintf(stderr, "Incorrect top pad size\n");
2191 if ((frame_padtop % 2) != 0) {
2192 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2197 static void opt_frame_pad_bottom(const char *arg)
2199 frame_padbottom = atoi(arg);
2200 if (frame_padbottom < 0) {
2201 fprintf(stderr, "Incorrect bottom pad size\n");
2204 if ((frame_padbottom % 2) != 0) {
2205 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2211 static void opt_frame_pad_left(const char *arg)
2213 frame_padleft = atoi(arg);
2214 if (frame_padleft < 0) {
2215 fprintf(stderr, "Incorrect left pad size\n");
2218 if ((frame_padleft % 2) != 0) {
2219 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2225 static void opt_frame_pad_right(const char *arg)
2227 frame_padright = atoi(arg);
2228 if (frame_padright < 0) {
2229 fprintf(stderr, "Incorrect right pad size\n");
2232 if ((frame_padright % 2) != 0) {
2233 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2239 static void opt_frame_pix_fmt(const char *arg)
2241 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2244 static void opt_frame_aspect_ratio(const char *arg)
2250 p = strchr(arg, ':');
2252 x = strtol(arg, (char **)&arg, 10);
2254 y = strtol(arg+1, (char **)&arg, 10);
2256 ar = (double)x / (double)y;
2258 ar = strtod(arg, (char **)&arg);
2261 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2264 frame_aspect_ratio = ar;
2267 static void opt_gop_size(const char *arg)
2269 gop_size = atoi(arg);
2272 static void opt_b_frames(const char *arg)
2274 b_frames = atoi(arg);
2275 if (b_frames > FF_MAX_B_FRAMES) {
2276 fprintf(stderr, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES);
2278 } else if (b_frames < 1) {
2279 fprintf(stderr, "\nNumber of B frames must be higher than 0\n");
2284 static void opt_mb_decision(const char *arg)
2286 mb_decision = atoi(arg);
2289 static void opt_mb_cmp(const char *arg)
2294 static void opt_ildct_cmp(const char *arg)
2296 ildct_cmp = atoi(arg);
2299 static void opt_sub_cmp(const char *arg)
2301 sub_cmp = atoi(arg);
2304 static void opt_cmp(const char *arg)
2309 static void opt_pre_cmp(const char *arg)
2311 pre_cmp = atoi(arg);
2314 static void opt_pre_me(const char *arg)
2319 static void opt_lumi_mask(const char *arg)
2321 lumi_mask = atof(arg);
2324 static void opt_dark_mask(const char *arg)
2326 dark_mask = atof(arg);
2329 static void opt_scplx_mask(const char *arg)
2331 scplx_mask = atof(arg);
2334 static void opt_tcplx_mask(const char *arg)
2336 tcplx_mask = atof(arg);
2339 static void opt_p_mask(const char *arg)
2344 static void opt_qscale(const char *arg)
2346 video_qscale = atof(arg);
2347 if (video_qscale < 0.01 ||
2348 video_qscale > 255) {
2349 fprintf(stderr, "qscale must be >= 0.01 and <= 255\n");
2354 static void opt_lmax(const char *arg)
2356 video_lmax = atof(arg)*FF_QP2LAMBDA;
2359 static void opt_lmin(const char *arg)
2361 video_lmin = atof(arg)*FF_QP2LAMBDA;
2364 static void opt_qmin(const char *arg)
2366 video_qmin = atoi(arg);
2367 if (video_qmin < 0 ||
2369 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2374 static void opt_qmax(const char *arg)
2376 video_qmax = atoi(arg);
2377 if (video_qmax < 0 ||
2379 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2384 static void opt_mb_qmin(const char *arg)
2386 video_mb_qmin = atoi(arg);
2387 if (video_mb_qmin < 0 ||
2388 video_mb_qmin > 31) {
2389 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2394 static void opt_mb_qmax(const char *arg)
2396 video_mb_qmax = atoi(arg);
2397 if (video_mb_qmax < 0 ||
2398 video_mb_qmax > 31) {
2399 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2404 static void opt_qdiff(const char *arg)
2406 video_qdiff = atoi(arg);
2407 if (video_qdiff < 0 ||
2409 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2414 static void opt_qblur(const char *arg)
2416 video_qblur = atof(arg);
2419 static void opt_qcomp(const char *arg)
2421 video_qcomp = atof(arg);
2424 static void opt_rc_initial_cplx(const char *arg)
2426 video_rc_initial_cplx = atof(arg);
2428 static void opt_b_qfactor(const char *arg)
2430 video_b_qfactor = atof(arg);
2432 static void opt_i_qfactor(const char *arg)
2434 video_i_qfactor = atof(arg);
2436 static void opt_b_qoffset(const char *arg)
2438 video_b_qoffset = atof(arg);
2440 static void opt_i_qoffset(const char *arg)
2442 video_i_qoffset = atof(arg);
2445 static void opt_ibias(const char *arg)
2447 video_intra_quant_bias = atoi(arg);
2449 static void opt_pbias(const char *arg)
2451 video_inter_quant_bias = atoi(arg);
2454 static void opt_packet_size(const char *arg)
2456 packet_size= atoi(arg);
2459 static void opt_error_rate(const char *arg)
2461 error_rate= atoi(arg);
2464 static void opt_strict(const char *arg)
2469 static void opt_top_field_first(const char *arg)
2471 top_field_first= atoi(arg);
2474 static void opt_noise_reduction(const char *arg)
2476 noise_reduction= atoi(arg);
2479 static void opt_qns(const char *arg)
2484 static void opt_sc_threshold(const char *arg)
2486 sc_threshold= atoi(arg);
2489 static void opt_me_range(const char *arg)
2491 me_range = atoi(arg);
2494 static void opt_thread_count(const char *arg)
2496 thread_count= atoi(arg);
2497 #if !defined(HAVE_PTHREADS) && !defined(HAVE_W32THREADS)
2499 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2503 static void opt_audio_bitrate(const char *arg)
2505 audio_bit_rate = atoi(arg) * 1000;
2508 static void opt_audio_rate(const char *arg)
2510 audio_sample_rate = atoi(arg);
2513 static void opt_audio_channels(const char *arg)
2515 audio_channels = atoi(arg);
2518 static void opt_video_device(const char *arg)
2520 video_device = av_strdup(arg);
2523 static void opt_video_channel(const char *arg)
2525 video_channel = strtol(arg, NULL, 0);
2528 static void opt_video_standard(const char *arg)
2530 video_standard = av_strdup(arg);
2533 static void opt_audio_device(const char *arg)
2535 audio_device = av_strdup(arg);
2538 static void opt_dv1394(const char *arg)
2540 video_grab_format = "dv1394";
2541 audio_grab_format = NULL;
2544 static void opt_audio_codec(const char *arg)
2548 if (!strcmp(arg, "copy")) {
2549 audio_stream_copy = 1;
2553 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_AUDIO)
2558 fprintf(stderr, "Unknown audio codec '%s'\n", arg);
2561 audio_codec_id = p->id;
2566 static void add_frame_hooker(const char *arg)
2571 char *args = av_strdup(arg);
2575 argv[0] = strtok(args, " ");
2576 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2579 i = frame_hook_add(argc, argv);
2582 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2587 const char *motion_str[] = {
2597 static void opt_motion_estimation(const char *arg)
2603 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2606 if (!strcmp(*p, arg))
2610 me_method = (p - motion_str) + 1;
2613 static void opt_video_codec(const char *arg)
2617 if (!strcmp(arg, "copy")) {
2618 video_stream_copy = 1;
2622 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_VIDEO)
2627 fprintf(stderr, "Unknown video codec '%s'\n", arg);
2630 video_codec_id = p->id;
2635 static void opt_map(const char *arg)
2641 m = &stream_maps[nb_stream_maps++];
2643 m->file_index = strtol(arg, (char **)&p, 0);
2647 m->stream_index = strtol(p, (char **)&p, 0);
2650 static void opt_recording_time(const char *arg)
2652 recording_time = parse_date(arg, 1);
2655 static void opt_start_time(const char *arg)
2657 start_time = parse_date(arg, 1);
2660 static void opt_rec_timestamp(const char *arg)
2662 rec_timestamp = parse_date(arg, 0) / 1000000;
2665 static void opt_input_ts_offset(const char *arg)
2667 input_ts_offset = parse_date(arg, 1);
2670 static void opt_input_file(const char *filename)
2672 AVFormatContext *ic;
2673 AVFormatParameters params, *ap = ¶ms;
2674 int err, i, ret, rfps, rfps_base;
2676 if (!strcmp(filename, "-"))
2679 using_stdin |= !strcmp(filename, "pipe:" ) ||
2680 !strcmp( filename, "/dev/stdin" );
2682 /* get default parameters from command line */
2683 memset(ap, 0, sizeof(*ap));
2684 ap->sample_rate = audio_sample_rate;
2685 ap->channels = audio_channels;
2686 ap->frame_rate = frame_rate;
2687 ap->frame_rate_base = frame_rate_base;
2688 ap->width = frame_width + frame_padleft + frame_padright;
2689 ap->height = frame_height + frame_padtop + frame_padbottom;
2690 ap->image_format = image_format;
2691 ap->pix_fmt = frame_pix_fmt;
2693 /* open the input file with generic libav function */
2694 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2696 print_error(filename, err);
2700 /* If not enough info to get the stream parameters, we decode the
2701 first frames to get it. (used in mpeg case for example) */
2702 ret = av_find_stream_info(ic);
2703 if (ret < 0 && verbose >= 0) {
2704 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2708 /* if seeking requested, we execute it */
2709 if (start_time != 0) {
2712 timestamp = start_time;
2713 /* add the stream start time */
2714 if (ic->start_time != AV_NOPTS_VALUE)
2715 timestamp += ic->start_time;
2716 ret = av_seek_frame(ic, -1, timestamp);
2718 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2719 filename, (double)timestamp / AV_TIME_BASE);
2721 /* reset seek info */
2725 /* update the current parameters so that they match the one of the input stream */
2726 for(i=0;i<ic->nb_streams;i++) {
2727 AVCodecContext *enc = &ic->streams[i]->codec;
2728 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2730 avcodec_thread_init(enc, thread_count);
2732 enc->thread_count= thread_count;
2733 switch(enc->codec_type) {
2734 case CODEC_TYPE_AUDIO:
2735 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2736 audio_channels = enc->channels;
2737 audio_sample_rate = enc->sample_rate;
2739 case CODEC_TYPE_VIDEO:
2740 frame_height = enc->height;
2741 frame_width = enc->width;
2742 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2743 frame_pix_fmt = enc->pix_fmt;
2744 rfps = ic->streams[i]->r_frame_rate;
2745 rfps_base = ic->streams[i]->r_frame_rate_base;
2746 enc->workaround_bugs = workaround_bugs;
2747 enc->error_resilience = error_resilience;
2748 enc->error_concealment = error_concealment;
2749 enc->idct_algo = idct_algo;
2751 enc->debug_mv = debug_mv;
2753 enc->flags|= CODEC_FLAG_BITEXACT;
2755 enc->debug |= FF_DEBUG_MV;
2757 assert(enc->frame_rate_base == rfps_base); // should be true for now
2758 if (enc->frame_rate != rfps) {
2761 fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f->%2.2f\n",
2762 i, (float)enc->frame_rate / enc->frame_rate_base,
2764 (float)rfps / rfps_base);
2766 /* update the current frame rate to match the stream frame rate */
2768 frame_rate_base = rfps_base;
2770 enc->rate_emu = rate_emu;
2772 case CODEC_TYPE_DATA:
2779 input_files[nb_input_files] = ic;
2780 input_files_ts_offset[nb_input_files] = input_ts_offset;
2781 /* dump the file content */
2783 dump_format(ic, nb_input_files, filename, 0);
2786 file_iformat = NULL;
2787 file_oformat = NULL;
2788 image_format = NULL;
2793 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
2795 int has_video, has_audio, i, j;
2796 AVFormatContext *ic;
2800 for(j=0;j<nb_input_files;j++) {
2801 ic = input_files[j];
2802 for(i=0;i<ic->nb_streams;i++) {
2803 AVCodecContext *enc = &ic->streams[i]->codec;
2804 switch(enc->codec_type) {
2805 case CODEC_TYPE_AUDIO:
2808 case CODEC_TYPE_VIDEO:
2811 case CODEC_TYPE_DATA:
2818 *has_video_ptr = has_video;
2819 *has_audio_ptr = has_audio;
2822 static void opt_output_file(const char *filename)
2825 AVFormatContext *oc;
2826 int use_video, use_audio, nb_streams, input_has_video, input_has_audio;
2828 AVFormatParameters params, *ap = ¶ms;
2830 if (!strcmp(filename, "-"))
2833 oc = av_alloc_format_context();
2835 if (!file_oformat) {
2836 file_oformat = guess_format(NULL, filename, NULL);
2837 if (!file_oformat) {
2838 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
2844 oc->oformat = file_oformat;
2846 if (!strcmp(file_oformat->name, "ffm") &&
2847 strstart(filename, "http:", NULL)) {
2848 /* special case for files sent to ffserver: we get the stream
2849 parameters from ffserver */
2850 if (read_ffserver_streams(oc, filename) < 0) {
2851 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
2855 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy;
2856 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy;
2858 /* disable if no corresponding type found and at least one
2860 if (nb_input_files > 0) {
2861 check_audio_video_inputs(&input_has_video, &input_has_audio);
2862 if (!input_has_video)
2864 if (!input_has_audio)
2868 /* manual disable */
2869 if (audio_disable) {
2872 if (video_disable) {
2878 AVCodecContext *video_enc;
2880 st = av_new_stream(oc, nb_streams++);
2882 fprintf(stderr, "Could not alloc stream\n");
2885 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2887 avcodec_thread_init(&st->codec, thread_count);
2890 video_enc = &st->codec;
2892 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
2893 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2894 if (video_stream_copy) {
2895 st->stream_copy = 1;
2896 video_enc->codec_type = CODEC_TYPE_VIDEO;
2902 codec_id = file_oformat->video_codec;
2903 if (video_codec_id != CODEC_ID_NONE)
2904 codec_id = video_codec_id;
2906 video_enc->codec_id = codec_id;
2907 codec = avcodec_find_encoder(codec_id);
2909 video_enc->bit_rate = video_bit_rate;
2910 video_enc->bit_rate_tolerance = video_bit_rate_tolerance;
2911 video_enc->frame_rate = frame_rate;
2912 video_enc->frame_rate_base = frame_rate_base;
2913 if(codec && codec->supported_framerates){
2914 const AVRational *p= codec->supported_framerates;
2915 AVRational req= (AVRational){frame_rate, frame_rate_base};
2916 const AVRational *best=NULL;
2917 AVRational best_error= (AVRational){INT_MAX, 1};
2918 for(; p->den!=0; p++){
2919 AVRational error= av_sub_q(req, *p);
2920 if(error.num <0) error.num *= -1;
2921 if(av_cmp_q(error, best_error) < 0){
2926 video_enc->frame_rate = best->num;
2927 video_enc->frame_rate_base= best->den;
2930 video_enc->width = frame_width + frame_padright + frame_padleft;
2931 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2932 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
2933 video_enc->pix_fmt = frame_pix_fmt;
2935 if(codec && codec->pix_fmts){
2936 const enum PixelFormat *p= codec->pix_fmts;
2938 if(*p == video_enc->pix_fmt)
2942 video_enc->pix_fmt = codec->pix_fmts[0];
2946 video_enc->gop_size = gop_size;
2948 video_enc->gop_size = 0;
2949 if (video_qscale || same_quality) {
2950 video_enc->flags |= CODEC_FLAG_QSCALE;
2951 st->quality = FF_QP2LAMBDA * video_qscale;
2955 video_enc->intra_matrix = intra_matrix;
2957 video_enc->inter_matrix = inter_matrix;
2960 video_enc->flags |= CODEC_FLAG_BITEXACT;
2962 video_enc->mb_decision = mb_decision;
2963 video_enc->mb_cmp = mb_cmp;
2964 video_enc->ildct_cmp = ildct_cmp;
2965 video_enc->me_sub_cmp = sub_cmp;
2966 video_enc->me_cmp = cmp;
2967 video_enc->me_pre_cmp = pre_cmp;
2968 video_enc->pre_me = pre_me;
2969 video_enc->lumi_masking = lumi_mask;
2970 video_enc->dark_masking = dark_mask;
2971 video_enc->spatial_cplx_masking = scplx_mask;
2972 video_enc->temporal_cplx_masking = tcplx_mask;
2973 video_enc->p_masking = p_mask;
2974 video_enc->quantizer_noise_shaping= qns;
2977 video_enc->flags |= CODEC_FLAG_H263P_UMV;
2980 video_enc->flags |= CODEC_FLAG_H263P_SLICE_STRUCT;
2983 video_enc->flags |= CODEC_FLAG_H263P_AIC;
2986 video_enc->flags |= CODEC_FLAG_H263P_AIV;
2989 video_enc->flags |= CODEC_FLAG_4MV;
2992 video_enc->flags |= CODEC_FLAG_OBMC;
2995 video_enc->flags |= CODEC_FLAG_LOOP_FILTER;
2999 video_enc->flags |= CODEC_FLAG_PART;
3002 video_enc->flags |= CODEC_FLAG_ALT_SCAN;
3005 video_enc->flags |= CODEC_FLAG_TRELLIS_QUANT;
3007 if (use_scan_offset) {
3008 video_enc->flags |= CODEC_FLAG_SVCD_SCAN_OFFSET;
3011 video_enc->flags |= CODEC_FLAG_CLOSED_GOP;
3014 video_enc->flags |= CODEC_FLAG_QPEL;
3017 video_enc->flags |= CODEC_FLAG_QP_RD;
3020 video_enc->flags |= CODEC_FLAG_CBP_RD;
3023 video_enc->max_b_frames = b_frames;
3024 video_enc->b_frame_strategy = 0;
3025 video_enc->b_quant_factor = 2.0;
3027 if (do_interlace_dct) {
3028 video_enc->flags |= CODEC_FLAG_INTERLACED_DCT;
3030 if (do_interlace_me) {
3031 video_enc->flags |= CODEC_FLAG_INTERLACED_ME;
3033 video_enc->qmin = video_qmin;
3034 video_enc->qmax = video_qmax;
3035 video_enc->lmin = video_lmin;
3036 video_enc->lmax = video_lmax;
3037 video_enc->mb_qmin = video_mb_qmin;
3038 video_enc->mb_qmax = video_mb_qmax;
3039 video_enc->max_qdiff = video_qdiff;
3040 video_enc->qblur = video_qblur;
3041 video_enc->qcompress = video_qcomp;
3042 video_enc->rc_eq = video_rc_eq;
3043 video_enc->debug = debug;
3044 video_enc->debug_mv = debug_mv;
3045 video_enc->thread_count = thread_count;
3046 p= video_rc_override_string;
3049 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3051 fprintf(stderr, "error parsing rc_override\n");
3054 video_enc->rc_override=
3055 av_realloc(video_enc->rc_override,
3056 sizeof(RcOverride)*(i+1));
3057 video_enc->rc_override[i].start_frame= start;
3058 video_enc->rc_override[i].end_frame = end;
3060 video_enc->rc_override[i].qscale= q;
3061 video_enc->rc_override[i].quality_factor= 1.0;
3064 video_enc->rc_override[i].qscale= 0;
3065 video_enc->rc_override[i].quality_factor= -q/100.0;
3070 video_enc->rc_override_count=i;
3072 video_enc->rc_max_rate = video_rc_max_rate;
3073 video_enc->rc_min_rate = video_rc_min_rate;
3074 video_enc->rc_buffer_size = video_rc_buffer_size;
3075 video_enc->rc_buffer_aggressivity= video_rc_buffer_aggressivity;
3076 video_enc->rc_initial_cplx= video_rc_initial_cplx;
3077 video_enc->i_quant_factor = video_i_qfactor;
3078 video_enc->b_quant_factor = video_b_qfactor;
3079 video_enc->i_quant_offset = video_i_qoffset;
3080 video_enc->b_quant_offset = video_b_qoffset;
3081 video_enc->intra_quant_bias = video_intra_quant_bias;
3082 video_enc->inter_quant_bias = video_inter_quant_bias;
3083 video_enc->dct_algo = dct_algo;
3084 video_enc->idct_algo = idct_algo;
3085 video_enc->me_threshold= me_threshold;
3086 video_enc->mb_threshold= mb_threshold;
3087 video_enc->intra_dc_precision= intra_dc_precision - 8;
3088 video_enc->strict_std_compliance = strict;
3089 video_enc->error_rate = error_rate;
3090 video_enc->noise_reduction= noise_reduction;
3091 video_enc->scenechange_threshold= sc_threshold;
3092 video_enc->me_range = me_range;
3093 video_enc->coder_type= coder;
3094 video_enc->context_model= context;
3095 video_enc->prediction_method= predictor;
3098 video_enc->rtp_mode= 1;
3099 video_enc->rtp_payload_size= packet_size;
3103 video_enc->flags|= CODEC_FLAG_PSNR;
3105 video_enc->me_method = me_method;
3110 video_enc->flags |= CODEC_FLAG_PASS1;
3112 video_enc->flags |= CODEC_FLAG_PASS2;
3119 AVCodecContext *audio_enc;
3121 st = av_new_stream(oc, nb_streams++);
3123 fprintf(stderr, "Could not alloc stream\n");
3126 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
3128 avcodec_thread_init(&st->codec, thread_count);
3131 audio_enc = &st->codec;
3132 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3134 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
3135 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3136 if (audio_stream_copy) {
3137 st->stream_copy = 1;
3138 audio_enc->channels = audio_channels;
3140 codec_id = file_oformat->audio_codec;
3141 if (audio_codec_id != CODEC_ID_NONE)
3142 codec_id = audio_codec_id;
3143 audio_enc->codec_id = codec_id;
3145 audio_enc->bit_rate = audio_bit_rate;
3146 audio_enc->strict_std_compliance = strict;
3147 audio_enc->thread_count = thread_count;
3148 /* For audio codecs other than AC3 or DTS we limit */
3149 /* the number of coded channels to stereo */
3150 if (audio_channels > 2 && codec_id != CODEC_ID_AC3
3151 && codec_id != CODEC_ID_DTS) {
3152 audio_enc->channels = 2;
3154 audio_enc->channels = audio_channels;
3156 audio_enc->sample_rate = audio_sample_rate;
3159 oc->nb_streams = nb_streams;
3162 fprintf(stderr, "No audio or video streams available\n");
3166 oc->timestamp = rec_timestamp;
3169 pstrcpy(oc->title, sizeof(oc->title), str_title);
3171 pstrcpy(oc->author, sizeof(oc->author), str_author);
3173 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3175 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3178 output_files[nb_output_files++] = oc;
3180 strcpy(oc->filename, filename);
3182 /* check filename in case of an image number is expected */
3183 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3184 if (filename_number_test(oc->filename) < 0) {
3185 print_error(oc->filename, AVERROR_NUMEXPECTED);
3190 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3191 /* test if it already exists to avoid loosing precious files */
3192 if (!file_overwrite &&
3193 (strchr(filename, ':') == NULL ||
3194 strstart(filename, "file:", NULL))) {
3195 if (url_exist(filename)) {
3198 if ( !using_stdin ) {
3199 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3202 if (toupper(c) != 'Y') {
3203 fprintf(stderr, "Not overwriting - exiting\n");
3208 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3215 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3216 fprintf(stderr, "Could not open '%s'\n", filename);
3221 memset(ap, 0, sizeof(*ap));
3222 ap->image_format = image_format;
3223 if (av_set_parameters(oc, ap) < 0) {
3224 fprintf(stderr, "%s: Invalid encoding parameters\n",
3229 /* reset some options */
3230 file_oformat = NULL;
3231 file_iformat = NULL;
3232 image_format = NULL;
3235 audio_codec_id = CODEC_ID_NONE;
3236 video_codec_id = CODEC_ID_NONE;
3237 audio_stream_copy = 0;
3238 video_stream_copy = 0;
3241 /* prepare dummy protocols for grab */
3242 static void prepare_grab(void)
3244 int has_video, has_audio, i, j;
3245 AVFormatContext *oc;
3246 AVFormatContext *ic;
3247 AVFormatParameters vp1, *vp = &vp1;
3248 AVFormatParameters ap1, *ap = &ap1;
3250 /* see if audio/video inputs are needed */
3253 memset(ap, 0, sizeof(*ap));
3254 memset(vp, 0, sizeof(*vp));
3255 for(j=0;j<nb_output_files;j++) {
3256 oc = output_files[j];
3257 for(i=0;i<oc->nb_streams;i++) {
3258 AVCodecContext *enc = &oc->streams[i]->codec;
3259 switch(enc->codec_type) {
3260 case CODEC_TYPE_AUDIO:
3261 if (enc->sample_rate > ap->sample_rate)
3262 ap->sample_rate = enc->sample_rate;
3263 if (enc->channels > ap->channels)
3264 ap->channels = enc->channels;
3267 case CODEC_TYPE_VIDEO:
3268 if (enc->width > vp->width)
3269 vp->width = enc->width;
3270 if (enc->height > vp->height)
3271 vp->height = enc->height;
3273 assert(enc->frame_rate_base == DEFAULT_FRAME_RATE_BASE);
3274 if (enc->frame_rate > vp->frame_rate){
3275 vp->frame_rate = enc->frame_rate;
3276 vp->frame_rate_base = enc->frame_rate_base;
3286 if (has_video == 0 && has_audio == 0) {
3287 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3292 AVInputFormat *fmt1;
3293 fmt1 = av_find_input_format(video_grab_format);
3294 vp->device = video_device;
3295 vp->channel = video_channel;
3296 vp->standard = video_standard;
3297 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3298 fprintf(stderr, "Could not find video grab device\n");
3301 /* If not enough info to get the stream parameters, we decode the
3302 first frames to get it. */
3303 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3304 fprintf(stderr, "Could not find video grab parameters\n");
3307 /* by now video grab has one stream */
3308 ic->streams[0]->r_frame_rate = vp->frame_rate;
3309 ic->streams[0]->r_frame_rate_base = vp->frame_rate_base;
3310 input_files[nb_input_files] = ic;
3313 dump_format(ic, nb_input_files, "", 0);
3317 if (has_audio && audio_grab_format) {
3318 AVInputFormat *fmt1;
3319 fmt1 = av_find_input_format(audio_grab_format);
3320 ap->device = audio_device;
3321 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3322 fprintf(stderr, "Could not find audio grab device\n");
3325 input_files[nb_input_files] = ic;
3328 dump_format(ic, nb_input_files, "", 0);
3334 /* same option as mencoder */
3335 static void opt_pass(const char *pass_str)
3338 pass = atoi(pass_str);
3339 if (pass != 1 && pass != 2) {
3340 fprintf(stderr, "pass number can be only 1 or 2\n");
3346 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3347 static int64_t getutime(void)
3349 return av_gettime();
3352 static int64_t getutime(void)
3354 struct rusage rusage;
3356 getrusage(RUSAGE_SELF, &rusage);
3357 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3361 extern int ffm_nopts;
3363 static void opt_bitexact(void)
3366 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3370 static void show_formats(void)
3372 AVInputFormat *ifmt;
3373 AVOutputFormat *ofmt;
3374 AVImageFormat *image_fmt;
3377 const char **pp, *last_name;
3379 printf("File formats:\n");
3384 const char *name=NULL;
3386 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3387 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3388 strcmp(ofmt->name, last_name)>0){
3393 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3394 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3395 strcmp(ifmt->name, last_name)>0){
3399 if(name && strcmp(ifmt->name, name)==0)
3414 printf("Image formats:\n");
3415 for(image_fmt = first_image_format; image_fmt != NULL;
3416 image_fmt = image_fmt->next) {
3419 image_fmt->img_read ? "D":" ",
3420 image_fmt->img_write ? "E":" ",
3425 printf("Codecs:\n");
3433 for(p = first_avcodec; p != NULL; p = p->next) {
3434 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3435 strcmp(p->name, last_name)>0){
3437 decode= encode= cap=0;
3439 if(p2 && strcmp(p->name, p2->name)==0){
3440 if(p->decode) decode=1;
3441 if(p->encode) encode=1;
3442 cap |= p->capabilities;
3447 last_name= p2->name;
3451 decode ? "D": (/*p2->decoder ? "d":*/" "),
3453 p2->type == CODEC_TYPE_AUDIO ? "A":"V",
3454 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3455 cap & CODEC_CAP_DR1 ? "D":" ",
3456 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3458 /* if(p2->decoder && decode==0)
3459 printf(" use %s for decoding", p2->decoder->name);*/
3464 printf("Supported file protocols:\n");
3465 for(up = first_protocol; up != NULL; up = up->next)
3466 printf(" %s:", up->name);
3469 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3470 printf("Motion estimation methods:\n");
3474 if ((pp - motion_str + 1) == ME_ZERO)
3475 printf("(fastest)");
3476 else if ((pp - motion_str + 1) == ME_FULL)
3477 printf("(slowest)");
3478 else if ((pp - motion_str + 1) == ME_EPZS)
3479 printf("(default)");
3484 "Note, the names of encoders and decoders dont always match, so there are\n"
3485 "several cases where the above table shows encoder only or decoder only entries\n"
3486 "even though both encoding and decoding are supported for example, the h263\n"
3487 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3492 void parse_matrix_coeffs(uint16_t *dest, const char *str)
3495 const char *p = str;
3502 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3509 void opt_inter_matrix(const char *arg)
3511 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3512 parse_matrix_coeffs(inter_matrix, arg);
3515 void opt_intra_matrix(const char *arg)
3517 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3518 parse_matrix_coeffs(intra_matrix, arg);
3521 static void opt_target(const char *arg)
3525 if(!strncmp(arg, "pal-", 4)) {
3528 } else if(!strncmp(arg, "ntsc-", 5)) {
3533 /* Calculate FR via float to avoid int overflow */
3534 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3537 } else if((fr == 29970) || (fr == 23976)) {
3540 /* Try to determine PAL/NTSC by peeking in the input files */
3541 if(nb_input_files) {
3543 for(j = 0; j < nb_input_files; j++) {
3544 for(i = 0; i < input_files[j]->nb_streams; i++) {
3545 AVCodecContext *c = &input_files[j]->streams[i]->codec;
3546 if(c->codec_type != CODEC_TYPE_VIDEO)
3548 fr = c->frame_rate * 1000 / c->frame_rate_base;
3552 } else if((fr == 29970) || (fr == 23976)) {
3562 if(verbose && norm >= 0)
3563 printf("Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3567 fprintf(stderr, "Could not determine norm (PAL/NTSC) for target.\n");
3568 fprintf(stderr, "Please prefix target with \"pal-\" or \"ntsc-\",\n");
3569 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3573 if(!strcmp(arg, "vcd")) {
3575 opt_video_codec("mpeg1video");
3576 opt_audio_codec("mp2");
3579 opt_frame_size(norm ? "352x240" : "352x288");
3581 video_bit_rate = 1150000;
3582 video_rc_max_rate = 1150000;
3583 video_rc_min_rate = 1150000;
3584 video_rc_buffer_size = 40*1024*8;
3586 audio_bit_rate = 224000;
3587 audio_sample_rate = 44100;
3589 } else if(!strcmp(arg, "svcd")) {
3591 opt_video_codec("mpeg2video");
3592 opt_audio_codec("mp2");
3595 opt_frame_size(norm ? "480x480" : "480x576");
3596 opt_gop_size(norm ? "18" : "15");
3598 video_bit_rate = 2040000;
3599 video_rc_max_rate = 2516000;
3600 video_rc_min_rate = 0; //1145000;
3601 video_rc_buffer_size = 224*1024*8;
3602 use_scan_offset = 1;
3604 audio_bit_rate = 224000;
3605 audio_sample_rate = 44100;
3607 } else if(!strcmp(arg, "dvd")) {
3609 opt_video_codec("mpeg2video");
3610 opt_audio_codec("ac3");
3613 opt_frame_size(norm ? "720x480" : "720x576");
3614 opt_gop_size(norm ? "18" : "15");
3616 video_bit_rate = 6000000;
3617 video_rc_max_rate = 9000000;
3618 video_rc_min_rate = 0; //1500000;
3619 video_rc_buffer_size = 224*1024*8;
3621 audio_bit_rate = 448000;
3622 audio_sample_rate = 48000;
3625 fprintf(stderr, "Unknown target: %s\n", arg);
3630 static void show_version(void)
3632 printf("ffmpeg " FFMPEG_VERSION "\n"
3635 avcodec_build(), LIBAVFORMAT_BUILD);
3639 const OptionDef options[] = {
3641 { "L", 0, {(void*)show_license}, "show license" },
3642 { "h", 0, {(void*)show_help}, "show help" },
3643 { "version", 0, {(void*)show_version}, "show version" },
3644 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3645 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3646 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
3647 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3648 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3649 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream" },
3650 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3651 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3652 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3653 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3654 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3655 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3656 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3657 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3658 { "debug", HAS_ARG | OPT_EXPERT, {(void*)opt_debug}, "print specific debug info", "" },
3659 { "vismv", HAS_ARG | OPT_EXPERT, {(void*)opt_vismv}, "visualize motion vectors", "" },
3660 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3661 "add timings for benchmarking" },
3662 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3663 "dump each input packet" },
3664 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3665 "when dumping packets, also dump the payload" },
3666 { "bitexact", OPT_EXPERT, {(void*)opt_bitexact}, "only use bit exact algorithms (for codec testing)" },
3667 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3668 { "loop", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3669 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3670 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\" or \"dvd\")", "type" },
3671 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3672 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3673 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3674 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3677 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
3678 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3679 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3680 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3681 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3682 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3683 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3684 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3685 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3686 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3687 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3688 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3689 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3690 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3691 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
3692 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3693 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3694 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
3695 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
3696 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
3697 { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
3698 { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
3699 { "mbqmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmin}, "min macroblock quantiser scale (VBR)", "q" },
3700 { "mbqmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmax}, "max macroblock quantiser scale (VBR)", "q" },
3701 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
3702 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
3703 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
3704 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
3705 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
3706 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
3707 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
3708 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
3709 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
3710 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
3711 // { "b_strategy", HAS_ARG | OPT_EXPERT, {(void*)opt_b_strategy}, "dynamic b frame selection strategy", "strategy" },
3712 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3713 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3714 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
3715 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
3716 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
3717 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffere size (in kByte)", "size" },
3718 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3719 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
3721 { "dct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dct_algo}, "set dct algo", "algo" },
3722 { "idct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_idct_algo}, "set idct algo", "algo" },
3723 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
3724 { "mb_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_threshold}, "macroblock threshold", "" },
3725 { "er", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_resilience}, "set error resilience", "n" },
3726 { "ec", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_concealment}, "set error concealment", "bit_mask" },
3727 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
3728 { "hq", OPT_BOOL, {(void*)&mb_decision}, "activate high quality settings" },
3729 { "mbd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_decision}, "macroblock decision", "mode" },
3730 { "mbcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_cmp}, "macroblock compare function", "cmp function" },
3731 { "ildctcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ildct_cmp}, "ildct compare function", "cmp function" },
3732 { "subcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sub_cmp}, "subpel compare function", "cmp function" },
3733 { "cmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_cmp}, "fullpel compare function", "cmp function" },
3734 { "precmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_cmp}, "pre motion estimation compare function", "cmp function" },
3735 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
3736 { "lumi_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lumi_mask}, "luminance masking", "" },
3737 { "dark_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dark_mask}, "darkness masking", "" },
3738 { "scplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_scplx_mask}, "spatial complexity masking", "" },
3739 { "tcplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_tcplx_mask}, "teporal complexity masking", "" },
3740 { "p_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_p_mask}, "inter masking", "" },
3741 { "4mv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_4mv}, "use four motion vector by macroblock (MPEG4)" },
3742 { "obmc", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_obmc}, "use overlapped block motion compensation (h263+)" },
3743 { "lf", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_loop}, "use loop filter (h263+)" },
3744 { "part", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_part}, "use data partitioning (MPEG4)" },
3745 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
3746 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
3747 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
3748 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3749 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3750 "use same video quality as source (implies VBR)" },
3751 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3752 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3753 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3754 "deinterlace pictures" },
3755 { "ildct", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_dct},
3756 "force interlaced dct support in encoder (MPEG2/MPEG4)" },
3757 { "ilme", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_me},
3758 "force interlaced me support in encoder (MPEG2/MPEG4)" },
3759 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3760 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
3761 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3762 { "aic", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aic}, "enable Advanced intra coding (h263+)" },
3763 { "aiv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aiv}, "enable Alternative inter vlc (h263+)" },
3764 { "umv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_umv}, "enable Unlimited Motion Vector (h263+)" },
3765 { "ssm", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_ss}, "enable Slice Structured mode (h263+)" },
3766 { "alt", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_alt_scan}, "enable alternate scantable (MPEG2/MPEG4)" },
3767 { "qprd", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qprd}, "" },
3768 { "cbp", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_cbprd}, "" },
3769 { "trell", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_trell}, "enable trellis quantization" },
3770 { "cgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&closed_gop}, "closed gop" },
3771 { "scan_offset", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_scan_offset}, "enable SVCD Scan Offset placeholder" },
3772 { "qpel", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qpel}, "enable 1/4-pel" },
3773 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3774 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3775 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3776 { "nr", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_noise_reduction}, "noise reduction", "" },
3777 { "qns", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qns}, "quantization noise shaping", "" },
3778 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
3779 { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
3780 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3781 { "coder", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&coder}, "coder type", "" },
3782 { "context", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&context}, "context model", "" },
3783 { "pred", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&predictor}, "prediction method", "" },
3786 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
3787 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3788 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3789 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3790 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3793 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
3794 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3795 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3796 { "dv1394", OPT_EXPERT | OPT_GRAB, {(void*)opt_dv1394}, "set DV1394 grab", "" },
3797 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
3801 static void show_banner(void)
3803 printf("ffmpeg version " FFMPEG_VERSION ", build %d, Copyright (c) 2000-2004 Fabrice Bellard\n",
3805 printf(" built on " __DATE__ " " __TIME__);
3807 printf(", gcc: %s\n", __VERSION__);
3809 printf(", using a non-gcc compiler\n");
3813 static void show_license(void)
3818 "This program is free software; you can redistribute it and/or modify\n"
3819 "it under the terms of the GNU General Public License as published by\n"
3820 "the Free Software Foundation; either version 2 of the License, or\n"
3821 "(at your option) any later version.\n"
3823 "This program is distributed in the hope that it will be useful,\n"
3824 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3825 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
3826 "GNU General Public License for more details.\n"
3828 "You should have received a copy of the GNU General Public License\n"
3829 "along with this program; if not, write to the Free Software\n"
3830 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3834 "This library is free software; you can redistribute it and/or\n"
3835 "modify it under the terms of the GNU Lesser General Public\n"
3836 "License as published by the Free Software Foundation; either\n"
3837 "version 2 of the License, or (at your option) any later version.\n"
3839 "This library is distributed in the hope that it will be useful,\n"
3840 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3841 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
3842 "Lesser General Public License for more details.\n"
3844 "You should have received a copy of the GNU Lesser General Public\n"
3845 "License along with this library; if not, write to the Free Software\n"
3846 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3852 static void show_help(void)
3855 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3856 "Hyper fast Audio and Video encoder\n");
3858 show_help_options(options, "Main options:\n",
3859 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
3860 show_help_options(options, "\nVideo options:\n",
3861 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3863 show_help_options(options, "\nAdvanced Video options:\n",
3864 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3865 OPT_VIDEO | OPT_EXPERT);
3866 show_help_options(options, "\nAudio options:\n",
3867 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3869 show_help_options(options, "\nAdvanced Audio options:\n",
3870 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3871 OPT_AUDIO | OPT_EXPERT);
3872 show_help_options(options, "\nAudio/Video grab options:\n",
3875 show_help_options(options, "\nAdvanced options:\n",
3876 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3881 void parse_arg_file(const char *filename)
3883 opt_output_file(filename);
3886 int main(int argc, char **argv)
3899 parse_options(argc, argv, options);
3901 /* file converter / grab */
3902 if (nb_output_files <= 0) {
3903 fprintf(stderr, "Must supply at least one output file\n");
3907 if (nb_input_files == 0) {
3913 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3914 stream_maps, nb_stream_maps);
3915 ti = getutime() - ti;
3917 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3921 for(i=0;i<nb_output_files;i++) {
3922 /* maybe av_close_output_file ??? */
3923 AVFormatContext *s = output_files[i];
3925 if (!(s->oformat->flags & AVFMT_NOFILE))
3927 for(j=0;j<s->nb_streams;j++)
3928 av_free(s->streams[j]);
3931 for(i=0;i<nb_input_files;i++)
3932 av_close_input_file(input_files[i]);
3937 av_free(intra_matrix);
3939 av_free(inter_matrix);
3941 #ifdef POWERPC_PERFORMANCE_REPORT
3942 extern void powerpc_display_perf_report(void);
3943 powerpc_display_perf_report();
3944 #endif /* POWERPC_PERFORMANCE_REPORT */
3946 #ifndef CONFIG_WIN32
3947 if (received_sigterm) {
3949 "Received signal %d: terminating.\n",
3950 (int) received_sigterm);
3954 exit(0); /* not all OS-es handle main() return value */