3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #define HAVE_AV_CONFIG_H
22 #include "framehook.h"
27 #include <sys/ioctl.h>
30 #include <sys/resource.h>
34 #include <sys/types.h>
35 #include <sys/select.h>
38 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
43 #if !defined(INFINITY) && defined(HUGE_VAL)
44 #define INFINITY HUGE_VAL
47 /* select an input stream for an output stream */
48 typedef struct AVStreamMap {
53 extern const OptionDef options[];
55 static void show_help(void);
56 static void show_license(void);
60 static AVFormatContext *input_files[MAX_FILES];
61 static int64_t input_files_ts_offset[MAX_FILES];
62 static int nb_input_files = 0;
64 static AVFormatContext *output_files[MAX_FILES];
65 static int nb_output_files = 0;
67 static AVStreamMap stream_maps[MAX_FILES];
68 static int nb_stream_maps;
70 static AVInputFormat *file_iformat;
71 static AVOutputFormat *file_oformat;
72 static AVImageFormat *image_format;
73 static int frame_width = 160;
74 static int frame_height = 128;
75 static float frame_aspect_ratio = 0;
76 static enum PixelFormat frame_pix_fmt = PIX_FMT_YUV420P;
77 static int frame_padtop = 0;
78 static int frame_padbottom = 0;
79 static int frame_padleft = 0;
80 static int frame_padright = 0;
81 static int padcolor[3] = {16,128,128}; /* default to black */
82 static int frame_topBand = 0;
83 static int frame_bottomBand = 0;
84 static int frame_leftBand = 0;
85 static int frame_rightBand = 0;
86 static int frame_rate = 25;
87 static int frame_rate_base = 1;
88 static int video_bit_rate = 200*1000;
89 static int video_bit_rate_tolerance = 4000*1000;
90 static float video_qscale = 0;
91 static int video_qmin = 2;
92 static int video_qmax = 31;
93 static int video_lmin = 2*FF_QP2LAMBDA;
94 static int video_lmax = 31*FF_QP2LAMBDA;
95 static int video_mb_qmin = 2;
96 static int video_mb_qmax = 31;
97 static int video_qdiff = 3;
98 static float video_qblur = 0.5;
99 static float video_qcomp = 0.5;
100 static uint16_t *intra_matrix = NULL;
101 static uint16_t *inter_matrix = NULL;
102 #if 0 //experimental, (can be removed)
103 static float video_rc_qsquish=1.0;
104 static float video_rc_qmod_amp=0;
105 static int video_rc_qmod_freq=0;
107 static char *video_rc_override_string=NULL;
108 static char *video_rc_eq="tex^qComp";
109 static int video_rc_buffer_size=0;
110 static float video_rc_buffer_aggressivity=1.0;
111 static int video_rc_max_rate=0;
112 static int video_rc_min_rate=0;
113 static float video_rc_initial_cplx=0;
114 static float video_b_qfactor = 1.25;
115 static float video_b_qoffset = 1.25;
116 static float video_i_qfactor = -0.8;
117 static float video_i_qoffset = 0.0;
118 static int video_intra_quant_bias= FF_DEFAULT_QUANT_BIAS;
119 static int video_inter_quant_bias= FF_DEFAULT_QUANT_BIAS;
120 static int me_method = ME_EPZS;
121 static int video_disable = 0;
122 static int video_codec_id = CODEC_ID_NONE;
123 static int same_quality = 0;
124 static int b_frames = 0;
125 static int mb_decision = FF_MB_DECISION_SIMPLE;
126 static int ildct_cmp = FF_CMP_VSAD;
127 static int mb_cmp = FF_CMP_SAD;
128 static int sub_cmp = FF_CMP_SAD;
129 static int cmp = FF_CMP_SAD;
130 static int pre_cmp = FF_CMP_SAD;
131 static int pre_me = 0;
132 static float lumi_mask = 0;
133 static float dark_mask = 0;
134 static float scplx_mask = 0;
135 static float tcplx_mask = 0;
136 static float p_mask = 0;
137 static int use_4mv = 0;
138 static int use_obmc = 0;
139 static int use_loop = 0;
140 static int use_aic = 0;
141 static int use_aiv = 0;
142 static int use_umv = 0;
143 static int use_ss = 0;
144 static int use_alt_scan = 0;
145 static int use_trell = 0;
146 static int use_scan_offset = 0;
147 static int use_qpel = 0;
148 static int use_qprd = 0;
149 static int use_cbprd = 0;
151 static int closed_gop = 0;
152 static int do_deinterlace = 0;
153 static int do_interlace_dct = 0;
154 static int do_interlace_me = 0;
155 static int workaround_bugs = FF_BUG_AUTODETECT;
156 static int error_resilience = 2;
157 static int error_concealment = 3;
158 static int dct_algo = 0;
159 static int idct_algo = 0;
160 static int use_part = 0;
161 static int packet_size = 0;
162 static int error_rate = 0;
163 static int strict = 0;
164 static int top_field_first = -1;
165 static int noise_reduction = 0;
166 static int sc_threshold = 0;
167 static int debug = 0;
168 static int debug_mv = 0;
169 static int me_threshold = 0;
170 static int mb_threshold = 0;
171 static int intra_dc_precision = 8;
172 static int coder = 0;
173 static int context = 0;
174 static int predictor = 0;
175 extern int loop_input; /* currently a hack */
177 static int gop_size = 12;
178 static int intra_only = 0;
179 static int audio_sample_rate = 44100;
180 static int audio_bit_rate = 64000;
181 static int audio_disable = 0;
182 static int audio_channels = 1;
183 static int audio_codec_id = CODEC_ID_NONE;
185 static int64_t recording_time = 0;
186 static int64_t start_time = 0;
187 static int64_t rec_timestamp = 0;
188 static int64_t input_ts_offset = 0;
189 static int file_overwrite = 0;
190 static char *str_title = NULL;
191 static char *str_author = NULL;
192 static char *str_copyright = NULL;
193 static char *str_comment = NULL;
194 static int do_benchmark = 0;
195 static int do_hex_dump = 0;
196 static int do_pkt_dump = 0;
197 static int do_psnr = 0;
198 static int do_vstats = 0;
199 static int do_pass = 0;
200 static int bitexact = 0;
201 static char *pass_logfilename = NULL;
202 static int audio_stream_copy = 0;
203 static int video_stream_copy = 0;
204 static int video_sync_method= 1;
205 static int audio_sync_method= 0;
206 static int copy_ts= 0;
208 static int rate_emu = 0;
210 static char *video_grab_format = "video4linux";
211 static char *video_device = NULL;
212 static int video_channel = 0;
213 static char *video_standard = "ntsc";
215 static char *audio_grab_format = "audio_device";
216 static char *audio_device = NULL;
218 static int using_stdin = 0;
219 static int using_vhook = 0;
220 static int verbose = 1;
221 static int thread_count= 1;
222 static int q_pressed = 0;
223 static int me_range = 0;
224 static int64_t video_size = 0;
225 static int64_t audio_size = 0;
226 static int64_t extra_size = 0;
227 static int nb_frames_dup = 0;
228 static int nb_frames_drop = 0;
229 static int input_sync;
231 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
233 typedef struct AVOutputStream {
234 int file_index; /* file index */
235 int index; /* stream index in the output file */
236 int source_index; /* AVInputStream index */
237 AVStream *st; /* stream in the output file */
238 int encoding_needed; /* true if encoding needed for this stream */
240 /* input pts and corresponding output pts
242 double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
243 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
245 int video_resample; /* video_resample and video_crop are mutually exclusive */
246 AVFrame pict_tmp; /* temporary image for resampling */
247 ImgReSampleContext *img_resample_ctx; /* for image resampling */
249 int video_crop; /* video_resample and video_crop are mutually exclusive */
250 int topBand; /* cropping area sizes */
253 int video_pad; /* video_resample and video_pad are mutually exclusive */
254 int padtop; /* padding area sizes */
261 ReSampleContext *resample; /* for audio resampling */
262 FifoBuffer fifo; /* for compression: one audio fifo per codec */
266 typedef struct AVInputStream {
270 int discard; /* true if stream data should be discarded */
271 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
272 int64_t sample_index; /* current sample */
274 int64_t start; /* time when read started */
275 unsigned long frame; /* current frame */
276 int64_t next_pts; /* synthetic pts for cases where pkt.pts
278 int64_t pts; /* current pts */
279 int is_start; /* is 1 at the start and after a discontinuity */
282 typedef struct AVInputFile {
283 int eof_reached; /* true if eof reached */
284 int ist_index; /* index of first stream in ist_table */
285 int buffer_size; /* current total buffer size */
286 int buffer_size_max; /* buffer size at which we consider we can stop
288 int nb_streams; /* nb streams we are aware of */
293 /* init terminal so that we can grab keys */
294 static struct termios oldtty;
296 static void term_exit(void)
298 tcsetattr (0, TCSANOW, &oldtty);
301 static volatile sig_atomic_t received_sigterm = 0;
304 sigterm_handler(int sig)
306 received_sigterm = sig;
310 static void term_init(void)
317 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
318 |INLCR|IGNCR|ICRNL|IXON);
319 tty.c_oflag |= OPOST;
320 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
321 tty.c_cflag &= ~(CSIZE|PARENB);
326 tcsetattr (0, TCSANOW, &tty);
328 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
329 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
330 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
332 register a function to be called at normal program termination
335 #ifdef CONFIG_BEOS_NETSERVER
336 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
340 /* read a key without blocking */
341 static int read_key(void)
345 #ifndef CONFIG_BEOS_NETSERVER
353 n = select(1, &rfds, NULL, NULL, &tv);
365 static int decode_interrupt_cb(void)
367 return q_pressed || (q_pressed = read_key() == 'q');
372 static volatile int received_sigterm = 0;
374 /* no interactive support */
375 static void term_exit(void)
379 static void term_init(void)
383 static int read_key(void)
390 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
395 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
398 /* copy stream format */
399 s->nb_streams = ic->nb_streams;
400 for(i=0;i<ic->nb_streams;i++) {
403 st = av_mallocz(sizeof(AVStream));
404 memcpy(st, ic->streams[i], sizeof(AVStream));
408 av_close_input_file(ic);
412 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
414 static void do_audio_out(AVFormatContext *s,
417 unsigned char *buf, int size)
420 static uint8_t *audio_buf = NULL;
421 static uint8_t *audio_out = NULL;
422 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
424 int size_out, frame_bytes, ret;
425 AVCodecContext *enc= &ost->st->codec;
427 /* SC: dynamic allocation of buffers */
429 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
431 audio_out = av_malloc(audio_out_size);
432 if (!audio_buf || !audio_out)
433 return; /* Should signal an error ! */
435 if(audio_sync_method){
436 double delta = ost->sync_ipts * enc->sample_rate - ost->sync_opts
437 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2);
438 double idelta= delta*ist->st->codec.sample_rate / enc->sample_rate;
439 int byte_delta= ((int)idelta)*2*ist->st->codec.channels;
441 //FIXME resample delay
442 if(fabs(delta) > 50){
445 byte_delta= FFMIN(byte_delta, size);
449 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
454 static uint8_t *input_tmp= NULL;
455 input_tmp= av_realloc(input_tmp, byte_delta + size);
457 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
460 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
462 memset(input_tmp, 0, byte_delta);
463 memcpy(input_tmp + byte_delta, buf, size);
467 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
469 }else if(audio_sync_method>1){
470 int comp= clip(delta, -audio_sync_method, audio_sync_method);
471 assert(ost->audio_resample);
473 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
474 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));
475 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
479 ost->sync_opts= lrintf(ost->sync_ipts * enc->sample_rate)
480 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2); //FIXME wrong
482 if (ost->audio_resample) {
484 size_out = audio_resample(ost->resample,
485 (short *)buftmp, (short *)buf,
486 size / (ist->st->codec.channels * 2));
487 size_out = size_out * enc->channels * 2;
493 /* now encode as many frames as possible */
494 if (enc->frame_size > 1) {
495 /* output resampled raw samples */
496 fifo_write(&ost->fifo, buftmp, size_out,
499 frame_bytes = enc->frame_size * 2 * enc->channels;
501 while (fifo_read(&ost->fifo, audio_buf, frame_bytes,
502 &ost->fifo.rptr) == 0) {
504 av_init_packet(&pkt);
506 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
509 pkt.stream_index= ost->index;
513 pkt.pts= enc->coded_frame->pts;
514 pkt.flags |= PKT_FLAG_KEY;
515 av_interleaved_write_frame(s, &pkt);
517 ost->sync_opts += enc->frame_size;
521 av_init_packet(&pkt);
523 ost->sync_opts += size_out / enc->channels;
525 /* output a pcm frame */
526 /* XXX: change encoding codec API to avoid this ? */
527 switch(enc->codec->id) {
528 case CODEC_ID_PCM_S16LE:
529 case CODEC_ID_PCM_S16BE:
530 case CODEC_ID_PCM_U16LE:
531 case CODEC_ID_PCM_U16BE:
534 size_out = size_out >> 1;
537 ret = avcodec_encode_audio(enc, audio_out, size_out,
540 pkt.stream_index= ost->index;
544 pkt.pts= enc->coded_frame->pts;
545 pkt.flags |= PKT_FLAG_KEY;
546 av_interleaved_write_frame(s, &pkt);
550 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
554 AVPicture picture_tmp;
557 dec = &ist->st->codec;
559 /* deinterlace : must be done before any resize */
560 if (do_deinterlace || using_vhook) {
563 /* create temporary picture */
564 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
565 buf = av_malloc(size);
569 picture2 = &picture_tmp;
570 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
573 if(avpicture_deinterlace(picture2, picture,
574 dec->pix_fmt, dec->width, dec->height) < 0) {
575 /* if error, do not deinterlace */
581 if (img_convert(picture2, dec->pix_fmt, picture,
582 dec->pix_fmt, dec->width, dec->height) < 0) {
583 /* if error, do not copy */
593 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
595 if (picture != picture2)
596 *picture = *picture2;
600 /* we begin to correct av delay at this threshold */
601 #define AV_DELAY_MAX 0.100
604 /* Expects img to be yuv420 */
605 static void fill_pad_region(AVPicture* img, int height, int width,
606 int padtop, int padbottom, int padleft, int padright, int *color) {
611 for (i = 0; i < 3; i++) {
612 shift = (i == 0) ? 0 : 1;
614 if (padtop || padleft) {
615 memset(img->data[i], color[i], (((img->linesize[i] * padtop) +
619 if (padleft || padright) {
620 optr = img->data[i] + (img->linesize[i] * (padtop >> shift)) +
621 (img->linesize[i] - (padright >> shift));
623 for (y = 0; y < ((height - (padtop + padbottom)) >> shift); y++) {
624 memset(optr, color[i], (padleft + padright) >> shift);
625 optr += img->linesize[i];
630 optr = img->data[i] + (img->linesize[i] * ((height - padbottom) >> shift));
631 memset(optr, color[i], ((img->linesize[i] * padbottom) >> shift));
636 static uint8_t *bit_buffer= NULL;
638 static void do_video_out(AVFormatContext *s,
644 int nb_frames, i, ret;
645 AVFrame *final_picture, *formatted_picture;
646 AVFrame picture_format_temp, picture_crop_temp;
647 uint8_t *buf = NULL, *buf1 = NULL;
648 AVCodecContext *enc, *dec;
649 enum PixelFormat target_pixfmt;
651 #define VIDEO_BUFFER_SIZE (1024*1024)
653 avcodec_get_frame_defaults(&picture_format_temp);
654 avcodec_get_frame_defaults(&picture_crop_temp);
656 enc = &ost->st->codec;
657 dec = &ist->st->codec;
659 /* by default, we output a single frame */
664 if(video_sync_method){
666 vdelta = ost->sync_ipts * enc->frame_rate / enc->frame_rate_base - ost->sync_opts;
667 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
670 else if (vdelta > 1.1)
672 //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);
676 fprintf(stderr, "*** drop!\n");
677 }else if (nb_frames == 2) {
680 fprintf(stderr, "*** dup!\n");
683 ost->sync_opts= lrintf(ost->sync_ipts * enc->frame_rate / enc->frame_rate_base);
688 /* convert pixel format if needed */
689 target_pixfmt = ost->video_resample || ost->video_pad
690 ? PIX_FMT_YUV420P : enc->pix_fmt;
691 if (dec->pix_fmt != target_pixfmt) {
694 /* create temporary picture */
695 size = avpicture_get_size(target_pixfmt, dec->width, dec->height);
696 buf = av_malloc(size);
699 formatted_picture = &picture_format_temp;
700 avpicture_fill((AVPicture*)formatted_picture, buf, target_pixfmt, dec->width, dec->height);
702 if (img_convert((AVPicture*)formatted_picture, target_pixfmt,
703 (AVPicture *)in_picture, dec->pix_fmt,
704 dec->width, dec->height) < 0) {
707 fprintf(stderr, "pixel format conversion not handled\n");
712 formatted_picture = in_picture;
715 /* XXX: resampling could be done before raw format conversion in
716 some cases to go faster */
717 /* XXX: only works for YUV420P */
718 if (ost->video_resample) {
719 final_picture = &ost->pict_tmp;
720 img_resample(ost->img_resample_ctx, (AVPicture*)final_picture, (AVPicture*)formatted_picture);
722 if (ost->padtop || ost->padbottom || ost->padleft || ost->padright) {
723 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
724 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
728 if (enc->pix_fmt != PIX_FMT_YUV420P) {
732 /* create temporary picture */
733 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
734 buf = av_malloc(size);
737 final_picture = &picture_format_temp;
738 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
740 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
741 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
742 enc->width, enc->height) < 0) {
745 fprintf(stderr, "pixel format conversion not handled\n");
750 } else if (ost->video_crop) {
751 picture_crop_temp.data[0] = formatted_picture->data[0] +
752 (ost->topBand * formatted_picture->linesize[0]) + ost->leftBand;
754 picture_crop_temp.data[1] = formatted_picture->data[1] +
755 ((ost->topBand >> 1) * formatted_picture->linesize[1]) +
756 (ost->leftBand >> 1);
758 picture_crop_temp.data[2] = formatted_picture->data[2] +
759 ((ost->topBand >> 1) * formatted_picture->linesize[2]) +
760 (ost->leftBand >> 1);
762 picture_crop_temp.linesize[0] = formatted_picture->linesize[0];
763 picture_crop_temp.linesize[1] = formatted_picture->linesize[1];
764 picture_crop_temp.linesize[2] = formatted_picture->linesize[2];
765 final_picture = &picture_crop_temp;
766 } else if (ost->video_pad) {
767 final_picture = &ost->pict_tmp;
769 for (i = 0; i < 3; i++) {
770 uint8_t *optr, *iptr;
771 int shift = (i == 0) ? 0 : 1;
774 /* set offset to start writing image into */
775 optr = final_picture->data[i] + (((final_picture->linesize[i] *
776 ost->padtop) + ost->padleft) >> shift);
777 iptr = formatted_picture->data[i];
779 yheight = (enc->height - ost->padtop - ost->padbottom) >> shift;
780 for (y = 0; y < yheight; y++) {
781 /* copy unpadded image row into padded image row */
782 memcpy(optr, iptr, formatted_picture->linesize[i]);
783 optr += final_picture->linesize[i];
784 iptr += formatted_picture->linesize[i];
788 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
789 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
792 if (enc->pix_fmt != PIX_FMT_YUV420P) {
796 /* create temporary picture */
797 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
798 buf = av_malloc(size);
801 final_picture = &picture_format_temp;
802 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
804 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
805 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
806 enc->width, enc->height) < 0) {
809 fprintf(stderr, "pixel format conversion not handled\n");
815 final_picture = formatted_picture;
817 /* duplicates frame if needed */
818 /* XXX: pb because no interleaving */
819 for(i=0;i<nb_frames;i++) {
821 av_init_packet(&pkt);
822 pkt.stream_index= ost->index;
824 if (s->oformat->flags & AVFMT_RAWPICTURE) {
825 /* raw pictures are written as AVPicture structure to
826 avoid any copies. We support temorarily the older
828 AVFrame* old_frame = enc->coded_frame;
829 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
830 pkt.data= (uint8_t *)final_picture;
831 pkt.size= sizeof(AVPicture);
833 pkt.pts= dec->coded_frame->pts;
834 if(dec->coded_frame && dec->coded_frame->key_frame)
835 pkt.flags |= PKT_FLAG_KEY;
837 av_interleaved_write_frame(s, &pkt);
838 enc->coded_frame = old_frame;
842 big_picture= *final_picture;
843 /* better than nothing: use input picture interlaced
845 big_picture.interlaced_frame = in_picture->interlaced_frame;
846 if(do_interlace_me || do_interlace_dct){
847 if(top_field_first == -1)
848 big_picture.top_field_first = in_picture->top_field_first;
850 big_picture.top_field_first = top_field_first;
853 /* handles sameq here. This is not correct because it may
854 not be a global option */
856 big_picture.quality = ist->st->quality;
858 big_picture.quality = ost->st->quality;
860 big_picture.pict_type = 0;
861 // big_picture.pts = AV_NOPTS_VALUE;
862 big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->frame_rate_base, enc->frame_rate);
863 //av_log(NULL, AV_LOG_DEBUG, "%lld -> encoder\n", ost->sync_opts);
864 ret = avcodec_encode_video(enc,
865 bit_buffer, VIDEO_BUFFER_SIZE,
867 //enc->frame_number = enc->real_pict_num;
869 pkt.data= bit_buffer;
872 pkt.pts= enc->coded_frame->pts;
873 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %lld/%lld\n",
874 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1,
875 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1);*/
877 if(enc->coded_frame && enc->coded_frame->key_frame)
878 pkt.flags |= PKT_FLAG_KEY;
879 av_interleaved_write_frame(s, &pkt);
881 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
882 // enc->frame_number-1, enc->real_pict_num, ret,
884 /* if two pass, output log */
885 if (ost->logfile && enc->stats_out) {
886 fprintf(ost->logfile, "%s", enc->stats_out);
898 static double psnr(double d){
899 if(d==0) return INFINITY;
900 return -10.0*log(d)/log(10.0);
903 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
906 static FILE *fvstats=NULL;
913 double ti1, bitrate, avg_bitrate;
917 today = localtime(&today2);
918 sprintf(filename, "vstats_%02d%02d%02d.log", today->tm_hour,
921 fvstats = fopen(filename,"w");
929 enc = &ost->st->codec;
930 if (enc->codec_type == CODEC_TYPE_VIDEO) {
931 frame_number = ost->frame_number;
932 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
933 if (enc->flags&CODEC_FLAG_PSNR)
934 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
936 fprintf(fvstats,"f_size= %6d ", frame_size);
937 /* compute pts value */
938 ti1 = (double)ost->sync_opts *enc->frame_rate_base / enc->frame_rate;
942 bitrate = (double)(frame_size * 8) * enc->frame_rate / enc->frame_rate_base / 1000.0;
943 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
944 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
945 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
946 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
950 static void print_report(AVFormatContext **output_files,
951 AVOutputStream **ost_table, int nb_ostreams,
956 AVFormatContext *oc, *os;
959 int frame_number, vid, i;
960 double bitrate, ti1, pts;
961 static int64_t last_time = -1;
963 if (!is_last_report) {
965 /* display the report every 0.5 seconds */
966 cur_time = av_gettime();
967 if (last_time == -1) {
968 last_time = cur_time;
971 if ((cur_time - last_time) < 500000)
973 last_time = cur_time;
977 oc = output_files[0];
979 total_size = url_ftell(&oc->pb);
984 for(i=0;i<nb_ostreams;i++) {
986 os = output_files[ost->file_index];
987 enc = &ost->st->codec;
988 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
989 sprintf(buf + strlen(buf), "q=%2.1f ",
990 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
992 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
993 frame_number = ost->frame_number;
994 sprintf(buf + strlen(buf), "frame=%5d q=%2.1f ",
995 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : 0);
997 sprintf(buf + strlen(buf), "L");
998 if (enc->flags&CODEC_FLAG_PSNR){
1000 double error, error_sum=0;
1001 double scale, scale_sum=0;
1002 char type[3]= {'Y','U','V'};
1003 sprintf(buf + strlen(buf), "PSNR=");
1006 error= enc->error[j];
1007 scale= enc->width*enc->height*255.0*255.0*frame_number;
1009 error= enc->coded_frame->error[j];
1010 scale= enc->width*enc->height*255.0*255.0;
1015 sprintf(buf + strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1017 sprintf(buf + strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1021 /* compute min output value */
1022 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1023 if ((pts < ti1) && (pts > 0))
1029 if (verbose || is_last_report) {
1030 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1032 sprintf(buf + strlen(buf),
1033 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
1034 (double)total_size / 1024, ti1, bitrate);
1037 sprintf(buf + strlen(buf), " dup=%d drop=%d",
1038 nb_frames_dup, nb_frames_drop);
1041 fprintf(stderr, "%s \r", buf);
1046 if (is_last_report && verbose >= 0){
1047 int64_t raw= audio_size + video_size + extra_size;
1048 fprintf(stderr, "\n");
1049 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1053 100.0*(total_size - raw)/raw
1058 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1059 static int output_packet(AVInputStream *ist, int ist_index,
1060 AVOutputStream **ost_table, int nb_ostreams,
1061 const AVPacket *pkt)
1063 AVFormatContext *os;
1064 AVOutputStream *ost;
1068 int data_size, got_picture;
1070 short samples[AVCODEC_MAX_AUDIO_FRAME_SIZE / 2];
1071 void *buffer_to_free;
1073 if (pkt && pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1074 ist->next_pts = ist->pts = pkt->dts;
1076 assert(ist->pts == ist->next_pts);
1090 /* decode the packet if needed */
1091 data_buf = NULL; /* fail safe */
1093 if (ist->decoding_needed) {
1094 switch(ist->st->codec.codec_type) {
1095 case CODEC_TYPE_AUDIO:
1096 /* XXX: could avoid copy if PCM 16 bits with same
1097 endianness as CPU */
1098 ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size,
1104 /* Some bug in mpeg audio decoder gives */
1105 /* data_size < 0, it seems they are overflows */
1106 if (data_size <= 0) {
1107 /* no audio frame */
1110 data_buf = (uint8_t *)samples;
1111 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1112 (ist->st->codec.sample_rate * ist->st->codec.channels);
1114 case CODEC_TYPE_VIDEO:
1115 data_size = (ist->st->codec.width * ist->st->codec.height * 3) / 2;
1116 /* XXX: allocate picture correctly */
1117 avcodec_get_frame_defaults(&picture);
1119 ret = avcodec_decode_video(&ist->st->codec,
1120 &picture, &got_picture, ptr, len);
1121 ist->st->quality= picture.quality;
1125 /* no picture yet */
1126 goto discard_packet;
1128 if (ist->st->codec.frame_rate_base != 0) {
1129 ist->next_pts += ((int64_t)AV_TIME_BASE *
1130 ist->st->codec.frame_rate_base) /
1131 ist->st->codec.frame_rate;
1145 buffer_to_free = NULL;
1146 if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1147 pre_process_video_frame(ist, (AVPicture *)&picture,
1151 /* frame rate emulation */
1152 if (ist->st->codec.rate_emu) {
1153 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec.frame_rate_base, 1000000, ist->st->codec.frame_rate);
1154 int64_t now = av_gettime() - ist->start;
1162 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1163 is the one of the next displayed one */
1164 /* XXX: add mpeg4 too ? */
1165 if (ist->st->codec.codec_id == CODEC_ID_MPEG1VIDEO) {
1166 if (ist->st->codec.pict_type != B_TYPE) {
1168 tmp = ist->last_ip_pts;
1169 ist->last_ip_pts = ist->frac_pts.val;
1170 ist->frac_pts.val = tmp;
1174 /* if output time reached then transcode raw format,
1175 encode packets and output them */
1176 if (start_time == 0 || ist->pts >= start_time)
1177 for(i=0;i<nb_ostreams;i++) {
1181 if (ost->source_index == ist_index) {
1182 os = output_files[ost->file_index];
1185 printf("%d: got pts=%0.3f %0.3f\n", i,
1186 (double)pkt->pts / AV_TIME_BASE,
1187 ((double)ist->pts / AV_TIME_BASE) -
1188 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1190 /* set the input output pts pairs */
1191 ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index])/ AV_TIME_BASE;
1193 if (ost->encoding_needed) {
1194 switch(ost->st->codec.codec_type) {
1195 case CODEC_TYPE_AUDIO:
1196 do_audio_out(os, ost, ist, data_buf, data_size);
1198 case CODEC_TYPE_VIDEO:
1199 /* find an audio stream for synchro */
1202 AVOutputStream *audio_sync, *ost1;
1204 for(i=0;i<nb_ostreams;i++) {
1205 ost1 = ost_table[i];
1206 if (ost1->file_index == ost->file_index &&
1207 ost1->st->codec.codec_type == CODEC_TYPE_AUDIO) {
1213 do_video_out(os, ost, ist, &picture, &frame_size);
1214 video_size += frame_size;
1215 if (do_vstats && frame_size)
1216 do_video_stats(os, ost, frame_size);
1223 AVFrame avframe; //FIXME/XXX remove this
1225 av_init_packet(&opkt);
1227 /* no reencoding needed : output the packet directly */
1228 /* force the input stream PTS */
1230 avcodec_get_frame_defaults(&avframe);
1231 ost->st->codec.coded_frame= &avframe;
1232 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1234 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO)
1235 audio_size += data_size;
1236 else if (ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1237 video_size += data_size;
1239 opkt.stream_index= ost->index;
1240 opkt.data= data_buf;
1241 opkt.size= data_size;
1242 opkt.pts= pkt->pts + input_files_ts_offset[ist->file_index];
1243 opkt.dts= pkt->dts + input_files_ts_offset[ist->file_index];
1244 opkt.flags= pkt->flags;
1246 av_interleaved_write_frame(os, &opkt);
1247 ost->st->codec.frame_number++;
1248 ost->frame_number++;
1252 av_free(buffer_to_free);
1258 for(i=0;i<nb_ostreams;i++) {
1260 if (ost->source_index == ist_index) {
1261 AVCodecContext *enc= &ost->st->codec;
1262 os = output_files[ost->file_index];
1264 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1266 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1269 if (ost->encoding_needed) {
1272 av_init_packet(&pkt);
1273 pkt.stream_index= ost->index;
1275 switch(ost->st->codec.codec_type) {
1276 case CODEC_TYPE_AUDIO:
1277 ret = avcodec_encode_audio(enc, bit_buffer, VIDEO_BUFFER_SIZE, NULL);
1279 pkt.flags |= PKT_FLAG_KEY;
1281 case CODEC_TYPE_VIDEO:
1282 ret = avcodec_encode_video(enc, bit_buffer, VIDEO_BUFFER_SIZE, NULL);
1284 if(enc->coded_frame && enc->coded_frame->key_frame)
1285 pkt.flags |= PKT_FLAG_KEY;
1286 if (ost->logfile && enc->stats_out) {
1287 fprintf(ost->logfile, "%s", enc->stats_out);
1296 pkt.data= bit_buffer;
1298 if(enc->coded_frame)
1299 pkt.pts= enc->coded_frame->pts;
1300 av_interleaved_write_frame(os, &pkt);
1314 * The following code is the main loop of the file converter
1316 static int av_encode(AVFormatContext **output_files,
1317 int nb_output_files,
1318 AVFormatContext **input_files,
1320 AVStreamMap *stream_maps, int nb_stream_maps)
1322 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1323 AVFormatContext *is, *os;
1324 AVCodecContext *codec, *icodec;
1325 AVOutputStream *ost, **ost_table = NULL;
1326 AVInputStream *ist, **ist_table = NULL;
1327 AVInputFile *file_table;
1328 AVFormatContext *stream_no_data;
1331 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1336 bit_buffer = av_malloc(VIDEO_BUFFER_SIZE);
1340 /* input stream init */
1342 for(i=0;i<nb_input_files;i++) {
1343 is = input_files[i];
1344 file_table[i].ist_index = j;
1345 file_table[i].nb_streams = is->nb_streams;
1346 j += is->nb_streams;
1350 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1354 for(i=0;i<nb_istreams;i++) {
1355 ist = av_mallocz(sizeof(AVInputStream));
1361 for(i=0;i<nb_input_files;i++) {
1362 is = input_files[i];
1363 for(k=0;k<is->nb_streams;k++) {
1364 ist = ist_table[j++];
1365 ist->st = is->streams[k];
1366 ist->file_index = i;
1368 ist->discard = 1; /* the stream is discarded by default
1371 if (ist->st->codec.rate_emu) {
1372 ist->start = av_gettime();
1378 /* output stream init */
1380 for(i=0;i<nb_output_files;i++) {
1381 os = output_files[i];
1382 nb_ostreams += os->nb_streams;
1384 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1385 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1389 /* Sanity check the mapping args -- do the input files & streams exist? */
1390 for(i=0;i<nb_stream_maps;i++) {
1391 int fi = stream_maps[i].file_index;
1392 int si = stream_maps[i].stream_index;
1394 if (fi < 0 || fi > nb_input_files - 1 ||
1395 si < 0 || si > file_table[fi].nb_streams - 1) {
1396 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1401 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1404 for(i=0;i<nb_ostreams;i++) {
1405 ost = av_mallocz(sizeof(AVOutputStream));
1412 for(k=0;k<nb_output_files;k++) {
1413 os = output_files[k];
1414 for(i=0;i<os->nb_streams;i++) {
1416 ost = ost_table[n++];
1417 ost->file_index = k;
1419 ost->st = os->streams[i];
1420 if (nb_stream_maps > 0) {
1421 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1422 stream_maps[n-1].stream_index;
1424 /* Sanity check that the stream types match */
1425 if (ist_table[ost->source_index]->st->codec.codec_type != ost->st->codec.codec_type) {
1426 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1427 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1428 ost->file_index, ost->index);
1433 /* get corresponding input stream index : we select the first one with the right type */
1435 for(j=0;j<nb_istreams;j++) {
1438 ist->st->codec.codec_type == ost->st->codec.codec_type) {
1439 ost->source_index = j;
1445 /* try again and reuse existing stream */
1446 for(j=0;j<nb_istreams;j++) {
1448 if (ist->st->codec.codec_type == ost->st->codec.codec_type) {
1449 ost->source_index = j;
1454 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1455 ost->file_index, ost->index);
1460 ist = ist_table[ost->source_index];
1465 /* for each output stream, we compute the right encoding parameters */
1466 for(i=0;i<nb_ostreams;i++) {
1468 ist = ist_table[ost->source_index];
1470 codec = &ost->st->codec;
1471 icodec = &ist->st->codec;
1473 if (ost->st->stream_copy) {
1474 /* if stream_copy is selected, no need to decode or encode */
1475 codec->codec_id = icodec->codec_id;
1476 codec->codec_type = icodec->codec_type;
1477 codec->codec_tag = icodec->codec_tag;
1478 codec->bit_rate = icodec->bit_rate;
1479 switch(codec->codec_type) {
1480 case CODEC_TYPE_AUDIO:
1481 codec->sample_rate = icodec->sample_rate;
1482 codec->channels = icodec->channels;
1483 codec->frame_size = icodec->frame_size;
1485 case CODEC_TYPE_VIDEO:
1486 codec->frame_rate = icodec->frame_rate;
1487 codec->frame_rate_base = icodec->frame_rate_base;
1488 codec->width = icodec->width;
1489 codec->height = icodec->height;
1495 switch(codec->codec_type) {
1496 case CODEC_TYPE_AUDIO:
1497 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1500 if (codec->channels == icodec->channels &&
1501 codec->sample_rate == icodec->sample_rate) {
1502 ost->audio_resample = 0;
1504 if (codec->channels != icodec->channels &&
1505 icodec->codec_id == CODEC_ID_AC3) {
1506 /* Special case for 5:1 AC3 input */
1507 /* and mono or stereo output */
1508 /* Request specific number of channels */
1509 icodec->channels = codec->channels;
1510 if (codec->sample_rate == icodec->sample_rate)
1511 ost->audio_resample = 0;
1513 ost->audio_resample = 1;
1516 ost->audio_resample = 1;
1519 if(audio_sync_method>1)
1520 ost->audio_resample = 1;
1522 if(ost->audio_resample){
1523 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1524 codec->sample_rate, icodec->sample_rate);
1526 printf("Can't resample. Aborting.\n");
1530 ist->decoding_needed = 1;
1531 ost->encoding_needed = 1;
1533 case CODEC_TYPE_VIDEO:
1534 if (codec->width == icodec->width &&
1535 codec->height == icodec->height &&
1536 frame_topBand == 0 &&
1537 frame_bottomBand == 0 &&
1538 frame_leftBand == 0 &&
1539 frame_rightBand == 0 &&
1540 frame_padtop == 0 &&
1541 frame_padbottom == 0 &&
1542 frame_padleft == 0 &&
1543 frame_padright == 0)
1545 ost->video_resample = 0;
1546 ost->video_crop = 0;
1548 } else if ((codec->width == icodec->width -
1549 (frame_leftBand + frame_rightBand)) &&
1550 (codec->height == icodec->height -
1551 (frame_topBand + frame_bottomBand)))
1553 ost->video_resample = 0;
1554 ost->video_crop = 1;
1555 ost->topBand = frame_topBand;
1556 ost->leftBand = frame_leftBand;
1557 } else if ((codec->width == icodec->width +
1558 (frame_padleft + frame_padright)) &&
1559 (codec->height == icodec->height +
1560 (frame_padtop + frame_padbottom))) {
1561 ost->video_resample = 0;
1562 ost->video_crop = 0;
1564 ost->padtop = frame_padtop;
1565 ost->padleft = frame_padleft;
1566 ost->padbottom = frame_padbottom;
1567 ost->padright = frame_padright;
1568 avcodec_get_frame_defaults(&ost->pict_tmp);
1569 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1570 codec->width, codec->height ) )
1573 ost->video_resample = 1;
1574 ost->video_crop = 0; // cropping is handled as part of resample
1575 avcodec_get_frame_defaults(&ost->pict_tmp);
1576 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1577 codec->width, codec->height ) )
1580 ost->img_resample_ctx = img_resample_full_init(
1581 ost->st->codec.width, ost->st->codec.height,
1582 ist->st->codec.width, ist->st->codec.height,
1583 frame_topBand, frame_bottomBand,
1584 frame_leftBand, frame_rightBand,
1585 frame_padtop, frame_padbottom,
1586 frame_padleft, frame_padright);
1588 ost->padtop = frame_padtop;
1589 ost->padleft = frame_padleft;
1590 ost->padbottom = frame_padbottom;
1591 ost->padright = frame_padright;
1594 ost->encoding_needed = 1;
1595 ist->decoding_needed = 1;
1601 if (ost->encoding_needed &&
1602 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1603 char logfilename[1024];
1608 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1610 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1611 if (codec->flags & CODEC_FLAG_PASS1) {
1612 f = fopen(logfilename, "w");
1614 perror(logfilename);
1619 /* read the log file */
1620 f = fopen(logfilename, "r");
1622 perror(logfilename);
1625 fseek(f, 0, SEEK_END);
1627 fseek(f, 0, SEEK_SET);
1628 logbuffer = av_malloc(size + 1);
1630 fprintf(stderr, "Could not allocate log buffer\n");
1633 size = fread(logbuffer, 1, size, f);
1635 logbuffer[size] = '\0';
1636 codec->stats_in = logbuffer;
1642 /* dump the file output parameters - cannot be done before in case
1644 for(i=0;i<nb_output_files;i++) {
1645 dump_format(output_files[i], i, output_files[i]->filename, 1);
1648 /* dump the stream mapping */
1650 fprintf(stderr, "Stream mapping:\n");
1651 for(i=0;i<nb_ostreams;i++) {
1653 fprintf(stderr, " Stream #%d.%d -> #%d.%d\n",
1654 ist_table[ost->source_index]->file_index,
1655 ist_table[ost->source_index]->index,
1661 /* open each encoder */
1662 for(i=0;i<nb_ostreams;i++) {
1664 if (ost->encoding_needed) {
1666 codec = avcodec_find_encoder(ost->st->codec.codec_id);
1668 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1669 ost->file_index, ost->index);
1672 if (avcodec_open(&ost->st->codec, codec) < 0) {
1673 fprintf(stderr, "Error while opening codec for stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1674 ost->file_index, ost->index);
1677 extra_size += ost->st->codec.extradata_size;
1681 /* open each decoder */
1682 for(i=0;i<nb_istreams;i++) {
1684 if (ist->decoding_needed) {
1686 codec = avcodec_find_decoder(ist->st->codec.codec_id);
1688 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1689 ist->st->codec.codec_id, ist->file_index, ist->index);
1692 if (avcodec_open(&ist->st->codec, codec) < 0) {
1693 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1694 ist->file_index, ist->index);
1697 //if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO)
1698 // ist->st->codec.flags |= CODEC_FLAG_REPEAT_FIELD;
1703 for(i=0;i<nb_istreams;i++) {
1705 is = input_files[ist->file_index];
1711 /* compute buffer size max (should use a complete heuristic) */
1712 for(i=0;i<nb_input_files;i++) {
1713 file_table[i].buffer_size_max = 2048;
1716 /* open files and write file headers */
1717 for(i=0;i<nb_output_files;i++) {
1718 os = output_files[i];
1719 if (av_write_header(os) < 0) {
1720 fprintf(stderr, "Could not write header for output file #%d (incorrect codec paramters ?)\n", i);
1726 #ifndef CONFIG_WIN32
1727 if ( !using_stdin && verbose >= 0) {
1728 fprintf(stderr, "Press [q] to stop encoding\n");
1729 url_set_interrupt_cb(decode_interrupt_cb);
1737 for(; received_sigterm == 0;) {
1738 int file_index, ist_index;
1740 double ipts_min= 1e100;
1741 double opts_min= 1e100;
1744 /* if 'q' pressed, exits */
1748 /* read_key() returns 0 on EOF */
1754 /* select the stream that we must read now by looking at the
1755 smallest output pts */
1757 for(i=0;i<nb_ostreams;i++) {
1760 os = output_files[ost->file_index];
1761 ist = ist_table[ost->source_index];
1762 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1763 opts = (double)ost->sync_opts * ost->st->codec.frame_rate_base / ost->st->codec.frame_rate;
1765 opts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1766 ipts = (double)ist->pts;
1767 if (!file_table[ist->file_index].eof_reached){
1768 if(ipts < ipts_min) {
1770 if(input_sync ) file_index = ist->file_index;
1772 if(opts < opts_min) {
1774 if(!input_sync) file_index = ist->file_index;
1778 /* if none, if is finished */
1779 if (file_index < 0) {
1783 /* finish if recording time exhausted */
1784 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
1787 /* read a frame from it and output it in the fifo */
1788 is = input_files[file_index];
1789 if (av_read_frame(is, &pkt) < 0) {
1790 file_table[file_index].eof_reached = 1;
1795 stream_no_data = is;
1800 av_pkt_dump(stdout, &pkt, do_hex_dump);
1802 /* the following test is needed in case new streams appear
1803 dynamically in stream : we ignore them */
1804 if (pkt.stream_index >= file_table[file_index].nb_streams)
1805 goto discard_packet;
1806 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1807 ist = ist_table[ist_index];
1809 goto discard_packet;
1811 // 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);
1812 if (pkt.dts != AV_NOPTS_VALUE) {
1813 int64_t delta= pkt.dts - ist->next_pts;
1814 if(ABS(delta) > 10LL*AV_TIME_BASE && !copy_ts){
1815 input_files_ts_offset[ist->file_index]-= delta;
1817 fprintf(stderr, "timestamp discontinuity %lld, new offset= %lld\n", delta, input_files_ts_offset[ist->file_index]);
1818 for(i=0; i<file_table[file_index].nb_streams; i++){
1819 int index= file_table[file_index].ist_index + i;
1820 ist_table[index]->next_pts += delta;
1821 ist_table[index]->is_start=1;
1826 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1827 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1830 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1831 ist->file_index, ist->index);
1833 av_free_packet(&pkt);
1838 av_free_packet(&pkt);
1840 /* dump report by using the output first video and audio streams */
1841 print_report(output_files, ost_table, nb_ostreams, 0);
1844 /* at the end of stream, we must flush the decoder buffers */
1845 for(i=0;i<nb_istreams;i++) {
1847 if (ist->decoding_needed) {
1848 output_packet(ist, i, ost_table, nb_ostreams, NULL);
1854 /* write the trailer if needed and close file */
1855 for(i=0;i<nb_output_files;i++) {
1856 os = output_files[i];
1857 av_write_trailer(os);
1860 /* dump report by using the first video and audio streams */
1861 print_report(output_files, ost_table, nb_ostreams, 1);
1863 /* close each encoder */
1864 for(i=0;i<nb_ostreams;i++) {
1866 if (ost->encoding_needed) {
1867 av_freep(&ost->st->codec.stats_in);
1868 avcodec_close(&ost->st->codec);
1872 /* close each decoder */
1873 for(i=0;i<nb_istreams;i++) {
1875 if (ist->decoding_needed) {
1876 avcodec_close(&ist->st->codec);
1884 av_free(file_table);
1887 for(i=0;i<nb_istreams;i++) {
1894 for(i=0;i<nb_ostreams;i++) {
1898 fclose(ost->logfile);
1899 ost->logfile = NULL;
1901 fifo_free(&ost->fifo); /* works even if fifo is not
1902 initialized but set to zero */
1903 av_free(ost->pict_tmp.data[0]);
1904 if (ost->video_resample)
1905 img_resample_close(ost->img_resample_ctx);
1906 if (ost->audio_resample)
1907 audio_resample_close(ost->resample);
1920 int file_read(const char *filename)
1923 unsigned char buffer[1024];
1926 if (url_open(&h, filename, O_RDONLY) < 0) {
1927 printf("could not open '%s'\n", filename);
1931 len = url_read(h, buffer, sizeof(buffer));
1934 for(i=0;i<len;i++) putchar(buffer[i]);
1941 static void opt_image_format(const char *arg)
1945 for(f = first_image_format; f != NULL; f = f->next) {
1946 if (!strcmp(arg, f->name))
1950 fprintf(stderr, "Unknown image format: '%s'\n", arg);
1956 static void opt_format(const char *arg)
1958 /* compatibility stuff for pgmyuv */
1959 if (!strcmp(arg, "pgmyuv")) {
1960 opt_image_format(arg);
1964 file_iformat = av_find_input_format(arg);
1965 file_oformat = guess_format(arg, NULL, NULL);
1966 if (!file_iformat && !file_oformat) {
1967 fprintf(stderr, "Unknown input or output format: %s\n", arg);
1972 static void opt_video_bitrate(const char *arg)
1974 video_bit_rate = atoi(arg) * 1000;
1977 static void opt_video_bitrate_tolerance(const char *arg)
1979 video_bit_rate_tolerance = atoi(arg) * 1000;
1982 static void opt_video_bitrate_max(const char *arg)
1984 video_rc_max_rate = atoi(arg) * 1000;
1987 static void opt_video_bitrate_min(const char *arg)
1989 video_rc_min_rate = atoi(arg) * 1000;
1992 static void opt_video_buffer_size(const char *arg)
1994 video_rc_buffer_size = atoi(arg) * 8*1024;
1997 static void opt_video_rc_eq(char *arg)
2002 static void opt_video_rc_override_string(char *arg)
2004 video_rc_override_string = arg;
2008 static void opt_workaround_bugs(const char *arg)
2010 workaround_bugs = atoi(arg);
2013 static void opt_dct_algo(const char *arg)
2015 dct_algo = atoi(arg);
2018 static void opt_idct_algo(const char *arg)
2020 idct_algo = atoi(arg);
2023 static void opt_me_threshold(const char *arg)
2025 me_threshold = atoi(arg);
2028 static void opt_mb_threshold(const char *arg)
2030 mb_threshold = atoi(arg);
2033 static void opt_error_resilience(const char *arg)
2035 error_resilience = atoi(arg);
2038 static void opt_error_concealment(const char *arg)
2040 error_concealment = atoi(arg);
2043 static void opt_debug(const char *arg)
2048 static void opt_vismv(const char *arg)
2050 debug_mv = atoi(arg);
2053 static void opt_verbose(const char *arg)
2055 verbose = atoi(arg);
2056 av_log_set_level(atoi(arg));
2059 static void opt_frame_rate(const char *arg)
2061 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
2062 fprintf(stderr, "Incorrect frame rate\n");
2067 static void opt_frame_crop_top(const char *arg)
2069 frame_topBand = atoi(arg);
2070 if (frame_topBand < 0) {
2071 fprintf(stderr, "Incorrect top crop size\n");
2074 if ((frame_topBand % 2) != 0) {
2075 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2078 if ((frame_topBand) >= frame_height){
2079 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2082 frame_height -= frame_topBand;
2085 static void opt_frame_crop_bottom(const char *arg)
2087 frame_bottomBand = atoi(arg);
2088 if (frame_bottomBand < 0) {
2089 fprintf(stderr, "Incorrect bottom crop size\n");
2092 if ((frame_bottomBand % 2) != 0) {
2093 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2096 if ((frame_bottomBand) >= frame_height){
2097 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2100 frame_height -= frame_bottomBand;
2103 static void opt_frame_crop_left(const char *arg)
2105 frame_leftBand = atoi(arg);
2106 if (frame_leftBand < 0) {
2107 fprintf(stderr, "Incorrect left crop size\n");
2110 if ((frame_leftBand % 2) != 0) {
2111 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2114 if ((frame_leftBand) >= frame_width){
2115 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2118 frame_width -= frame_leftBand;
2121 static void opt_frame_crop_right(const char *arg)
2123 frame_rightBand = atoi(arg);
2124 if (frame_rightBand < 0) {
2125 fprintf(stderr, "Incorrect right crop size\n");
2128 if ((frame_rightBand % 2) != 0) {
2129 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2132 if ((frame_rightBand) >= frame_width){
2133 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2136 frame_width -= frame_rightBand;
2139 static void opt_frame_size(const char *arg)
2141 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2142 fprintf(stderr, "Incorrect frame size\n");
2145 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2146 fprintf(stderr, "Frame size must be a multiple of 2\n");
2152 #define SCALEBITS 10
2153 #define ONE_HALF (1 << (SCALEBITS - 1))
2154 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2156 #define RGB_TO_Y(r, g, b) \
2157 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2158 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2160 #define RGB_TO_U(r1, g1, b1, shift)\
2161 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2162 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2164 #define RGB_TO_V(r1, g1, b1, shift)\
2165 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2166 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2168 static void opt_pad_color(const char *arg) {
2169 /* Input is expected to be six hex digits similar to
2170 how colors are expressed in html tags (but without the #) */
2171 int rgb = strtol(arg, NULL, 16);
2175 g = ((rgb >> 8) & 255);
2178 padcolor[0] = RGB_TO_Y(r,g,b);
2179 padcolor[1] = RGB_TO_U(r,g,b,0);
2180 padcolor[2] = RGB_TO_V(r,g,b,0);
2183 static void opt_frame_pad_top(const char *arg)
2185 frame_padtop = atoi(arg);
2186 if (frame_padtop < 0) {
2187 fprintf(stderr, "Incorrect top pad size\n");
2190 if ((frame_padtop % 2) != 0) {
2191 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2196 static void opt_frame_pad_bottom(const char *arg)
2198 frame_padbottom = atoi(arg);
2199 if (frame_padbottom < 0) {
2200 fprintf(stderr, "Incorrect bottom pad size\n");
2203 if ((frame_padbottom % 2) != 0) {
2204 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2210 static void opt_frame_pad_left(const char *arg)
2212 frame_padleft = atoi(arg);
2213 if (frame_padleft < 0) {
2214 fprintf(stderr, "Incorrect left pad size\n");
2217 if ((frame_padleft % 2) != 0) {
2218 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2224 static void opt_frame_pad_right(const char *arg)
2226 frame_padright = atoi(arg);
2227 if (frame_padright < 0) {
2228 fprintf(stderr, "Incorrect right pad size\n");
2231 if ((frame_padright % 2) != 0) {
2232 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2238 static void opt_frame_pix_fmt(const char *arg)
2240 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2243 static void opt_frame_aspect_ratio(const char *arg)
2249 p = strchr(arg, ':');
2251 x = strtol(arg, (char **)&arg, 10);
2253 y = strtol(arg+1, (char **)&arg, 10);
2255 ar = (double)x / (double)y;
2257 ar = strtod(arg, (char **)&arg);
2260 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2263 frame_aspect_ratio = ar;
2266 static void opt_gop_size(const char *arg)
2268 gop_size = atoi(arg);
2271 static void opt_b_frames(const char *arg)
2273 b_frames = atoi(arg);
2274 if (b_frames > FF_MAX_B_FRAMES) {
2275 fprintf(stderr, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES);
2277 } else if (b_frames < 1) {
2278 fprintf(stderr, "\nNumber of B frames must be higher than 0\n");
2283 static void opt_mb_decision(const char *arg)
2285 mb_decision = atoi(arg);
2288 static void opt_mb_cmp(const char *arg)
2293 static void opt_ildct_cmp(const char *arg)
2295 ildct_cmp = atoi(arg);
2298 static void opt_sub_cmp(const char *arg)
2300 sub_cmp = atoi(arg);
2303 static void opt_cmp(const char *arg)
2308 static void opt_pre_cmp(const char *arg)
2310 pre_cmp = atoi(arg);
2313 static void opt_pre_me(const char *arg)
2318 static void opt_lumi_mask(const char *arg)
2320 lumi_mask = atof(arg);
2323 static void opt_dark_mask(const char *arg)
2325 dark_mask = atof(arg);
2328 static void opt_scplx_mask(const char *arg)
2330 scplx_mask = atof(arg);
2333 static void opt_tcplx_mask(const char *arg)
2335 tcplx_mask = atof(arg);
2338 static void opt_p_mask(const char *arg)
2343 static void opt_qscale(const char *arg)
2345 video_qscale = atof(arg);
2346 if (video_qscale < 0.01 ||
2347 video_qscale > 255) {
2348 fprintf(stderr, "qscale must be >= 0.01 and <= 255\n");
2353 static void opt_lmax(const char *arg)
2355 video_lmax = atof(arg)*FF_QP2LAMBDA;
2358 static void opt_lmin(const char *arg)
2360 video_lmin = atof(arg)*FF_QP2LAMBDA;
2363 static void opt_qmin(const char *arg)
2365 video_qmin = atoi(arg);
2366 if (video_qmin < 0 ||
2368 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2373 static void opt_qmax(const char *arg)
2375 video_qmax = atoi(arg);
2376 if (video_qmax < 0 ||
2378 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2383 static void opt_mb_qmin(const char *arg)
2385 video_mb_qmin = atoi(arg);
2386 if (video_mb_qmin < 0 ||
2387 video_mb_qmin > 31) {
2388 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2393 static void opt_mb_qmax(const char *arg)
2395 video_mb_qmax = atoi(arg);
2396 if (video_mb_qmax < 0 ||
2397 video_mb_qmax > 31) {
2398 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2403 static void opt_qdiff(const char *arg)
2405 video_qdiff = atoi(arg);
2406 if (video_qdiff < 0 ||
2408 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2413 static void opt_qblur(const char *arg)
2415 video_qblur = atof(arg);
2418 static void opt_qcomp(const char *arg)
2420 video_qcomp = atof(arg);
2423 static void opt_rc_initial_cplx(const char *arg)
2425 video_rc_initial_cplx = atof(arg);
2427 static void opt_b_qfactor(const char *arg)
2429 video_b_qfactor = atof(arg);
2431 static void opt_i_qfactor(const char *arg)
2433 video_i_qfactor = atof(arg);
2435 static void opt_b_qoffset(const char *arg)
2437 video_b_qoffset = atof(arg);
2439 static void opt_i_qoffset(const char *arg)
2441 video_i_qoffset = atof(arg);
2444 static void opt_ibias(const char *arg)
2446 video_intra_quant_bias = atoi(arg);
2448 static void opt_pbias(const char *arg)
2450 video_inter_quant_bias = atoi(arg);
2453 static void opt_packet_size(const char *arg)
2455 packet_size= atoi(arg);
2458 static void opt_error_rate(const char *arg)
2460 error_rate= atoi(arg);
2463 static void opt_strict(const char *arg)
2468 static void opt_top_field_first(const char *arg)
2470 top_field_first= atoi(arg);
2473 static void opt_noise_reduction(const char *arg)
2475 noise_reduction= atoi(arg);
2478 static void opt_qns(const char *arg)
2483 static void opt_sc_threshold(const char *arg)
2485 sc_threshold= atoi(arg);
2488 static void opt_me_range(const char *arg)
2490 me_range = atoi(arg);
2493 static void opt_thread_count(const char *arg)
2495 thread_count= atoi(arg);
2496 #if !defined(HAVE_PTHREADS) && !defined(HAVE_W32THREADS)
2498 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2502 static void opt_audio_bitrate(const char *arg)
2504 audio_bit_rate = atoi(arg) * 1000;
2507 static void opt_audio_rate(const char *arg)
2509 audio_sample_rate = atoi(arg);
2512 static void opt_audio_channels(const char *arg)
2514 audio_channels = atoi(arg);
2517 static void opt_video_device(const char *arg)
2519 video_device = av_strdup(arg);
2522 static void opt_video_channel(const char *arg)
2524 video_channel = strtol(arg, NULL, 0);
2527 static void opt_video_standard(const char *arg)
2529 video_standard = av_strdup(arg);
2532 static void opt_audio_device(const char *arg)
2534 audio_device = av_strdup(arg);
2537 static void opt_dv1394(const char *arg)
2539 video_grab_format = "dv1394";
2540 audio_grab_format = NULL;
2543 static void opt_audio_codec(const char *arg)
2547 if (!strcmp(arg, "copy")) {
2548 audio_stream_copy = 1;
2552 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_AUDIO)
2557 fprintf(stderr, "Unknown audio codec '%s'\n", arg);
2560 audio_codec_id = p->id;
2565 static void add_frame_hooker(const char *arg)
2570 char *args = av_strdup(arg);
2574 argv[0] = strtok(args, " ");
2575 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2578 i = frame_hook_add(argc, argv);
2581 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2586 const char *motion_str[] = {
2596 static void opt_motion_estimation(const char *arg)
2602 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2605 if (!strcmp(*p, arg))
2609 me_method = (p - motion_str) + 1;
2612 static void opt_video_codec(const char *arg)
2616 if (!strcmp(arg, "copy")) {
2617 video_stream_copy = 1;
2621 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_VIDEO)
2626 fprintf(stderr, "Unknown video codec '%s'\n", arg);
2629 video_codec_id = p->id;
2634 static void opt_map(const char *arg)
2640 m = &stream_maps[nb_stream_maps++];
2642 m->file_index = strtol(arg, (char **)&p, 0);
2646 m->stream_index = strtol(p, (char **)&p, 0);
2649 static void opt_recording_time(const char *arg)
2651 recording_time = parse_date(arg, 1);
2654 static void opt_start_time(const char *arg)
2656 start_time = parse_date(arg, 1);
2659 static void opt_rec_timestamp(const char *arg)
2661 rec_timestamp = parse_date(arg, 0) / 1000000;
2664 static void opt_input_ts_offset(const char *arg)
2666 input_ts_offset = parse_date(arg, 1);
2669 static void opt_input_file(const char *filename)
2671 AVFormatContext *ic;
2672 AVFormatParameters params, *ap = ¶ms;
2673 int err, i, ret, rfps, rfps_base;
2675 if (!strcmp(filename, "-"))
2678 using_stdin |= !strcmp(filename, "pipe:" ) ||
2679 !strcmp( filename, "/dev/stdin" );
2681 /* get default parameters from command line */
2682 memset(ap, 0, sizeof(*ap));
2683 ap->sample_rate = audio_sample_rate;
2684 ap->channels = audio_channels;
2685 ap->frame_rate = frame_rate;
2686 ap->frame_rate_base = frame_rate_base;
2687 ap->width = frame_width + frame_padleft + frame_padright;
2688 ap->height = frame_height + frame_padtop + frame_padbottom;
2689 ap->image_format = image_format;
2690 ap->pix_fmt = frame_pix_fmt;
2692 /* open the input file with generic libav function */
2693 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2695 print_error(filename, err);
2699 /* If not enough info to get the stream parameters, we decode the
2700 first frames to get it. (used in mpeg case for example) */
2701 ret = av_find_stream_info(ic);
2702 if (ret < 0 && verbose >= 0) {
2703 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2707 /* if seeking requested, we execute it */
2708 if (start_time != 0) {
2711 timestamp = start_time;
2712 /* add the stream start time */
2713 if (ic->start_time != AV_NOPTS_VALUE)
2714 timestamp += ic->start_time;
2715 ret = av_seek_frame(ic, -1, timestamp);
2717 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2718 filename, (double)timestamp / AV_TIME_BASE);
2720 /* reset seek info */
2724 /* update the current parameters so that they match the one of the input stream */
2725 for(i=0;i<ic->nb_streams;i++) {
2726 AVCodecContext *enc = &ic->streams[i]->codec;
2727 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2729 avcodec_thread_init(enc, thread_count);
2731 enc->thread_count= thread_count;
2732 switch(enc->codec_type) {
2733 case CODEC_TYPE_AUDIO:
2734 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2735 audio_channels = enc->channels;
2736 audio_sample_rate = enc->sample_rate;
2738 case CODEC_TYPE_VIDEO:
2739 frame_height = enc->height;
2740 frame_width = enc->width;
2741 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2742 frame_pix_fmt = enc->pix_fmt;
2743 rfps = ic->streams[i]->r_frame_rate;
2744 rfps_base = ic->streams[i]->r_frame_rate_base;
2745 enc->workaround_bugs = workaround_bugs;
2746 enc->error_resilience = error_resilience;
2747 enc->error_concealment = error_concealment;
2748 enc->idct_algo = idct_algo;
2750 enc->debug_mv = debug_mv;
2752 enc->flags|= CODEC_FLAG_BITEXACT;
2754 enc->debug |= FF_DEBUG_MV;
2756 assert(enc->frame_rate_base == rfps_base); // should be true for now
2757 if (enc->frame_rate != rfps) {
2760 fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f->%2.2f\n",
2761 i, (float)enc->frame_rate / enc->frame_rate_base,
2763 (float)rfps / rfps_base);
2765 /* update the current frame rate to match the stream frame rate */
2767 frame_rate_base = rfps_base;
2769 enc->rate_emu = rate_emu;
2771 case CODEC_TYPE_DATA:
2778 input_files[nb_input_files] = ic;
2779 input_files_ts_offset[nb_input_files] = input_ts_offset;
2780 /* dump the file content */
2782 dump_format(ic, nb_input_files, filename, 0);
2785 file_iformat = NULL;
2786 file_oformat = NULL;
2787 image_format = NULL;
2792 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
2794 int has_video, has_audio, i, j;
2795 AVFormatContext *ic;
2799 for(j=0;j<nb_input_files;j++) {
2800 ic = input_files[j];
2801 for(i=0;i<ic->nb_streams;i++) {
2802 AVCodecContext *enc = &ic->streams[i]->codec;
2803 switch(enc->codec_type) {
2804 case CODEC_TYPE_AUDIO:
2807 case CODEC_TYPE_VIDEO:
2810 case CODEC_TYPE_DATA:
2817 *has_video_ptr = has_video;
2818 *has_audio_ptr = has_audio;
2821 static void opt_output_file(const char *filename)
2824 AVFormatContext *oc;
2825 int use_video, use_audio, nb_streams, input_has_video, input_has_audio;
2827 AVFormatParameters params, *ap = ¶ms;
2829 if (!strcmp(filename, "-"))
2832 oc = av_alloc_format_context();
2834 if (!file_oformat) {
2835 file_oformat = guess_format(NULL, filename, NULL);
2836 if (!file_oformat) {
2837 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
2843 oc->oformat = file_oformat;
2845 if (!strcmp(file_oformat->name, "ffm") &&
2846 strstart(filename, "http:", NULL)) {
2847 /* special case for files sent to ffserver: we get the stream
2848 parameters from ffserver */
2849 if (read_ffserver_streams(oc, filename) < 0) {
2850 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
2854 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy;
2855 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy;
2857 /* disable if no corresponding type found and at least one
2859 if (nb_input_files > 0) {
2860 check_audio_video_inputs(&input_has_video, &input_has_audio);
2861 if (!input_has_video)
2863 if (!input_has_audio)
2867 /* manual disable */
2868 if (audio_disable) {
2871 if (video_disable) {
2877 AVCodecContext *video_enc;
2879 st = av_new_stream(oc, nb_streams++);
2881 fprintf(stderr, "Could not alloc stream\n");
2884 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2886 avcodec_thread_init(&st->codec, thread_count);
2889 video_enc = &st->codec;
2891 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
2892 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2893 if (video_stream_copy) {
2894 st->stream_copy = 1;
2895 video_enc->codec_type = CODEC_TYPE_VIDEO;
2901 codec_id = file_oformat->video_codec;
2902 if (video_codec_id != CODEC_ID_NONE)
2903 codec_id = video_codec_id;
2905 video_enc->codec_id = codec_id;
2906 codec = avcodec_find_encoder(codec_id);
2908 video_enc->bit_rate = video_bit_rate;
2909 video_enc->bit_rate_tolerance = video_bit_rate_tolerance;
2910 video_enc->frame_rate = frame_rate;
2911 video_enc->frame_rate_base = frame_rate_base;
2912 if(codec && codec->supported_framerates){
2913 const AVRational *p= codec->supported_framerates;
2914 AVRational req= (AVRational){frame_rate, frame_rate_base};
2915 const AVRational *best=NULL;
2916 AVRational best_error= (AVRational){INT_MAX, 1};
2917 for(; p->den!=0; p++){
2918 AVRational error= av_sub_q(req, *p);
2919 if(error.num <0) error.num *= -1;
2920 if(av_cmp_q(error, best_error) < 0){
2925 video_enc->frame_rate = best->num;
2926 video_enc->frame_rate_base= best->den;
2929 video_enc->width = frame_width + frame_padright + frame_padleft;
2930 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2931 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
2932 video_enc->pix_fmt = frame_pix_fmt;
2934 if(codec && codec->pix_fmts){
2935 const enum PixelFormat *p= codec->pix_fmts;
2937 if(*p == video_enc->pix_fmt)
2941 video_enc->pix_fmt = codec->pix_fmts[0];
2945 video_enc->gop_size = gop_size;
2947 video_enc->gop_size = 0;
2948 if (video_qscale || same_quality) {
2949 video_enc->flags |= CODEC_FLAG_QSCALE;
2950 st->quality = FF_QP2LAMBDA * video_qscale;
2954 video_enc->intra_matrix = intra_matrix;
2956 video_enc->inter_matrix = inter_matrix;
2959 video_enc->flags |= CODEC_FLAG_BITEXACT;
2961 video_enc->mb_decision = mb_decision;
2962 video_enc->mb_cmp = mb_cmp;
2963 video_enc->ildct_cmp = ildct_cmp;
2964 video_enc->me_sub_cmp = sub_cmp;
2965 video_enc->me_cmp = cmp;
2966 video_enc->me_pre_cmp = pre_cmp;
2967 video_enc->pre_me = pre_me;
2968 video_enc->lumi_masking = lumi_mask;
2969 video_enc->dark_masking = dark_mask;
2970 video_enc->spatial_cplx_masking = scplx_mask;
2971 video_enc->temporal_cplx_masking = tcplx_mask;
2972 video_enc->p_masking = p_mask;
2973 video_enc->quantizer_noise_shaping= qns;
2976 video_enc->flags |= CODEC_FLAG_H263P_UMV;
2979 video_enc->flags |= CODEC_FLAG_H263P_SLICE_STRUCT;
2982 video_enc->flags |= CODEC_FLAG_H263P_AIC;
2985 video_enc->flags |= CODEC_FLAG_H263P_AIV;
2988 video_enc->flags |= CODEC_FLAG_4MV;
2991 video_enc->flags |= CODEC_FLAG_OBMC;
2994 video_enc->flags |= CODEC_FLAG_LOOP_FILTER;
2998 video_enc->flags |= CODEC_FLAG_PART;
3001 video_enc->flags |= CODEC_FLAG_ALT_SCAN;
3004 video_enc->flags |= CODEC_FLAG_TRELLIS_QUANT;
3006 if (use_scan_offset) {
3007 video_enc->flags |= CODEC_FLAG_SVCD_SCAN_OFFSET;
3010 video_enc->flags |= CODEC_FLAG_CLOSED_GOP;
3013 video_enc->flags |= CODEC_FLAG_QPEL;
3016 video_enc->flags |= CODEC_FLAG_QP_RD;
3019 video_enc->flags |= CODEC_FLAG_CBP_RD;
3022 video_enc->max_b_frames = b_frames;
3023 video_enc->b_frame_strategy = 0;
3024 video_enc->b_quant_factor = 2.0;
3026 if (do_interlace_dct) {
3027 video_enc->flags |= CODEC_FLAG_INTERLACED_DCT;
3029 if (do_interlace_me) {
3030 video_enc->flags |= CODEC_FLAG_INTERLACED_ME;
3032 video_enc->qmin = video_qmin;
3033 video_enc->qmax = video_qmax;
3034 video_enc->lmin = video_lmin;
3035 video_enc->lmax = video_lmax;
3036 video_enc->mb_qmin = video_mb_qmin;
3037 video_enc->mb_qmax = video_mb_qmax;
3038 video_enc->max_qdiff = video_qdiff;
3039 video_enc->qblur = video_qblur;
3040 video_enc->qcompress = video_qcomp;
3041 video_enc->rc_eq = video_rc_eq;
3042 video_enc->debug = debug;
3043 video_enc->debug_mv = debug_mv;
3044 video_enc->thread_count = thread_count;
3045 p= video_rc_override_string;
3048 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3050 fprintf(stderr, "error parsing rc_override\n");
3053 video_enc->rc_override=
3054 av_realloc(video_enc->rc_override,
3055 sizeof(RcOverride)*(i+1));
3056 video_enc->rc_override[i].start_frame= start;
3057 video_enc->rc_override[i].end_frame = end;
3059 video_enc->rc_override[i].qscale= q;
3060 video_enc->rc_override[i].quality_factor= 1.0;
3063 video_enc->rc_override[i].qscale= 0;
3064 video_enc->rc_override[i].quality_factor= -q/100.0;
3069 video_enc->rc_override_count=i;
3071 video_enc->rc_max_rate = video_rc_max_rate;
3072 video_enc->rc_min_rate = video_rc_min_rate;
3073 video_enc->rc_buffer_size = video_rc_buffer_size;
3074 video_enc->rc_buffer_aggressivity= video_rc_buffer_aggressivity;
3075 video_enc->rc_initial_cplx= video_rc_initial_cplx;
3076 video_enc->i_quant_factor = video_i_qfactor;
3077 video_enc->b_quant_factor = video_b_qfactor;
3078 video_enc->i_quant_offset = video_i_qoffset;
3079 video_enc->b_quant_offset = video_b_qoffset;
3080 video_enc->intra_quant_bias = video_intra_quant_bias;
3081 video_enc->inter_quant_bias = video_inter_quant_bias;
3082 video_enc->dct_algo = dct_algo;
3083 video_enc->idct_algo = idct_algo;
3084 video_enc->me_threshold= me_threshold;
3085 video_enc->mb_threshold= mb_threshold;
3086 video_enc->intra_dc_precision= intra_dc_precision - 8;
3087 video_enc->strict_std_compliance = strict;
3088 video_enc->error_rate = error_rate;
3089 video_enc->noise_reduction= noise_reduction;
3090 video_enc->scenechange_threshold= sc_threshold;
3091 video_enc->me_range = me_range;
3092 video_enc->coder_type= coder;
3093 video_enc->context_model= context;
3094 video_enc->prediction_method= predictor;
3097 video_enc->rtp_mode= 1;
3098 video_enc->rtp_payload_size= packet_size;
3102 video_enc->flags|= CODEC_FLAG_PSNR;
3104 video_enc->me_method = me_method;
3109 video_enc->flags |= CODEC_FLAG_PASS1;
3111 video_enc->flags |= CODEC_FLAG_PASS2;
3118 AVCodecContext *audio_enc;
3120 st = av_new_stream(oc, nb_streams++);
3122 fprintf(stderr, "Could not alloc stream\n");
3125 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
3127 avcodec_thread_init(&st->codec, thread_count);
3130 audio_enc = &st->codec;
3131 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3133 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
3134 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3135 if (audio_stream_copy) {
3136 st->stream_copy = 1;
3137 audio_enc->channels = audio_channels;
3139 codec_id = file_oformat->audio_codec;
3140 if (audio_codec_id != CODEC_ID_NONE)
3141 codec_id = audio_codec_id;
3142 audio_enc->codec_id = codec_id;
3144 audio_enc->bit_rate = audio_bit_rate;
3145 audio_enc->strict_std_compliance = strict;
3146 audio_enc->thread_count = thread_count;
3147 /* For audio codecs other than AC3 we limit */
3148 /* the number of coded channels to stereo */
3149 if (audio_channels > 2 && codec_id != CODEC_ID_AC3) {
3150 audio_enc->channels = 2;
3152 audio_enc->channels = audio_channels;
3154 audio_enc->sample_rate = audio_sample_rate;
3157 oc->nb_streams = nb_streams;
3160 fprintf(stderr, "No audio or video streams available\n");
3164 oc->timestamp = rec_timestamp;
3167 pstrcpy(oc->title, sizeof(oc->title), str_title);
3169 pstrcpy(oc->author, sizeof(oc->author), str_author);
3171 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3173 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3176 output_files[nb_output_files++] = oc;
3178 strcpy(oc->filename, filename);
3180 /* check filename in case of an image number is expected */
3181 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3182 if (filename_number_test(oc->filename) < 0) {
3183 print_error(oc->filename, AVERROR_NUMEXPECTED);
3188 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3189 /* test if it already exists to avoid loosing precious files */
3190 if (!file_overwrite &&
3191 (strchr(filename, ':') == NULL ||
3192 strstart(filename, "file:", NULL))) {
3193 if (url_exist(filename)) {
3196 if ( !using_stdin ) {
3197 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3200 if (toupper(c) != 'Y') {
3201 fprintf(stderr, "Not overwriting - exiting\n");
3206 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3213 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3214 fprintf(stderr, "Could not open '%s'\n", filename);
3219 memset(ap, 0, sizeof(*ap));
3220 ap->image_format = image_format;
3221 if (av_set_parameters(oc, ap) < 0) {
3222 fprintf(stderr, "%s: Invalid encoding parameters\n",
3227 /* reset some options */
3228 file_oformat = NULL;
3229 file_iformat = NULL;
3230 image_format = NULL;
3233 audio_codec_id = CODEC_ID_NONE;
3234 video_codec_id = CODEC_ID_NONE;
3235 audio_stream_copy = 0;
3236 video_stream_copy = 0;
3239 /* prepare dummy protocols for grab */
3240 static void prepare_grab(void)
3242 int has_video, has_audio, i, j;
3243 AVFormatContext *oc;
3244 AVFormatContext *ic;
3245 AVFormatParameters vp1, *vp = &vp1;
3246 AVFormatParameters ap1, *ap = &ap1;
3248 /* see if audio/video inputs are needed */
3251 memset(ap, 0, sizeof(*ap));
3252 memset(vp, 0, sizeof(*vp));
3253 for(j=0;j<nb_output_files;j++) {
3254 oc = output_files[j];
3255 for(i=0;i<oc->nb_streams;i++) {
3256 AVCodecContext *enc = &oc->streams[i]->codec;
3257 switch(enc->codec_type) {
3258 case CODEC_TYPE_AUDIO:
3259 if (enc->sample_rate > ap->sample_rate)
3260 ap->sample_rate = enc->sample_rate;
3261 if (enc->channels > ap->channels)
3262 ap->channels = enc->channels;
3265 case CODEC_TYPE_VIDEO:
3266 if (enc->width > vp->width)
3267 vp->width = enc->width;
3268 if (enc->height > vp->height)
3269 vp->height = enc->height;
3271 assert(enc->frame_rate_base == DEFAULT_FRAME_RATE_BASE);
3272 if (enc->frame_rate > vp->frame_rate){
3273 vp->frame_rate = enc->frame_rate;
3274 vp->frame_rate_base = enc->frame_rate_base;
3284 if (has_video == 0 && has_audio == 0) {
3285 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3290 AVInputFormat *fmt1;
3291 fmt1 = av_find_input_format(video_grab_format);
3292 vp->device = video_device;
3293 vp->channel = video_channel;
3294 vp->standard = video_standard;
3295 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3296 fprintf(stderr, "Could not find video grab device\n");
3299 /* If not enough info to get the stream parameters, we decode the
3300 first frames to get it. */
3301 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3302 fprintf(stderr, "Could not find video grab parameters\n");
3305 /* by now video grab has one stream */
3306 ic->streams[0]->r_frame_rate = vp->frame_rate;
3307 ic->streams[0]->r_frame_rate_base = vp->frame_rate_base;
3308 input_files[nb_input_files] = ic;
3311 dump_format(ic, nb_input_files, "", 0);
3315 if (has_audio && audio_grab_format) {
3316 AVInputFormat *fmt1;
3317 fmt1 = av_find_input_format(audio_grab_format);
3318 ap->device = audio_device;
3319 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3320 fprintf(stderr, "Could not find audio grab device\n");
3323 input_files[nb_input_files] = ic;
3326 dump_format(ic, nb_input_files, "", 0);
3332 /* same option as mencoder */
3333 static void opt_pass(const char *pass_str)
3336 pass = atoi(pass_str);
3337 if (pass != 1 && pass != 2) {
3338 fprintf(stderr, "pass number can be only 1 or 2\n");
3344 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3345 static int64_t getutime(void)
3347 return av_gettime();
3350 static int64_t getutime(void)
3352 struct rusage rusage;
3354 getrusage(RUSAGE_SELF, &rusage);
3355 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3359 extern int ffm_nopts;
3361 static void opt_bitexact(void)
3364 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3368 static void show_formats(void)
3370 AVInputFormat *ifmt;
3371 AVOutputFormat *ofmt;
3372 AVImageFormat *image_fmt;
3375 const char **pp, *last_name;
3377 printf("File formats:\n");
3382 const char *name=NULL;
3384 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3385 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3386 strcmp(ofmt->name, last_name)>0){
3391 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3392 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3393 strcmp(ifmt->name, last_name)>0){
3397 if(name && strcmp(ifmt->name, name)==0)
3412 printf("Image formats:\n");
3413 for(image_fmt = first_image_format; image_fmt != NULL;
3414 image_fmt = image_fmt->next) {
3417 image_fmt->img_read ? "D":" ",
3418 image_fmt->img_write ? "E":" ",
3423 printf("Codecs:\n");
3431 for(p = first_avcodec; p != NULL; p = p->next) {
3432 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3433 strcmp(p->name, last_name)>0){
3435 decode= encode= cap=0;
3437 if(p2 && strcmp(p->name, p2->name)==0){
3438 if(p->decode) decode=1;
3439 if(p->encode) encode=1;
3440 cap |= p->capabilities;
3445 last_name= p2->name;
3449 decode ? "D": (/*p2->decoder ? "d":*/" "),
3451 p2->type == CODEC_TYPE_AUDIO ? "A":"V",
3452 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3453 cap & CODEC_CAP_DR1 ? "D":" ",
3454 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3456 /* if(p2->decoder && decode==0)
3457 printf(" use %s for decoding", p2->decoder->name);*/
3462 printf("Supported file protocols:\n");
3463 for(up = first_protocol; up != NULL; up = up->next)
3464 printf(" %s:", up->name);
3467 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3468 printf("Motion estimation methods:\n");
3472 if ((pp - motion_str + 1) == ME_ZERO)
3473 printf("(fastest)");
3474 else if ((pp - motion_str + 1) == ME_FULL)
3475 printf("(slowest)");
3476 else if ((pp - motion_str + 1) == ME_EPZS)
3477 printf("(default)");
3482 "Note, the names of encoders and decoders dont always match, so there are\n"
3483 "several cases where the above table shows encoder only or decoder only entries\n"
3484 "even though both encoding and decoding are supported for example, the h263\n"
3485 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3490 void parse_matrix_coeffs(uint16_t *dest, const char *str)
3493 const char *p = str;
3500 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3507 void opt_inter_matrix(const char *arg)
3509 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3510 parse_matrix_coeffs(inter_matrix, arg);
3513 void opt_intra_matrix(const char *arg)
3515 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3516 parse_matrix_coeffs(intra_matrix, arg);
3519 static void opt_target(const char *arg)
3523 if(!strncmp(arg, "pal-", 4)) {
3526 } else if(!strncmp(arg, "ntsc-", 5)) {
3531 /* Calculate FR via float to avoid int overflow */
3532 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3535 } else if((fr == 29970) || (fr == 23976)) {
3538 /* Try to determine PAL/NTSC by peeking in the input files */
3539 if(nb_input_files) {
3541 for(j = 0; j < nb_input_files; j++) {
3542 for(i = 0; i < input_files[j]->nb_streams; i++) {
3543 AVCodecContext *c = &input_files[j]->streams[i]->codec;
3544 if(c->codec_type != CODEC_TYPE_VIDEO)
3546 fr = c->frame_rate * 1000 / c->frame_rate_base;
3550 } else if((fr == 29970) || (fr == 23976)) {
3560 if(verbose && norm >= 0)
3561 printf("Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3565 fprintf(stderr, "Could not determine norm (PAL/NTSC) for target.\n");
3566 fprintf(stderr, "Please prefix target with \"pal-\" or \"ntsc-\",\n");
3567 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3571 if(!strcmp(arg, "vcd")) {
3573 opt_video_codec("mpeg1video");
3574 opt_audio_codec("mp2");
3577 opt_frame_size(norm ? "352x240" : "352x288");
3579 video_bit_rate = 1150000;
3580 video_rc_max_rate = 1150000;
3581 video_rc_min_rate = 1150000;
3582 video_rc_buffer_size = 40*1024*8;
3584 audio_bit_rate = 224000;
3585 audio_sample_rate = 44100;
3587 } else if(!strcmp(arg, "svcd")) {
3589 opt_video_codec("mpeg2video");
3590 opt_audio_codec("mp2");
3593 opt_frame_size(norm ? "480x480" : "480x576");
3594 opt_gop_size(norm ? "18" : "15");
3596 video_bit_rate = 2040000;
3597 video_rc_max_rate = 2516000;
3598 video_rc_min_rate = 0; //1145000;
3599 video_rc_buffer_size = 224*1024*8;
3600 use_scan_offset = 1;
3602 audio_bit_rate = 224000;
3603 audio_sample_rate = 44100;
3605 } else if(!strcmp(arg, "dvd")) {
3607 opt_video_codec("mpeg2video");
3608 opt_audio_codec("ac3");
3611 opt_frame_size(norm ? "720x480" : "720x576");
3612 opt_gop_size(norm ? "18" : "15");
3614 video_bit_rate = 6000000;
3615 video_rc_max_rate = 9000000;
3616 video_rc_min_rate = 0; //1500000;
3617 video_rc_buffer_size = 224*1024*8;
3619 audio_bit_rate = 448000;
3620 audio_sample_rate = 48000;
3623 fprintf(stderr, "Unknown target: %s\n", arg);
3628 static void show_version(void)
3630 printf("ffmpeg " FFMPEG_VERSION "\n"
3633 avcodec_build(), LIBAVFORMAT_BUILD);
3637 const OptionDef options[] = {
3639 { "L", 0, {(void*)show_license}, "show license" },
3640 { "h", 0, {(void*)show_help}, "show help" },
3641 { "version", 0, {(void*)show_version}, "show version" },
3642 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3643 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3644 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
3645 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3646 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3647 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream" },
3648 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3649 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3650 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3651 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3652 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3653 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3654 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3655 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3656 { "debug", HAS_ARG | OPT_EXPERT, {(void*)opt_debug}, "print specific debug info", "" },
3657 { "vismv", HAS_ARG | OPT_EXPERT, {(void*)opt_vismv}, "visualize motion vectors", "" },
3658 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3659 "add timings for benchmarking" },
3660 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3661 "dump each input packet" },
3662 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3663 "when dumping packets, also dump the payload" },
3664 { "bitexact", OPT_EXPERT, {(void*)opt_bitexact}, "only use bit exact algorithms (for codec testing)" },
3665 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3666 { "loop", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3667 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3668 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\" or \"dvd\")", "type" },
3669 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3670 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3671 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3672 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3675 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
3676 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3677 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3678 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3679 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3680 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3681 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3682 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3683 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3684 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3685 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3686 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3687 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3688 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3689 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
3690 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3691 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3692 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
3693 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
3694 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
3695 { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
3696 { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
3697 { "mbqmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmin}, "min macroblock quantiser scale (VBR)", "q" },
3698 { "mbqmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmax}, "max macroblock quantiser scale (VBR)", "q" },
3699 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
3700 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
3701 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
3702 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
3703 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
3704 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
3705 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
3706 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
3707 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
3708 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
3709 // { "b_strategy", HAS_ARG | OPT_EXPERT, {(void*)opt_b_strategy}, "dynamic b frame selection strategy", "strategy" },
3710 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3711 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3712 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
3713 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
3714 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
3715 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffere size (in kByte)", "size" },
3716 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3717 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
3719 { "dct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dct_algo}, "set dct algo", "algo" },
3720 { "idct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_idct_algo}, "set idct algo", "algo" },
3721 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
3722 { "mb_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_threshold}, "macroblock threshold", "" },
3723 { "er", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_resilience}, "set error resilience", "n" },
3724 { "ec", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_concealment}, "set error concealment", "bit_mask" },
3725 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
3726 { "hq", OPT_BOOL, {(void*)&mb_decision}, "activate high quality settings" },
3727 { "mbd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_decision}, "macroblock decision", "mode" },
3728 { "mbcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_cmp}, "macroblock compare function", "cmp function" },
3729 { "ildctcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ildct_cmp}, "ildct compare function", "cmp function" },
3730 { "subcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sub_cmp}, "subpel compare function", "cmp function" },
3731 { "cmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_cmp}, "fullpel compare function", "cmp function" },
3732 { "precmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_cmp}, "pre motion estimation compare function", "cmp function" },
3733 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
3734 { "lumi_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lumi_mask}, "luminance masking", "" },
3735 { "dark_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dark_mask}, "darkness masking", "" },
3736 { "scplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_scplx_mask}, "spatial complexity masking", "" },
3737 { "tcplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_tcplx_mask}, "teporal complexity masking", "" },
3738 { "p_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_p_mask}, "inter masking", "" },
3739 { "4mv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_4mv}, "use four motion vector by macroblock (MPEG4)" },
3740 { "obmc", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_obmc}, "use overlapped block motion compensation (h263+)" },
3741 { "lf", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_loop}, "use loop filter (h263+)" },
3742 { "part", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_part}, "use data partitioning (MPEG4)" },
3743 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
3744 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
3745 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
3746 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3747 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3748 "use same video quality as source (implies VBR)" },
3749 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3750 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3751 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3752 "deinterlace pictures" },
3753 { "ildct", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_dct},
3754 "force interlaced dct support in encoder (MPEG2/MPEG4)" },
3755 { "ilme", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_me},
3756 "force interlaced me support in encoder (MPEG2/MPEG4)" },
3757 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3758 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
3759 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3760 { "aic", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aic}, "enable Advanced intra coding (h263+)" },
3761 { "aiv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aiv}, "enable Alternative inter vlc (h263+)" },
3762 { "umv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_umv}, "enable Unlimited Motion Vector (h263+)" },
3763 { "ssm", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_ss}, "enable Slice Structured mode (h263+)" },
3764 { "alt", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_alt_scan}, "enable alternate scantable (MPEG2/MPEG4)" },
3765 { "qprd", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qprd}, "" },
3766 { "cbp", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_cbprd}, "" },
3767 { "trell", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_trell}, "enable trellis quantization" },
3768 { "cgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&closed_gop}, "closed gop" },
3769 { "scan_offset", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_scan_offset}, "enable SVCD Scan Offset placeholder" },
3770 { "qpel", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qpel}, "enable 1/4-pel" },
3771 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3772 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3773 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3774 { "nr", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_noise_reduction}, "noise reduction", "" },
3775 { "qns", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qns}, "quantization noise shaping", "" },
3776 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
3777 { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
3778 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3779 { "coder", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&coder}, "coder type", "" },
3780 { "context", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&context}, "context model", "" },
3781 { "pred", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&predictor}, "prediction method", "" },
3784 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
3785 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3786 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3787 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3788 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3791 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
3792 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3793 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3794 { "dv1394", OPT_EXPERT | OPT_GRAB, {(void*)opt_dv1394}, "set DV1394 grab", "" },
3795 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
3799 static void show_banner(void)
3801 printf("ffmpeg version " FFMPEG_VERSION ", build %d, Copyright (c) 2000-2004 Fabrice Bellard\n",
3803 printf(" built on " __DATE__ " " __TIME__);
3805 printf(", gcc: %s\n", __VERSION__);
3807 printf(", using a non-gcc compiler\n");
3811 static void show_license(void)
3816 "This program is free software; you can redistribute it and/or modify\n"
3817 "it under the terms of the GNU General Public License as published by\n"
3818 "the Free Software Foundation; either version 2 of the License, or\n"
3819 "(at your option) any later version.\n"
3821 "This program is distributed in the hope that it will be useful,\n"
3822 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3823 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
3824 "GNU General Public License for more details.\n"
3826 "You should have received a copy of the GNU General Public License\n"
3827 "along with this program; if not, write to the Free Software\n"
3828 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3832 "This library is free software; you can redistribute it and/or\n"
3833 "modify it under the terms of the GNU Lesser General Public\n"
3834 "License as published by the Free Software Foundation; either\n"
3835 "version 2 of the License, or (at your option) any later version.\n"
3837 "This library is distributed in the hope that it will be useful,\n"
3838 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3839 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
3840 "Lesser General Public License for more details.\n"
3842 "You should have received a copy of the GNU Lesser General Public\n"
3843 "License along with this library; if not, write to the Free Software\n"
3844 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3850 static void show_help(void)
3853 printf("usage: ffmpeg [[options] -i input_file]... {[options] outfile}...\n"
3854 "Hyper fast Audio and Video encoder\n");
3856 show_help_options(options, "Main options:\n",
3857 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
3858 show_help_options(options, "\nVideo options:\n",
3859 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3861 show_help_options(options, "\nAdvanced Video options:\n",
3862 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3863 OPT_VIDEO | OPT_EXPERT);
3864 show_help_options(options, "\nAudio options:\n",
3865 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3867 show_help_options(options, "\nAdvanced Audio options:\n",
3868 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3869 OPT_AUDIO | OPT_EXPERT);
3870 show_help_options(options, "\nAudio/Video grab options:\n",
3873 show_help_options(options, "\nAdvanced options:\n",
3874 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3879 void parse_arg_file(const char *filename)
3881 opt_output_file(filename);
3884 int main(int argc, char **argv)
3897 parse_options(argc, argv, options);
3899 /* file converter / grab */
3900 if (nb_output_files <= 0) {
3901 fprintf(stderr, "Must supply at least one output file\n");
3905 if (nb_input_files == 0) {
3911 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3912 stream_maps, nb_stream_maps);
3913 ti = getutime() - ti;
3915 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3919 for(i=0;i<nb_output_files;i++) {
3920 /* maybe av_close_output_file ??? */
3921 AVFormatContext *s = output_files[i];
3923 if (!(s->oformat->flags & AVFMT_NOFILE))
3925 for(j=0;j<s->nb_streams;j++)
3926 av_free(s->streams[j]);
3929 for(i=0;i<nb_input_files;i++)
3930 av_close_input_file(input_files[i]);
3935 av_free(intra_matrix);
3937 av_free(inter_matrix);
3939 #ifdef POWERPC_PERFORMANCE_REPORT
3940 extern void powerpc_display_perf_report(void);
3941 powerpc_display_perf_report();
3942 #endif /* POWERPC_PERFORMANCE_REPORT */
3944 #ifndef CONFIG_WIN32
3945 if (received_sigterm) {
3947 "Received signal %d: terminating.\n",
3948 (int) received_sigterm);
3952 exit(0); /* not all OS-es handle main() return value */