3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #define HAVE_AV_CONFIG_H
22 #include "framehook.h"
28 #include <sys/ioctl.h>
31 #include <sys/resource.h>
35 #include <sys/types.h>
36 #include <sys/select.h>
39 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
44 #if !defined(INFINITY) && defined(HUGE_VAL)
45 #define INFINITY HUGE_VAL
48 /* select an input stream for an output stream */
49 typedef struct AVStreamMap {
54 /** select an input file for an output file */
55 typedef struct AVMetaDataMap {
60 extern const OptionDef options[];
62 static void show_help(void);
63 static void show_license(void);
67 static AVFormatContext *input_files[MAX_FILES];
68 static int64_t input_files_ts_offset[MAX_FILES];
69 static int nb_input_files = 0;
71 static AVFormatContext *output_files[MAX_FILES];
72 static int nb_output_files = 0;
74 static AVStreamMap stream_maps[MAX_FILES];
75 static int nb_stream_maps;
77 static AVMetaDataMap meta_data_maps[MAX_FILES];
78 static int nb_meta_data_maps;
80 static AVInputFormat *file_iformat;
81 static AVOutputFormat *file_oformat;
82 static AVImageFormat *image_format;
83 static int frame_width = 160;
84 static int frame_height = 128;
85 static float frame_aspect_ratio = 0;
86 static enum PixelFormat frame_pix_fmt = PIX_FMT_YUV420P;
87 static int frame_padtop = 0;
88 static int frame_padbottom = 0;
89 static int frame_padleft = 0;
90 static int frame_padright = 0;
91 static int padcolor[3] = {16,128,128}; /* default to black */
92 static int frame_topBand = 0;
93 static int frame_bottomBand = 0;
94 static int frame_leftBand = 0;
95 static int frame_rightBand = 0;
96 static int frame_rate = 25;
97 static int frame_rate_base = 1;
98 static int video_bit_rate = 200*1000;
99 static int video_bit_rate_tolerance = 4000*1000;
100 static float video_qscale = 0;
101 static int video_qmin = 2;
102 static int video_qmax = 31;
103 static int video_lmin = 2*FF_QP2LAMBDA;
104 static int video_lmax = 31*FF_QP2LAMBDA;
105 static int video_mb_qmin = 2;
106 static int video_mb_qmax = 31;
107 static int video_qdiff = 3;
108 static float video_qblur = 0.5;
109 static float video_qcomp = 0.5;
110 static uint16_t *intra_matrix = NULL;
111 static uint16_t *inter_matrix = NULL;
112 #if 0 //experimental, (can be removed)
113 static float video_rc_qsquish=1.0;
114 static float video_rc_qmod_amp=0;
115 static int video_rc_qmod_freq=0;
117 static char *video_rc_override_string=NULL;
118 static char *video_rc_eq="tex^qComp";
119 static int video_rc_buffer_size=0;
120 static float video_rc_buffer_aggressivity=1.0;
121 static int video_rc_max_rate=0;
122 static int video_rc_min_rate=0;
123 static float video_rc_initial_cplx=0;
124 static float video_b_qfactor = 1.25;
125 static float video_b_qoffset = 1.25;
126 static float video_i_qfactor = -0.8;
127 static float video_i_qoffset = 0.0;
128 static int video_intra_quant_bias= FF_DEFAULT_QUANT_BIAS;
129 static int video_inter_quant_bias= FF_DEFAULT_QUANT_BIAS;
130 static int me_method = ME_EPZS;
131 static int video_disable = 0;
132 static int video_codec_id = CODEC_ID_NONE;
133 static int same_quality = 0;
134 static int b_frames = 0;
135 static int mb_decision = FF_MB_DECISION_SIMPLE;
136 static int ildct_cmp = FF_CMP_VSAD;
137 static int mb_cmp = FF_CMP_SAD;
138 static int sub_cmp = FF_CMP_SAD;
139 static int cmp = FF_CMP_SAD;
140 static int pre_cmp = FF_CMP_SAD;
141 static int pre_me = 0;
142 static float lumi_mask = 0;
143 static float dark_mask = 0;
144 static float scplx_mask = 0;
145 static float tcplx_mask = 0;
146 static float p_mask = 0;
147 static int use_4mv = 0;
148 static int use_obmc = 0;
149 static int use_loop = 0;
150 static int use_aic = 0;
151 static int use_aiv = 0;
152 static int use_umv = 0;
153 static int use_ss = 0;
154 static int use_alt_scan = 0;
155 static int use_trell = 0;
156 static int use_scan_offset = 0;
157 static int use_qpel = 0;
158 static int use_qprd = 0;
159 static int use_cbprd = 0;
161 static int closed_gop = 0;
162 static int do_deinterlace = 0;
163 static int do_interlace_dct = 0;
164 static int do_interlace_me = 0;
165 static int workaround_bugs = FF_BUG_AUTODETECT;
166 static int error_resilience = 2;
167 static int error_concealment = 3;
168 static int dct_algo = 0;
169 static int idct_algo = 0;
170 static int use_part = 0;
171 static int packet_size = 0;
172 static int error_rate = 0;
173 static int strict = 0;
174 static int top_field_first = -1;
175 static int noise_reduction = 0;
176 static int sc_threshold = 0;
177 static int debug = 0;
178 static int debug_mv = 0;
179 static int me_threshold = 0;
180 static int mb_threshold = 0;
181 static int intra_dc_precision = 8;
182 static int coder = 0;
183 static int context = 0;
184 static int predictor = 0;
185 static int video_profile = FF_PROFILE_UNKNOWN;
186 static int video_level = FF_LEVEL_UNKNOWN;
187 extern int loop_input; /* currently a hack */
189 static int gop_size = 12;
190 static int intra_only = 0;
191 static int audio_sample_rate = 44100;
192 static int audio_bit_rate = 64000;
193 static int audio_disable = 0;
194 static int audio_channels = 1;
195 static int audio_codec_id = CODEC_ID_NONE;
197 static int64_t recording_time = 0;
198 static int64_t start_time = 0;
199 static int64_t rec_timestamp = 0;
200 static int64_t input_ts_offset = 0;
201 static int file_overwrite = 0;
202 static char *str_title = NULL;
203 static char *str_author = NULL;
204 static char *str_copyright = NULL;
205 static char *str_comment = NULL;
206 static int do_benchmark = 0;
207 static int do_hex_dump = 0;
208 static int do_pkt_dump = 0;
209 static int do_psnr = 0;
210 static int do_vstats = 0;
211 static int do_pass = 0;
212 static int bitexact = 0;
213 static char *pass_logfilename = NULL;
214 static int audio_stream_copy = 0;
215 static int video_stream_copy = 0;
216 static int video_sync_method= 1;
217 static int audio_sync_method= 0;
218 static int copy_ts= 0;
220 static int rate_emu = 0;
222 static char *video_grab_format = "video4linux";
223 static char *video_device = NULL;
224 static int video_channel = 0;
225 static char *video_standard = "ntsc";
227 static char *audio_grab_format = "audio_device";
228 static char *audio_device = NULL;
230 static int using_stdin = 0;
231 static int using_vhook = 0;
232 static int verbose = 1;
233 static int thread_count= 1;
234 static int q_pressed = 0;
235 static int me_range = 0;
236 static int64_t video_size = 0;
237 static int64_t audio_size = 0;
238 static int64_t extra_size = 0;
239 static int nb_frames_dup = 0;
240 static int nb_frames_drop = 0;
241 static int input_sync;
243 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
245 typedef struct AVOutputStream {
246 int file_index; /* file index */
247 int index; /* stream index in the output file */
248 int source_index; /* AVInputStream index */
249 AVStream *st; /* stream in the output file */
250 int encoding_needed; /* true if encoding needed for this stream */
252 /* input pts and corresponding output pts
254 double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
255 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
257 int video_resample; /* video_resample and video_crop are mutually exclusive */
258 AVFrame pict_tmp; /* temporary image for resampling */
259 ImgReSampleContext *img_resample_ctx; /* for image resampling */
261 int video_crop; /* video_resample and video_crop are mutually exclusive */
262 int topBand; /* cropping area sizes */
265 int video_pad; /* video_resample and video_pad are mutually exclusive */
266 int padtop; /* padding area sizes */
273 ReSampleContext *resample; /* for audio resampling */
274 FifoBuffer fifo; /* for compression: one audio fifo per codec */
278 typedef struct AVInputStream {
282 int discard; /* true if stream data should be discarded */
283 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
284 int64_t sample_index; /* current sample */
286 int64_t start; /* time when read started */
287 unsigned long frame; /* current frame */
288 int64_t next_pts; /* synthetic pts for cases where pkt.pts
290 int64_t pts; /* current pts */
291 int is_start; /* is 1 at the start and after a discontinuity */
294 typedef struct AVInputFile {
295 int eof_reached; /* true if eof reached */
296 int ist_index; /* index of first stream in ist_table */
297 int buffer_size; /* current total buffer size */
298 int buffer_size_max; /* buffer size at which we consider we can stop
300 int nb_streams; /* nb streams we are aware of */
305 /* init terminal so that we can grab keys */
306 static struct termios oldtty;
308 static void term_exit(void)
310 tcsetattr (0, TCSANOW, &oldtty);
313 static volatile sig_atomic_t received_sigterm = 0;
316 sigterm_handler(int sig)
318 received_sigterm = sig;
322 static void term_init(void)
329 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
330 |INLCR|IGNCR|ICRNL|IXON);
331 tty.c_oflag |= OPOST;
332 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
333 tty.c_cflag &= ~(CSIZE|PARENB);
338 tcsetattr (0, TCSANOW, &tty);
340 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
341 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
342 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
344 register a function to be called at normal program termination
347 #ifdef CONFIG_BEOS_NETSERVER
348 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
352 /* read a key without blocking */
353 static int read_key(void)
357 #ifndef CONFIG_BEOS_NETSERVER
365 n = select(1, &rfds, NULL, NULL, &tv);
377 static int decode_interrupt_cb(void)
379 return q_pressed || (q_pressed = read_key() == 'q');
384 static volatile int received_sigterm = 0;
386 /* no interactive support */
387 static void term_exit(void)
391 static void term_init(void)
395 static int read_key(void)
402 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
407 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
410 /* copy stream format */
411 s->nb_streams = ic->nb_streams;
412 for(i=0;i<ic->nb_streams;i++) {
415 st = av_mallocz(sizeof(AVStream));
416 memcpy(st, ic->streams[i], sizeof(AVStream));
420 av_close_input_file(ic);
424 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
426 static void do_audio_out(AVFormatContext *s,
429 unsigned char *buf, int size)
432 static uint8_t *audio_buf = NULL;
433 static uint8_t *audio_out = NULL;
434 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
436 int size_out, frame_bytes, ret;
437 AVCodecContext *enc= &ost->st->codec;
439 /* SC: dynamic allocation of buffers */
441 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
443 audio_out = av_malloc(audio_out_size);
444 if (!audio_buf || !audio_out)
445 return; /* Should signal an error ! */
447 if(audio_sync_method){
448 double delta = ost->sync_ipts * enc->sample_rate - ost->sync_opts
449 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2);
450 double idelta= delta*ist->st->codec.sample_rate / enc->sample_rate;
451 int byte_delta= ((int)idelta)*2*ist->st->codec.channels;
453 //FIXME resample delay
454 if(fabs(delta) > 50){
457 byte_delta= FFMAX(byte_delta, -size);
461 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
466 static uint8_t *input_tmp= NULL;
467 input_tmp= av_realloc(input_tmp, byte_delta + size);
469 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
472 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
474 memset(input_tmp, 0, byte_delta);
475 memcpy(input_tmp + byte_delta, buf, size);
479 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
481 }else if(audio_sync_method>1){
482 int comp= clip(delta, -audio_sync_method, audio_sync_method);
483 assert(ost->audio_resample);
485 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
486 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));
487 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
491 ost->sync_opts= lrintf(ost->sync_ipts * enc->sample_rate)
492 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec.channels * 2); //FIXME wrong
494 if (ost->audio_resample) {
496 size_out = audio_resample(ost->resample,
497 (short *)buftmp, (short *)buf,
498 size / (ist->st->codec.channels * 2));
499 size_out = size_out * enc->channels * 2;
505 /* now encode as many frames as possible */
506 if (enc->frame_size > 1) {
507 /* output resampled raw samples */
508 fifo_write(&ost->fifo, buftmp, size_out,
511 frame_bytes = enc->frame_size * 2 * enc->channels;
513 while (fifo_read(&ost->fifo, audio_buf, frame_bytes,
514 &ost->fifo.rptr) == 0) {
516 av_init_packet(&pkt);
518 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
521 pkt.stream_index= ost->index;
525 pkt.pts= enc->coded_frame->pts;
526 pkt.flags |= PKT_FLAG_KEY;
527 av_interleaved_write_frame(s, &pkt);
529 ost->sync_opts += enc->frame_size;
533 av_init_packet(&pkt);
535 ost->sync_opts += size_out / (2 * enc->channels);
537 /* output a pcm frame */
538 /* XXX: change encoding codec API to avoid this ? */
539 switch(enc->codec->id) {
540 case CODEC_ID_PCM_S16LE:
541 case CODEC_ID_PCM_S16BE:
542 case CODEC_ID_PCM_U16LE:
543 case CODEC_ID_PCM_U16BE:
546 size_out = size_out >> 1;
549 ret = avcodec_encode_audio(enc, audio_out, size_out,
552 pkt.stream_index= ost->index;
556 pkt.pts= enc->coded_frame->pts;
557 pkt.flags |= PKT_FLAG_KEY;
558 av_interleaved_write_frame(s, &pkt);
562 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
566 AVPicture picture_tmp;
569 dec = &ist->st->codec;
571 /* deinterlace : must be done before any resize */
572 if (do_deinterlace || using_vhook) {
575 /* create temporary picture */
576 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
577 buf = av_malloc(size);
581 picture2 = &picture_tmp;
582 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
585 if(avpicture_deinterlace(picture2, picture,
586 dec->pix_fmt, dec->width, dec->height) < 0) {
587 /* if error, do not deinterlace */
593 if (img_convert(picture2, dec->pix_fmt, picture,
594 dec->pix_fmt, dec->width, dec->height) < 0) {
595 /* if error, do not copy */
605 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
607 if (picture != picture2)
608 *picture = *picture2;
612 /* we begin to correct av delay at this threshold */
613 #define AV_DELAY_MAX 0.100
616 /* Expects img to be yuv420 */
617 static void fill_pad_region(AVPicture* img, int height, int width,
618 int padtop, int padbottom, int padleft, int padright, int *color) {
623 for (i = 0; i < 3; i++) {
624 shift = (i == 0) ? 0 : 1;
626 if (padtop || padleft) {
627 memset(img->data[i], color[i], (((img->linesize[i] * padtop) +
631 if (padleft || padright) {
632 optr = img->data[i] + (img->linesize[i] * (padtop >> shift)) +
633 (img->linesize[i] - (padright >> shift));
635 for (y = 0; y < ((height - (padtop + padbottom)) >> shift); y++) {
636 memset(optr, color[i], (padleft + padright) >> shift);
637 optr += img->linesize[i];
642 optr = img->data[i] + (img->linesize[i] * ((height - padbottom) >> shift));
643 memset(optr, color[i], ((img->linesize[i] * padbottom) >> shift));
648 static uint8_t *bit_buffer= NULL;
650 static void do_video_out(AVFormatContext *s,
656 int nb_frames, i, ret;
657 AVFrame *final_picture, *formatted_picture;
658 AVFrame picture_format_temp, picture_crop_temp;
659 uint8_t *buf = NULL, *buf1 = NULL;
660 AVCodecContext *enc, *dec;
661 enum PixelFormat target_pixfmt;
663 #define VIDEO_BUFFER_SIZE (1024*1024)
665 avcodec_get_frame_defaults(&picture_format_temp);
666 avcodec_get_frame_defaults(&picture_crop_temp);
668 enc = &ost->st->codec;
669 dec = &ist->st->codec;
671 /* by default, we output a single frame */
676 if(video_sync_method){
678 vdelta = ost->sync_ipts * enc->frame_rate / enc->frame_rate_base - ost->sync_opts;
679 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
682 else if (vdelta > 1.1)
683 nb_frames = lrintf(vdelta - 1.1 + 0.5);
684 //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);
688 fprintf(stderr, "*** drop!\n");
689 }else if (nb_frames > 1) {
690 nb_frames_dup += nb_frames;
692 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
695 ost->sync_opts= lrintf(ost->sync_ipts * enc->frame_rate / enc->frame_rate_base);
700 /* convert pixel format if needed */
701 target_pixfmt = ost->video_resample || ost->video_pad
702 ? PIX_FMT_YUV420P : enc->pix_fmt;
703 if (dec->pix_fmt != target_pixfmt) {
706 /* create temporary picture */
707 size = avpicture_get_size(target_pixfmt, dec->width, dec->height);
708 buf = av_malloc(size);
711 formatted_picture = &picture_format_temp;
712 avpicture_fill((AVPicture*)formatted_picture, buf, target_pixfmt, dec->width, dec->height);
714 if (img_convert((AVPicture*)formatted_picture, target_pixfmt,
715 (AVPicture *)in_picture, dec->pix_fmt,
716 dec->width, dec->height) < 0) {
719 fprintf(stderr, "pixel format conversion not handled\n");
724 formatted_picture = in_picture;
727 /* XXX: resampling could be done before raw format conversion in
728 some cases to go faster */
729 /* XXX: only works for YUV420P */
730 if (ost->video_resample) {
731 final_picture = &ost->pict_tmp;
732 img_resample(ost->img_resample_ctx, (AVPicture*)final_picture, (AVPicture*)formatted_picture);
734 if (ost->padtop || ost->padbottom || ost->padleft || ost->padright) {
735 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
736 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
740 if (enc->pix_fmt != PIX_FMT_YUV420P) {
744 /* create temporary picture */
745 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
746 buf = av_malloc(size);
749 final_picture = &picture_format_temp;
750 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
752 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
753 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
754 enc->width, enc->height) < 0) {
757 fprintf(stderr, "pixel format conversion not handled\n");
762 } else if (ost->video_crop) {
763 picture_crop_temp.data[0] = formatted_picture->data[0] +
764 (ost->topBand * formatted_picture->linesize[0]) + ost->leftBand;
766 picture_crop_temp.data[1] = formatted_picture->data[1] +
767 ((ost->topBand >> 1) * formatted_picture->linesize[1]) +
768 (ost->leftBand >> 1);
770 picture_crop_temp.data[2] = formatted_picture->data[2] +
771 ((ost->topBand >> 1) * formatted_picture->linesize[2]) +
772 (ost->leftBand >> 1);
774 picture_crop_temp.linesize[0] = formatted_picture->linesize[0];
775 picture_crop_temp.linesize[1] = formatted_picture->linesize[1];
776 picture_crop_temp.linesize[2] = formatted_picture->linesize[2];
777 final_picture = &picture_crop_temp;
778 } else if (ost->video_pad) {
779 final_picture = &ost->pict_tmp;
781 for (i = 0; i < 3; i++) {
782 uint8_t *optr, *iptr;
783 int shift = (i == 0) ? 0 : 1;
786 /* set offset to start writing image into */
787 optr = final_picture->data[i] + (((final_picture->linesize[i] *
788 ost->padtop) + ost->padleft) >> shift);
789 iptr = formatted_picture->data[i];
791 yheight = (enc->height - ost->padtop - ost->padbottom) >> shift;
792 for (y = 0; y < yheight; y++) {
793 /* copy unpadded image row into padded image row */
794 memcpy(optr, iptr, formatted_picture->linesize[i]);
795 optr += final_picture->linesize[i];
796 iptr += formatted_picture->linesize[i];
800 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
801 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
804 if (enc->pix_fmt != PIX_FMT_YUV420P) {
808 /* create temporary picture */
809 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
810 buf = av_malloc(size);
813 final_picture = &picture_format_temp;
814 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
816 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
817 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
818 enc->width, enc->height) < 0) {
821 fprintf(stderr, "pixel format conversion not handled\n");
827 final_picture = formatted_picture;
829 /* duplicates frame if needed */
830 for(i=0;i<nb_frames;i++) {
832 av_init_packet(&pkt);
833 pkt.stream_index= ost->index;
835 if (s->oformat->flags & AVFMT_RAWPICTURE) {
836 /* raw pictures are written as AVPicture structure to
837 avoid any copies. We support temorarily the older
839 AVFrame* old_frame = enc->coded_frame;
840 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
841 pkt.data= (uint8_t *)final_picture;
842 pkt.size= sizeof(AVPicture);
844 pkt.pts= dec->coded_frame->pts;
845 if(dec->coded_frame && dec->coded_frame->key_frame)
846 pkt.flags |= PKT_FLAG_KEY;
848 av_interleaved_write_frame(s, &pkt);
849 enc->coded_frame = old_frame;
853 big_picture= *final_picture;
854 /* better than nothing: use input picture interlaced
856 big_picture.interlaced_frame = in_picture->interlaced_frame;
857 if(do_interlace_me || do_interlace_dct){
858 if(top_field_first == -1)
859 big_picture.top_field_first = in_picture->top_field_first;
861 big_picture.top_field_first = top_field_first;
864 /* handles sameq here. This is not correct because it may
865 not be a global option */
867 big_picture.quality = ist->st->quality;
869 big_picture.quality = ost->st->quality;
871 big_picture.pict_type = 0;
872 // big_picture.pts = AV_NOPTS_VALUE;
873 big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->frame_rate_base, enc->frame_rate);
874 //av_log(NULL, AV_LOG_DEBUG, "%lld -> encoder\n", ost->sync_opts);
875 ret = avcodec_encode_video(enc,
876 bit_buffer, VIDEO_BUFFER_SIZE,
878 //enc->frame_number = enc->real_pict_num;
880 pkt.data= bit_buffer;
883 pkt.pts= enc->coded_frame->pts;
884 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %lld/%lld\n",
885 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1,
886 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->frame_rate, AV_TIME_BASE*(int64_t)enc->frame_rate_base) : -1);*/
888 if(enc->coded_frame && enc->coded_frame->key_frame)
889 pkt.flags |= PKT_FLAG_KEY;
890 av_interleaved_write_frame(s, &pkt);
892 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
893 // enc->frame_number-1, enc->real_pict_num, ret,
895 /* if two pass, output log */
896 if (ost->logfile && enc->stats_out) {
897 fprintf(ost->logfile, "%s", enc->stats_out);
909 static double psnr(double d){
910 if(d==0) return INFINITY;
911 return -10.0*log(d)/log(10.0);
914 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
917 static FILE *fvstats=NULL;
924 double ti1, bitrate, avg_bitrate;
928 today = localtime(&today2);
929 sprintf(filename, "vstats_%02d%02d%02d.log", today->tm_hour,
932 fvstats = fopen(filename,"w");
940 enc = &ost->st->codec;
941 if (enc->codec_type == CODEC_TYPE_VIDEO) {
942 frame_number = ost->frame_number;
943 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
944 if (enc->flags&CODEC_FLAG_PSNR)
945 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
947 fprintf(fvstats,"f_size= %6d ", frame_size);
948 /* compute pts value */
949 ti1 = (double)ost->sync_opts *enc->frame_rate_base / enc->frame_rate;
953 bitrate = (double)(frame_size * 8) * enc->frame_rate / enc->frame_rate_base / 1000.0;
954 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
955 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
956 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
957 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
961 static void print_report(AVFormatContext **output_files,
962 AVOutputStream **ost_table, int nb_ostreams,
967 AVFormatContext *oc, *os;
970 int frame_number, vid, i;
971 double bitrate, ti1, pts;
972 static int64_t last_time = -1;
974 if (!is_last_report) {
976 /* display the report every 0.5 seconds */
977 cur_time = av_gettime();
978 if (last_time == -1) {
979 last_time = cur_time;
982 if ((cur_time - last_time) < 500000)
984 last_time = cur_time;
988 oc = output_files[0];
990 total_size = url_ftell(&oc->pb);
995 for(i=0;i<nb_ostreams;i++) {
997 os = output_files[ost->file_index];
998 enc = &ost->st->codec;
999 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1000 sprintf(buf + strlen(buf), "q=%2.1f ",
1001 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1003 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1004 frame_number = ost->frame_number;
1005 sprintf(buf + strlen(buf), "frame=%5d q=%2.1f ",
1006 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : 0);
1008 sprintf(buf + strlen(buf), "L");
1009 if (enc->flags&CODEC_FLAG_PSNR){
1011 double error, error_sum=0;
1012 double scale, scale_sum=0;
1013 char type[3]= {'Y','U','V'};
1014 sprintf(buf + strlen(buf), "PSNR=");
1017 error= enc->error[j];
1018 scale= enc->width*enc->height*255.0*255.0*frame_number;
1020 error= enc->coded_frame->error[j];
1021 scale= enc->width*enc->height*255.0*255.0;
1026 sprintf(buf + strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1028 sprintf(buf + strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1032 /* compute min output value */
1033 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1034 if ((pts < ti1) && (pts > 0))
1040 if (verbose || is_last_report) {
1041 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1043 sprintf(buf + strlen(buf),
1044 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
1045 (double)total_size / 1024, ti1, bitrate);
1048 sprintf(buf + strlen(buf), " dup=%d drop=%d",
1049 nb_frames_dup, nb_frames_drop);
1052 fprintf(stderr, "%s \r", buf);
1057 if (is_last_report && verbose >= 0){
1058 int64_t raw= audio_size + video_size + extra_size;
1059 fprintf(stderr, "\n");
1060 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1064 100.0*(total_size - raw)/raw
1069 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1070 static int output_packet(AVInputStream *ist, int ist_index,
1071 AVOutputStream **ost_table, int nb_ostreams,
1072 const AVPacket *pkt)
1074 AVFormatContext *os;
1075 AVOutputStream *ost;
1079 int data_size, got_picture;
1081 void *buffer_to_free;
1083 if (pkt && pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1084 ist->next_pts = ist->pts = pkt->dts;
1086 assert(ist->pts == ist->next_pts);
1100 /* decode the packet if needed */
1101 data_buf = NULL; /* fail safe */
1103 if (ist->decoding_needed) {
1104 switch(ist->st->codec.codec_type) {
1105 case CODEC_TYPE_AUDIO:{
1106 /* XXX: could avoid copy if PCM 16 bits with same
1107 endianness as CPU */
1108 short samples[pkt && pkt->size > AVCODEC_MAX_AUDIO_FRAME_SIZE/2 ? pkt->size : AVCODEC_MAX_AUDIO_FRAME_SIZE/2];
1109 ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size,
1115 /* Some bug in mpeg audio decoder gives */
1116 /* data_size < 0, it seems they are overflows */
1117 if (data_size <= 0) {
1118 /* no audio frame */
1121 data_buf = (uint8_t *)samples;
1122 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1123 (ist->st->codec.sample_rate * ist->st->codec.channels);
1125 case CODEC_TYPE_VIDEO:
1126 data_size = (ist->st->codec.width * ist->st->codec.height * 3) / 2;
1127 /* XXX: allocate picture correctly */
1128 avcodec_get_frame_defaults(&picture);
1130 ret = avcodec_decode_video(&ist->st->codec,
1131 &picture, &got_picture, ptr, len);
1132 ist->st->quality= picture.quality;
1136 /* no picture yet */
1137 goto discard_packet;
1139 if (ist->st->codec.frame_rate_base != 0) {
1140 ist->next_pts += ((int64_t)AV_TIME_BASE *
1141 ist->st->codec.frame_rate_base) /
1142 ist->st->codec.frame_rate;
1156 buffer_to_free = NULL;
1157 if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO) {
1158 pre_process_video_frame(ist, (AVPicture *)&picture,
1162 /* frame rate emulation */
1163 if (ist->st->codec.rate_emu) {
1164 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec.frame_rate_base, 1000000, ist->st->codec.frame_rate);
1165 int64_t now = av_gettime() - ist->start;
1173 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1174 is the one of the next displayed one */
1175 /* XXX: add mpeg4 too ? */
1176 if (ist->st->codec.codec_id == CODEC_ID_MPEG1VIDEO) {
1177 if (ist->st->codec.pict_type != B_TYPE) {
1179 tmp = ist->last_ip_pts;
1180 ist->last_ip_pts = ist->frac_pts.val;
1181 ist->frac_pts.val = tmp;
1185 /* if output time reached then transcode raw format,
1186 encode packets and output them */
1187 if (start_time == 0 || ist->pts >= start_time)
1188 for(i=0;i<nb_ostreams;i++) {
1192 if (ost->source_index == ist_index) {
1193 os = output_files[ost->file_index];
1196 printf("%d: got pts=%0.3f %0.3f\n", i,
1197 (double)pkt->pts / AV_TIME_BASE,
1198 ((double)ist->pts / AV_TIME_BASE) -
1199 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1201 /* set the input output pts pairs */
1202 ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index])/ AV_TIME_BASE;
1204 if (ost->encoding_needed) {
1205 switch(ost->st->codec.codec_type) {
1206 case CODEC_TYPE_AUDIO:
1207 do_audio_out(os, ost, ist, data_buf, data_size);
1209 case CODEC_TYPE_VIDEO:
1210 /* find an audio stream for synchro */
1213 AVOutputStream *audio_sync, *ost1;
1215 for(i=0;i<nb_ostreams;i++) {
1216 ost1 = ost_table[i];
1217 if (ost1->file_index == ost->file_index &&
1218 ost1->st->codec.codec_type == CODEC_TYPE_AUDIO) {
1224 do_video_out(os, ost, ist, &picture, &frame_size);
1225 video_size += frame_size;
1226 if (do_vstats && frame_size)
1227 do_video_stats(os, ost, frame_size);
1234 AVFrame avframe; //FIXME/XXX remove this
1236 av_init_packet(&opkt);
1238 /* no reencoding needed : output the packet directly */
1239 /* force the input stream PTS */
1241 avcodec_get_frame_defaults(&avframe);
1242 ost->st->codec.coded_frame= &avframe;
1243 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1245 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO)
1246 audio_size += data_size;
1247 else if (ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1248 video_size += data_size;
1250 opkt.stream_index= ost->index;
1251 opkt.data= data_buf;
1252 opkt.size= data_size;
1253 opkt.pts= pkt->pts + input_files_ts_offset[ist->file_index];
1254 opkt.dts= pkt->dts + input_files_ts_offset[ist->file_index];
1255 opkt.flags= pkt->flags;
1257 av_interleaved_write_frame(os, &opkt);
1258 ost->st->codec.frame_number++;
1259 ost->frame_number++;
1263 av_free(buffer_to_free);
1269 for(i=0;i<nb_ostreams;i++) {
1271 if (ost->source_index == ist_index) {
1272 AVCodecContext *enc= &ost->st->codec;
1273 os = output_files[ost->file_index];
1275 if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1277 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1280 if (ost->encoding_needed) {
1283 av_init_packet(&pkt);
1284 pkt.stream_index= ost->index;
1286 switch(ost->st->codec.codec_type) {
1287 case CODEC_TYPE_AUDIO:
1288 ret = avcodec_encode_audio(enc, bit_buffer, VIDEO_BUFFER_SIZE, NULL);
1290 pkt.flags |= PKT_FLAG_KEY;
1292 case CODEC_TYPE_VIDEO:
1293 ret = avcodec_encode_video(enc, bit_buffer, VIDEO_BUFFER_SIZE, NULL);
1295 if(enc->coded_frame && enc->coded_frame->key_frame)
1296 pkt.flags |= PKT_FLAG_KEY;
1297 if (ost->logfile && enc->stats_out) {
1298 fprintf(ost->logfile, "%s", enc->stats_out);
1307 pkt.data= bit_buffer;
1309 if(enc->coded_frame)
1310 pkt.pts= enc->coded_frame->pts;
1311 av_interleaved_write_frame(os, &pkt);
1325 * The following code is the main loop of the file converter
1327 static int av_encode(AVFormatContext **output_files,
1328 int nb_output_files,
1329 AVFormatContext **input_files,
1331 AVStreamMap *stream_maps, int nb_stream_maps)
1333 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1334 AVFormatContext *is, *os;
1335 AVCodecContext *codec, *icodec;
1336 AVOutputStream *ost, **ost_table = NULL;
1337 AVInputStream *ist, **ist_table = NULL;
1338 AVInputFile *file_table;
1339 AVFormatContext *stream_no_data;
1342 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1347 bit_buffer = av_malloc(VIDEO_BUFFER_SIZE);
1351 /* input stream init */
1353 for(i=0;i<nb_input_files;i++) {
1354 is = input_files[i];
1355 file_table[i].ist_index = j;
1356 file_table[i].nb_streams = is->nb_streams;
1357 j += is->nb_streams;
1361 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1365 for(i=0;i<nb_istreams;i++) {
1366 ist = av_mallocz(sizeof(AVInputStream));
1372 for(i=0;i<nb_input_files;i++) {
1373 is = input_files[i];
1374 for(k=0;k<is->nb_streams;k++) {
1375 ist = ist_table[j++];
1376 ist->st = is->streams[k];
1377 ist->file_index = i;
1379 ist->discard = 1; /* the stream is discarded by default
1382 if (ist->st->codec.rate_emu) {
1383 ist->start = av_gettime();
1389 /* output stream init */
1391 for(i=0;i<nb_output_files;i++) {
1392 os = output_files[i];
1393 nb_ostreams += os->nb_streams;
1395 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1396 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1400 /* Sanity check the mapping args -- do the input files & streams exist? */
1401 for(i=0;i<nb_stream_maps;i++) {
1402 int fi = stream_maps[i].file_index;
1403 int si = stream_maps[i].stream_index;
1405 if (fi < 0 || fi > nb_input_files - 1 ||
1406 si < 0 || si > file_table[fi].nb_streams - 1) {
1407 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1412 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1415 for(i=0;i<nb_ostreams;i++) {
1416 ost = av_mallocz(sizeof(AVOutputStream));
1423 for(k=0;k<nb_output_files;k++) {
1424 os = output_files[k];
1425 for(i=0;i<os->nb_streams;i++) {
1427 ost = ost_table[n++];
1428 ost->file_index = k;
1430 ost->st = os->streams[i];
1431 if (nb_stream_maps > 0) {
1432 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1433 stream_maps[n-1].stream_index;
1435 /* Sanity check that the stream types match */
1436 if (ist_table[ost->source_index]->st->codec.codec_type != ost->st->codec.codec_type) {
1437 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1438 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1439 ost->file_index, ost->index);
1444 /* get corresponding input stream index : we select the first one with the right type */
1446 for(j=0;j<nb_istreams;j++) {
1449 ist->st->codec.codec_type == ost->st->codec.codec_type) {
1450 ost->source_index = j;
1456 /* try again and reuse existing stream */
1457 for(j=0;j<nb_istreams;j++) {
1459 if (ist->st->codec.codec_type == ost->st->codec.codec_type) {
1460 ost->source_index = j;
1465 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1466 ost->file_index, ost->index);
1471 ist = ist_table[ost->source_index];
1476 /* for each output stream, we compute the right encoding parameters */
1477 for(i=0;i<nb_ostreams;i++) {
1479 ist = ist_table[ost->source_index];
1481 codec = &ost->st->codec;
1482 icodec = &ist->st->codec;
1484 if (ost->st->stream_copy) {
1485 /* if stream_copy is selected, no need to decode or encode */
1486 codec->codec_id = icodec->codec_id;
1487 codec->codec_type = icodec->codec_type;
1488 codec->codec_tag = icodec->codec_tag;
1489 codec->bit_rate = icodec->bit_rate;
1490 switch(codec->codec_type) {
1491 case CODEC_TYPE_AUDIO:
1492 codec->sample_rate = icodec->sample_rate;
1493 codec->channels = icodec->channels;
1494 codec->frame_size = icodec->frame_size;
1496 case CODEC_TYPE_VIDEO:
1497 codec->frame_rate = icodec->frame_rate;
1498 codec->frame_rate_base = icodec->frame_rate_base;
1499 codec->width = icodec->width;
1500 codec->height = icodec->height;
1506 switch(codec->codec_type) {
1507 case CODEC_TYPE_AUDIO:
1508 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1511 if (codec->channels == icodec->channels &&
1512 codec->sample_rate == icodec->sample_rate) {
1513 ost->audio_resample = 0;
1515 if (codec->channels != icodec->channels &&
1516 (icodec->codec_id == CODEC_ID_AC3 ||
1517 icodec->codec_id == CODEC_ID_DTS)) {
1518 /* Special case for 5:1 AC3 and DTS input */
1519 /* and mono or stereo output */
1520 /* Request specific number of channels */
1521 icodec->channels = codec->channels;
1522 if (codec->sample_rate == icodec->sample_rate)
1523 ost->audio_resample = 0;
1525 ost->audio_resample = 1;
1528 ost->audio_resample = 1;
1531 if(audio_sync_method>1)
1532 ost->audio_resample = 1;
1534 if(ost->audio_resample){
1535 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1536 codec->sample_rate, icodec->sample_rate);
1538 printf("Can't resample. Aborting.\n");
1542 ist->decoding_needed = 1;
1543 ost->encoding_needed = 1;
1545 case CODEC_TYPE_VIDEO:
1546 if (codec->width == icodec->width &&
1547 codec->height == icodec->height &&
1548 frame_topBand == 0 &&
1549 frame_bottomBand == 0 &&
1550 frame_leftBand == 0 &&
1551 frame_rightBand == 0 &&
1552 frame_padtop == 0 &&
1553 frame_padbottom == 0 &&
1554 frame_padleft == 0 &&
1555 frame_padright == 0)
1557 ost->video_resample = 0;
1558 ost->video_crop = 0;
1560 } else if ((codec->width == icodec->width -
1561 (frame_leftBand + frame_rightBand)) &&
1562 (codec->height == icodec->height -
1563 (frame_topBand + frame_bottomBand)))
1565 ost->video_resample = 0;
1566 ost->video_crop = 1;
1567 ost->topBand = frame_topBand;
1568 ost->leftBand = frame_leftBand;
1569 } else if ((codec->width == icodec->width +
1570 (frame_padleft + frame_padright)) &&
1571 (codec->height == icodec->height +
1572 (frame_padtop + frame_padbottom))) {
1573 ost->video_resample = 0;
1574 ost->video_crop = 0;
1576 ost->padtop = frame_padtop;
1577 ost->padleft = frame_padleft;
1578 ost->padbottom = frame_padbottom;
1579 ost->padright = frame_padright;
1580 avcodec_get_frame_defaults(&ost->pict_tmp);
1581 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1582 codec->width, codec->height ) )
1585 ost->video_resample = 1;
1586 ost->video_crop = 0; // cropping is handled as part of resample
1587 avcodec_get_frame_defaults(&ost->pict_tmp);
1588 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1589 codec->width, codec->height ) )
1592 ost->img_resample_ctx = img_resample_full_init(
1593 ost->st->codec.width, ost->st->codec.height,
1594 ist->st->codec.width, ist->st->codec.height,
1595 frame_topBand, frame_bottomBand,
1596 frame_leftBand, frame_rightBand,
1597 frame_padtop, frame_padbottom,
1598 frame_padleft, frame_padright);
1600 ost->padtop = frame_padtop;
1601 ost->padleft = frame_padleft;
1602 ost->padbottom = frame_padbottom;
1603 ost->padright = frame_padright;
1606 ost->encoding_needed = 1;
1607 ist->decoding_needed = 1;
1613 if (ost->encoding_needed &&
1614 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1615 char logfilename[1024];
1620 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1622 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1623 if (codec->flags & CODEC_FLAG_PASS1) {
1624 f = fopen(logfilename, "w");
1626 perror(logfilename);
1631 /* read the log file */
1632 f = fopen(logfilename, "r");
1634 perror(logfilename);
1637 fseek(f, 0, SEEK_END);
1639 fseek(f, 0, SEEK_SET);
1640 logbuffer = av_malloc(size + 1);
1642 fprintf(stderr, "Could not allocate log buffer\n");
1645 size = fread(logbuffer, 1, size, f);
1647 logbuffer[size] = '\0';
1648 codec->stats_in = logbuffer;
1654 /* dump the file output parameters - cannot be done before in case
1656 for(i=0;i<nb_output_files;i++) {
1657 dump_format(output_files[i], i, output_files[i]->filename, 1);
1660 /* dump the stream mapping */
1662 fprintf(stderr, "Stream mapping:\n");
1663 for(i=0;i<nb_ostreams;i++) {
1665 fprintf(stderr, " Stream #%d.%d -> #%d.%d\n",
1666 ist_table[ost->source_index]->file_index,
1667 ist_table[ost->source_index]->index,
1673 /* open each encoder */
1674 for(i=0;i<nb_ostreams;i++) {
1676 if (ost->encoding_needed) {
1678 codec = avcodec_find_encoder(ost->st->codec.codec_id);
1680 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1681 ost->file_index, ost->index);
1684 if (avcodec_open(&ost->st->codec, codec) < 0) {
1685 fprintf(stderr, "Error while opening codec for stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1686 ost->file_index, ost->index);
1689 extra_size += ost->st->codec.extradata_size;
1693 /* open each decoder */
1694 for(i=0;i<nb_istreams;i++) {
1696 if (ist->decoding_needed) {
1698 codec = avcodec_find_decoder(ist->st->codec.codec_id);
1700 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1701 ist->st->codec.codec_id, ist->file_index, ist->index);
1704 if (avcodec_open(&ist->st->codec, codec) < 0) {
1705 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1706 ist->file_index, ist->index);
1709 //if (ist->st->codec.codec_type == CODEC_TYPE_VIDEO)
1710 // ist->st->codec.flags |= CODEC_FLAG_REPEAT_FIELD;
1715 for(i=0;i<nb_istreams;i++) {
1717 is = input_files[ist->file_index];
1723 /* compute buffer size max (should use a complete heuristic) */
1724 for(i=0;i<nb_input_files;i++) {
1725 file_table[i].buffer_size_max = 2048;
1728 /* set meta data information from input file if required */
1729 for (i=0;i<nb_meta_data_maps;i++) {
1730 AVFormatContext *out_file;
1731 AVFormatContext *in_file;
1733 int out_file_index = meta_data_maps[i].out_file;
1734 int in_file_index = meta_data_maps[i].in_file;
1735 if ( out_file_index < 0 || out_file_index >= nb_output_files ) {
1736 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1740 if ( in_file_index < 0 || in_file_index >= nb_input_files ) {
1741 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1746 out_file = output_files[out_file_index];
1747 in_file = input_files[in_file_index];
1749 strcpy(out_file->title, in_file->title);
1750 strcpy(out_file->author, in_file->author);
1751 strcpy(out_file->copyright, in_file->copyright);
1752 strcpy(out_file->comment, in_file->comment);
1753 strcpy(out_file->album, in_file->album);
1754 out_file->year = in_file->year;
1755 out_file->track = in_file->track;
1756 strcpy(out_file->genre, in_file->genre);
1759 /* open files and write file headers */
1760 for(i=0;i<nb_output_files;i++) {
1761 os = output_files[i];
1762 if (av_write_header(os) < 0) {
1763 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1769 #ifndef CONFIG_WIN32
1770 if ( !using_stdin && verbose >= 0) {
1771 fprintf(stderr, "Press [q] to stop encoding\n");
1772 url_set_interrupt_cb(decode_interrupt_cb);
1780 for(; received_sigterm == 0;) {
1781 int file_index, ist_index;
1789 /* if 'q' pressed, exits */
1793 /* read_key() returns 0 on EOF */
1799 /* select the stream that we must read now by looking at the
1800 smallest output pts */
1802 for(i=0;i<nb_ostreams;i++) {
1805 os = output_files[ost->file_index];
1806 ist = ist_table[ost->source_index];
1807 if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO)
1808 opts = (double)ost->sync_opts * ost->st->codec.frame_rate_base / ost->st->codec.frame_rate;
1810 opts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1811 ipts = (double)ist->pts;
1812 if (!file_table[ist->file_index].eof_reached){
1813 if(ipts < ipts_min) {
1815 if(input_sync ) file_index = ist->file_index;
1817 if(opts < opts_min) {
1819 if(!input_sync) file_index = ist->file_index;
1823 /* if none, if is finished */
1824 if (file_index < 0) {
1828 /* finish if recording time exhausted */
1829 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
1832 /* read a frame from it and output it in the fifo */
1833 is = input_files[file_index];
1834 if (av_read_frame(is, &pkt) < 0) {
1835 file_table[file_index].eof_reached = 1;
1840 stream_no_data = is;
1845 av_pkt_dump(stdout, &pkt, do_hex_dump);
1847 /* the following test is needed in case new streams appear
1848 dynamically in stream : we ignore them */
1849 if (pkt.stream_index >= file_table[file_index].nb_streams)
1850 goto discard_packet;
1851 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1852 ist = ist_table[ist_index];
1854 goto discard_packet;
1856 // 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);
1857 if (pkt.dts != AV_NOPTS_VALUE) {
1858 int64_t delta= pkt.dts - ist->next_pts;
1859 if(ABS(delta) > 10LL*AV_TIME_BASE && !copy_ts){
1860 input_files_ts_offset[ist->file_index]-= delta;
1862 fprintf(stderr, "timestamp discontinuity %lld, new offset= %lld\n", delta, input_files_ts_offset[ist->file_index]);
1863 for(i=0; i<file_table[file_index].nb_streams; i++){
1864 int index= file_table[file_index].ist_index + i;
1865 ist_table[index]->next_pts += delta;
1866 ist_table[index]->is_start=1;
1871 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1872 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1875 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1876 ist->file_index, ist->index);
1878 av_free_packet(&pkt);
1883 av_free_packet(&pkt);
1885 /* dump report by using the output first video and audio streams */
1886 print_report(output_files, ost_table, nb_ostreams, 0);
1889 /* at the end of stream, we must flush the decoder buffers */
1890 for(i=0;i<nb_istreams;i++) {
1892 if (ist->decoding_needed) {
1893 output_packet(ist, i, ost_table, nb_ostreams, NULL);
1899 /* write the trailer if needed and close file */
1900 for(i=0;i<nb_output_files;i++) {
1901 os = output_files[i];
1902 av_write_trailer(os);
1905 /* dump report by using the first video and audio streams */
1906 print_report(output_files, ost_table, nb_ostreams, 1);
1908 /* close each encoder */
1909 for(i=0;i<nb_ostreams;i++) {
1911 if (ost->encoding_needed) {
1912 av_freep(&ost->st->codec.stats_in);
1913 avcodec_close(&ost->st->codec);
1917 /* close each decoder */
1918 for(i=0;i<nb_istreams;i++) {
1920 if (ist->decoding_needed) {
1921 avcodec_close(&ist->st->codec);
1929 av_free(file_table);
1932 for(i=0;i<nb_istreams;i++) {
1939 for(i=0;i<nb_ostreams;i++) {
1943 fclose(ost->logfile);
1944 ost->logfile = NULL;
1946 fifo_free(&ost->fifo); /* works even if fifo is not
1947 initialized but set to zero */
1948 av_free(ost->pict_tmp.data[0]);
1949 if (ost->video_resample)
1950 img_resample_close(ost->img_resample_ctx);
1951 if (ost->audio_resample)
1952 audio_resample_close(ost->resample);
1965 int file_read(const char *filename)
1968 unsigned char buffer[1024];
1971 if (url_open(&h, filename, O_RDONLY) < 0) {
1972 printf("could not open '%s'\n", filename);
1976 len = url_read(h, buffer, sizeof(buffer));
1979 for(i=0;i<len;i++) putchar(buffer[i]);
1986 static void opt_image_format(const char *arg)
1990 for(f = first_image_format; f != NULL; f = f->next) {
1991 if (!strcmp(arg, f->name))
1995 fprintf(stderr, "Unknown image format: '%s'\n", arg);
2001 static void opt_format(const char *arg)
2003 /* compatibility stuff for pgmyuv */
2004 if (!strcmp(arg, "pgmyuv")) {
2005 opt_image_format(arg);
2009 file_iformat = av_find_input_format(arg);
2010 file_oformat = guess_format(arg, NULL, NULL);
2011 if (!file_iformat && !file_oformat) {
2012 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2017 static void opt_video_bitrate(const char *arg)
2019 video_bit_rate = atoi(arg) * 1000;
2022 static void opt_video_bitrate_tolerance(const char *arg)
2024 video_bit_rate_tolerance = atoi(arg) * 1000;
2027 static void opt_video_bitrate_max(const char *arg)
2029 video_rc_max_rate = atoi(arg) * 1000;
2032 static void opt_video_bitrate_min(const char *arg)
2034 video_rc_min_rate = atoi(arg) * 1000;
2037 static void opt_video_buffer_size(const char *arg)
2039 video_rc_buffer_size = atoi(arg) * 8*1024;
2042 static void opt_video_rc_eq(char *arg)
2047 static void opt_video_rc_override_string(char *arg)
2049 video_rc_override_string = arg;
2053 static void opt_workaround_bugs(const char *arg)
2055 workaround_bugs = atoi(arg);
2058 static void opt_dct_algo(const char *arg)
2060 dct_algo = atoi(arg);
2063 static void opt_idct_algo(const char *arg)
2065 idct_algo = atoi(arg);
2068 static void opt_me_threshold(const char *arg)
2070 me_threshold = atoi(arg);
2073 static void opt_mb_threshold(const char *arg)
2075 mb_threshold = atoi(arg);
2078 static void opt_error_resilience(const char *arg)
2080 error_resilience = atoi(arg);
2083 static void opt_error_concealment(const char *arg)
2085 error_concealment = atoi(arg);
2088 static void opt_debug(const char *arg)
2093 static void opt_vismv(const char *arg)
2095 debug_mv = atoi(arg);
2098 static void opt_verbose(const char *arg)
2100 verbose = atoi(arg);
2101 av_log_set_level(atoi(arg));
2104 static void opt_frame_rate(const char *arg)
2106 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
2107 fprintf(stderr, "Incorrect frame rate\n");
2112 static void opt_frame_crop_top(const char *arg)
2114 frame_topBand = atoi(arg);
2115 if (frame_topBand < 0) {
2116 fprintf(stderr, "Incorrect top crop size\n");
2119 if ((frame_topBand % 2) != 0) {
2120 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2123 if ((frame_topBand) >= frame_height){
2124 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2127 frame_height -= frame_topBand;
2130 static void opt_frame_crop_bottom(const char *arg)
2132 frame_bottomBand = atoi(arg);
2133 if (frame_bottomBand < 0) {
2134 fprintf(stderr, "Incorrect bottom crop size\n");
2137 if ((frame_bottomBand % 2) != 0) {
2138 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2141 if ((frame_bottomBand) >= frame_height){
2142 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2145 frame_height -= frame_bottomBand;
2148 static void opt_frame_crop_left(const char *arg)
2150 frame_leftBand = atoi(arg);
2151 if (frame_leftBand < 0) {
2152 fprintf(stderr, "Incorrect left crop size\n");
2155 if ((frame_leftBand % 2) != 0) {
2156 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2159 if ((frame_leftBand) >= frame_width){
2160 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2163 frame_width -= frame_leftBand;
2166 static void opt_frame_crop_right(const char *arg)
2168 frame_rightBand = atoi(arg);
2169 if (frame_rightBand < 0) {
2170 fprintf(stderr, "Incorrect right crop size\n");
2173 if ((frame_rightBand % 2) != 0) {
2174 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2177 if ((frame_rightBand) >= frame_width){
2178 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2181 frame_width -= frame_rightBand;
2184 static void opt_frame_size(const char *arg)
2186 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2187 fprintf(stderr, "Incorrect frame size\n");
2190 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2191 fprintf(stderr, "Frame size must be a multiple of 2\n");
2197 #define SCALEBITS 10
2198 #define ONE_HALF (1 << (SCALEBITS - 1))
2199 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2201 #define RGB_TO_Y(r, g, b) \
2202 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2203 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2205 #define RGB_TO_U(r1, g1, b1, shift)\
2206 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2207 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2209 #define RGB_TO_V(r1, g1, b1, shift)\
2210 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2211 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2213 static void opt_pad_color(const char *arg) {
2214 /* Input is expected to be six hex digits similar to
2215 how colors are expressed in html tags (but without the #) */
2216 int rgb = strtol(arg, NULL, 16);
2220 g = ((rgb >> 8) & 255);
2223 padcolor[0] = RGB_TO_Y(r,g,b);
2224 padcolor[1] = RGB_TO_U(r,g,b,0);
2225 padcolor[2] = RGB_TO_V(r,g,b,0);
2228 static void opt_frame_pad_top(const char *arg)
2230 frame_padtop = atoi(arg);
2231 if (frame_padtop < 0) {
2232 fprintf(stderr, "Incorrect top pad size\n");
2235 if ((frame_padtop % 2) != 0) {
2236 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2241 static void opt_frame_pad_bottom(const char *arg)
2243 frame_padbottom = atoi(arg);
2244 if (frame_padbottom < 0) {
2245 fprintf(stderr, "Incorrect bottom pad size\n");
2248 if ((frame_padbottom % 2) != 0) {
2249 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2255 static void opt_frame_pad_left(const char *arg)
2257 frame_padleft = atoi(arg);
2258 if (frame_padleft < 0) {
2259 fprintf(stderr, "Incorrect left pad size\n");
2262 if ((frame_padleft % 2) != 0) {
2263 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2269 static void opt_frame_pad_right(const char *arg)
2271 frame_padright = atoi(arg);
2272 if (frame_padright < 0) {
2273 fprintf(stderr, "Incorrect right pad size\n");
2276 if ((frame_padright % 2) != 0) {
2277 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2283 static void opt_frame_pix_fmt(const char *arg)
2285 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2288 static void opt_frame_aspect_ratio(const char *arg)
2294 p = strchr(arg, ':');
2296 x = strtol(arg, (char **)&arg, 10);
2298 y = strtol(arg+1, (char **)&arg, 10);
2300 ar = (double)x / (double)y;
2302 ar = strtod(arg, (char **)&arg);
2305 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2308 frame_aspect_ratio = ar;
2311 static void opt_gop_size(const char *arg)
2313 gop_size = atoi(arg);
2316 static void opt_b_frames(const char *arg)
2318 b_frames = atoi(arg);
2319 if (b_frames > FF_MAX_B_FRAMES) {
2320 fprintf(stderr, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES);
2322 } else if (b_frames < 1) {
2323 fprintf(stderr, "\nNumber of B frames must be higher than 0\n");
2328 static void opt_mb_decision(const char *arg)
2330 mb_decision = atoi(arg);
2333 static void opt_mb_cmp(const char *arg)
2338 static void opt_ildct_cmp(const char *arg)
2340 ildct_cmp = atoi(arg);
2343 static void opt_sub_cmp(const char *arg)
2345 sub_cmp = atoi(arg);
2348 static void opt_cmp(const char *arg)
2353 static void opt_pre_cmp(const char *arg)
2355 pre_cmp = atoi(arg);
2358 static void opt_pre_me(const char *arg)
2363 static void opt_lumi_mask(const char *arg)
2365 lumi_mask = atof(arg);
2368 static void opt_dark_mask(const char *arg)
2370 dark_mask = atof(arg);
2373 static void opt_scplx_mask(const char *arg)
2375 scplx_mask = atof(arg);
2378 static void opt_tcplx_mask(const char *arg)
2380 tcplx_mask = atof(arg);
2383 static void opt_p_mask(const char *arg)
2388 static void opt_qscale(const char *arg)
2390 video_qscale = atof(arg);
2391 if (video_qscale < 0.01 ||
2392 video_qscale > 255) {
2393 fprintf(stderr, "qscale must be >= 0.01 and <= 255\n");
2398 static void opt_lmax(const char *arg)
2400 video_lmax = atof(arg)*FF_QP2LAMBDA;
2403 static void opt_lmin(const char *arg)
2405 video_lmin = atof(arg)*FF_QP2LAMBDA;
2408 static void opt_qmin(const char *arg)
2410 video_qmin = atoi(arg);
2411 if (video_qmin < 0 ||
2413 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2418 static void opt_qmax(const char *arg)
2420 video_qmax = atoi(arg);
2421 if (video_qmax < 0 ||
2423 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2428 static void opt_mb_qmin(const char *arg)
2430 video_mb_qmin = atoi(arg);
2431 if (video_mb_qmin < 0 ||
2432 video_mb_qmin > 31) {
2433 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2438 static void opt_mb_qmax(const char *arg)
2440 video_mb_qmax = atoi(arg);
2441 if (video_mb_qmax < 0 ||
2442 video_mb_qmax > 31) {
2443 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2448 static void opt_qdiff(const char *arg)
2450 video_qdiff = atoi(arg);
2451 if (video_qdiff < 0 ||
2453 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2458 static void opt_qblur(const char *arg)
2460 video_qblur = atof(arg);
2463 static void opt_qcomp(const char *arg)
2465 video_qcomp = atof(arg);
2468 static void opt_rc_initial_cplx(const char *arg)
2470 video_rc_initial_cplx = atof(arg);
2472 static void opt_b_qfactor(const char *arg)
2474 video_b_qfactor = atof(arg);
2476 static void opt_i_qfactor(const char *arg)
2478 video_i_qfactor = atof(arg);
2480 static void opt_b_qoffset(const char *arg)
2482 video_b_qoffset = atof(arg);
2484 static void opt_i_qoffset(const char *arg)
2486 video_i_qoffset = atof(arg);
2489 static void opt_ibias(const char *arg)
2491 video_intra_quant_bias = atoi(arg);
2493 static void opt_pbias(const char *arg)
2495 video_inter_quant_bias = atoi(arg);
2498 static void opt_packet_size(const char *arg)
2500 packet_size= atoi(arg);
2503 static void opt_error_rate(const char *arg)
2505 error_rate= atoi(arg);
2508 static void opt_strict(const char *arg)
2513 static void opt_top_field_first(const char *arg)
2515 top_field_first= atoi(arg);
2518 static void opt_noise_reduction(const char *arg)
2520 noise_reduction= atoi(arg);
2523 static void opt_qns(const char *arg)
2528 static void opt_sc_threshold(const char *arg)
2530 sc_threshold= atoi(arg);
2533 static void opt_me_range(const char *arg)
2535 me_range = atoi(arg);
2538 static void opt_thread_count(const char *arg)
2540 thread_count= atoi(arg);
2541 #if !defined(HAVE_PTHREADS) && !defined(HAVE_W32THREADS)
2543 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2547 static void opt_audio_bitrate(const char *arg)
2549 audio_bit_rate = atoi(arg) * 1000;
2552 static void opt_audio_rate(const char *arg)
2554 audio_sample_rate = atoi(arg);
2557 static void opt_audio_channels(const char *arg)
2559 audio_channels = atoi(arg);
2562 static void opt_video_device(const char *arg)
2564 video_device = av_strdup(arg);
2567 static void opt_video_channel(const char *arg)
2569 video_channel = strtol(arg, NULL, 0);
2572 static void opt_video_standard(const char *arg)
2574 video_standard = av_strdup(arg);
2577 static void opt_audio_device(const char *arg)
2579 audio_device = av_strdup(arg);
2582 static void opt_dv1394(const char *arg)
2584 video_grab_format = "dv1394";
2585 audio_grab_format = NULL;
2588 static void opt_audio_codec(const char *arg)
2592 if (!strcmp(arg, "copy")) {
2593 audio_stream_copy = 1;
2597 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_AUDIO)
2602 fprintf(stderr, "Unknown audio codec '%s'\n", arg);
2605 audio_codec_id = p->id;
2610 static void add_frame_hooker(const char *arg)
2615 char *args = av_strdup(arg);
2619 argv[0] = strtok(args, " ");
2620 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2623 i = frame_hook_add(argc, argv);
2626 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2631 const char *motion_str[] = {
2641 static void opt_motion_estimation(const char *arg)
2647 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2650 if (!strcmp(*p, arg))
2654 me_method = (p - motion_str) + 1;
2657 static void opt_video_codec(const char *arg)
2661 if (!strcmp(arg, "copy")) {
2662 video_stream_copy = 1;
2666 if (!strcmp(p->name, arg) && p->type == CODEC_TYPE_VIDEO)
2671 fprintf(stderr, "Unknown video codec '%s'\n", arg);
2674 video_codec_id = p->id;
2679 static void opt_map(const char *arg)
2685 m = &stream_maps[nb_stream_maps++];
2687 m->file_index = strtol(arg, (char **)&p, 0);
2691 m->stream_index = strtol(p, (char **)&p, 0);
2694 static void opt_map_meta_data(const char *arg)
2700 m = &meta_data_maps[nb_meta_data_maps++];
2702 m->out_file = strtol(arg, (char **)&p, 0);
2706 m->in_file = strtol(p, (char **)&p, 0);
2709 static void opt_recording_time(const char *arg)
2711 recording_time = parse_date(arg, 1);
2714 static void opt_start_time(const char *arg)
2716 start_time = parse_date(arg, 1);
2719 static void opt_rec_timestamp(const char *arg)
2721 rec_timestamp = parse_date(arg, 0) / 1000000;
2724 static void opt_input_ts_offset(const char *arg)
2726 input_ts_offset = parse_date(arg, 1);
2729 static void opt_input_file(const char *filename)
2731 AVFormatContext *ic;
2732 AVFormatParameters params, *ap = ¶ms;
2733 int err, i, ret, rfps, rfps_base;
2735 if (!strcmp(filename, "-"))
2738 using_stdin |= !strcmp(filename, "pipe:" ) ||
2739 !strcmp( filename, "/dev/stdin" );
2741 /* get default parameters from command line */
2742 memset(ap, 0, sizeof(*ap));
2743 ap->sample_rate = audio_sample_rate;
2744 ap->channels = audio_channels;
2745 ap->frame_rate = frame_rate;
2746 ap->frame_rate_base = frame_rate_base;
2747 ap->width = frame_width + frame_padleft + frame_padright;
2748 ap->height = frame_height + frame_padtop + frame_padbottom;
2749 ap->image_format = image_format;
2750 ap->pix_fmt = frame_pix_fmt;
2752 /* open the input file with generic libav function */
2753 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2755 print_error(filename, err);
2759 /* If not enough info to get the stream parameters, we decode the
2760 first frames to get it. (used in mpeg case for example) */
2761 ret = av_find_stream_info(ic);
2762 if (ret < 0 && verbose >= 0) {
2763 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2767 /* if seeking requested, we execute it */
2768 if (start_time != 0) {
2771 timestamp = start_time;
2772 /* add the stream start time */
2773 if (ic->start_time != AV_NOPTS_VALUE)
2774 timestamp += ic->start_time;
2775 ret = av_seek_frame(ic, -1, timestamp);
2777 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2778 filename, (double)timestamp / AV_TIME_BASE);
2780 /* reset seek info */
2784 /* update the current parameters so that they match the one of the input stream */
2785 for(i=0;i<ic->nb_streams;i++) {
2786 AVCodecContext *enc = &ic->streams[i]->codec;
2787 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2789 avcodec_thread_init(enc, thread_count);
2791 enc->thread_count= thread_count;
2792 switch(enc->codec_type) {
2793 case CODEC_TYPE_AUDIO:
2794 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2795 audio_channels = enc->channels;
2796 audio_sample_rate = enc->sample_rate;
2798 case CODEC_TYPE_VIDEO:
2799 frame_height = enc->height;
2800 frame_width = enc->width;
2801 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2802 frame_pix_fmt = enc->pix_fmt;
2803 rfps = ic->streams[i]->r_frame_rate;
2804 rfps_base = ic->streams[i]->r_frame_rate_base;
2805 enc->workaround_bugs = workaround_bugs;
2806 enc->error_resilience = error_resilience;
2807 enc->error_concealment = error_concealment;
2808 enc->idct_algo = idct_algo;
2810 enc->debug_mv = debug_mv;
2812 enc->flags|= CODEC_FLAG_BITEXACT;
2814 enc->debug |= FF_DEBUG_MV;
2816 assert(enc->frame_rate_base == rfps_base); // should be true for now
2817 if (enc->frame_rate != rfps) {
2820 fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f->%2.2f\n",
2821 i, (float)enc->frame_rate / enc->frame_rate_base,
2823 (float)rfps / rfps_base);
2825 /* update the current frame rate to match the stream frame rate */
2827 frame_rate_base = rfps_base;
2829 enc->rate_emu = rate_emu;
2831 case CODEC_TYPE_DATA:
2838 input_files[nb_input_files] = ic;
2839 input_files_ts_offset[nb_input_files] = input_ts_offset;
2840 /* dump the file content */
2842 dump_format(ic, nb_input_files, filename, 0);
2845 file_iformat = NULL;
2846 file_oformat = NULL;
2847 image_format = NULL;
2852 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
2854 int has_video, has_audio, i, j;
2855 AVFormatContext *ic;
2859 for(j=0;j<nb_input_files;j++) {
2860 ic = input_files[j];
2861 for(i=0;i<ic->nb_streams;i++) {
2862 AVCodecContext *enc = &ic->streams[i]->codec;
2863 switch(enc->codec_type) {
2864 case CODEC_TYPE_AUDIO:
2867 case CODEC_TYPE_VIDEO:
2870 case CODEC_TYPE_DATA:
2877 *has_video_ptr = has_video;
2878 *has_audio_ptr = has_audio;
2881 static void opt_output_file(const char *filename)
2884 AVFormatContext *oc;
2885 int use_video, use_audio, nb_streams, input_has_video, input_has_audio;
2887 AVFormatParameters params, *ap = ¶ms;
2889 if (!strcmp(filename, "-"))
2892 oc = av_alloc_format_context();
2894 if (!file_oformat) {
2895 file_oformat = guess_format(NULL, filename, NULL);
2896 if (!file_oformat) {
2897 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
2903 oc->oformat = file_oformat;
2905 if (!strcmp(file_oformat->name, "ffm") &&
2906 strstart(filename, "http:", NULL)) {
2907 /* special case for files sent to ffserver: we get the stream
2908 parameters from ffserver */
2909 if (read_ffserver_streams(oc, filename) < 0) {
2910 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
2914 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy;
2915 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy;
2917 /* disable if no corresponding type found and at least one
2919 if (nb_input_files > 0) {
2920 check_audio_video_inputs(&input_has_video, &input_has_audio);
2921 if (!input_has_video)
2923 if (!input_has_audio)
2927 /* manual disable */
2928 if (audio_disable) {
2931 if (video_disable) {
2937 AVCodecContext *video_enc;
2939 st = av_new_stream(oc, nb_streams++);
2941 fprintf(stderr, "Could not alloc stream\n");
2944 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
2946 avcodec_thread_init(&st->codec, thread_count);
2949 video_enc = &st->codec;
2951 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
2952 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2953 if (video_stream_copy) {
2954 st->stream_copy = 1;
2955 video_enc->codec_type = CODEC_TYPE_VIDEO;
2961 codec_id = file_oformat->video_codec;
2962 if (video_codec_id != CODEC_ID_NONE)
2963 codec_id = video_codec_id;
2965 video_enc->codec_id = codec_id;
2966 codec = avcodec_find_encoder(codec_id);
2968 video_enc->bit_rate = video_bit_rate;
2969 video_enc->bit_rate_tolerance = video_bit_rate_tolerance;
2970 video_enc->frame_rate = frame_rate;
2971 video_enc->frame_rate_base = frame_rate_base;
2972 if(codec && codec->supported_framerates){
2973 const AVRational *p= codec->supported_framerates;
2974 AVRational req= (AVRational){frame_rate, frame_rate_base};
2975 const AVRational *best=NULL;
2976 AVRational best_error= (AVRational){INT_MAX, 1};
2977 for(; p->den!=0; p++){
2978 AVRational error= av_sub_q(req, *p);
2979 if(error.num <0) error.num *= -1;
2980 if(av_cmp_q(error, best_error) < 0){
2985 video_enc->frame_rate = best->num;
2986 video_enc->frame_rate_base= best->den;
2989 video_enc->width = frame_width + frame_padright + frame_padleft;
2990 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2991 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
2992 video_enc->pix_fmt = frame_pix_fmt;
2994 if(codec && codec->pix_fmts){
2995 const enum PixelFormat *p= codec->pix_fmts;
2997 if(*p == video_enc->pix_fmt)
3001 video_enc->pix_fmt = codec->pix_fmts[0];
3005 video_enc->gop_size = gop_size;
3007 video_enc->gop_size = 0;
3008 if (video_qscale || same_quality) {
3009 video_enc->flags |= CODEC_FLAG_QSCALE;
3010 st->quality = FF_QP2LAMBDA * video_qscale;
3014 video_enc->intra_matrix = intra_matrix;
3016 video_enc->inter_matrix = inter_matrix;
3019 video_enc->flags |= CODEC_FLAG_BITEXACT;
3021 video_enc->mb_decision = mb_decision;
3022 video_enc->mb_cmp = mb_cmp;
3023 video_enc->ildct_cmp = ildct_cmp;
3024 video_enc->me_sub_cmp = sub_cmp;
3025 video_enc->me_cmp = cmp;
3026 video_enc->me_pre_cmp = pre_cmp;
3027 video_enc->pre_me = pre_me;
3028 video_enc->lumi_masking = lumi_mask;
3029 video_enc->dark_masking = dark_mask;
3030 video_enc->spatial_cplx_masking = scplx_mask;
3031 video_enc->temporal_cplx_masking = tcplx_mask;
3032 video_enc->p_masking = p_mask;
3033 video_enc->quantizer_noise_shaping= qns;
3036 video_enc->flags |= CODEC_FLAG_H263P_UMV;
3039 video_enc->flags |= CODEC_FLAG_H263P_SLICE_STRUCT;
3042 video_enc->flags |= CODEC_FLAG_H263P_AIC;
3045 video_enc->flags |= CODEC_FLAG_H263P_AIV;
3048 video_enc->flags |= CODEC_FLAG_4MV;
3051 video_enc->flags |= CODEC_FLAG_OBMC;
3054 video_enc->flags |= CODEC_FLAG_LOOP_FILTER;
3058 video_enc->flags |= CODEC_FLAG_PART;
3061 video_enc->flags |= CODEC_FLAG_ALT_SCAN;
3064 video_enc->flags |= CODEC_FLAG_TRELLIS_QUANT;
3066 if (use_scan_offset) {
3067 video_enc->flags |= CODEC_FLAG_SVCD_SCAN_OFFSET;
3070 video_enc->flags |= CODEC_FLAG_CLOSED_GOP;
3073 video_enc->flags |= CODEC_FLAG_QPEL;
3076 video_enc->flags |= CODEC_FLAG_QP_RD;
3079 video_enc->flags |= CODEC_FLAG_CBP_RD;
3082 video_enc->max_b_frames = b_frames;
3083 video_enc->b_frame_strategy = 0;
3084 video_enc->b_quant_factor = 2.0;
3086 if (do_interlace_dct) {
3087 video_enc->flags |= CODEC_FLAG_INTERLACED_DCT;
3089 if (do_interlace_me) {
3090 video_enc->flags |= CODEC_FLAG_INTERLACED_ME;
3092 video_enc->qmin = video_qmin;
3093 video_enc->qmax = video_qmax;
3094 video_enc->lmin = video_lmin;
3095 video_enc->lmax = video_lmax;
3096 video_enc->mb_qmin = video_mb_qmin;
3097 video_enc->mb_qmax = video_mb_qmax;
3098 video_enc->max_qdiff = video_qdiff;
3099 video_enc->qblur = video_qblur;
3100 video_enc->qcompress = video_qcomp;
3101 video_enc->rc_eq = video_rc_eq;
3102 video_enc->debug = debug;
3103 video_enc->debug_mv = debug_mv;
3104 video_enc->thread_count = thread_count;
3105 p= video_rc_override_string;
3108 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3110 fprintf(stderr, "error parsing rc_override\n");
3113 video_enc->rc_override=
3114 av_realloc(video_enc->rc_override,
3115 sizeof(RcOverride)*(i+1));
3116 video_enc->rc_override[i].start_frame= start;
3117 video_enc->rc_override[i].end_frame = end;
3119 video_enc->rc_override[i].qscale= q;
3120 video_enc->rc_override[i].quality_factor= 1.0;
3123 video_enc->rc_override[i].qscale= 0;
3124 video_enc->rc_override[i].quality_factor= -q/100.0;
3129 video_enc->rc_override_count=i;
3131 video_enc->rc_max_rate = video_rc_max_rate;
3132 video_enc->rc_min_rate = video_rc_min_rate;
3133 video_enc->rc_buffer_size = video_rc_buffer_size;
3134 video_enc->rc_buffer_aggressivity= video_rc_buffer_aggressivity;
3135 video_enc->rc_initial_cplx= video_rc_initial_cplx;
3136 video_enc->i_quant_factor = video_i_qfactor;
3137 video_enc->b_quant_factor = video_b_qfactor;
3138 video_enc->i_quant_offset = video_i_qoffset;
3139 video_enc->b_quant_offset = video_b_qoffset;
3140 video_enc->intra_quant_bias = video_intra_quant_bias;
3141 video_enc->inter_quant_bias = video_inter_quant_bias;
3142 video_enc->dct_algo = dct_algo;
3143 video_enc->idct_algo = idct_algo;
3144 video_enc->me_threshold= me_threshold;
3145 video_enc->mb_threshold= mb_threshold;
3146 video_enc->intra_dc_precision= intra_dc_precision - 8;
3147 video_enc->strict_std_compliance = strict;
3148 video_enc->error_rate = error_rate;
3149 video_enc->noise_reduction= noise_reduction;
3150 video_enc->scenechange_threshold= sc_threshold;
3151 video_enc->me_range = me_range;
3152 video_enc->coder_type= coder;
3153 video_enc->context_model= context;
3154 video_enc->prediction_method= predictor;
3155 video_enc->profile= video_profile;
3156 video_enc->level= video_level;
3159 video_enc->rtp_mode= 1;
3160 video_enc->rtp_payload_size= packet_size;
3164 video_enc->flags|= CODEC_FLAG_PSNR;
3166 video_enc->me_method = me_method;
3171 video_enc->flags |= CODEC_FLAG_PASS1;
3173 video_enc->flags |= CODEC_FLAG_PASS2;
3180 AVCodecContext *audio_enc;
3182 st = av_new_stream(oc, nb_streams++);
3184 fprintf(stderr, "Could not alloc stream\n");
3187 #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
3189 avcodec_thread_init(&st->codec, thread_count);
3192 audio_enc = &st->codec;
3193 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3195 if(!strcmp(file_oformat->name, "mp4") || !strcmp(file_oformat->name, "mov") || !strcmp(file_oformat->name, "3gp"))
3196 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3197 if (audio_stream_copy) {
3198 st->stream_copy = 1;
3199 audio_enc->channels = audio_channels;
3201 codec_id = file_oformat->audio_codec;
3202 if (audio_codec_id != CODEC_ID_NONE)
3203 codec_id = audio_codec_id;
3204 audio_enc->codec_id = codec_id;
3206 audio_enc->bit_rate = audio_bit_rate;
3207 audio_enc->strict_std_compliance = strict;
3208 audio_enc->thread_count = thread_count;
3209 /* For audio codecs other than AC3 or DTS we limit */
3210 /* the number of coded channels to stereo */
3211 if (audio_channels > 2 && codec_id != CODEC_ID_AC3
3212 && codec_id != CODEC_ID_DTS) {
3213 audio_enc->channels = 2;
3215 audio_enc->channels = audio_channels;
3217 audio_enc->sample_rate = audio_sample_rate;
3220 oc->nb_streams = nb_streams;
3223 fprintf(stderr, "No audio or video streams available\n");
3227 oc->timestamp = rec_timestamp;
3230 pstrcpy(oc->title, sizeof(oc->title), str_title);
3232 pstrcpy(oc->author, sizeof(oc->author), str_author);
3234 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3236 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3239 output_files[nb_output_files++] = oc;
3241 strcpy(oc->filename, filename);
3243 /* check filename in case of an image number is expected */
3244 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3245 if (filename_number_test(oc->filename) < 0) {
3246 print_error(oc->filename, AVERROR_NUMEXPECTED);
3251 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3252 /* test if it already exists to avoid loosing precious files */
3253 if (!file_overwrite &&
3254 (strchr(filename, ':') == NULL ||
3255 strstart(filename, "file:", NULL))) {
3256 if (url_exist(filename)) {
3259 if ( !using_stdin ) {
3260 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3263 if (toupper(c) != 'Y') {
3264 fprintf(stderr, "Not overwriting - exiting\n");
3269 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3276 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3277 fprintf(stderr, "Could not open '%s'\n", filename);
3282 memset(ap, 0, sizeof(*ap));
3283 ap->image_format = image_format;
3284 if (av_set_parameters(oc, ap) < 0) {
3285 fprintf(stderr, "%s: Invalid encoding parameters\n",
3290 /* reset some options */
3291 file_oformat = NULL;
3292 file_iformat = NULL;
3293 image_format = NULL;
3296 audio_codec_id = CODEC_ID_NONE;
3297 video_codec_id = CODEC_ID_NONE;
3298 audio_stream_copy = 0;
3299 video_stream_copy = 0;
3302 /* prepare dummy protocols for grab */
3303 static void prepare_grab(void)
3305 int has_video, has_audio, i, j;
3306 AVFormatContext *oc;
3307 AVFormatContext *ic;
3308 AVFormatParameters vp1, *vp = &vp1;
3309 AVFormatParameters ap1, *ap = &ap1;
3311 /* see if audio/video inputs are needed */
3314 memset(ap, 0, sizeof(*ap));
3315 memset(vp, 0, sizeof(*vp));
3316 for(j=0;j<nb_output_files;j++) {
3317 oc = output_files[j];
3318 for(i=0;i<oc->nb_streams;i++) {
3319 AVCodecContext *enc = &oc->streams[i]->codec;
3320 switch(enc->codec_type) {
3321 case CODEC_TYPE_AUDIO:
3322 if (enc->sample_rate > ap->sample_rate)
3323 ap->sample_rate = enc->sample_rate;
3324 if (enc->channels > ap->channels)
3325 ap->channels = enc->channels;
3328 case CODEC_TYPE_VIDEO:
3329 if (enc->width > vp->width)
3330 vp->width = enc->width;
3331 if (enc->height > vp->height)
3332 vp->height = enc->height;
3334 assert(enc->frame_rate_base == DEFAULT_FRAME_RATE_BASE);
3335 if (enc->frame_rate > vp->frame_rate){
3336 vp->frame_rate = enc->frame_rate;
3337 vp->frame_rate_base = enc->frame_rate_base;
3347 if (has_video == 0 && has_audio == 0) {
3348 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3353 AVInputFormat *fmt1;
3354 fmt1 = av_find_input_format(video_grab_format);
3355 vp->device = video_device;
3356 vp->channel = video_channel;
3357 vp->standard = video_standard;
3358 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3359 fprintf(stderr, "Could not find video grab device\n");
3362 /* If not enough info to get the stream parameters, we decode the
3363 first frames to get it. */
3364 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3365 fprintf(stderr, "Could not find video grab parameters\n");
3368 /* by now video grab has one stream */
3369 ic->streams[0]->r_frame_rate = vp->frame_rate;
3370 ic->streams[0]->r_frame_rate_base = vp->frame_rate_base;
3371 input_files[nb_input_files] = ic;
3374 dump_format(ic, nb_input_files, "", 0);
3378 if (has_audio && audio_grab_format) {
3379 AVInputFormat *fmt1;
3380 fmt1 = av_find_input_format(audio_grab_format);
3381 ap->device = audio_device;
3382 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3383 fprintf(stderr, "Could not find audio grab device\n");
3386 input_files[nb_input_files] = ic;
3389 dump_format(ic, nb_input_files, "", 0);
3395 /* same option as mencoder */
3396 static void opt_pass(const char *pass_str)
3399 pass = atoi(pass_str);
3400 if (pass != 1 && pass != 2) {
3401 fprintf(stderr, "pass number can be only 1 or 2\n");
3407 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3408 static int64_t getutime(void)
3410 return av_gettime();
3413 static int64_t getutime(void)
3415 struct rusage rusage;
3417 getrusage(RUSAGE_SELF, &rusage);
3418 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3422 extern int ffm_nopts;
3424 static void opt_bitexact(void)
3427 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3431 static void show_formats(void)
3433 AVInputFormat *ifmt;
3434 AVOutputFormat *ofmt;
3435 AVImageFormat *image_fmt;
3438 const char **pp, *last_name;
3440 printf("File formats:\n");
3445 const char *name=NULL;
3447 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3448 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3449 strcmp(ofmt->name, last_name)>0){
3454 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3455 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3456 strcmp(ifmt->name, last_name)>0){
3460 if(name && strcmp(ifmt->name, name)==0)
3475 printf("Image formats:\n");
3476 for(image_fmt = first_image_format; image_fmt != NULL;
3477 image_fmt = image_fmt->next) {
3480 image_fmt->img_read ? "D":" ",
3481 image_fmt->img_write ? "E":" ",
3486 printf("Codecs:\n");
3494 for(p = first_avcodec; p != NULL; p = p->next) {
3495 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3496 strcmp(p->name, last_name)>0){
3498 decode= encode= cap=0;
3500 if(p2 && strcmp(p->name, p2->name)==0){
3501 if(p->decode) decode=1;
3502 if(p->encode) encode=1;
3503 cap |= p->capabilities;
3508 last_name= p2->name;
3512 decode ? "D": (/*p2->decoder ? "d":*/" "),
3514 p2->type == CODEC_TYPE_AUDIO ? "A":"V",
3515 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3516 cap & CODEC_CAP_DR1 ? "D":" ",
3517 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3519 /* if(p2->decoder && decode==0)
3520 printf(" use %s for decoding", p2->decoder->name);*/
3525 printf("Supported file protocols:\n");
3526 for(up = first_protocol; up != NULL; up = up->next)
3527 printf(" %s:", up->name);
3530 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3531 printf("Motion estimation methods:\n");
3535 if ((pp - motion_str + 1) == ME_ZERO)
3536 printf("(fastest)");
3537 else if ((pp - motion_str + 1) == ME_FULL)
3538 printf("(slowest)");
3539 else if ((pp - motion_str + 1) == ME_EPZS)
3540 printf("(default)");
3545 "Note, the names of encoders and decoders dont always match, so there are\n"
3546 "several cases where the above table shows encoder only or decoder only entries\n"
3547 "even though both encoding and decoding are supported for example, the h263\n"
3548 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3553 void parse_matrix_coeffs(uint16_t *dest, const char *str)
3556 const char *p = str;
3563 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3570 void opt_inter_matrix(const char *arg)
3572 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3573 parse_matrix_coeffs(inter_matrix, arg);
3576 void opt_intra_matrix(const char *arg)
3578 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3579 parse_matrix_coeffs(intra_matrix, arg);
3582 static void opt_target(const char *arg)
3586 if(!strncmp(arg, "pal-", 4)) {
3589 } else if(!strncmp(arg, "ntsc-", 5)) {
3594 /* Calculate FR via float to avoid int overflow */
3595 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3598 } else if((fr == 29970) || (fr == 23976)) {
3601 /* Try to determine PAL/NTSC by peeking in the input files */
3602 if(nb_input_files) {
3604 for(j = 0; j < nb_input_files; j++) {
3605 for(i = 0; i < input_files[j]->nb_streams; i++) {
3606 AVCodecContext *c = &input_files[j]->streams[i]->codec;
3607 if(c->codec_type != CODEC_TYPE_VIDEO)
3609 fr = c->frame_rate * 1000 / c->frame_rate_base;
3613 } else if((fr == 29970) || (fr == 23976)) {
3623 if(verbose && norm >= 0)
3624 printf("Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3628 fprintf(stderr, "Could not determine norm (PAL/NTSC) for target.\n");
3629 fprintf(stderr, "Please prefix target with \"pal-\" or \"ntsc-\",\n");
3630 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3634 if(!strcmp(arg, "vcd")) {
3636 opt_video_codec("mpeg1video");
3637 opt_audio_codec("mp2");
3640 opt_frame_size(norm ? "352x240" : "352x288");
3642 video_bit_rate = 1150000;
3643 video_rc_max_rate = 1150000;
3644 video_rc_min_rate = 1150000;
3645 video_rc_buffer_size = 40*1024*8;
3647 audio_bit_rate = 224000;
3648 audio_sample_rate = 44100;
3650 } else if(!strcmp(arg, "svcd")) {
3652 opt_video_codec("mpeg2video");
3653 opt_audio_codec("mp2");
3656 opt_frame_size(norm ? "480x480" : "480x576");
3657 opt_gop_size(norm ? "18" : "15");
3659 video_bit_rate = 2040000;
3660 video_rc_max_rate = 2516000;
3661 video_rc_min_rate = 0; //1145000;
3662 video_rc_buffer_size = 224*1024*8;
3663 use_scan_offset = 1;
3665 audio_bit_rate = 224000;
3666 audio_sample_rate = 44100;
3668 } else if(!strcmp(arg, "dvd")) {
3670 opt_video_codec("mpeg2video");
3671 opt_audio_codec("ac3");
3674 opt_frame_size(norm ? "720x480" : "720x576");
3675 opt_gop_size(norm ? "18" : "15");
3677 video_bit_rate = 6000000;
3678 video_rc_max_rate = 9000000;
3679 video_rc_min_rate = 0; //1500000;
3680 video_rc_buffer_size = 224*1024*8;
3682 audio_bit_rate = 448000;
3683 audio_sample_rate = 48000;
3686 fprintf(stderr, "Unknown target: %s\n", arg);
3691 static void show_version(void)
3693 printf("ffmpeg " FFMPEG_VERSION "\n"
3696 avcodec_build(), LIBAVFORMAT_BUILD);
3700 const OptionDef options[] = {
3702 { "L", 0, {(void*)show_license}, "show license" },
3703 { "h", 0, {(void*)show_help}, "show help" },
3704 { "version", 0, {(void*)show_version}, "show version" },
3705 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3706 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3707 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
3708 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3709 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3710 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream" },
3711 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3712 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3713 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3714 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3715 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3716 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3717 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3718 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3719 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3720 { "debug", HAS_ARG | OPT_EXPERT, {(void*)opt_debug}, "print specific debug info", "" },
3721 { "vismv", HAS_ARG | OPT_EXPERT, {(void*)opt_vismv}, "visualize motion vectors", "" },
3722 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3723 "add timings for benchmarking" },
3724 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3725 "dump each input packet" },
3726 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3727 "when dumping packets, also dump the payload" },
3728 { "bitexact", OPT_EXPERT, {(void*)opt_bitexact}, "only use bit exact algorithms (for codec testing)" },
3729 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3730 { "loop", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3731 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3732 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\" or \"dvd\")", "type" },
3733 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3734 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3735 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3736 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3739 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
3740 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3741 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3742 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3743 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3744 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3745 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3746 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3747 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3748 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3749 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3750 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3751 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3752 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3753 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
3754 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3755 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3756 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
3757 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
3758 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
3759 { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
3760 { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
3761 { "mbqmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmin}, "min macroblock quantiser scale (VBR)", "q" },
3762 { "mbqmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmax}, "max macroblock quantiser scale (VBR)", "q" },
3763 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
3764 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
3765 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
3766 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
3767 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
3768 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
3769 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
3770 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
3771 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
3772 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
3773 // { "b_strategy", HAS_ARG | OPT_EXPERT, {(void*)opt_b_strategy}, "dynamic b frame selection strategy", "strategy" },
3774 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3775 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3776 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
3777 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
3778 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
3779 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffer size (in kByte)", "size" },
3780 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3781 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
3783 { "dct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dct_algo}, "set dct algo", "algo" },
3784 { "idct_algo", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_idct_algo}, "set idct algo", "algo" },
3785 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
3786 { "mb_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_threshold}, "macroblock threshold", "" },
3787 { "er", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_resilience}, "set error resilience", "n" },
3788 { "ec", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_error_concealment}, "set error concealment", "bit_mask" },
3789 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
3790 { "hq", OPT_BOOL, {(void*)&mb_decision}, "activate high quality settings" },
3791 { "mbd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_decision}, "macroblock decision", "mode" },
3792 { "mbcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_cmp}, "macroblock compare function", "cmp function" },
3793 { "ildctcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ildct_cmp}, "ildct compare function", "cmp function" },
3794 { "subcmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sub_cmp}, "subpel compare function", "cmp function" },
3795 { "cmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_cmp}, "fullpel compare function", "cmp function" },
3796 { "precmp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_cmp}, "pre motion estimation compare function", "cmp function" },
3797 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
3798 { "lumi_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lumi_mask}, "luminance masking", "" },
3799 { "dark_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_dark_mask}, "darkness masking", "" },
3800 { "scplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_scplx_mask}, "spatial complexity masking", "" },
3801 { "tcplx_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_tcplx_mask}, "temporal complexity masking", "" },
3802 { "p_mask", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_p_mask}, "inter masking", "" },
3803 { "4mv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_4mv}, "use four motion vector by macroblock (MPEG4)" },
3804 { "obmc", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_obmc}, "use overlapped block motion compensation (h263+)" },
3805 { "lf", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_loop}, "use loop filter (h263+)" },
3806 { "part", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_part}, "use data partitioning (MPEG4)" },
3807 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
3808 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
3809 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
3810 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3811 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3812 "use same video quality as source (implies VBR)" },
3813 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3814 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3815 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3816 "deinterlace pictures" },
3817 { "ildct", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_dct},
3818 "force interlaced dct support in encoder (MPEG2/MPEG4)" },
3819 { "ilme", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_interlace_me},
3820 "force interlaced me support in encoder (MPEG2/MPEG4)" },
3821 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3822 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
3823 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3824 { "aic", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aic}, "enable Advanced intra coding (h263+)" },
3825 { "aiv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_aiv}, "enable Alternative inter vlc (h263+)" },
3826 { "umv", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_umv}, "enable Unlimited Motion Vector (h263+)" },
3827 { "ssm", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_ss}, "enable Slice Structured mode (h263+)" },
3828 { "alt", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_alt_scan}, "enable alternate scantable (MPEG2/MPEG4)" },
3829 { "qprd", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qprd}, "" },
3830 { "cbp", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_cbprd}, "" },
3831 { "trell", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_trell}, "enable trellis quantization" },
3832 { "cgop", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&closed_gop}, "closed gop" },
3833 { "scan_offset", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_scan_offset}, "enable SVCD Scan Offset placeholder" },
3834 { "qpel", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&use_qpel}, "enable 1/4-pel" },
3835 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3836 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3837 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3838 { "nr", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_noise_reduction}, "noise reduction", "" },
3839 { "qns", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qns}, "quantization noise shaping", "" },
3840 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
3841 { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
3842 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3843 { "coder", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&coder}, "coder type", "" },
3844 { "context", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&context}, "context model", "" },
3845 { "pred", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&predictor}, "prediction method", "" },
3846 { "vprofile", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_profile}, "profile", "" },
3847 { "vlevel", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_level}, "level", "" },
3850 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
3851 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3852 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3853 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3854 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3857 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
3858 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3859 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3860 { "dv1394", OPT_EXPERT | OPT_GRAB, {(void*)opt_dv1394}, "set DV1394 grab", "" },
3861 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
3865 static void show_banner(void)
3867 printf("ffmpeg version " FFMPEG_VERSION ", build %d, Copyright (c) 2000-2004 Fabrice Bellard\n",
3869 printf(" built on " __DATE__ " " __TIME__);
3871 printf(", gcc: %s\n", __VERSION__);
3873 printf(", using a non-gcc compiler\n");
3877 static void show_license(void)
3882 "This program is free software; you can redistribute it and/or modify\n"
3883 "it under the terms of the GNU General Public License as published by\n"
3884 "the Free Software Foundation; either version 2 of the License, or\n"
3885 "(at your option) any later version.\n"
3887 "This program is distributed in the hope that it will be useful,\n"
3888 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3889 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
3890 "GNU General Public License for more details.\n"
3892 "You should have received a copy of the GNU General Public License\n"
3893 "along with this program; if not, write to the Free Software\n"
3894 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3898 "This library is free software; you can redistribute it and/or\n"
3899 "modify it under the terms of the GNU Lesser General Public\n"
3900 "License as published by the Free Software Foundation; either\n"
3901 "version 2 of the License, or (at your option) any later version.\n"
3903 "This library is distributed in the hope that it will be useful,\n"
3904 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3905 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
3906 "Lesser General Public License for more details.\n"
3908 "You should have received a copy of the GNU Lesser General Public\n"
3909 "License along with this library; if not, write to the Free Software\n"
3910 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
3916 static void show_help(void)
3919 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3920 "Hyper fast Audio and Video encoder\n");
3922 show_help_options(options, "Main options:\n",
3923 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
3924 show_help_options(options, "\nVideo options:\n",
3925 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3927 show_help_options(options, "\nAdvanced Video options:\n",
3928 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3929 OPT_VIDEO | OPT_EXPERT);
3930 show_help_options(options, "\nAudio options:\n",
3931 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3933 show_help_options(options, "\nAdvanced Audio options:\n",
3934 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3935 OPT_AUDIO | OPT_EXPERT);
3936 show_help_options(options, "\nAudio/Video grab options:\n",
3939 show_help_options(options, "\nAdvanced options:\n",
3940 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3945 void parse_arg_file(const char *filename)
3947 opt_output_file(filename);
3950 int main(int argc, char **argv)
3963 parse_options(argc, argv, options);
3965 /* file converter / grab */
3966 if (nb_output_files <= 0) {
3967 fprintf(stderr, "Must supply at least one output file\n");
3971 if (nb_input_files == 0) {
3977 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3978 stream_maps, nb_stream_maps);
3979 ti = getutime() - ti;
3981 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3985 for(i=0;i<nb_output_files;i++) {
3986 /* maybe av_close_output_file ??? */
3987 AVFormatContext *s = output_files[i];
3989 if (!(s->oformat->flags & AVFMT_NOFILE))
3991 for(j=0;j<s->nb_streams;j++)
3992 av_free(s->streams[j]);
3995 for(i=0;i<nb_input_files;i++)
3996 av_close_input_file(input_files[i]);
4001 av_free(intra_matrix);
4003 av_free(inter_matrix);
4005 #ifdef POWERPC_PERFORMANCE_REPORT
4006 extern void powerpc_display_perf_report(void);
4007 powerpc_display_perf_report();
4008 #endif /* POWERPC_PERFORMANCE_REPORT */
4010 #ifndef CONFIG_WIN32
4011 if (received_sigterm) {
4013 "Received signal %d: terminating.\n",
4014 (int) received_sigterm);
4018 exit(0); /* not all OS-es handle main() return value */