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 /* XXX: pb because no interleaving */
820 for(i=0;i<nb_frames;i++) {
822 av_init_packet(&pkt);
823 pkt.stream_index= ost->index;
825 if (s->oformat->flags & AVFMT_RAWPICTURE) {
826 /* raw pictures are written as AVPicture structure to
827 avoid any copies. We support temorarily the older
829 AVFrame* old_frame = enc->coded_frame;
830 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
831 pkt.data= (uint8_t *)final_picture;
832 pkt.size= sizeof(AVPicture);
834 pkt.pts= dec->coded_frame->pts;
835 if(dec->coded_frame && dec->coded_frame->key_frame)
836 pkt.flags |= PKT_FLAG_KEY;
838 av_interleaved_write_frame(s, &pkt);
839 enc->coded_frame = old_frame;
843 big_picture= *final_picture;
844 /* better than nothing: use input picture interlaced
846 big_picture.interlaced_frame = in_picture->interlaced_frame;
847 if(do_interlace_me || do_interlace_dct){
848 if(top_field_first == -1)
849 big_picture.top_field_first = in_picture->top_field_first;
851 big_picture.top_field_first = top_field_first;
854 /* handles sameq here. This is not correct because it may
855 not be a global option */
857 big_picture.quality = ist->st->quality;
859 big_picture.quality = ost->st->quality;
861 big_picture.pict_type = 0;
862 // big_picture.pts = AV_NOPTS_VALUE;
863 big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->frame_rate_base, enc->frame_rate);
864 //av_log(NULL, AV_LOG_DEBUG, "%lld -> encoder\n", ost->sync_opts);
865 ret = avcodec_encode_video(enc,
866 bit_buffer, VIDEO_BUFFER_SIZE,
868 //enc->frame_number = enc->real_pict_num;
870 pkt.data= bit_buffer;
873 pkt.pts= enc->coded_frame->pts;
874 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %lld/%lld\n",
875 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1,
876 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1);*/
878 if(enc->coded_frame && enc->coded_frame->key_frame)
879 pkt.flags |= PKT_FLAG_KEY;
880 av_interleaved_write_frame(s, &pkt);
882 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
883 // enc->frame_number-1, enc->real_pict_num, ret,
885 /* if two pass, output log */
886 if (ost->logfile && enc->stats_out) {
887 fprintf(ost->logfile, "%s", enc->stats_out);
899 static double psnr(double d){
900 if(d==0) return INFINITY;
901 return -10.0*log(d)/log(10.0);
904 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
907 static FILE *fvstats=NULL;
914 double ti1, bitrate, avg_bitrate;
918 today = localtime(&today2);
919 sprintf(filename, "vstats_%02d%02d%02d.log", today->tm_hour,
922 fvstats = fopen(filename,"w");
930 enc = &ost->st->codec;
931 if (enc->codec_type == CODEC_TYPE_VIDEO) {
932 frame_number = ost->frame_number;
933 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
934 if (enc->flags&CODEC_FLAG_PSNR)
935 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
937 fprintf(fvstats,"f_size= %6d ", frame_size);
938 /* compute pts value */
939 ti1 = (double)ost->sync_opts *enc->frame_rate_base / enc->frame_rate;
943 bitrate = (double)(frame_size * 8) * enc->frame_rate / enc->frame_rate_base / 1000.0;
944 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
945 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
946 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
947 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
951 static void print_report(AVFormatContext **output_files,
952 AVOutputStream **ost_table, int nb_ostreams,
957 AVFormatContext *oc, *os;
960 int frame_number, vid, i;
961 double bitrate, ti1, pts;
962 static int64_t last_time = -1;
964 if (!is_last_report) {
966 /* display the report every 0.5 seconds */
967 cur_time = av_gettime();
968 if (last_time == -1) {
969 last_time = cur_time;
972 if ((cur_time - last_time) < 500000)
974 last_time = cur_time;
978 oc = output_files[0];
980 total_size = url_ftell(&oc->pb);
985 for(i=0;i<nb_ostreams;i++) {
987 os = output_files[ost->file_index];
988 enc = &ost->st->codec;
989 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
990 sprintf(buf + strlen(buf), "q=%2.1f ",
991 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
993 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
994 frame_number = ost->frame_number;
995 sprintf(buf + strlen(buf), "frame=%5d q=%2.1f ",
996 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : 0);
998 sprintf(buf + strlen(buf), "L");
999 if (enc->flags&CODEC_FLAG_PSNR){
1001 double error, error_sum=0;
1002 double scale, scale_sum=0;
1003 char type[3]= {'Y','U','V'};
1004 sprintf(buf + strlen(buf), "PSNR=");
1007 error= enc->error[j];
1008 scale= enc->width*enc->height*255.0*255.0*frame_number;
1010 error= enc->coded_frame->error[j];
1011 scale= enc->width*enc->height*255.0*255.0;
1016 sprintf(buf + strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1018 sprintf(buf + strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1022 /* compute min output value */
1023 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1024 if ((pts < ti1) && (pts > 0))
1030 if (verbose || is_last_report) {
1031 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1033 sprintf(buf + strlen(buf),
1034 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
1035 (double)total_size / 1024, ti1, bitrate);
1038 sprintf(buf + strlen(buf), " dup=%d drop=%d",
1039 nb_frames_dup, nb_frames_drop);
1042 fprintf(stderr, "%s \r", buf);
1047 if (is_last_report && verbose >= 0){
1048 int64_t raw= audio_size + video_size + extra_size;
1049 fprintf(stderr, "\n");
1050 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1054 100.0*(total_size - raw)/raw
1059 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1060 static int output_packet(AVInputStream *ist, int ist_index,
1061 AVOutputStream **ost_table, int nb_ostreams,
1062 const AVPacket *pkt)
1064 AVFormatContext *os;
1065 AVOutputStream *ost;
1069 int data_size, got_picture;
1071 short samples[AVCODEC_MAX_AUDIO_FRAME_SIZE / 2];
1072 void *buffer_to_free;
1074 if (pkt && pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1075 ist->next_pts = ist->pts = pkt->dts;
1077 assert(ist->pts == ist->next_pts);
1091 /* decode the packet if needed */
1092 data_buf = NULL; /* fail safe */
1094 if (ist->decoding_needed) {
1095 switch(ist->st->codec.codec_type) {
1096 case CODEC_TYPE_AUDIO:
1097 /* XXX: could avoid copy if PCM 16 bits with same
1098 endianness as CPU */
1099 ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size,
1105 /* Some bug in mpeg audio decoder gives */
1106 /* data_size < 0, it seems they are overflows */
1107 if (data_size <= 0) {
1108 /* no audio frame */
1111 data_buf = (uint8_t *)samples;
1112 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1113 (ist->st->codec.sample_rate * ist->st->codec.channels);
1115 case CODEC_TYPE_VIDEO:
1116 data_size = (ist->st->codec.width * ist->st->codec.height * 3) / 2;
1117 /* XXX: allocate picture correctly */
1118 avcodec_get_frame_defaults(&picture);
1120 ret = avcodec_decode_video(&ist->st->codec,
1121 &picture, &got_picture, ptr, len);
1122 ist->st->quality= picture.quality;
1126 /* no picture yet */
1127 goto discard_packet;
1129 if (ist->st->codec.frame_rate_base != 0) {
1130 ist->next_pts += ((int64_t)AV_TIME_BASE *
1131 ist->st->codec.frame_rate_base) /
1132 ist->st->codec.frame_rate;
1146 buffer_to_free = NULL;
1147 if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1148 pre_process_video_frame(ist, (AVPicture *)&picture,
1152 /* frame rate emulation */
1153 if (ist->st->codec.rate_emu) {
1154 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec.frame_rate_base, 1000000, ist->st->codec.frame_rate);
1155 int64_t now = av_gettime() - ist->start;
1163 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1164 is the one of the next displayed one */
1165 /* XXX: add mpeg4 too ? */
1166 if (ist->st->codec.codec_id == CODEC_ID_MPEG1VIDEO) {
1167 if (ist->st->codec.pict_type != B_TYPE) {
1169 tmp = ist->last_ip_pts;
1170 ist->last_ip_pts = ist->frac_pts.val;
1171 ist->frac_pts.val = tmp;
1175 /* if output time reached then transcode raw format,
1176 encode packets and output them */
1177 if (start_time == 0 || ist->pts >= start_time)
1178 for(i=0;i<nb_ostreams;i++) {
1182 if (ost->source_index == ist_index) {
1183 os = output_files[ost->file_index];
1186 printf("%d: got pts=%0.3f %0.3f\n", i,
1187 (double)pkt->pts / AV_TIME_BASE,
1188 ((double)ist->pts / AV_TIME_BASE) -
1189 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1191 /* set the input output pts pairs */
1192 ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index])/ AV_TIME_BASE;
1194 if (ost->encoding_needed) {
1195 switch(ost->st->codec.codec_type) {
1196 case CODEC_TYPE_AUDIO:
1197 do_audio_out(os, ost, ist, data_buf, data_size);
1199 case CODEC_TYPE_VIDEO:
1200 /* find an audio stream for synchro */
1203 AVOutputStream *audio_sync, *ost1;
1205 for(i=0;i<nb_ostreams;i++) {
1206 ost1 = ost_table[i];
1207 if (ost1->file_index == ost->file_index &&
1208 ost1->st->codec.codec_type == CODEC_TYPE_AUDIO) {
1214 do_video_out(os, ost, ist, &picture, &frame_size);
1215 video_size += frame_size;
1216 if (do_vstats && frame_size)
1217 do_video_stats(os, ost, frame_size);
1224 AVFrame avframe; //FIXME/XXX remove this
1226 av_init_packet(&opkt);
1228 /* no reencoding needed : output the packet directly */
1229 /* force the input stream PTS */
1231 avcodec_get_frame_defaults(&avframe);
1232 ost->st->codec.coded_frame= &avframe;
1233 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1235 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO)
1236 audio_size += data_size;
1237 else if (ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1238 video_size += data_size;
1240 opkt.stream_index= ost->index;
1241 opkt.data= data_buf;
1242 opkt.size= data_size;
1243 opkt.pts= pkt->pts + input_files_ts_offset[ist->file_index];
1244 opkt.dts= pkt->dts + input_files_ts_offset[ist->file_index];
1245 opkt.flags= pkt->flags;
1247 av_interleaved_write_frame(os, &opkt);
1248 ost->st->codec.frame_number++;
1249 ost->frame_number++;
1253 av_free(buffer_to_free);
1259 for(i=0;i<nb_ostreams;i++) {
1261 if (ost->source_index == ist_index) {
1262 AVCodecContext *enc= &ost->st->codec;
1263 os = output_files[ost->file_index];
1265 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1267 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1270 if (ost->encoding_needed) {
1273 av_init_packet(&pkt);
1274 pkt.stream_index= ost->index;
1276 switch(ost->st->codec.codec_type) {
1277 case CODEC_TYPE_AUDIO:
1278 ret = avcodec_encode_audio(enc, bit_buffer, VIDEO_BUFFER_SIZE, NULL);
1280 pkt.flags |= PKT_FLAG_KEY;
1282 case CODEC_TYPE_VIDEO:
1283 ret = avcodec_encode_video(enc, bit_buffer, VIDEO_BUFFER_SIZE, NULL);
1285 if(enc->coded_frame && enc->coded_frame->key_frame)
1286 pkt.flags |= PKT_FLAG_KEY;
1287 if (ost->logfile && enc->stats_out) {
1288 fprintf(ost->logfile, "%s", enc->stats_out);
1297 pkt.data= bit_buffer;
1299 if(enc->coded_frame)
1300 pkt.pts= enc->coded_frame->pts;
1301 av_interleaved_write_frame(os, &pkt);
1315 * The following code is the main loop of the file converter
1317 static int av_encode(AVFormatContext **output_files,
1318 int nb_output_files,
1319 AVFormatContext **input_files,
1321 AVStreamMap *stream_maps, int nb_stream_maps)
1323 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1324 AVFormatContext *is, *os;
1325 AVCodecContext *codec, *icodec;
1326 AVOutputStream *ost, **ost_table = NULL;
1327 AVInputStream *ist, **ist_table = NULL;
1328 AVInputFile *file_table;
1329 AVFormatContext *stream_no_data;
1332 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1337 bit_buffer = av_malloc(VIDEO_BUFFER_SIZE);
1341 /* input stream init */
1343 for(i=0;i<nb_input_files;i++) {
1344 is = input_files[i];
1345 file_table[i].ist_index = j;
1346 file_table[i].nb_streams = is->nb_streams;
1347 j += is->nb_streams;
1351 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1355 for(i=0;i<nb_istreams;i++) {
1356 ist = av_mallocz(sizeof(AVInputStream));
1362 for(i=0;i<nb_input_files;i++) {
1363 is = input_files[i];
1364 for(k=0;k<is->nb_streams;k++) {
1365 ist = ist_table[j++];
1366 ist->st = is->streams[k];
1367 ist->file_index = i;
1369 ist->discard = 1; /* the stream is discarded by default
1372 if (ist->st->codec.rate_emu) {
1373 ist->start = av_gettime();
1379 /* output stream init */
1381 for(i=0;i<nb_output_files;i++) {
1382 os = output_files[i];
1383 nb_ostreams += os->nb_streams;
1385 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1386 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1390 /* Sanity check the mapping args -- do the input files & streams exist? */
1391 for(i=0;i<nb_stream_maps;i++) {
1392 int fi = stream_maps[i].file_index;
1393 int si = stream_maps[i].stream_index;
1395 if (fi < 0 || fi > nb_input_files - 1 ||
1396 si < 0 || si > file_table[fi].nb_streams - 1) {
1397 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1402 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1405 for(i=0;i<nb_ostreams;i++) {
1406 ost = av_mallocz(sizeof(AVOutputStream));
1413 for(k=0;k<nb_output_files;k++) {
1414 os = output_files[k];
1415 for(i=0;i<os->nb_streams;i++) {
1417 ost = ost_table[n++];
1418 ost->file_index = k;
1420 ost->st = os->streams[i];
1421 if (nb_stream_maps > 0) {
1422 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1423 stream_maps[n-1].stream_index;
1425 /* Sanity check that the stream types match */
1426 if (ist_table[ost->source_index]->st->codec.codec_type != ost->st->codec.codec_type) {
1427 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1428 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1429 ost->file_index, ost->index);
1434 /* get corresponding input stream index : we select the first one with the right type */
1436 for(j=0;j<nb_istreams;j++) {
1439 ist->st->codec.codec_type == ost->st->codec.codec_type) {
1440 ost->source_index = j;
1446 /* try again and reuse existing stream */
1447 for(j=0;j<nb_istreams;j++) {
1449 if (ist->st->codec.codec_type == ost->st->codec.codec_type) {
1450 ost->source_index = j;
1455 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1456 ost->file_index, ost->index);
1461 ist = ist_table[ost->source_index];
1466 /* for each output stream, we compute the right encoding parameters */
1467 for(i=0;i<nb_ostreams;i++) {
1469 ist = ist_table[ost->source_index];
1471 codec = &ost->st->codec;
1472 icodec = &ist->st->codec;
1474 if (ost->st->stream_copy) {
1475 /* if stream_copy is selected, no need to decode or encode */
1476 codec->codec_id = icodec->codec_id;
1477 codec->codec_type = icodec->codec_type;
1478 codec->codec_tag = icodec->codec_tag;
1479 codec->bit_rate = icodec->bit_rate;
1480 switch(codec->codec_type) {
1481 case CODEC_TYPE_AUDIO:
1482 codec->sample_rate = icodec->sample_rate;
1483 codec->channels = icodec->channels;
1484 codec->frame_size = icodec->frame_size;
1486 case CODEC_TYPE_VIDEO:
1487 codec->frame_rate = icodec->frame_rate;
1488 codec->frame_rate_base = icodec->frame_rate_base;
1489 codec->width = icodec->width;
1490 codec->height = icodec->height;
1496 switch(codec->codec_type) {
1497 case CODEC_TYPE_AUDIO:
1498 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1501 if (codec->channels == icodec->channels &&
1502 codec->sample_rate == icodec->sample_rate) {
1503 ost->audio_resample = 0;
1505 if (codec->channels != icodec->channels &&
1506 icodec->codec_id == CODEC_ID_AC3) {
1507 /* Special case for 5:1 AC3 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 we limit */
3149 /* the number of coded channels to stereo */
3150 if (audio_channels > 2 && codec_id != CODEC_ID_AC3) {
3151 audio_enc->channels = 2;
3153 audio_enc->channels = audio_channels;
3155 audio_enc->sample_rate = audio_sample_rate;
3158 oc->nb_streams = nb_streams;
3161 fprintf(stderr, "No audio or video streams available\n");
3165 oc->timestamp = rec_timestamp;
3168 pstrcpy(oc->title, sizeof(oc->title), str_title);
3170 pstrcpy(oc->author, sizeof(oc->author), str_author);
3172 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3174 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3177 output_files[nb_output_files++] = oc;
3179 strcpy(oc->filename, filename);
3181 /* check filename in case of an image number is expected */
3182 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3183 if (filename_number_test(oc->filename) < 0) {
3184 print_error(oc->filename, AVERROR_NUMEXPECTED);
3189 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3190 /* test if it already exists to avoid loosing precious files */
3191 if (!file_overwrite &&
3192 (strchr(filename, ':') == NULL ||
3193 strstart(filename, "file:", NULL))) {
3194 if (url_exist(filename)) {
3197 if ( !using_stdin ) {
3198 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3201 if (toupper(c) != 'Y') {
3202 fprintf(stderr, "Not overwriting - exiting\n");
3207 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3214 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3215 fprintf(stderr, "Could not open '%s'\n", filename);
3220 memset(ap, 0, sizeof(*ap));
3221 ap->image_format = image_format;
3222 if (av_set_parameters(oc, ap) < 0) {
3223 fprintf(stderr, "%s: Invalid encoding parameters\n",
3228 /* reset some options */
3229 file_oformat = NULL;
3230 file_iformat = NULL;
3231 image_format = NULL;
3234 audio_codec_id = CODEC_ID_NONE;
3235 video_codec_id = CODEC_ID_NONE;
3236 audio_stream_copy = 0;
3237 video_stream_copy = 0;
3240 /* prepare dummy protocols for grab */
3241 static void prepare_grab(void)
3243 int has_video, has_audio, i, j;
3244 AVFormatContext *oc;
3245 AVFormatContext *ic;
3246 AVFormatParameters vp1, *vp = &vp1;
3247 AVFormatParameters ap1, *ap = &ap1;
3249 /* see if audio/video inputs are needed */
3252 memset(ap, 0, sizeof(*ap));
3253 memset(vp, 0, sizeof(*vp));
3254 for(j=0;j<nb_output_files;j++) {
3255 oc = output_files[j];
3256 for(i=0;i<oc->nb_streams;i++) {
3257 AVCodecContext *enc = &oc->streams[i]->codec;
3258 switch(enc->codec_type) {
3259 case CODEC_TYPE_AUDIO:
3260 if (enc->sample_rate > ap->sample_rate)
3261 ap->sample_rate = enc->sample_rate;
3262 if (enc->channels > ap->channels)
3263 ap->channels = enc->channels;
3266 case CODEC_TYPE_VIDEO:
3267 if (enc->width > vp->width)
3268 vp->width = enc->width;
3269 if (enc->height > vp->height)
3270 vp->height = enc->height;
3272 assert(enc->frame_rate_base == DEFAULT_FRAME_RATE_BASE);
3273 if (enc->frame_rate > vp->frame_rate){
3274 vp->frame_rate = enc->frame_rate;
3275 vp->frame_rate_base = enc->frame_rate_base;
3285 if (has_video == 0 && has_audio == 0) {
3286 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3291 AVInputFormat *fmt1;
3292 fmt1 = av_find_input_format(video_grab_format);
3293 vp->device = video_device;
3294 vp->channel = video_channel;
3295 vp->standard = video_standard;
3296 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3297 fprintf(stderr, "Could not find video grab device\n");
3300 /* If not enough info to get the stream parameters, we decode the
3301 first frames to get it. */
3302 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3303 fprintf(stderr, "Could not find video grab parameters\n");
3306 /* by now video grab has one stream */
3307 ic->streams[0]->r_frame_rate = vp->frame_rate;
3308 ic->streams[0]->r_frame_rate_base = vp->frame_rate_base;
3309 input_files[nb_input_files] = ic;
3312 dump_format(ic, nb_input_files, "", 0);
3316 if (has_audio && audio_grab_format) {
3317 AVInputFormat *fmt1;
3318 fmt1 = av_find_input_format(audio_grab_format);
3319 ap->device = audio_device;
3320 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3321 fprintf(stderr, "Could not find audio grab device\n");
3324 input_files[nb_input_files] = ic;
3327 dump_format(ic, nb_input_files, "", 0);
3333 /* same option as mencoder */
3334 static void opt_pass(const char *pass_str)
3337 pass = atoi(pass_str);
3338 if (pass != 1 && pass != 2) {
3339 fprintf(stderr, "pass number can be only 1 or 2\n");
3345 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3346 static int64_t getutime(void)
3348 return av_gettime();
3351 static int64_t getutime(void)
3353 struct rusage rusage;
3355 getrusage(RUSAGE_SELF, &rusage);
3356 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3360 extern int ffm_nopts;
3362 static void opt_bitexact(void)
3365 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3369 static void show_formats(void)
3371 AVInputFormat *ifmt;
3372 AVOutputFormat *ofmt;
3373 AVImageFormat *image_fmt;
3376 const char **pp, *last_name;
3378 printf("File formats:\n");
3383 const char *name=NULL;
3385 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3386 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3387 strcmp(ofmt->name, last_name)>0){
3392 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3393 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3394 strcmp(ifmt->name, last_name)>0){
3398 if(name && strcmp(ifmt->name, name)==0)
3413 printf("Image formats:\n");
3414 for(image_fmt = first_image_format; image_fmt != NULL;
3415 image_fmt = image_fmt->next) {
3418 image_fmt->img_read ? "D":" ",
3419 image_fmt->img_write ? "E":" ",
3424 printf("Codecs:\n");
3432 for(p = first_avcodec; p != NULL; p = p->next) {
3433 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3434 strcmp(p->name, last_name)>0){
3436 decode= encode= cap=0;
3438 if(p2 && strcmp(p->name, p2->name)==0){
3439 if(p->decode) decode=1;
3440 if(p->encode) encode=1;
3441 cap |= p->capabilities;
3446 last_name= p2->name;
3450 decode ? "D": (/*p2->decoder ? "d":*/" "),
3452 p2->type == CODEC_TYPE_AUDIO ? "A":"V",
3453 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3454 cap & CODEC_CAP_DR1 ? "D":" ",
3455 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3457 /* if(p2->decoder && decode==0)
3458 printf(" use %s for decoding", p2->decoder->name);*/
3463 printf("Supported file protocols:\n");
3464 for(up = first_protocol; up != NULL; up = up->next)
3465 printf(" %s:", up->name);
3468 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3469 printf("Motion estimation methods:\n");
3473 if ((pp - motion_str + 1) == ME_ZERO)
3474 printf("(fastest)");
3475 else if ((pp - motion_str + 1) == ME_FULL)
3476 printf("(slowest)");
3477 else if ((pp - motion_str + 1) == ME_EPZS)
3478 printf("(default)");
3483 "Note, the names of encoders and decoders dont always match, so there are\n"
3484 "several cases where the above table shows encoder only or decoder only entries\n"
3485 "even though both encoding and decoding are supported for example, the h263\n"
3486 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3491 void parse_matrix_coeffs(uint16_t *dest, const char *str)
3494 const char *p = str;
3501 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3508 void opt_inter_matrix(const char *arg)
3510 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3511 parse_matrix_coeffs(inter_matrix, arg);
3514 void opt_intra_matrix(const char *arg)
3516 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3517 parse_matrix_coeffs(intra_matrix, arg);
3520 static void opt_target(const char *arg)
3524 if(!strncmp(arg, "pal-", 4)) {
3527 } else if(!strncmp(arg, "ntsc-", 5)) {
3532 /* Calculate FR via float to avoid int overflow */
3533 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3536 } else if((fr == 29970) || (fr == 23976)) {
3539 /* Try to determine PAL/NTSC by peeking in the input files */
3540 if(nb_input_files) {
3542 for(j = 0; j < nb_input_files; j++) {
3543 for(i = 0; i < input_files[j]->nb_streams; i++) {
3544 AVCodecContext *c = &input_files[j]->streams[i]->codec;
3545 if(c->codec_type != CODEC_TYPE_VIDEO)
3547 fr = c->frame_rate * 1000 / c->frame_rate_base;
3551 } else if((fr == 29970) || (fr == 23976)) {
3561 if(verbose && norm >= 0)
3562 printf("Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3566 fprintf(stderr, "Could not determine norm (PAL/NTSC) for target.\n");
3567 fprintf(stderr, "Please prefix target with \"pal-\" or \"ntsc-\",\n");
3568 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3572 if(!strcmp(arg, "vcd")) {
3574 opt_video_codec("mpeg1video");
3575 opt_audio_codec("mp2");
3578 opt_frame_size(norm ? "352x240" : "352x288");
3580 video_bit_rate = 1150000;
3581 video_rc_max_rate = 1150000;
3582 video_rc_min_rate = 1150000;
3583 video_rc_buffer_size = 40*1024*8;
3585 audio_bit_rate = 224000;
3586 audio_sample_rate = 44100;
3588 } else if(!strcmp(arg, "svcd")) {
3590 opt_video_codec("mpeg2video");
3591 opt_audio_codec("mp2");
3594 opt_frame_size(norm ? "480x480" : "480x576");
3595 opt_gop_size(norm ? "18" : "15");
3597 video_bit_rate = 2040000;
3598 video_rc_max_rate = 2516000;
3599 video_rc_min_rate = 0; //1145000;
3600 video_rc_buffer_size = 224*1024*8;
3601 use_scan_offset = 1;
3603 audio_bit_rate = 224000;
3604 audio_sample_rate = 44100;
3606 } else if(!strcmp(arg, "dvd")) {
3608 opt_video_codec("mpeg2video");
3609 opt_audio_codec("ac3");
3612 opt_frame_size(norm ? "720x480" : "720x576");
3613 opt_gop_size(norm ? "18" : "15");
3615 video_bit_rate = 6000000;
3616 video_rc_max_rate = 9000000;
3617 video_rc_min_rate = 0; //1500000;
3618 video_rc_buffer_size = 224*1024*8;
3620 audio_bit_rate = 448000;
3621 audio_sample_rate = 48000;
3624 fprintf(stderr, "Unknown target: %s\n", arg);
3629 static void show_version(void)
3631 printf("ffmpeg " FFMPEG_VERSION "\n"
3634 avcodec_build(), LIBAVFORMAT_BUILD);
3638 const OptionDef options[] = {
3640 { "L", 0, {(void*)show_license}, "show license" },
3641 { "h", 0, {(void*)show_help}, "show help" },
3642 { "version", 0, {(void*)show_version}, "show version" },
3643 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3644 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3645 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
3646 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3647 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3648 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream" },
3649 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3650 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3651 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3652 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3653 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3654 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3655 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3656 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3657 { "debug", HAS_ARG | OPT_EXPERT, {(void*)opt_debug}, "print specific debug info", "" },
3658 { "vismv", HAS_ARG | OPT_EXPERT, {(void*)opt_vismv}, "visualize motion vectors", "" },
3659 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3660 "add timings for benchmarking" },
3661 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3662 "dump each input packet" },
3663 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3664 "when dumping packets, also dump the payload" },
3665 { "bitexact", OPT_EXPERT, {(void*)opt_bitexact}, "only use bit exact algorithms (for codec testing)" },
3666 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3667 { "loop", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3668 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3669 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\" or \"dvd\")", "type" },
3670 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3671 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3672 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3673 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3676 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
3677 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3678 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3679 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3680 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3681 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3682 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3683 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3684 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3685 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3686 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3687 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3688 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3689 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3690 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
3691 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3692 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3693 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
3694 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
3695 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
3696 { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
3697 { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
3698 { "mbqmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmin}, "min macroblock quantiser scale (VBR)", "q" },
3699 { "mbqmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmax}, "max macroblock quantiser scale (VBR)", "q" },
3700 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
3701 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
3702 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
3703 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
3704 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
3705 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
3706 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
3707 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
3708 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
3709 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
3710 // { "b_strategy", HAS_ARG | OPT_EXPERT, {(void*)opt_b_strategy}, "dynamic b frame selection strategy", "strategy" },
3711 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3712 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3713 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
3714 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
3715 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
3716 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffere size (in kByte)", "size" },
3717 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3718 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
3720 { "dct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dct_algo}, "set dct algo", "algo" },
3721 { "idct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_idct_algo}, "set idct algo", "algo" },
3722 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
3723 { "mb_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_threshold}, "macroblock threshold", "" },
3724 { "er", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_resilience}, "set error resilience", "n" },
3725 { "ec", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_concealment}, "set error concealment", "bit_mask" },
3726 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
3727 { "hq", OPT_BOOL, {(void*)&mb_decision}, "activate high quality settings" },
3728 { "mbd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_decision}, "macroblock decision", "mode" },
3729 { "mbcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_cmp}, "macroblock compare function", "cmp function" },
3730 { "ildctcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ildct_cmp}, "ildct compare function", "cmp function" },
3731 { "subcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sub_cmp}, "subpel compare function", "cmp function" },
3732 { "cmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_cmp}, "fullpel compare function", "cmp function" },
3733 { "precmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_cmp}, "pre motion estimation compare function", "cmp function" },
3734 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
3735 { "lumi_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lumi_mask}, "luminance masking", "" },
3736 { "dark_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dark_mask}, "darkness masking", "" },
3737 { "scplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_scplx_mask}, "spatial complexity masking", "" },
3738 { "tcplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_tcplx_mask}, "teporal complexity masking", "" },
3739 { "p_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_p_mask}, "inter masking", "" },
3740 { "4mv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_4mv}, "use four motion vector by macroblock (MPEG4)" },
3741 { "obmc", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_obmc}, "use overlapped block motion compensation (h263+)" },
3742 { "lf", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_loop}, "use loop filter (h263+)" },
3743 { "part", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_part}, "use data partitioning (MPEG4)" },
3744 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
3745 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
3746 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
3747 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3748 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3749 "use same video quality as source (implies VBR)" },
3750 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3751 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3752 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3753 "deinterlace pictures" },
3754 { "ildct", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_dct},
3755 "force interlaced dct support in encoder (MPEG2/MPEG4)" },
3756 { "ilme", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_me},
3757 "force interlaced me support in encoder (MPEG2/MPEG4)" },
3758 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3759 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
3760 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3761 { "aic", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aic}, "enable Advanced intra coding (h263+)" },
3762 { "aiv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aiv}, "enable Alternative inter vlc (h263+)" },
3763 { "umv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_umv}, "enable Unlimited Motion Vector (h263+)" },
3764 { "ssm", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_ss}, "enable Slice Structured mode (h263+)" },
3765 { "alt", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_alt_scan}, "enable alternate scantable (MPEG2/MPEG4)" },
3766 { "qprd", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qprd}, "" },
3767 { "cbp", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_cbprd}, "" },
3768 { "trell", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_trell}, "enable trellis quantization" },
3769 { "cgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&closed_gop}, "closed gop" },
3770 { "scan_offset", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_scan_offset}, "enable SVCD Scan Offset placeholder" },
3771 { "qpel", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qpel}, "enable 1/4-pel" },
3772 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3773 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3774 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3775 { "nr", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_noise_reduction}, "noise reduction", "" },
3776 { "qns", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qns}, "quantization noise shaping", "" },
3777 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
3778 { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
3779 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3780 { "coder", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&coder}, "coder type", "" },
3781 { "context", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&context}, "context model", "" },
3782 { "pred", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&predictor}, "prediction method", "" },
3785 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
3786 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3787 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3788 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3789 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3792 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
3793 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3794 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3795 { "dv1394", OPT_EXPERT | OPT_GRAB, {(void*)opt_dv1394}, "set DV1394 grab", "" },
3796 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
3800 static void show_banner(void)
3802 printf("ffmpeg version " FFMPEG_VERSION ", build %d, Copyright (c) 2000-2004 Fabrice Bellard\n",
3804 printf(" built on " __DATE__ " " __TIME__);
3806 printf(", gcc: %s\n", __VERSION__);
3808 printf(", using a non-gcc compiler\n");
3812 static void show_license(void)
3817 "This program is free software; you can redistribute it and/or modify\n"
3818 "it under the terms of the GNU General Public License as published by\n"
3819 "the Free Software Foundation; either version 2 of the License, or\n"
3820 "(at your option) any later version.\n"
3822 "This program is distributed in the hope that it will be useful,\n"
3823 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3824 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
3825 "GNU General Public License for more details.\n"
3827 "You should have received a copy of the GNU General Public License\n"
3828 "along with this program; if not, write to the Free Software\n"
3829 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3833 "This library is free software; you can redistribute it and/or\n"
3834 "modify it under the terms of the GNU Lesser General Public\n"
3835 "License as published by the Free Software Foundation; either\n"
3836 "version 2 of the License, or (at your option) any later version.\n"
3838 "This library is distributed in the hope that it will be useful,\n"
3839 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3840 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
3841 "Lesser General Public License for more details.\n"
3843 "You should have received a copy of the GNU Lesser General Public\n"
3844 "License along with this library; if not, write to the Free Software\n"
3845 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3851 static void show_help(void)
3854 printf("usage: ffmpeg [[options] -i input_file]... {[options] outfile}...\n"
3855 "Hyper fast Audio and Video encoder\n");
3857 show_help_options(options, "Main options:\n",
3858 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
3859 show_help_options(options, "\nVideo options:\n",
3860 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3862 show_help_options(options, "\nAdvanced Video options:\n",
3863 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3864 OPT_VIDEO | OPT_EXPERT);
3865 show_help_options(options, "\nAudio options:\n",
3866 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3868 show_help_options(options, "\nAdvanced Audio options:\n",
3869 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3870 OPT_AUDIO | OPT_EXPERT);
3871 show_help_options(options, "\nAudio/Video grab options:\n",
3874 show_help_options(options, "\nAdvanced options:\n",
3875 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3880 void parse_arg_file(const char *filename)
3882 opt_output_file(filename);
3885 int main(int argc, char **argv)
3898 parse_options(argc, argv, options);
3900 /* file converter / grab */
3901 if (nb_output_files <= 0) {
3902 fprintf(stderr, "Must supply at least one output file\n");
3906 if (nb_input_files == 0) {
3912 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3913 stream_maps, nb_stream_maps);
3914 ti = getutime() - ti;
3916 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3920 for(i=0;i<nb_output_files;i++) {
3921 /* maybe av_close_output_file ??? */
3922 AVFormatContext *s = output_files[i];
3924 if (!(s->oformat->flags & AVFMT_NOFILE))
3926 for(j=0;j<s->nb_streams;j++)
3927 av_free(s->streams[j]);
3930 for(i=0;i<nb_input_files;i++)
3931 av_close_input_file(input_files[i]);
3936 av_free(intra_matrix);
3938 av_free(inter_matrix);
3940 #ifdef POWERPC_PERFORMANCE_REPORT
3941 extern void powerpc_display_perf_report(void);
3942 powerpc_display_perf_report();
3943 #endif /* POWERPC_PERFORMANCE_REPORT */
3945 #ifndef CONFIG_WIN32
3946 if (received_sigterm) {
3948 "Received signal %d: terminating.\n",
3949 (int) received_sigterm);
3953 exit(0); /* not all OS-es handle main() return value */