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"
29 #include <sys/ioctl.h>
32 #include <sys/resource.h>
36 #include <sys/types.h>
37 #include <sys/select.h>
40 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
48 #if !defined(INFINITY) && defined(HUGE_VAL)
49 #define INFINITY HUGE_VAL
52 /* select an input stream for an output stream */
53 typedef struct AVStreamMap {
57 int sync_stream_index;
60 /** select an input file for an output file */
61 typedef struct AVMetaDataMap {
66 extern const OptionDef options[];
68 static void show_help(void);
69 static void show_license(void);
70 static int opt_default(const char *opt, const char *arg);
74 static AVFormatContext *input_files[MAX_FILES];
75 static int64_t input_files_ts_offset[MAX_FILES];
76 static int nb_input_files = 0;
78 static AVFormatContext *output_files[MAX_FILES];
79 static int nb_output_files = 0;
81 static AVStreamMap stream_maps[MAX_FILES];
82 static int nb_stream_maps;
84 static AVMetaDataMap meta_data_maps[MAX_FILES];
85 static int nb_meta_data_maps;
87 static AVInputFormat *file_iformat;
88 static AVOutputFormat *file_oformat;
89 static AVImageFormat *image_format;
90 static int frame_width = 0;
91 static int frame_height = 0;
92 static float frame_aspect_ratio = 0;
93 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
94 static int frame_padtop = 0;
95 static int frame_padbottom = 0;
96 static int frame_padleft = 0;
97 static int frame_padright = 0;
98 static int padcolor[3] = {16,128,128}; /* default to black */
99 static int frame_topBand = 0;
100 static int frame_bottomBand = 0;
101 static int frame_leftBand = 0;
102 static int frame_rightBand = 0;
103 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
104 static int frame_rate = 25;
105 static int frame_rate_base = 1;
106 static int video_bit_rate = 200*1000;
107 static int video_bit_rate_tolerance = 4000*1000;
108 static float video_qscale = 0;
109 static int video_qmin = 2;
110 static int video_qmax = 31;
111 static int video_lmin = 2*FF_QP2LAMBDA;
112 static int video_lmax = 31*FF_QP2LAMBDA;
113 static int video_mb_lmin = 2*FF_QP2LAMBDA;
114 static int video_mb_lmax = 31*FF_QP2LAMBDA;
115 static int video_qdiff = 3;
116 static float video_qblur = 0.5;
117 static float video_qsquish = 0.0;
118 static float video_qcomp = 0.5;
119 static uint16_t *intra_matrix = NULL;
120 static uint16_t *inter_matrix = NULL;
121 #if 0 //experimental, (can be removed)
122 static float video_rc_qsquish=1.0;
123 static float video_rc_qmod_amp=0;
124 static int video_rc_qmod_freq=0;
126 static char *video_rc_override_string=NULL;
127 static char *video_rc_eq="tex^qComp";
128 static int video_rc_buffer_size=0;
129 static float video_rc_buffer_aggressivity=1.0;
130 static int video_rc_max_rate=0;
131 static int video_rc_min_rate=0;
132 static float video_rc_initial_cplx=0;
133 static float video_b_qfactor = 1.25;
134 static float video_b_qoffset = 1.25;
135 static float video_i_qfactor = -0.8;
136 static float video_i_qoffset = 0.0;
137 static int video_intra_quant_bias= FF_DEFAULT_QUANT_BIAS;
138 static int video_inter_quant_bias= FF_DEFAULT_QUANT_BIAS;
139 static int me_method = ME_EPZS;
140 static int video_disable = 0;
141 static int video_discard = 0;
142 static int video_codec_id = CODEC_ID_NONE;
143 static int video_codec_tag = 0;
144 static int same_quality = 0;
145 static int b_frames = 0;
146 static int b_strategy = 0;
147 static int pre_me = 0;
148 static int do_deinterlace = 0;
149 static int workaround_bugs = FF_BUG_AUTODETECT;
150 static int packet_size = 0;
151 static int error_rate = 0;
152 static int strict = 0;
153 static int top_field_first = -1;
154 static int sc_threshold = 0;
155 static int me_threshold = 0;
156 static int mb_threshold = 0;
157 static int intra_dc_precision = 8;
158 static int me_penalty_compensation= 256;
159 static int frame_skip_threshold= 0;
160 static int frame_skip_factor= 0;
161 static int frame_skip_exp= 0;
162 extern int loop_input; /* currently a hack */
163 static int loop_output = AVFMT_NOOUTPUTLOOP;
164 static int genpts = 0;
166 static int gop_size = 12;
167 static int intra_only = 0;
168 static int audio_sample_rate = 44100;
169 static int audio_bit_rate = 64000;
170 #define QSCALE_NONE -99999
171 static float audio_qscale = QSCALE_NONE;
172 static int audio_disable = 0;
173 static int audio_channels = 1;
174 static int audio_codec_id = CODEC_ID_NONE;
175 static int audio_codec_tag = 0;
176 static char *audio_language = NULL;
178 static int subtitle_codec_id = CODEC_ID_NONE;
179 static char *subtitle_language = NULL;
181 static int mux_rate= 0;
182 static int mux_packet_size= 0;
183 static float mux_preload= 0.5;
184 static float mux_max_delay= 0.7;
186 static int64_t recording_time = 0;
187 static int64_t start_time = 0;
188 static int64_t rec_timestamp = 0;
189 static int64_t input_ts_offset = 0;
190 static int file_overwrite = 0;
191 static char *str_title = NULL;
192 static char *str_author = NULL;
193 static char *str_copyright = NULL;
194 static char *str_comment = NULL;
195 static int do_benchmark = 0;
196 static int do_hex_dump = 0;
197 static int do_pkt_dump = 0;
198 static int do_psnr = 0;
199 static int do_vstats = 0;
200 static int do_pass = 0;
201 static char *pass_logfilename = NULL;
202 static int audio_stream_copy = 0;
203 static int video_stream_copy = 0;
204 static int subtitle_stream_copy = 0;
205 static int video_sync_method= 1;
206 static int audio_sync_method= 0;
207 static int copy_ts= 0;
208 static int opt_shortest = 0; //
209 static int video_global_header = 0;
211 static int rate_emu = 0;
214 static char *video_grab_format = "bktr";
216 static char *video_grab_format = "video4linux";
218 static char *video_device = NULL;
219 static char *grab_device = NULL;
220 static int video_channel = 0;
221 static char *video_standard = "ntsc";
223 static char *audio_grab_format = "audio_device";
224 static char *audio_device = NULL;
225 static int audio_volume = 256;
227 static int using_stdin = 0;
228 static int using_vhook = 0;
229 static int verbose = 1;
230 static int thread_count= 1;
231 static int q_pressed = 0;
232 static int me_range = 0;
233 static int64_t video_size = 0;
234 static int64_t audio_size = 0;
235 static int64_t extra_size = 0;
236 static int nb_frames_dup = 0;
237 static int nb_frames_drop = 0;
238 static int input_sync;
239 static int limit_filesize = 0; //
241 static int pgmyuv_compatibility_hack=0;
243 const char **opt_names=NULL;
244 int opt_name_count=0;
245 AVCodecContext *avctx_opts;
248 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
250 struct AVInputStream;
252 typedef struct AVOutputStream {
253 int file_index; /* file index */
254 int index; /* stream index in the output file */
255 int source_index; /* AVInputStream index */
256 AVStream *st; /* stream in the output file */
257 int encoding_needed; /* true if encoding needed for this stream */
259 /* input pts and corresponding output pts
261 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
262 struct AVInputStream *sync_ist; /* input stream to sync against */
263 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
265 int video_resample; /* video_resample and video_crop are mutually exclusive */
266 AVFrame pict_tmp; /* temporary image for resampling */
267 ImgReSampleContext *img_resample_ctx; /* for image resampling */
269 int video_crop; /* video_resample and video_crop are mutually exclusive */
270 int topBand; /* cropping area sizes */
273 int video_pad; /* video_resample and video_pad are mutually exclusive */
274 int padtop; /* padding area sizes */
281 ReSampleContext *resample; /* for audio resampling */
282 FifoBuffer fifo; /* for compression: one audio fifo per codec */
286 typedef struct AVInputStream {
290 int discard; /* true if stream data should be discarded */
291 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
292 int64_t sample_index; /* current sample */
294 int64_t start; /* time when read started */
295 unsigned long frame; /* current frame */
296 int64_t next_pts; /* synthetic pts for cases where pkt.pts
298 int64_t pts; /* current pts */
299 int is_start; /* is 1 at the start and after a discontinuity */
302 typedef struct AVInputFile {
303 int eof_reached; /* true if eof reached */
304 int ist_index; /* index of first stream in ist_table */
305 int buffer_size; /* current total buffer size */
306 int buffer_size_max; /* buffer size at which we consider we can stop
308 int nb_streams; /* nb streams we are aware of */
313 /* init terminal so that we can grab keys */
314 static struct termios oldtty;
316 static void term_exit(void)
318 tcsetattr (0, TCSANOW, &oldtty);
321 static volatile sig_atomic_t received_sigterm = 0;
324 sigterm_handler(int sig)
326 received_sigterm = sig;
330 static void term_init(void)
337 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
338 |INLCR|IGNCR|ICRNL|IXON);
339 tty.c_oflag |= OPOST;
340 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
341 tty.c_cflag &= ~(CSIZE|PARENB);
346 tcsetattr (0, TCSANOW, &tty);
348 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
349 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
350 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
352 register a function to be called at normal program termination
355 #ifdef CONFIG_BEOS_NETSERVER
356 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
360 /* read a key without blocking */
361 static int read_key(void)
365 #ifndef CONFIG_BEOS_NETSERVER
373 n = select(1, &rfds, NULL, NULL, &tv);
385 static int decode_interrupt_cb(void)
387 return q_pressed || (q_pressed = read_key() == 'q');
392 static volatile int received_sigterm = 0;
394 /* no interactive support */
395 static void term_exit(void)
399 static void term_init(void)
403 static int read_key(void)
410 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
415 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
418 /* copy stream format */
419 s->nb_streams = ic->nb_streams;
420 for(i=0;i<ic->nb_streams;i++) {
423 st = av_mallocz(sizeof(AVStream));
424 memcpy(st, ic->streams[i], sizeof(AVStream));
428 av_close_input_file(ic);
433 get_sync_ipts(const AVOutputStream *ost)
435 const AVInputStream *ist = ost->sync_ist;
436 return (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/AV_TIME_BASE;
439 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
441 static void do_audio_out(AVFormatContext *s,
444 unsigned char *buf, int size)
447 static uint8_t *audio_buf = NULL;
448 static uint8_t *audio_out = NULL;
449 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
451 int size_out, frame_bytes, ret;
452 AVCodecContext *enc= ost->st->codec;
454 /* SC: dynamic allocation of buffers */
456 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
458 audio_out = av_malloc(audio_out_size);
459 if (!audio_buf || !audio_out)
460 return; /* Should signal an error ! */
462 if(audio_sync_method){
463 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
464 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec->channels * 2);
465 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
466 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
468 //FIXME resample delay
469 if(fabs(delta) > 50){
472 byte_delta= FFMAX(byte_delta, -size);
476 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
481 static uint8_t *input_tmp= NULL;
482 input_tmp= av_realloc(input_tmp, byte_delta + size);
484 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
487 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
489 memset(input_tmp, 0, byte_delta);
490 memcpy(input_tmp + byte_delta, buf, size);
494 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
496 }else if(audio_sync_method>1){
497 int comp= clip(delta, -audio_sync_method, audio_sync_method);
498 assert(ost->audio_resample);
500 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
501 // fprintf(stderr, "drift:%f len:%d opts:%lld ipts:%lld fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(get_sync_ipts(ost) * enc->sample_rate), fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec->channels * 2));
502 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
506 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
507 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec->channels * 2); //FIXME wrong
509 if (ost->audio_resample) {
511 size_out = audio_resample(ost->resample,
512 (short *)buftmp, (short *)buf,
513 size / (ist->st->codec->channels * 2));
514 size_out = size_out * enc->channels * 2;
520 /* now encode as many frames as possible */
521 if (enc->frame_size > 1) {
522 /* output resampled raw samples */
523 fifo_write(&ost->fifo, buftmp, size_out,
526 frame_bytes = enc->frame_size * 2 * enc->channels;
528 while (fifo_read(&ost->fifo, audio_buf, frame_bytes,
529 &ost->fifo.rptr) == 0) {
531 av_init_packet(&pkt);
533 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
536 pkt.stream_index= ost->index;
539 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
540 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
541 pkt.flags |= PKT_FLAG_KEY;
542 av_interleaved_write_frame(s, &pkt);
544 ost->sync_opts += enc->frame_size;
548 av_init_packet(&pkt);
550 ost->sync_opts += size_out / (2 * enc->channels);
552 /* output a pcm frame */
553 /* XXX: change encoding codec API to avoid this ? */
554 switch(enc->codec->id) {
555 case CODEC_ID_PCM_S32LE:
556 case CODEC_ID_PCM_S32BE:
557 case CODEC_ID_PCM_U32LE:
558 case CODEC_ID_PCM_U32BE:
559 size_out = size_out << 1;
561 case CODEC_ID_PCM_S24LE:
562 case CODEC_ID_PCM_S24BE:
563 case CODEC_ID_PCM_U24LE:
564 case CODEC_ID_PCM_U24BE:
565 case CODEC_ID_PCM_S24DAUD:
566 size_out = size_out / 2 * 3;
568 case CODEC_ID_PCM_S16LE:
569 case CODEC_ID_PCM_S16BE:
570 case CODEC_ID_PCM_U16LE:
571 case CODEC_ID_PCM_U16BE:
574 size_out = size_out >> 1;
577 ret = avcodec_encode_audio(enc, audio_out, size_out,
580 pkt.stream_index= ost->index;
583 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
584 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
585 pkt.flags |= PKT_FLAG_KEY;
586 av_interleaved_write_frame(s, &pkt);
590 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
594 AVPicture picture_tmp;
597 dec = ist->st->codec;
599 /* deinterlace : must be done before any resize */
600 if (do_deinterlace || using_vhook) {
603 /* create temporary picture */
604 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
605 buf = av_malloc(size);
609 picture2 = &picture_tmp;
610 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
613 if(avpicture_deinterlace(picture2, picture,
614 dec->pix_fmt, dec->width, dec->height) < 0) {
615 /* if error, do not deinterlace */
621 if (img_convert(picture2, dec->pix_fmt, picture,
622 dec->pix_fmt, dec->width, dec->height) < 0) {
623 /* if error, do not copy */
633 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
635 if (picture != picture2)
636 *picture = *picture2;
640 /* we begin to correct av delay at this threshold */
641 #define AV_DELAY_MAX 0.100
644 /* Expects img to be yuv420 */
645 static void fill_pad_region(AVPicture* img, int height, int width,
646 int padtop, int padbottom, int padleft, int padright, int *color) {
651 for (i = 0; i < 3; i++) {
652 shift = (i == 0) ? 0 : 1;
654 if (padtop || padleft) {
655 memset(img->data[i], color[i], (((img->linesize[i] * padtop) +
659 if (padleft || padright) {
660 optr = img->data[i] + (img->linesize[i] * (padtop >> shift)) +
661 (img->linesize[i] - (padright >> shift));
663 for (y = 0; y < ((height - (padtop + padbottom) - 1) >> shift); y++) {
664 memset(optr, color[i], (padleft + padright) >> shift);
665 optr += img->linesize[i];
669 if (padbottom || padright) {
670 optr = img->data[i] + (((img->linesize[i] * (height - padbottom)) - padright) >> shift);
671 memset(optr, color[i], (((img->linesize[i] * padbottom) + padright) >> shift));
676 static void do_subtitle_out(AVFormatContext *s,
682 static uint8_t *subtitle_out = NULL;
683 int subtitle_out_max_size = 65536;
684 int subtitle_out_size, nb, i;
688 if (pts == AV_NOPTS_VALUE) {
689 fprintf(stderr, "Subtitle packets must have a pts\n");
693 enc = ost->st->codec;
696 subtitle_out = av_malloc(subtitle_out_max_size);
699 /* Note: DVB subtitle need one packet to draw them and one other
700 packet to clear them */
701 /* XXX: signal it in the codec context ? */
702 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
707 for(i = 0; i < nb; i++) {
708 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
709 subtitle_out_max_size, sub);
711 av_init_packet(&pkt);
712 pkt.stream_index = ost->index;
713 pkt.data = subtitle_out;
714 pkt.size = subtitle_out_size;
715 pkt.pts = av_rescale_q(av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q) + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
716 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
717 /* XXX: the pts correction is handled here. Maybe handling
718 it in the codec would be better */
720 pkt.pts += 90 * sub->start_display_time;
722 pkt.pts += 90 * sub->end_display_time;
724 av_interleaved_write_frame(s, &pkt);
728 static int bit_buffer_size= 1024*256;
729 static uint8_t *bit_buffer= NULL;
731 static void do_video_out(AVFormatContext *s,
737 int nb_frames, i, ret;
738 AVFrame *final_picture, *formatted_picture;
739 AVFrame picture_format_temp, picture_crop_temp;
740 uint8_t *buf = NULL, *buf1 = NULL;
741 AVCodecContext *enc, *dec;
742 enum PixelFormat target_pixfmt;
744 avcodec_get_frame_defaults(&picture_format_temp);
745 avcodec_get_frame_defaults(&picture_crop_temp);
747 enc = ost->st->codec;
748 dec = ist->st->codec;
750 /* by default, we output a single frame */
755 if(video_sync_method){
757 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
758 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
761 else if (vdelta > 1.1)
762 nb_frames = lrintf(vdelta);
763 //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);
767 fprintf(stderr, "*** drop!\n");
768 }else if (nb_frames > 1) {
769 nb_frames_dup += nb_frames;
771 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
774 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
776 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
780 /* convert pixel format if needed */
781 target_pixfmt = ost->video_resample || ost->video_pad
782 ? PIX_FMT_YUV420P : enc->pix_fmt;
783 if (dec->pix_fmt != target_pixfmt) {
786 /* create temporary picture */
787 size = avpicture_get_size(target_pixfmt, dec->width, dec->height);
788 buf = av_malloc(size);
791 formatted_picture = &picture_format_temp;
792 avpicture_fill((AVPicture*)formatted_picture, buf, target_pixfmt, dec->width, dec->height);
794 if (img_convert((AVPicture*)formatted_picture, target_pixfmt,
795 (AVPicture *)in_picture, dec->pix_fmt,
796 dec->width, dec->height) < 0) {
799 fprintf(stderr, "pixel format conversion not handled\n");
804 formatted_picture = in_picture;
807 /* XXX: resampling could be done before raw format conversion in
808 some cases to go faster */
809 /* XXX: only works for YUV420P */
810 if (ost->video_resample) {
811 final_picture = &ost->pict_tmp;
812 img_resample(ost->img_resample_ctx, (AVPicture*)final_picture, (AVPicture*)formatted_picture);
814 if (ost->padtop || ost->padbottom || ost->padleft || ost->padright) {
815 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
816 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
820 if (enc->pix_fmt != PIX_FMT_YUV420P) {
824 /* create temporary picture */
825 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
826 buf = av_malloc(size);
829 final_picture = &picture_format_temp;
830 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
832 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
833 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
834 enc->width, enc->height) < 0) {
837 fprintf(stderr, "pixel format conversion not handled\n");
842 } else if (ost->video_crop) {
843 picture_crop_temp.data[0] = formatted_picture->data[0] +
844 (ost->topBand * formatted_picture->linesize[0]) + ost->leftBand;
846 picture_crop_temp.data[1] = formatted_picture->data[1] +
847 ((ost->topBand >> 1) * formatted_picture->linesize[1]) +
848 (ost->leftBand >> 1);
850 picture_crop_temp.data[2] = formatted_picture->data[2] +
851 ((ost->topBand >> 1) * formatted_picture->linesize[2]) +
852 (ost->leftBand >> 1);
854 picture_crop_temp.linesize[0] = formatted_picture->linesize[0];
855 picture_crop_temp.linesize[1] = formatted_picture->linesize[1];
856 picture_crop_temp.linesize[2] = formatted_picture->linesize[2];
857 final_picture = &picture_crop_temp;
858 } else if (ost->video_pad) {
859 final_picture = &ost->pict_tmp;
861 for (i = 0; i < 3; i++) {
862 uint8_t *optr, *iptr;
863 int shift = (i == 0) ? 0 : 1;
866 /* set offset to start writing image into */
867 optr = final_picture->data[i] + (((final_picture->linesize[i] *
868 ost->padtop) + ost->padleft) >> shift);
869 iptr = formatted_picture->data[i];
871 yheight = (enc->height - ost->padtop - ost->padbottom) >> shift;
872 for (y = 0; y < yheight; y++) {
873 /* copy unpadded image row into padded image row */
874 memcpy(optr, iptr, formatted_picture->linesize[i]);
875 optr += final_picture->linesize[i];
876 iptr += formatted_picture->linesize[i];
880 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
881 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
884 if (enc->pix_fmt != PIX_FMT_YUV420P) {
888 /* create temporary picture */
889 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
890 buf = av_malloc(size);
893 final_picture = &picture_format_temp;
894 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
896 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
897 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
898 enc->width, enc->height) < 0) {
901 fprintf(stderr, "pixel format conversion not handled\n");
907 final_picture = formatted_picture;
909 /* duplicates frame if needed */
910 for(i=0;i<nb_frames;i++) {
912 av_init_packet(&pkt);
913 pkt.stream_index= ost->index;
915 if (s->oformat->flags & AVFMT_RAWPICTURE) {
916 /* raw pictures are written as AVPicture structure to
917 avoid any copies. We support temorarily the older
919 AVFrame* old_frame = enc->coded_frame;
920 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
921 pkt.data= (uint8_t *)final_picture;
922 pkt.size= sizeof(AVPicture);
923 if(dec->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
924 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
925 if(dec->coded_frame && dec->coded_frame->key_frame)
926 pkt.flags |= PKT_FLAG_KEY;
928 av_interleaved_write_frame(s, &pkt);
929 enc->coded_frame = old_frame;
933 big_picture= *final_picture;
934 /* better than nothing: use input picture interlaced
936 big_picture.interlaced_frame = in_picture->interlaced_frame;
937 if(avctx_opts->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
938 if(top_field_first == -1)
939 big_picture.top_field_first = in_picture->top_field_first;
941 big_picture.top_field_first = top_field_first;
944 /* handles sameq here. This is not correct because it may
945 not be a global option */
947 big_picture.quality = ist->st->quality;
949 big_picture.quality = ost->st->quality;
951 big_picture.pict_type = 0;
952 // big_picture.pts = AV_NOPTS_VALUE;
953 big_picture.pts= ost->sync_opts;
954 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
955 //av_log(NULL, AV_LOG_DEBUG, "%lld -> encoder\n", ost->sync_opts);
956 ret = avcodec_encode_video(enc,
957 bit_buffer, bit_buffer_size,
959 //enc->frame_number = enc->real_pict_num;
961 pkt.data= bit_buffer;
963 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
964 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
965 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %lld/%lld\n",
966 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
967 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
969 if(enc->coded_frame && enc->coded_frame->key_frame)
970 pkt.flags |= PKT_FLAG_KEY;
971 av_interleaved_write_frame(s, &pkt);
973 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
974 // enc->frame_number-1, enc->real_pict_num, ret,
976 /* if two pass, output log */
977 if (ost->logfile && enc->stats_out) {
978 fprintf(ost->logfile, "%s", enc->stats_out);
990 static double psnr(double d){
991 if(d==0) return INFINITY;
992 return -10.0*log(d)/log(10.0);
995 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
998 static FILE *fvstats=NULL;
1002 AVCodecContext *enc;
1005 double ti1, bitrate, avg_bitrate;
1008 today2 = time(NULL);
1009 today = localtime(&today2);
1010 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour,
1013 fvstats = fopen(filename,"w");
1021 enc = ost->st->codec;
1022 if (enc->codec_type == CODEC_TYPE_VIDEO) {
1023 frame_number = ost->frame_number;
1024 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1025 if (enc->flags&CODEC_FLAG_PSNR)
1026 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1028 fprintf(fvstats,"f_size= %6d ", frame_size);
1029 /* compute pts value */
1030 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1034 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1035 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1036 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1037 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1038 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1042 static void print_report(AVFormatContext **output_files,
1043 AVOutputStream **ost_table, int nb_ostreams,
1047 AVOutputStream *ost;
1048 AVFormatContext *oc, *os;
1050 AVCodecContext *enc;
1051 int frame_number, vid, i;
1052 double bitrate, ti1, pts;
1053 static int64_t last_time = -1;
1055 if (!is_last_report) {
1057 /* display the report every 0.5 seconds */
1058 cur_time = av_gettime();
1059 if (last_time == -1) {
1060 last_time = cur_time;
1063 if ((cur_time - last_time) < 500000)
1065 last_time = cur_time;
1069 oc = output_files[0];
1071 total_size = url_ftell(&oc->pb);
1076 for(i=0;i<nb_ostreams;i++) {
1078 os = output_files[ost->file_index];
1079 enc = ost->st->codec;
1080 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1081 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1082 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1084 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1085 frame_number = ost->frame_number;
1086 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d q=%2.1f ",
1087 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : 0);
1089 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1090 if (enc->flags&CODEC_FLAG_PSNR){
1092 double error, error_sum=0;
1093 double scale, scale_sum=0;
1094 char type[3]= {'Y','U','V'};
1095 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1098 error= enc->error[j];
1099 scale= enc->width*enc->height*255.0*255.0*frame_number;
1101 error= enc->coded_frame->error[j];
1102 scale= enc->width*enc->height*255.0*255.0;
1107 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1109 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1113 /* compute min output value */
1114 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1115 if ((pts < ti1) && (pts > 0))
1121 if (verbose || is_last_report) {
1122 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1124 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1125 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
1126 (double)total_size / 1024, ti1, bitrate);
1129 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1130 nb_frames_dup, nb_frames_drop);
1133 fprintf(stderr, "%s \r", buf);
1138 if (is_last_report && verbose >= 0){
1139 int64_t raw= audio_size + video_size + extra_size;
1140 fprintf(stderr, "\n");
1141 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1145 100.0*(total_size - raw)/raw
1150 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1151 static int output_packet(AVInputStream *ist, int ist_index,
1152 AVOutputStream **ost_table, int nb_ostreams,
1153 const AVPacket *pkt)
1155 AVFormatContext *os;
1156 AVOutputStream *ost;
1160 int data_size, got_picture;
1162 void *buffer_to_free;
1163 static int samples_size= 0;
1164 static short *samples= NULL;
1165 AVSubtitle subtitle, *subtitle_to_free;
1169 ist->pts= ist->next_pts; // needed for last packet if vsync=0
1170 } else if (pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1171 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1173 // assert(ist->pts == ist->next_pts);
1187 /* decode the packet if needed */
1188 data_buf = NULL; /* fail safe */
1190 subtitle_to_free = NULL;
1191 if (ist->decoding_needed) {
1192 switch(ist->st->codec->codec_type) {
1193 case CODEC_TYPE_AUDIO:{
1195 samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE));
1196 /* XXX: could avoid copy if PCM 16 bits with same
1197 endianness as CPU */
1198 ret = avcodec_decode_audio(ist->st->codec, samples, &data_size,
1204 /* Some bug in mpeg audio decoder gives */
1205 /* data_size < 0, it seems they are overflows */
1206 if (data_size <= 0) {
1207 /* no audio frame */
1210 data_buf = (uint8_t *)samples;
1211 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1212 (ist->st->codec->sample_rate * ist->st->codec->channels);
1214 case CODEC_TYPE_VIDEO:
1215 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1216 /* XXX: allocate picture correctly */
1217 avcodec_get_frame_defaults(&picture);
1219 ret = avcodec_decode_video(ist->st->codec,
1220 &picture, &got_picture, ptr, len);
1221 ist->st->quality= picture.quality;
1225 /* no picture yet */
1226 goto discard_packet;
1228 if (ist->st->codec->time_base.num != 0) {
1229 ist->next_pts += ((int64_t)AV_TIME_BASE *
1230 ist->st->codec->time_base.num) /
1231 ist->st->codec->time_base.den;
1235 case CODEC_TYPE_SUBTITLE:
1236 ret = avcodec_decode_subtitle(ist->st->codec,
1237 &subtitle, &got_subtitle, ptr, len);
1240 if (!got_subtitle) {
1241 goto discard_packet;
1243 subtitle_to_free = &subtitle;
1250 switch(ist->st->codec->codec_type) {
1251 case CODEC_TYPE_AUDIO:
1252 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1253 (ist->st->codec->sample_rate * ist->st->codec->channels);
1255 case CODEC_TYPE_VIDEO:
1256 if (ist->st->codec->time_base.num != 0) {
1257 ist->next_pts += ((int64_t)AV_TIME_BASE *
1258 ist->st->codec->time_base.num) /
1259 ist->st->codec->time_base.den;
1269 buffer_to_free = NULL;
1270 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1271 pre_process_video_frame(ist, (AVPicture *)&picture,
1275 // preprocess audio (volume)
1276 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1277 if (audio_volume != 256) {
1280 for(i=0;i<(data_size / sizeof(short));i++) {
1281 int v = ((*volp) * audio_volume + 128) >> 8;
1282 if (v < -32768) v = -32768;
1283 if (v > 32767) v = 32767;
1289 /* frame rate emulation */
1290 if (ist->st->codec->rate_emu) {
1291 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
1292 int64_t now = av_gettime() - ist->start;
1300 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1301 is the one of the next displayed one */
1302 /* XXX: add mpeg4 too ? */
1303 if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
1304 if (ist->st->codec->pict_type != B_TYPE) {
1306 tmp = ist->last_ip_pts;
1307 ist->last_ip_pts = ist->frac_pts.val;
1308 ist->frac_pts.val = tmp;
1312 /* if output time reached then transcode raw format,
1313 encode packets and output them */
1314 if (start_time == 0 || ist->pts >= start_time)
1315 for(i=0;i<nb_ostreams;i++) {
1319 if (ost->source_index == ist_index) {
1320 os = output_files[ost->file_index];
1323 printf("%d: got pts=%0.3f %0.3f\n", i,
1324 (double)pkt->pts / AV_TIME_BASE,
1325 ((double)ist->pts / AV_TIME_BASE) -
1326 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1328 /* set the input output pts pairs */
1329 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1331 if (ost->encoding_needed) {
1332 switch(ost->st->codec->codec_type) {
1333 case CODEC_TYPE_AUDIO:
1334 do_audio_out(os, ost, ist, data_buf, data_size);
1336 case CODEC_TYPE_VIDEO:
1337 do_video_out(os, ost, ist, &picture, &frame_size);
1338 video_size += frame_size;
1339 if (do_vstats && frame_size)
1340 do_video_stats(os, ost, frame_size);
1342 case CODEC_TYPE_SUBTITLE:
1343 do_subtitle_out(os, ost, ist, &subtitle,
1350 AVFrame avframe; //FIXME/XXX remove this
1352 av_init_packet(&opkt);
1354 /* no reencoding needed : output the packet directly */
1355 /* force the input stream PTS */
1357 avcodec_get_frame_defaults(&avframe);
1358 ost->st->codec->coded_frame= &avframe;
1359 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1361 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1362 audio_size += data_size;
1363 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1364 video_size += data_size;
1368 opkt.stream_index= ost->index;
1369 if(pkt->pts != AV_NOPTS_VALUE)
1370 opkt.pts= av_rescale_q(av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q) + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
1372 opkt.pts= AV_NOPTS_VALUE;
1376 if (pkt->dts == AV_NOPTS_VALUE)
1377 dts = ist->next_pts;
1379 dts= av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1380 opkt.dts= av_rescale_q(dts + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
1382 opkt.flags= pkt->flags;
1383 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1384 opkt.destruct= av_destruct_packet;
1385 av_interleaved_write_frame(os, &opkt);
1386 ost->st->codec->frame_number++;
1387 ost->frame_number++;
1388 av_free_packet(&opkt);
1392 av_free(buffer_to_free);
1393 /* XXX: allocate the subtitles in the codec ? */
1394 if (subtitle_to_free) {
1395 if (subtitle_to_free->rects != NULL) {
1396 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1397 av_free(subtitle_to_free->rects[i].bitmap);
1398 av_free(subtitle_to_free->rects[i].rgba_palette);
1400 av_freep(&subtitle_to_free->rects);
1402 subtitle_to_free->num_rects = 0;
1403 subtitle_to_free = NULL;
1410 for(i=0;i<nb_ostreams;i++) {
1412 if (ost->source_index == ist_index) {
1413 AVCodecContext *enc= ost->st->codec;
1414 os = output_files[ost->file_index];
1416 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1418 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1421 if (ost->encoding_needed) {
1424 av_init_packet(&pkt);
1425 pkt.stream_index= ost->index;
1427 switch(ost->st->codec->codec_type) {
1428 case CODEC_TYPE_AUDIO:
1429 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1431 pkt.flags |= PKT_FLAG_KEY;
1433 case CODEC_TYPE_VIDEO:
1434 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1436 if(enc->coded_frame && enc->coded_frame->key_frame)
1437 pkt.flags |= PKT_FLAG_KEY;
1438 if (ost->logfile && enc->stats_out) {
1439 fprintf(ost->logfile, "%s", enc->stats_out);
1448 pkt.data= bit_buffer;
1450 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1451 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1452 av_interleaved_write_frame(os, &pkt);
1466 * The following code is the main loop of the file converter
1468 static int av_encode(AVFormatContext **output_files,
1469 int nb_output_files,
1470 AVFormatContext **input_files,
1472 AVStreamMap *stream_maps, int nb_stream_maps)
1474 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1475 AVFormatContext *is, *os;
1476 AVCodecContext *codec, *icodec;
1477 AVOutputStream *ost, **ost_table = NULL;
1478 AVInputStream *ist, **ist_table = NULL;
1479 AVInputFile *file_table;
1480 AVFormatContext *stream_no_data;
1483 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1487 /* input stream init */
1489 for(i=0;i<nb_input_files;i++) {
1490 is = input_files[i];
1491 file_table[i].ist_index = j;
1492 file_table[i].nb_streams = is->nb_streams;
1493 j += is->nb_streams;
1497 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1501 for(i=0;i<nb_istreams;i++) {
1502 ist = av_mallocz(sizeof(AVInputStream));
1508 for(i=0;i<nb_input_files;i++) {
1509 is = input_files[i];
1510 for(k=0;k<is->nb_streams;k++) {
1511 ist = ist_table[j++];
1512 ist->st = is->streams[k];
1513 ist->file_index = i;
1515 ist->discard = 1; /* the stream is discarded by default
1518 if (ist->st->codec->rate_emu) {
1519 ist->start = av_gettime();
1525 /* output stream init */
1527 for(i=0;i<nb_output_files;i++) {
1528 os = output_files[i];
1529 nb_ostreams += os->nb_streams;
1531 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1532 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1536 /* Sanity check the mapping args -- do the input files & streams exist? */
1537 for(i=0;i<nb_stream_maps;i++) {
1538 int fi = stream_maps[i].file_index;
1539 int si = stream_maps[i].stream_index;
1541 if (fi < 0 || fi > nb_input_files - 1 ||
1542 si < 0 || si > file_table[fi].nb_streams - 1) {
1543 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1546 fi = stream_maps[i].sync_file_index;
1547 si = stream_maps[i].sync_stream_index;
1548 if (fi < 0 || fi > nb_input_files - 1 ||
1549 si < 0 || si > file_table[fi].nb_streams - 1) {
1550 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1555 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1558 for(i=0;i<nb_ostreams;i++) {
1559 ost = av_mallocz(sizeof(AVOutputStream));
1566 for(k=0;k<nb_output_files;k++) {
1567 os = output_files[k];
1568 for(i=0;i<os->nb_streams;i++) {
1570 ost = ost_table[n++];
1571 ost->file_index = k;
1573 ost->st = os->streams[i];
1574 if (nb_stream_maps > 0) {
1575 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1576 stream_maps[n-1].stream_index;
1578 /* Sanity check that the stream types match */
1579 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1580 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1581 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1582 ost->file_index, ost->index);
1587 /* get corresponding input stream index : we select the first one with the right type */
1589 for(j=0;j<nb_istreams;j++) {
1592 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1593 ost->source_index = j;
1600 /* try again and reuse existing stream */
1601 for(j=0;j<nb_istreams;j++) {
1603 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1604 ost->source_index = j;
1609 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1610 ost->file_index, ost->index);
1615 ist = ist_table[ost->source_index];
1617 ost->sync_ist = (nb_stream_maps > 0) ?
1618 ist_table[file_table[stream_maps[n-1].sync_file_index].ist_index +
1619 stream_maps[n-1].sync_stream_index] : ist;
1623 /* for each output stream, we compute the right encoding parameters */
1624 for(i=0;i<nb_ostreams;i++) {
1626 ist = ist_table[ost->source_index];
1628 codec = ost->st->codec;
1629 icodec = ist->st->codec;
1631 if (ost->st->stream_copy) {
1632 /* if stream_copy is selected, no need to decode or encode */
1633 codec->codec_id = icodec->codec_id;
1634 codec->codec_type = icodec->codec_type;
1635 if(!codec->codec_tag) codec->codec_tag = icodec->codec_tag;
1636 codec->bit_rate = icodec->bit_rate;
1637 codec->extradata= icodec->extradata;
1638 codec->extradata_size= icodec->extradata_size;
1639 codec->time_base = icodec->time_base;
1640 switch(codec->codec_type) {
1641 case CODEC_TYPE_AUDIO:
1642 codec->sample_rate = icodec->sample_rate;
1643 codec->channels = icodec->channels;
1644 codec->frame_size = icodec->frame_size;
1645 codec->block_align= icodec->block_align;
1647 case CODEC_TYPE_VIDEO:
1648 codec->width = icodec->width;
1649 codec->height = icodec->height;
1650 codec->has_b_frames = icodec->has_b_frames;
1652 case CODEC_TYPE_SUBTITLE:
1658 switch(codec->codec_type) {
1659 case CODEC_TYPE_AUDIO:
1660 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1663 if (codec->channels == icodec->channels &&
1664 codec->sample_rate == icodec->sample_rate) {
1665 ost->audio_resample = 0;
1667 if (codec->channels != icodec->channels &&
1668 (icodec->codec_id == CODEC_ID_AC3 ||
1669 icodec->codec_id == CODEC_ID_DTS)) {
1670 /* Special case for 5:1 AC3 and DTS input */
1671 /* and mono or stereo output */
1672 /* Request specific number of channels */
1673 icodec->channels = codec->channels;
1674 if (codec->sample_rate == icodec->sample_rate)
1675 ost->audio_resample = 0;
1677 ost->audio_resample = 1;
1680 ost->audio_resample = 1;
1683 if(audio_sync_method>1)
1684 ost->audio_resample = 1;
1686 if(ost->audio_resample){
1687 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1688 codec->sample_rate, icodec->sample_rate);
1690 printf("Can't resample. Aborting.\n");
1694 ist->decoding_needed = 1;
1695 ost->encoding_needed = 1;
1697 case CODEC_TYPE_VIDEO:
1698 if (codec->width == icodec->width &&
1699 codec->height == icodec->height &&
1700 frame_topBand == 0 &&
1701 frame_bottomBand == 0 &&
1702 frame_leftBand == 0 &&
1703 frame_rightBand == 0 &&
1704 frame_padtop == 0 &&
1705 frame_padbottom == 0 &&
1706 frame_padleft == 0 &&
1707 frame_padright == 0)
1709 ost->video_resample = 0;
1710 ost->video_crop = 0;
1712 } else if ((codec->width == icodec->width -
1713 (frame_leftBand + frame_rightBand)) &&
1714 (codec->height == icodec->height -
1715 (frame_topBand + frame_bottomBand)))
1717 ost->video_resample = 0;
1718 ost->video_crop = 1;
1719 ost->topBand = frame_topBand;
1720 ost->leftBand = frame_leftBand;
1721 } else if ((codec->width == icodec->width +
1722 (frame_padleft + frame_padright)) &&
1723 (codec->height == icodec->height +
1724 (frame_padtop + frame_padbottom))) {
1725 ost->video_resample = 0;
1726 ost->video_crop = 0;
1728 ost->padtop = frame_padtop;
1729 ost->padleft = frame_padleft;
1730 ost->padbottom = frame_padbottom;
1731 ost->padright = frame_padright;
1732 avcodec_get_frame_defaults(&ost->pict_tmp);
1733 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1734 codec->width, codec->height ) )
1737 ost->video_resample = 1;
1738 ost->video_crop = 0; // cropping is handled as part of resample
1739 avcodec_get_frame_defaults(&ost->pict_tmp);
1740 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1741 codec->width, codec->height ) )
1744 ost->img_resample_ctx = img_resample_full_init(
1745 ost->st->codec->width, ost->st->codec->height,
1746 ist->st->codec->width, ist->st->codec->height,
1747 frame_topBand, frame_bottomBand,
1748 frame_leftBand, frame_rightBand,
1749 frame_padtop, frame_padbottom,
1750 frame_padleft, frame_padright);
1752 ost->padtop = frame_padtop;
1753 ost->padleft = frame_padleft;
1754 ost->padbottom = frame_padbottom;
1755 ost->padright = frame_padright;
1758 ost->encoding_needed = 1;
1759 ist->decoding_needed = 1;
1761 case CODEC_TYPE_SUBTITLE:
1762 ost->encoding_needed = 1;
1763 ist->decoding_needed = 1;
1770 if (ost->encoding_needed &&
1771 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1772 char logfilename[1024];
1777 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1779 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1780 if (codec->flags & CODEC_FLAG_PASS1) {
1781 f = fopen(logfilename, "w");
1783 perror(logfilename);
1788 /* read the log file */
1789 f = fopen(logfilename, "r");
1791 perror(logfilename);
1794 fseek(f, 0, SEEK_END);
1796 fseek(f, 0, SEEK_SET);
1797 logbuffer = av_malloc(size + 1);
1799 fprintf(stderr, "Could not allocate log buffer\n");
1802 size = fread(logbuffer, 1, size, f);
1804 logbuffer[size] = '\0';
1805 codec->stats_in = logbuffer;
1809 if(codec->codec_type == CODEC_TYPE_VIDEO){
1810 int size= codec->width * codec->height;
1811 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1816 bit_buffer = av_malloc(bit_buffer_size);
1820 /* dump the file output parameters - cannot be done before in case
1822 for(i=0;i<nb_output_files;i++) {
1823 dump_format(output_files[i], i, output_files[i]->filename, 1);
1826 /* dump the stream mapping */
1828 fprintf(stderr, "Stream mapping:\n");
1829 for(i=0;i<nb_ostreams;i++) {
1831 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1832 ist_table[ost->source_index]->file_index,
1833 ist_table[ost->source_index]->index,
1836 if (ost->sync_ist != ist_table[ost->source_index])
1837 fprintf(stderr, " [sync #%d.%d]",
1838 ost->sync_ist->file_index,
1839 ost->sync_ist->index);
1840 fprintf(stderr, "\n");
1844 /* open each encoder */
1845 for(i=0;i<nb_ostreams;i++) {
1847 if (ost->encoding_needed) {
1849 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1851 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1852 ost->file_index, ost->index);
1855 if (avcodec_open(ost->st->codec, codec) < 0) {
1856 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1857 ost->file_index, ost->index);
1860 extra_size += ost->st->codec->extradata_size;
1864 /* open each decoder */
1865 for(i=0;i<nb_istreams;i++) {
1867 if (ist->decoding_needed) {
1869 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1871 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1872 ist->st->codec->codec_id, ist->file_index, ist->index);
1875 if (avcodec_open(ist->st->codec, codec) < 0) {
1876 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1877 ist->file_index, ist->index);
1880 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1881 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1886 for(i=0;i<nb_istreams;i++) {
1888 is = input_files[ist->file_index];
1890 ist->next_pts = av_rescale_q(ist->st->start_time, ist->st->time_base, AV_TIME_BASE_Q);
1891 if(ist->st->start_time == AV_NOPTS_VALUE)
1893 if(input_files_ts_offset[ist->file_index])
1894 ist->next_pts= AV_NOPTS_VALUE;
1898 /* compute buffer size max (should use a complete heuristic) */
1899 for(i=0;i<nb_input_files;i++) {
1900 file_table[i].buffer_size_max = 2048;
1903 /* set meta data information from input file if required */
1904 for (i=0;i<nb_meta_data_maps;i++) {
1905 AVFormatContext *out_file;
1906 AVFormatContext *in_file;
1908 int out_file_index = meta_data_maps[i].out_file;
1909 int in_file_index = meta_data_maps[i].in_file;
1910 if ( out_file_index < 0 || out_file_index >= nb_output_files ) {
1911 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1915 if ( in_file_index < 0 || in_file_index >= nb_input_files ) {
1916 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1921 out_file = output_files[out_file_index];
1922 in_file = input_files[in_file_index];
1924 strcpy(out_file->title, in_file->title);
1925 strcpy(out_file->author, in_file->author);
1926 strcpy(out_file->copyright, in_file->copyright);
1927 strcpy(out_file->comment, in_file->comment);
1928 strcpy(out_file->album, in_file->album);
1929 out_file->year = in_file->year;
1930 out_file->track = in_file->track;
1931 strcpy(out_file->genre, in_file->genre);
1934 /* open files and write file headers */
1935 for(i=0;i<nb_output_files;i++) {
1936 os = output_files[i];
1937 if (av_write_header(os) < 0) {
1938 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1944 #ifndef CONFIG_WIN32
1945 if ( !using_stdin && verbose >= 0) {
1946 fprintf(stderr, "Press [q] to stop encoding\n");
1947 url_set_interrupt_cb(decode_interrupt_cb);
1955 for(; received_sigterm == 0;) {
1956 int file_index, ist_index;
1964 /* if 'q' pressed, exits */
1968 /* read_key() returns 0 on EOF */
1974 /* select the stream that we must read now by looking at the
1975 smallest output pts */
1977 for(i=0;i<nb_ostreams;i++) {
1980 os = output_files[ost->file_index];
1981 ist = ist_table[ost->source_index];
1982 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
1983 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
1985 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
1986 ipts = (double)ist->pts;
1987 if (!file_table[ist->file_index].eof_reached){
1988 if(ipts < ipts_min) {
1990 if(input_sync ) file_index = ist->file_index;
1992 if(opts < opts_min) {
1994 if(!input_sync) file_index = ist->file_index;
1997 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2002 /* if none, if is finished */
2003 if (file_index < 0) {
2007 /* finish if recording time exhausted */
2008 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
2011 /* finish if limit size exhausted */
2012 if (limit_filesize != 0 && (limit_filesize * 1024) < url_ftell(&output_files[0]->pb))
2015 /* read a frame from it and output it in the fifo */
2016 is = input_files[file_index];
2017 if (av_read_frame(is, &pkt) < 0) {
2018 file_table[file_index].eof_reached = 1;
2019 if (opt_shortest) break; else continue; //
2023 stream_no_data = is;
2028 av_pkt_dump(stdout, &pkt, do_hex_dump);
2030 /* the following test is needed in case new streams appear
2031 dynamically in stream : we ignore them */
2032 if (pkt.stream_index >= file_table[file_index].nb_streams)
2033 goto discard_packet;
2034 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2035 ist = ist_table[ist_index];
2037 goto discard_packet;
2039 // 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);
2040 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
2041 int64_t delta= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q) - ist->next_pts;
2042 if(ABS(delta) > 10LL*AV_TIME_BASE && !copy_ts){
2043 input_files_ts_offset[ist->file_index]-= delta;
2045 fprintf(stderr, "timestamp discontinuity %lld, new offset= %lld\n", delta, input_files_ts_offset[ist->file_index]);
2046 for(i=0; i<file_table[file_index].nb_streams; i++){
2047 int index= file_table[file_index].ist_index + i;
2048 ist_table[index]->next_pts += delta;
2049 ist_table[index]->is_start=1;
2054 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2055 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2058 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2059 ist->file_index, ist->index);
2061 av_free_packet(&pkt);
2066 av_free_packet(&pkt);
2068 /* dump report by using the output first video and audio streams */
2069 print_report(output_files, ost_table, nb_ostreams, 0);
2072 /* at the end of stream, we must flush the decoder buffers */
2073 for(i=0;i<nb_istreams;i++) {
2075 if (ist->decoding_needed) {
2076 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2082 /* write the trailer if needed and close file */
2083 for(i=0;i<nb_output_files;i++) {
2084 os = output_files[i];
2085 av_write_trailer(os);
2088 /* dump report by using the first video and audio streams */
2089 print_report(output_files, ost_table, nb_ostreams, 1);
2091 /* close each encoder */
2092 for(i=0;i<nb_ostreams;i++) {
2094 if (ost->encoding_needed) {
2095 av_freep(&ost->st->codec->stats_in);
2096 avcodec_close(ost->st->codec);
2100 /* close each decoder */
2101 for(i=0;i<nb_istreams;i++) {
2103 if (ist->decoding_needed) {
2104 avcodec_close(ist->st->codec);
2112 av_freep(&bit_buffer);
2113 av_free(file_table);
2116 for(i=0;i<nb_istreams;i++) {
2123 for(i=0;i<nb_ostreams;i++) {
2127 fclose(ost->logfile);
2128 ost->logfile = NULL;
2130 fifo_free(&ost->fifo); /* works even if fifo is not
2131 initialized but set to zero */
2132 av_free(ost->pict_tmp.data[0]);
2133 if (ost->video_resample)
2134 img_resample_close(ost->img_resample_ctx);
2135 if (ost->audio_resample)
2136 audio_resample_close(ost->resample);
2149 int file_read(const char *filename)
2152 unsigned char buffer[1024];
2155 if (url_open(&h, filename, O_RDONLY) < 0) {
2156 printf("could not open '%s'\n", filename);
2160 len = url_read(h, buffer, sizeof(buffer));
2163 for(i=0;i<len;i++) putchar(buffer[i]);
2170 static void opt_image_format(const char *arg)
2174 for(f = first_image_format; f != NULL; f = f->next) {
2175 if (!strcmp(arg, f->name))
2179 fprintf(stderr, "Unknown image format: '%s'\n", arg);
2185 static void opt_format(const char *arg)
2187 /* compatibility stuff for pgmyuv */
2188 if (!strcmp(arg, "pgmyuv")) {
2189 pgmyuv_compatibility_hack=1;
2190 // opt_image_format(arg);
2194 file_iformat = av_find_input_format(arg);
2195 file_oformat = guess_format(arg, NULL, NULL);
2196 if (!file_iformat && !file_oformat) {
2197 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2202 static void opt_video_bitrate(const char *arg)
2204 video_bit_rate = atoi(arg) * 1000;
2207 static void opt_video_bitrate_tolerance(const char *arg)
2209 video_bit_rate_tolerance = atoi(arg) * 1000;
2212 static void opt_video_bitrate_max(const char *arg)
2214 video_rc_max_rate = atoi(arg) * 1000;
2217 static void opt_video_bitrate_min(const char *arg)
2219 video_rc_min_rate = atoi(arg) * 1000;
2222 static void opt_video_buffer_size(const char *arg)
2224 video_rc_buffer_size = atoi(arg) * 8*1024;
2227 static void opt_video_rc_eq(char *arg)
2232 static void opt_video_rc_override_string(char *arg)
2234 video_rc_override_string = arg;
2238 static void opt_workaround_bugs(const char *arg)
2240 workaround_bugs = atoi(arg);
2243 static void opt_me_threshold(const char *arg)
2245 me_threshold = atoi(arg);
2248 static void opt_mb_threshold(const char *arg)
2250 mb_threshold = atoi(arg);
2253 static void opt_verbose(const char *arg)
2255 verbose = atoi(arg);
2256 av_log_set_level(atoi(arg));
2259 static void opt_frame_rate(const char *arg)
2261 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
2262 fprintf(stderr, "Incorrect frame rate\n");
2267 static void opt_frame_crop_top(const char *arg)
2269 frame_topBand = atoi(arg);
2270 if (frame_topBand < 0) {
2271 fprintf(stderr, "Incorrect top crop size\n");
2274 if ((frame_topBand % 2) != 0) {
2275 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2278 if ((frame_topBand) >= frame_height){
2279 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2282 frame_height -= frame_topBand;
2285 static void opt_frame_crop_bottom(const char *arg)
2287 frame_bottomBand = atoi(arg);
2288 if (frame_bottomBand < 0) {
2289 fprintf(stderr, "Incorrect bottom crop size\n");
2292 if ((frame_bottomBand % 2) != 0) {
2293 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2296 if ((frame_bottomBand) >= frame_height){
2297 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2300 frame_height -= frame_bottomBand;
2303 static void opt_frame_crop_left(const char *arg)
2305 frame_leftBand = atoi(arg);
2306 if (frame_leftBand < 0) {
2307 fprintf(stderr, "Incorrect left crop size\n");
2310 if ((frame_leftBand % 2) != 0) {
2311 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2314 if ((frame_leftBand) >= frame_width){
2315 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2318 frame_width -= frame_leftBand;
2321 static void opt_frame_crop_right(const char *arg)
2323 frame_rightBand = atoi(arg);
2324 if (frame_rightBand < 0) {
2325 fprintf(stderr, "Incorrect right crop size\n");
2328 if ((frame_rightBand % 2) != 0) {
2329 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2332 if ((frame_rightBand) >= frame_width){
2333 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2336 frame_width -= frame_rightBand;
2339 static void opt_frame_size(const char *arg)
2341 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2342 fprintf(stderr, "Incorrect frame size\n");
2345 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2346 fprintf(stderr, "Frame size must be a multiple of 2\n");
2352 #define SCALEBITS 10
2353 #define ONE_HALF (1 << (SCALEBITS - 1))
2354 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2356 #define RGB_TO_Y(r, g, b) \
2357 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2358 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2360 #define RGB_TO_U(r1, g1, b1, shift)\
2361 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2362 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2364 #define RGB_TO_V(r1, g1, b1, shift)\
2365 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2366 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2368 static void opt_pad_color(const char *arg) {
2369 /* Input is expected to be six hex digits similar to
2370 how colors are expressed in html tags (but without the #) */
2371 int rgb = strtol(arg, NULL, 16);
2375 g = ((rgb >> 8) & 255);
2378 padcolor[0] = RGB_TO_Y(r,g,b);
2379 padcolor[1] = RGB_TO_U(r,g,b,0);
2380 padcolor[2] = RGB_TO_V(r,g,b,0);
2383 static void opt_frame_pad_top(const char *arg)
2385 frame_padtop = atoi(arg);
2386 if (frame_padtop < 0) {
2387 fprintf(stderr, "Incorrect top pad size\n");
2390 if ((frame_padtop % 2) != 0) {
2391 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2396 static void opt_frame_pad_bottom(const char *arg)
2398 frame_padbottom = atoi(arg);
2399 if (frame_padbottom < 0) {
2400 fprintf(stderr, "Incorrect bottom pad size\n");
2403 if ((frame_padbottom % 2) != 0) {
2404 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2410 static void opt_frame_pad_left(const char *arg)
2412 frame_padleft = atoi(arg);
2413 if (frame_padleft < 0) {
2414 fprintf(stderr, "Incorrect left pad size\n");
2417 if ((frame_padleft % 2) != 0) {
2418 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2424 static void opt_frame_pad_right(const char *arg)
2426 frame_padright = atoi(arg);
2427 if (frame_padright < 0) {
2428 fprintf(stderr, "Incorrect right pad size\n");
2431 if ((frame_padright % 2) != 0) {
2432 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2438 static void opt_frame_pix_fmt(const char *arg)
2440 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2443 static void opt_frame_aspect_ratio(const char *arg)
2449 p = strchr(arg, ':');
2451 x = strtol(arg, (char **)&arg, 10);
2453 y = strtol(arg+1, (char **)&arg, 10);
2455 ar = (double)x / (double)y;
2457 ar = strtod(arg, (char **)&arg);
2460 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2463 frame_aspect_ratio = ar;
2466 static void opt_gop_size(const char *arg)
2468 gop_size = atoi(arg);
2471 static void opt_b_frames(const char *arg)
2473 b_frames = atoi(arg);
2474 if (b_frames > FF_MAX_B_FRAMES) {
2475 fprintf(stderr, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES);
2477 } else if (b_frames < 1) {
2478 fprintf(stderr, "\nNumber of B frames must be higher than 0\n");
2483 static void opt_pre_me(const char *arg)
2488 static void opt_qscale(const char *arg)
2490 video_qscale = atof(arg);
2491 if (video_qscale < 0.01 ||
2492 video_qscale > 255) {
2493 fprintf(stderr, "qscale must be >= 0.01 and <= 255\n");
2498 static void opt_qsquish(const char *arg)
2500 video_qsquish = atof(arg);
2501 if (video_qsquish < 0.0 ||
2502 video_qsquish > 99.0) {
2503 fprintf(stderr, "qsquish must be >= 0.0 and <= 99.0\n");
2508 static void opt_lmax(const char *arg)
2510 video_lmax = atof(arg)*FF_QP2LAMBDA;
2513 static void opt_lmin(const char *arg)
2515 video_lmin = atof(arg)*FF_QP2LAMBDA;
2518 static void opt_qmin(const char *arg)
2520 video_qmin = atoi(arg);
2521 if (video_qmin < 1 ||
2523 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2528 static void opt_qmax(const char *arg)
2530 video_qmax = atoi(arg);
2531 if (video_qmax < 1 ||
2533 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2538 static void opt_mb_lmin(const char *arg)
2540 video_mb_lmin = atof(arg)*FF_QP2LAMBDA;
2541 if (video_mb_lmin < 1 ||
2542 video_mb_lmin > FF_LAMBDA_MAX) {
2543 fprintf(stderr, "mblmin must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
2548 static void opt_mb_lmax(const char *arg)
2550 video_mb_lmax = atof(arg)*FF_QP2LAMBDA;
2551 if (video_mb_lmax < 1 ||
2552 video_mb_lmax > FF_LAMBDA_MAX) {
2553 fprintf(stderr, "mblmax must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
2558 static void opt_qdiff(const char *arg)
2560 video_qdiff = atoi(arg);
2561 if (video_qdiff < 0 ||
2563 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2568 static void opt_qblur(const char *arg)
2570 video_qblur = atof(arg);
2573 static void opt_qcomp(const char *arg)
2575 video_qcomp = atof(arg);
2578 static void opt_rc_initial_cplx(const char *arg)
2580 video_rc_initial_cplx = atof(arg);
2582 static void opt_b_qfactor(const char *arg)
2584 video_b_qfactor = atof(arg);
2586 static void opt_i_qfactor(const char *arg)
2588 video_i_qfactor = atof(arg);
2590 static void opt_b_qoffset(const char *arg)
2592 video_b_qoffset = atof(arg);
2594 static void opt_i_qoffset(const char *arg)
2596 video_i_qoffset = atof(arg);
2599 static void opt_ibias(const char *arg)
2601 video_intra_quant_bias = atoi(arg);
2603 static void opt_pbias(const char *arg)
2605 video_inter_quant_bias = atoi(arg);
2608 static void opt_packet_size(const char *arg)
2610 packet_size= atoi(arg);
2613 static void opt_error_rate(const char *arg)
2615 error_rate= atoi(arg);
2618 static void opt_strict(const char *arg)
2623 static void opt_top_field_first(const char *arg)
2625 top_field_first= atoi(arg);
2628 static void opt_sc_threshold(const char *arg)
2630 sc_threshold= atoi(arg);
2633 static void opt_me_range(const char *arg)
2635 me_range = atoi(arg);
2638 static void opt_thread_count(const char *arg)
2640 thread_count= atoi(arg);
2641 #if !defined(HAVE_THREADS)
2643 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2647 static void opt_audio_bitrate(const char *arg)
2649 audio_bit_rate = atoi(arg) * 1000;
2652 static void opt_audio_rate(const char *arg)
2654 audio_sample_rate = atoi(arg);
2657 static void opt_audio_channels(const char *arg)
2659 audio_channels = atoi(arg);
2662 static void opt_video_device(const char *arg)
2664 video_device = av_strdup(arg);
2667 static void opt_grab_device(const char *arg)
2669 grab_device = av_strdup(arg);
2672 static void opt_video_channel(const char *arg)
2674 video_channel = strtol(arg, NULL, 0);
2677 static void opt_video_standard(const char *arg)
2679 video_standard = av_strdup(arg);
2682 static void opt_audio_device(const char *arg)
2684 audio_device = av_strdup(arg);
2687 static void opt_codec(int *pstream_copy, int *pcodec_id,
2688 int codec_type, const char *arg)
2692 if (!strcmp(arg, "copy")) {
2697 if (!strcmp(p->name, arg) && p->type == codec_type)
2702 fprintf(stderr, "Unknown codec '%s'\n", arg);
2710 static void opt_audio_codec(const char *arg)
2712 opt_codec(&audio_stream_copy, &audio_codec_id, CODEC_TYPE_AUDIO, arg);
2715 static void opt_audio_tag(const char *arg)
2718 audio_codec_tag= strtol(arg, &tail, 0);
2721 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2724 static void opt_video_tag(const char *arg)
2727 video_codec_tag= strtol(arg, &tail, 0);
2730 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2733 static void add_frame_hooker(const char *arg)
2738 char *args = av_strdup(arg);
2742 argv[0] = strtok(args, " ");
2743 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2746 i = frame_hook_add(argc, argv);
2749 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2754 const char *motion_str[] = {
2764 static void opt_motion_estimation(const char *arg)
2770 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2773 if (!strcmp(*p, arg))
2777 me_method = (p - motion_str) + 1;
2780 static void opt_video_codec(const char *arg)
2782 opt_codec(&video_stream_copy, &video_codec_id, CODEC_TYPE_VIDEO, arg);
2785 static void opt_subtitle_codec(const char *arg)
2787 opt_codec(&subtitle_stream_copy, &subtitle_codec_id, CODEC_TYPE_SUBTITLE, arg);
2790 static void opt_map(const char *arg)
2796 m = &stream_maps[nb_stream_maps++];
2798 m->file_index = strtol(arg, (char **)&p, 0);
2802 m->stream_index = strtol(p, (char **)&p, 0);
2805 m->sync_file_index = strtol(p, (char **)&p, 0);
2808 m->sync_stream_index = strtol(p, (char **)&p, 0);
2810 m->sync_file_index = m->file_index;
2811 m->sync_stream_index = m->stream_index;
2815 static void opt_map_meta_data(const char *arg)
2821 m = &meta_data_maps[nb_meta_data_maps++];
2823 m->out_file = strtol(arg, (char **)&p, 0);
2827 m->in_file = strtol(p, (char **)&p, 0);
2830 static void opt_recording_time(const char *arg)
2832 recording_time = parse_date(arg, 1);
2835 static void opt_start_time(const char *arg)
2837 start_time = parse_date(arg, 1);
2840 static void opt_rec_timestamp(const char *arg)
2842 rec_timestamp = parse_date(arg, 0) / 1000000;
2845 static void opt_input_ts_offset(const char *arg)
2847 input_ts_offset = parse_date(arg, 1);
2850 static void opt_input_file(const char *filename)
2852 AVFormatContext *ic;
2853 AVFormatParameters params, *ap = ¶ms;
2854 int err, i, ret, rfps, rfps_base;
2857 if (!strcmp(filename, "-"))
2860 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2861 !strcmp( filename, "/dev/stdin" );
2863 /* get default parameters from command line */
2864 memset(ap, 0, sizeof(*ap));
2865 ap->sample_rate = audio_sample_rate;
2866 ap->channels = audio_channels;
2867 ap->time_base.den = frame_rate;
2868 ap->time_base.num = frame_rate_base;
2869 ap->width = frame_width + frame_padleft + frame_padright;
2870 ap->height = frame_height + frame_padtop + frame_padbottom;
2871 ap->image_format = image_format;
2872 ap->pix_fmt = frame_pix_fmt;
2873 ap->device = grab_device;
2874 ap->channel = video_channel;
2875 ap->standard = video_standard;
2876 ap->video_codec_id = video_codec_id;
2877 ap->audio_codec_id = audio_codec_id;
2878 if(pgmyuv_compatibility_hack)
2879 ap->video_codec_id= CODEC_ID_PGMYUV;
2881 /* open the input file with generic libav function */
2882 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2884 print_error(filename, err);
2889 ic->flags|= AVFMT_FLAG_GENPTS;
2891 /* If not enough info to get the stream parameters, we decode the
2892 first frames to get it. (used in mpeg case for example) */
2893 ret = av_find_stream_info(ic);
2894 if (ret < 0 && verbose >= 0) {
2895 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2899 timestamp = start_time;
2900 /* add the stream start time */
2901 if (ic->start_time != AV_NOPTS_VALUE)
2902 timestamp += ic->start_time;
2904 /* if seeking requested, we execute it */
2905 if (start_time != 0) {
2906 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2908 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2909 filename, (double)timestamp / AV_TIME_BASE);
2911 /* reset seek info */
2915 /* update the current parameters so that they match the one of the input stream */
2916 for(i=0;i<ic->nb_streams;i++) {
2918 AVCodecContext *enc = ic->streams[i]->codec;
2919 #if defined(HAVE_THREADS)
2921 avcodec_thread_init(enc, thread_count);
2923 enc->thread_count= thread_count;
2924 switch(enc->codec_type) {
2925 case CODEC_TYPE_AUDIO:
2926 for(j=0; j<opt_name_count; j++){
2928 double d= av_get_double(avctx_opts, opt_names[j], &opt);
2929 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2930 av_set_double(enc, opt_names[j], d);
2932 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2933 audio_channels = enc->channels;
2934 audio_sample_rate = enc->sample_rate;
2936 ic->streams[i]->discard= AVDISCARD_ALL;
2938 case CODEC_TYPE_VIDEO:
2939 for(j=0; j<opt_name_count; j++){
2941 double d= av_get_double(avctx_opts, opt_names[j], &opt);
2942 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2943 av_set_double(enc, opt_names[j], d);
2945 frame_height = enc->height;
2946 frame_width = enc->width;
2947 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2948 frame_pix_fmt = enc->pix_fmt;
2949 rfps = ic->streams[i]->r_frame_rate.num;
2950 rfps_base = ic->streams[i]->r_frame_rate.den;
2951 enc->workaround_bugs = workaround_bugs;
2952 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2954 enc->debug |= FF_DEBUG_MV;
2956 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2959 fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2960 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2962 (float)rfps / rfps_base, rfps, rfps_base);
2964 /* update the current frame rate to match the stream frame rate */
2966 frame_rate_base = rfps_base;
2968 enc->rate_emu = rate_emu;
2970 ic->streams[i]->discard= AVDISCARD_ALL;
2971 else if(video_discard)
2972 ic->streams[i]->discard= video_discard;
2974 case CODEC_TYPE_DATA:
2976 case CODEC_TYPE_SUBTITLE:
2978 case CODEC_TYPE_UNKNOWN:
2985 input_files[nb_input_files] = ic;
2986 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2987 /* dump the file content */
2989 dump_format(ic, nb_input_files, filename, 0);
2992 file_iformat = NULL;
2993 file_oformat = NULL;
2994 image_format = NULL;
3002 static void opt_grab(const char *arg)
3004 file_iformat = av_find_input_format(arg);
3008 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
3010 int has_video, has_audio, i, j;
3011 AVFormatContext *ic;
3015 for(j=0;j<nb_input_files;j++) {
3016 ic = input_files[j];
3017 for(i=0;i<ic->nb_streams;i++) {
3018 AVCodecContext *enc = ic->streams[i]->codec;
3019 switch(enc->codec_type) {
3020 case CODEC_TYPE_AUDIO:
3023 case CODEC_TYPE_VIDEO:
3026 case CODEC_TYPE_DATA:
3027 case CODEC_TYPE_UNKNOWN:
3028 case CODEC_TYPE_SUBTITLE:
3035 *has_video_ptr = has_video;
3036 *has_audio_ptr = has_audio;
3039 static void new_video_stream(AVFormatContext *oc)
3042 AVCodecContext *video_enc;
3045 st = av_new_stream(oc, oc->nb_streams);
3047 fprintf(stderr, "Could not alloc stream\n");
3050 #if defined(HAVE_THREADS)
3052 avcodec_thread_init(st->codec, thread_count);
3055 video_enc = st->codec;
3058 video_enc->codec_tag= video_codec_tag;
3060 if( (video_global_header&1)
3061 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3062 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3063 avctx_opts->flags|= CODEC_FLAG_GLOBAL_HEADER;
3065 if(video_global_header&2){
3066 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3067 avctx_opts->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3070 if (video_stream_copy) {
3071 st->stream_copy = 1;
3072 video_enc->codec_type = CODEC_TYPE_VIDEO;
3078 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
3079 if (video_codec_id != CODEC_ID_NONE)
3080 codec_id = video_codec_id;
3082 video_enc->codec_id = codec_id;
3083 codec = avcodec_find_encoder(codec_id);
3085 for(i=0; i<opt_name_count; i++){
3087 double d= av_get_double(avctx_opts, opt_names[i], &opt);
3088 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3089 av_set_double(video_enc, opt_names[i], d);
3092 video_enc->bit_rate = video_bit_rate;
3093 video_enc->bit_rate_tolerance = video_bit_rate_tolerance;
3094 video_enc->time_base.den = frame_rate;
3095 video_enc->time_base.num = frame_rate_base;
3096 if(codec && codec->supported_framerates){
3097 const AVRational *p= codec->supported_framerates;
3098 AVRational req= (AVRational){frame_rate, frame_rate_base};
3099 const AVRational *best=NULL;
3100 AVRational best_error= (AVRational){INT_MAX, 1};
3101 for(; p->den!=0; p++){
3102 AVRational error= av_sub_q(req, *p);
3103 if(error.num <0) error.num *= -1;
3104 if(av_cmp_q(error, best_error) < 0){
3109 video_enc->time_base.den= best->num;
3110 video_enc->time_base.num= best->den;
3113 video_enc->width = frame_width + frame_padright + frame_padleft;
3114 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3115 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3116 video_enc->pix_fmt = frame_pix_fmt;
3118 if(codec && codec->pix_fmts){
3119 const enum PixelFormat *p= codec->pix_fmts;
3121 if(*p == video_enc->pix_fmt)
3125 video_enc->pix_fmt = codec->pix_fmts[0];
3129 video_enc->gop_size = gop_size;
3131 video_enc->gop_size = 0;
3132 if (video_qscale || same_quality) {
3133 video_enc->flags |= CODEC_FLAG_QSCALE;
3134 video_enc->global_quality=
3135 st->quality = FF_QP2LAMBDA * video_qscale;
3139 video_enc->intra_matrix = intra_matrix;
3141 video_enc->inter_matrix = inter_matrix;
3143 video_enc->pre_me = pre_me;
3146 video_enc->max_b_frames = b_frames;
3147 video_enc->b_frame_strategy = b_strategy;
3148 video_enc->b_quant_factor = 2.0;
3150 video_enc->qmin = video_qmin;
3151 video_enc->qmax = video_qmax;
3152 video_enc->lmin = video_lmin;
3153 video_enc->lmax = video_lmax;
3154 video_enc->rc_qsquish = video_qsquish;
3155 video_enc->mb_lmin = video_mb_lmin;
3156 video_enc->mb_lmax = video_mb_lmax;
3157 video_enc->max_qdiff = video_qdiff;
3158 video_enc->qblur = video_qblur;
3159 video_enc->qcompress = video_qcomp;
3160 video_enc->rc_eq = video_rc_eq;
3161 video_enc->workaround_bugs = workaround_bugs;
3162 video_enc->thread_count = thread_count;
3163 p= video_rc_override_string;
3166 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3168 fprintf(stderr, "error parsing rc_override\n");
3171 video_enc->rc_override=
3172 av_realloc(video_enc->rc_override,
3173 sizeof(RcOverride)*(i+1));
3174 video_enc->rc_override[i].start_frame= start;
3175 video_enc->rc_override[i].end_frame = end;
3177 video_enc->rc_override[i].qscale= q;
3178 video_enc->rc_override[i].quality_factor= 1.0;
3181 video_enc->rc_override[i].qscale= 0;
3182 video_enc->rc_override[i].quality_factor= -q/100.0;
3187 video_enc->rc_override_count=i;
3189 video_enc->rc_max_rate = video_rc_max_rate;
3190 video_enc->rc_min_rate = video_rc_min_rate;
3191 video_enc->rc_buffer_size = video_rc_buffer_size;
3192 video_enc->rc_initial_buffer_occupancy = video_rc_buffer_size*3/4;
3193 video_enc->rc_buffer_aggressivity= video_rc_buffer_aggressivity;
3194 video_enc->rc_initial_cplx= video_rc_initial_cplx;
3195 video_enc->i_quant_factor = video_i_qfactor;
3196 video_enc->b_quant_factor = video_b_qfactor;
3197 video_enc->i_quant_offset = video_i_qoffset;
3198 video_enc->b_quant_offset = video_b_qoffset;
3199 video_enc->intra_quant_bias = video_intra_quant_bias;
3200 video_enc->inter_quant_bias = video_inter_quant_bias;
3201 video_enc->me_threshold= me_threshold;
3202 video_enc->mb_threshold= mb_threshold;
3203 video_enc->intra_dc_precision= intra_dc_precision - 8;
3204 video_enc->strict_std_compliance = strict;
3205 video_enc->error_rate = error_rate;
3206 video_enc->scenechange_threshold= sc_threshold;
3207 video_enc->me_range = me_range;
3208 video_enc->me_penalty_compensation= me_penalty_compensation;
3209 video_enc->frame_skip_threshold= frame_skip_threshold;
3210 video_enc->frame_skip_factor= frame_skip_factor;
3211 video_enc->frame_skip_exp= frame_skip_exp;
3214 video_enc->rtp_mode= 1;
3215 video_enc->rtp_payload_size= packet_size;
3219 video_enc->flags|= CODEC_FLAG_PSNR;
3221 video_enc->me_method = me_method;
3226 video_enc->flags |= CODEC_FLAG_PASS1;
3228 video_enc->flags |= CODEC_FLAG_PASS2;
3233 /* reset some key parameters */
3235 video_codec_id = CODEC_ID_NONE;
3236 video_stream_copy = 0;
3239 static void new_audio_stream(AVFormatContext *oc)
3242 AVCodecContext *audio_enc;
3245 st = av_new_stream(oc, oc->nb_streams);
3247 fprintf(stderr, "Could not alloc stream\n");
3250 #if defined(HAVE_THREADS)
3252 avcodec_thread_init(st->codec, thread_count);
3255 audio_enc = st->codec;
3256 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3259 audio_enc->codec_tag= audio_codec_tag;
3261 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3262 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3263 avctx_opts->flags|= CODEC_FLAG_GLOBAL_HEADER;
3265 if (audio_stream_copy) {
3266 st->stream_copy = 1;
3267 audio_enc->channels = audio_channels;
3269 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3271 for(i=0; i<opt_name_count; i++){
3273 double d= av_get_double(avctx_opts, opt_names[i], &opt);
3274 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3275 av_set_double(audio_enc, opt_names[i], d);
3278 if (audio_codec_id != CODEC_ID_NONE)
3279 codec_id = audio_codec_id;
3280 audio_enc->codec_id = codec_id;
3282 audio_enc->bit_rate = audio_bit_rate;
3283 if (audio_qscale > QSCALE_NONE) {
3284 audio_enc->flags |= CODEC_FLAG_QSCALE;
3285 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3287 audio_enc->strict_std_compliance = strict;
3288 audio_enc->thread_count = thread_count;
3289 /* For audio codecs other than AC3 or DTS we limit */
3290 /* the number of coded channels to stereo */
3291 if (audio_channels > 2 && codec_id != CODEC_ID_AC3
3292 && codec_id != CODEC_ID_DTS) {
3293 audio_enc->channels = 2;
3295 audio_enc->channels = audio_channels;
3297 audio_enc->sample_rate = audio_sample_rate;
3298 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3299 if (audio_language) {
3300 pstrcpy(st->language, sizeof(st->language), audio_language);
3301 av_free(audio_language);
3302 audio_language = NULL;
3305 /* reset some key parameters */
3307 audio_codec_id = CODEC_ID_NONE;
3308 audio_stream_copy = 0;
3311 static void opt_new_subtitle_stream(void)
3313 AVFormatContext *oc;
3315 AVCodecContext *subtitle_enc;
3318 if (nb_output_files <= 0) {
3319 fprintf(stderr, "At least one output file must be specified\n");
3322 oc = output_files[nb_output_files - 1];
3324 st = av_new_stream(oc, oc->nb_streams);
3326 fprintf(stderr, "Could not alloc stream\n");
3330 subtitle_enc = st->codec;
3331 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3332 if (subtitle_stream_copy) {
3333 st->stream_copy = 1;
3335 for(i=0; i<opt_name_count; i++){
3337 double d= av_get_double(avctx_opts, opt_names[i], &opt);
3338 if(d==d && (opt->flags&AV_OPT_FLAG_SUBTITLE_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3339 av_set_double(subtitle_enc, opt_names[i], d);
3341 subtitle_enc->codec_id = subtitle_codec_id;
3344 if (subtitle_language) {
3345 pstrcpy(st->language, sizeof(st->language), subtitle_language);
3346 av_free(subtitle_language);
3347 subtitle_language = NULL;
3350 subtitle_codec_id = CODEC_ID_NONE;
3351 subtitle_stream_copy = 0;
3354 static void opt_new_audio_stream(void)
3356 AVFormatContext *oc;
3357 if (nb_output_files <= 0) {
3358 fprintf(stderr, "At least one output file must be specified\n");
3361 oc = output_files[nb_output_files - 1];
3362 new_audio_stream(oc);
3365 static void opt_new_video_stream(void)
3367 AVFormatContext *oc;
3368 if (nb_output_files <= 0) {
3369 fprintf(stderr, "At least one output file must be specified\n");
3372 oc = output_files[nb_output_files - 1];
3373 new_video_stream(oc);
3376 static void opt_output_file(const char *filename)
3378 AVFormatContext *oc;
3379 int use_video, use_audio, input_has_video, input_has_audio;
3380 AVFormatParameters params, *ap = ¶ms;
3382 if (!strcmp(filename, "-"))
3385 oc = av_alloc_format_context();
3387 if (!file_oformat) {
3388 file_oformat = guess_format(NULL, filename, NULL);
3389 if (!file_oformat) {
3390 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
3396 oc->oformat = file_oformat;
3397 pstrcpy(oc->filename, sizeof(oc->filename), filename);
3399 if (!strcmp(file_oformat->name, "ffm") &&
3400 strstart(filename, "http:", NULL)) {
3401 /* special case for files sent to ffserver: we get the stream
3402 parameters from ffserver */
3403 if (read_ffserver_streams(oc, filename) < 0) {
3404 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
3408 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_id != CODEC_ID_NONE;
3409 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_id != CODEC_ID_NONE;
3411 /* disable if no corresponding type found and at least one
3413 if (nb_input_files > 0) {
3414 check_audio_video_inputs(&input_has_video, &input_has_audio);
3415 if (!input_has_video)
3417 if (!input_has_audio)
3421 /* manual disable */
3422 if (audio_disable) {
3425 if (video_disable) {
3430 new_video_stream(oc);
3434 new_audio_stream(oc);
3437 if (!oc->nb_streams) {
3438 fprintf(stderr, "No audio or video streams available\n");
3442 oc->timestamp = rec_timestamp;
3445 pstrcpy(oc->title, sizeof(oc->title), str_title);
3447 pstrcpy(oc->author, sizeof(oc->author), str_author);
3449 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3451 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3454 output_files[nb_output_files++] = oc;
3456 /* check filename in case of an image number is expected */
3457 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3458 if (filename_number_test(oc->filename) < 0) {
3459 print_error(oc->filename, AVERROR_NUMEXPECTED);
3464 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3465 /* test if it already exists to avoid loosing precious files */
3466 if (!file_overwrite &&
3467 (strchr(filename, ':') == NULL ||
3468 strstart(filename, "file:", NULL))) {
3469 if (url_exist(filename)) {
3472 if ( !using_stdin ) {
3473 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3476 if (toupper(c) != 'Y') {
3477 fprintf(stderr, "Not overwriting - exiting\n");
3482 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3489 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3490 fprintf(stderr, "Could not open '%s'\n", filename);
3495 memset(ap, 0, sizeof(*ap));
3496 ap->image_format = image_format;
3497 if (av_set_parameters(oc, ap) < 0) {
3498 fprintf(stderr, "%s: Invalid encoding parameters\n",
3503 oc->packet_size= mux_packet_size;
3504 oc->mux_rate= mux_rate;
3505 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3506 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3507 oc->loop_output = loop_output;
3509 /* reset some options */
3510 file_oformat = NULL;
3511 file_iformat = NULL;
3512 image_format = NULL;
3515 /* prepare dummy protocols for grab */
3516 static void prepare_grab(void)
3518 int has_video, has_audio, i, j;
3519 AVFormatContext *oc;
3520 AVFormatContext *ic;
3521 AVFormatParameters vp1, *vp = &vp1;
3522 AVFormatParameters ap1, *ap = &ap1;
3524 /* see if audio/video inputs are needed */
3527 memset(ap, 0, sizeof(*ap));
3528 memset(vp, 0, sizeof(*vp));
3529 vp->time_base.num= 1;
3530 for(j=0;j<nb_output_files;j++) {
3531 oc = output_files[j];
3532 for(i=0;i<oc->nb_streams;i++) {
3533 AVCodecContext *enc = oc->streams[i]->codec;
3534 switch(enc->codec_type) {
3535 case CODEC_TYPE_AUDIO:
3536 if (enc->sample_rate > ap->sample_rate)
3537 ap->sample_rate = enc->sample_rate;
3538 if (enc->channels > ap->channels)
3539 ap->channels = enc->channels;
3542 case CODEC_TYPE_VIDEO:
3543 if (enc->width > vp->width)
3544 vp->width = enc->width;
3545 if (enc->height > vp->height)
3546 vp->height = enc->height;
3548 if (vp->time_base.num*(int64_t)enc->time_base.den > enc->time_base.num*(int64_t)vp->time_base.den){
3549 vp->time_base = enc->time_base;
3559 if (has_video == 0 && has_audio == 0) {
3560 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3565 AVInputFormat *fmt1;
3566 fmt1 = av_find_input_format(video_grab_format);
3567 vp->device = video_device;
3568 vp->channel = video_channel;
3569 vp->standard = video_standard;
3570 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3571 fprintf(stderr, "Could not find video grab device\n");
3574 /* If not enough info to get the stream parameters, we decode the
3575 first frames to get it. */
3576 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3577 fprintf(stderr, "Could not find video grab parameters\n");
3580 /* by now video grab has one stream */
3581 ic->streams[0]->r_frame_rate.num = vp->time_base.den;
3582 ic->streams[0]->r_frame_rate.den = vp->time_base.num;
3583 input_files[nb_input_files] = ic;
3586 dump_format(ic, nb_input_files, "", 0);
3590 if (has_audio && audio_grab_format) {
3591 AVInputFormat *fmt1;
3592 fmt1 = av_find_input_format(audio_grab_format);
3593 ap->device = audio_device;
3594 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3595 fprintf(stderr, "Could not find audio grab device\n");
3598 input_files[nb_input_files] = ic;
3601 dump_format(ic, nb_input_files, "", 0);
3607 /* same option as mencoder */
3608 static void opt_pass(const char *pass_str)
3611 pass = atoi(pass_str);
3612 if (pass != 1 && pass != 2) {
3613 fprintf(stderr, "pass number can be only 1 or 2\n");
3619 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3620 static int64_t getutime(void)
3622 return av_gettime();
3625 static int64_t getutime(void)
3627 struct rusage rusage;
3629 getrusage(RUSAGE_SELF, &rusage);
3630 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3634 extern int ffm_nopts;
3636 static void show_formats(void)
3638 AVInputFormat *ifmt;
3639 AVOutputFormat *ofmt;
3640 AVImageFormat *image_fmt;
3643 const char **pp, *last_name;
3645 printf("File formats:\n");
3650 const char *name=NULL;
3651 const char *long_name=NULL;
3653 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3654 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3655 strcmp(ofmt->name, last_name)>0){
3657 long_name= ofmt->long_name;
3661 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3662 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3663 strcmp(ifmt->name, last_name)>0){
3665 long_name= ifmt->long_name;
3668 if(name && strcmp(ifmt->name, name)==0)
3680 long_name ? long_name:" ");
3684 printf("Image formats (filename extensions, if any, follow):\n");
3685 for(image_fmt = first_image_format; image_fmt != NULL;
3686 image_fmt = image_fmt->next) {
3689 image_fmt->img_read ? "D":" ",
3690 image_fmt->img_write ? "E":" ",
3692 image_fmt->extensions ? image_fmt->extensions:" ");
3696 printf("Codecs:\n");
3702 const char *type_str;
3705 for(p = first_avcodec; p != NULL; p = p->next) {
3706 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3707 strcmp(p->name, last_name)>0){
3709 decode= encode= cap=0;
3711 if(p2 && strcmp(p->name, p2->name)==0){
3712 if(p->decode) decode=1;
3713 if(p->encode) encode=1;
3714 cap |= p->capabilities;
3719 last_name= p2->name;
3722 case CODEC_TYPE_VIDEO:
3725 case CODEC_TYPE_AUDIO:
3728 case CODEC_TYPE_SUBTITLE:
3737 decode ? "D": (/*p2->decoder ? "d":*/" "),
3740 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3741 cap & CODEC_CAP_DR1 ? "D":" ",
3742 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3744 /* if(p2->decoder && decode==0)
3745 printf(" use %s for decoding", p2->decoder->name);*/
3750 printf("Supported file protocols:\n");
3751 for(up = first_protocol; up != NULL; up = up->next)
3752 printf(" %s:", up->name);
3755 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3756 printf("Motion estimation methods:\n");
3760 if ((pp - motion_str + 1) == ME_ZERO)
3761 printf("(fastest)");
3762 else if ((pp - motion_str + 1) == ME_FULL)
3763 printf("(slowest)");
3764 else if ((pp - motion_str + 1) == ME_EPZS)
3765 printf("(default)");
3770 "Note, the names of encoders and decoders dont always match, so there are\n"
3771 "several cases where the above table shows encoder only or decoder only entries\n"
3772 "even though both encoding and decoding are supported for example, the h263\n"
3773 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3778 void parse_matrix_coeffs(uint16_t *dest, const char *str)
3781 const char *p = str;
3788 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3795 void opt_inter_matrix(const char *arg)
3797 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3798 parse_matrix_coeffs(inter_matrix, arg);
3801 void opt_intra_matrix(const char *arg)
3803 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3804 parse_matrix_coeffs(intra_matrix, arg);
3807 static void opt_target(const char *arg)
3810 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3812 if(!strncmp(arg, "pal-", 4)) {
3815 } else if(!strncmp(arg, "ntsc-", 5)) {
3818 } else if(!strncmp(arg, "film-", 5)) {
3823 /* Calculate FR via float to avoid int overflow */
3824 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3827 } else if((fr == 29970) || (fr == 23976)) {
3830 /* Try to determine PAL/NTSC by peeking in the input files */
3831 if(nb_input_files) {
3833 for(j = 0; j < nb_input_files; j++) {
3834 for(i = 0; i < input_files[j]->nb_streams; i++) {
3835 AVCodecContext *c = input_files[j]->streams[i]->codec;
3836 if(c->codec_type != CODEC_TYPE_VIDEO)
3838 fr = c->time_base.den * 1000 / c->time_base.num;
3842 } else if((fr == 29970) || (fr == 23976)) {
3852 if(verbose && norm >= 0)
3853 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3857 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3858 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3859 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3863 if(!strcmp(arg, "vcd")) {
3865 opt_video_codec("mpeg1video");
3866 opt_audio_codec("mp2");
3869 opt_frame_size(norm ? "352x240" : "352x288");
3870 opt_frame_rate(frame_rates[norm]);
3871 opt_gop_size(norm ? "18" : "15");
3873 video_bit_rate = 1150000;
3874 video_rc_max_rate = 1150000;
3875 video_rc_min_rate = 1150000;
3876 video_rc_buffer_size = 40*1024*8;
3878 audio_bit_rate = 224000;
3879 audio_sample_rate = 44100;
3881 mux_packet_size= 2324;
3882 mux_rate= 2352 * 75 * 8;
3884 /* We have to offset the PTS, so that it is consistent with the SCR.
3885 SCR starts at 36000, but the first two packs contain only padding
3886 and the first pack from the other stream, respectively, may also have
3887 been written before.
3888 So the real data starts at SCR 36000+3*1200. */
3889 mux_preload= (36000+3*1200) / 90000.0; //0.44
3890 } else if(!strcmp(arg, "svcd")) {
3892 opt_video_codec("mpeg2video");
3893 opt_audio_codec("mp2");
3896 opt_frame_size(norm ? "480x480" : "480x576");
3897 opt_frame_rate(frame_rates[norm]);
3898 opt_gop_size(norm ? "18" : "15");
3900 video_bit_rate = 2040000;
3901 video_rc_max_rate = 2516000;
3902 video_rc_min_rate = 0; //1145000;
3903 video_rc_buffer_size = 224*1024*8;
3904 opt_default("flags", "+SCAN_OFFSET");
3907 audio_bit_rate = 224000;
3908 audio_sample_rate = 44100;
3910 mux_packet_size= 2324;
3912 } else if(!strcmp(arg, "dvd")) {
3914 opt_video_codec("mpeg2video");
3915 opt_audio_codec("ac3");
3918 opt_frame_size(norm ? "720x480" : "720x576");
3919 opt_frame_rate(frame_rates[norm]);
3920 opt_gop_size(norm ? "18" : "15");
3922 video_bit_rate = 6000000;
3923 video_rc_max_rate = 9000000;
3924 video_rc_min_rate = 0; //1500000;
3925 video_rc_buffer_size = 224*1024*8;
3927 mux_packet_size= 2048; // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3928 mux_rate = 10080000; // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3930 audio_bit_rate = 448000;
3931 audio_sample_rate = 48000;
3933 } else if(!strcmp(arg, "dv")) {
3937 opt_frame_size(norm ? "720x480" : "720x576");
3938 opt_frame_rate(frame_rates[norm]);
3940 audio_sample_rate = 48000;
3944 fprintf(stderr, "Unknown target: %s\n", arg);
3949 static void show_version(void)
3951 fprintf(stderr, "ffmpeg " FFMPEG_VERSION "\n"
3954 avcodec_build(), LIBAVFORMAT_BUILD);
3958 static int opt_default(const char *opt, const char *arg){
3959 AVOption *o= av_set_string(avctx_opts, opt, arg);
3963 // av_log(NULL, AV_LOG_ERROR, "%s:%s: %f 0x%0X\n", opt, arg, av_get_double(avctx_opts, opt, NULL), (int)av_get_int(avctx_opts, opt, NULL));
3965 //FIXME we should always use avctx_opts, ... for storing options so there wont be any need to keep track of whats set over this
3966 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
3967 opt_names[opt_name_count++]= o->name;
3969 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3970 if(avctx_opts->flags & CODEC_FLAG_BITEXACT)
3973 if(avctx_opts->debug)
3974 av_log_set_level(AV_LOG_DEBUG);
3978 const OptionDef options[] = {
3980 { "L", 0, {(void*)show_license}, "show license" },
3981 { "h", 0, {(void*)show_help}, "show help" },
3982 { "version", 0, {(void*)show_version}, "show version" },
3983 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3984 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3985 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
3986 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3987 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3988 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3989 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3990 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3991 { "fs", HAS_ARG | OPT_INT, {(void*)&limit_filesize}, "set the limit file size", "limit_size" }, //
3992 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3993 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3994 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3995 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3996 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3997 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3998 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3999 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4000 "add timings for benchmarking" },
4001 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4002 "dump each input packet" },
4003 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4004 "when dumping packets, also dump the payload" },
4005 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4006 { "loop", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4007 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "number of times to loop output in formats that support looping (0 loops forever)", "" },
4008 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
4009 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4010 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4011 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4012 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4013 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4014 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4015 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4018 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
4019 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4020 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4021 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
4022 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4023 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4024 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4025 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
4026 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
4027 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
4028 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
4029 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
4030 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
4031 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
4032 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
4033 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
4034 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
4035 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
4036 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4037 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4038 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4039 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
4040 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
4041 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
4042 { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
4043 { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
4044 { "mblmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmin}, "min macroblock quantiser scale (VBR)", "q" },
4045 { "mblmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmax}, "max macroblock quantiser scale (VBR)", "q" },
4046 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
4047 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
4048 { "qsquish", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qsquish}, "how to keep quantiser between qmin and qmax (0 = clip, 1 = use differentiable function)", "squish" },
4049 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
4050 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
4051 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
4052 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
4053 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
4054 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
4055 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
4056 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
4057 { "b_strategy", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&b_strategy}, "dynamic b frame selection strategy", "strategy" },
4058 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
4059 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4060 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
4061 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
4062 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
4063 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffer size (in kByte)", "size" },
4064 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4065 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
4067 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
4068 { "mb_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_threshold}, "macroblock threshold", "" },
4069 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
4070 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
4071 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
4072 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
4073 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
4074 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
4075 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4076 "use same video quality as source (implies VBR)" },
4077 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4078 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
4079 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4080 "deinterlace pictures" },
4081 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4082 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
4083 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
4084 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4085 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4086 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4087 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
4088 { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
4089 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4090 { "mepc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&me_penalty_compensation}, "motion estimation bitrate penalty compensation", "factor (1.0 = 256)" },
4091 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4092 { "skip_threshold", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_threshold}, "frame skip threshold", "threshold" },
4093 { "skip_factor", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_factor}, "frame skip factor", "factor" },
4094 { "skip_exp", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_exp}, "frame skip exponent", "exponent" },
4095 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
4096 { "genpts", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&genpts }, "generate pts" },
4099 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
4100 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4101 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4102 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4103 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4104 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4105 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4106 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4107 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
4108 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4110 /* subtitle options */
4111 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4112 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
4113 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4116 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
4117 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4118 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4119 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
4121 /* G.2 grab options */
4122 { "grab", HAS_ARG | OPT_EXPERT | OPT_GRAB, {(void*)opt_grab}, "request grabbing using", "format" },
4123 { "gd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_grab_device}, "set grab device", "device" },
4126 { "muxrate", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_rate}, "set mux rate", "rate" },
4127 { "packetsize", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_packet_size}, "set packet size", "size" },
4128 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4129 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4130 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4134 static void show_banner(void)
4136 fprintf(stderr, "ffmpeg version " FFMPEG_VERSION ", build %d, Copyright (c) 2000-2004 Fabrice Bellard\n",
4138 fprintf(stderr, " configuration: %s\n", FFMPEG_CONFIGURATION);
4139 fprintf(stderr, " built on " __DATE__ " " __TIME__);
4141 fprintf(stderr, ", gcc: %s\n", __VERSION__);
4143 fprintf(stderr, ", using a non-gcc compiler\n");
4147 static void show_license(void)
4152 "This program is free software; you can redistribute it and/or modify\n"
4153 "it under the terms of the GNU General Public License as published by\n"
4154 "the Free Software Foundation; either version 2 of the License, or\n"
4155 "(at your option) any later version.\n"
4157 "This program is distributed in the hope that it will be useful,\n"
4158 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
4159 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
4160 "GNU General Public License for more details.\n"
4162 "You should have received a copy of the GNU General Public License\n"
4163 "along with this program; if not, write to the Free Software\n"
4164 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
4168 "This library is free software; you can redistribute it and/or\n"
4169 "modify it under the terms of the GNU Lesser General Public\n"
4170 "License as published by the Free Software Foundation; either\n"
4171 "version 2 of the License, or (at your option) any later version.\n"
4173 "This library is distributed in the hope that it will be useful,\n"
4174 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
4175 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
4176 "Lesser General Public License for more details.\n"
4178 "You should have received a copy of the GNU Lesser General Public\n"
4179 "License along with this library; if not, write to the Free Software\n"
4180 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
4186 static void show_help(void)
4189 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
4190 "Hyper fast Audio and Video encoder\n");
4192 show_help_options(options, "Main options:\n",
4193 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
4194 show_help_options(options, "\nVideo options:\n",
4195 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4197 show_help_options(options, "\nAdvanced Video options:\n",
4198 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4199 OPT_VIDEO | OPT_EXPERT);
4200 show_help_options(options, "\nAudio options:\n",
4201 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4203 show_help_options(options, "\nAdvanced Audio options:\n",
4204 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4205 OPT_AUDIO | OPT_EXPERT);
4206 show_help_options(options, "\nSubtitle options:\n",
4207 OPT_SUBTITLE | OPT_GRAB,
4209 show_help_options(options, "\nAudio/Video grab options:\n",
4212 show_help_options(options, "\nAdvanced options:\n",
4213 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4215 av_opt_show(avctx_opts, NULL);
4220 void parse_arg_file(const char *filename)
4222 opt_output_file(filename);
4225 int main(int argc, char **argv)
4232 avctx_opts= avcodec_alloc_context();
4240 parse_options(argc, argv, options);
4242 /* file converter / grab */
4243 if (nb_output_files <= 0) {
4244 fprintf(stderr, "Must supply at least one output file\n");
4248 if (nb_input_files == 0) {
4254 av_encode(output_files, nb_output_files, input_files, nb_input_files,
4255 stream_maps, nb_stream_maps);
4256 ti = getutime() - ti;
4258 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
4262 for(i=0;i<nb_output_files;i++) {
4263 /* maybe av_close_output_file ??? */
4264 AVFormatContext *s = output_files[i];
4266 if (!(s->oformat->flags & AVFMT_NOFILE))
4268 for(j=0;j<s->nb_streams;j++)
4269 av_free(s->streams[j]);
4272 for(i=0;i<nb_input_files;i++)
4273 av_close_input_file(input_files[i]);
4278 av_free(intra_matrix);
4280 av_free(inter_matrix);
4282 #ifdef POWERPC_PERFORMANCE_REPORT
4283 extern void powerpc_display_perf_report(void);
4284 powerpc_display_perf_report();
4285 #endif /* POWERPC_PERFORMANCE_REPORT */
4287 #ifndef CONFIG_WIN32
4288 if (received_sigterm) {
4290 "Received signal %d: terminating.\n",
4291 (int) received_sigterm);
4295 exit(0); /* not all OS-es handle main() return value */