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 // FIXME: a more elegant solution is needed
424 st = av_mallocz(sizeof(AVStream));
425 memcpy(st, ic->streams[i], sizeof(AVStream));
426 st->codec = avcodec_alloc_context();
427 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
431 av_close_input_file(ic);
436 get_sync_ipts(const AVOutputStream *ost)
438 const AVInputStream *ist = ost->sync_ist;
439 return (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/AV_TIME_BASE;
442 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
444 static void do_audio_out(AVFormatContext *s,
447 unsigned char *buf, int size)
450 static uint8_t *audio_buf = NULL;
451 static uint8_t *audio_out = NULL;
452 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
454 int size_out, frame_bytes, ret;
455 AVCodecContext *enc= ost->st->codec;
457 /* SC: dynamic allocation of buffers */
459 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
461 audio_out = av_malloc(audio_out_size);
462 if (!audio_buf || !audio_out)
463 return; /* Should signal an error ! */
465 if(audio_sync_method){
466 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
467 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec->channels * 2);
468 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
469 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
471 //FIXME resample delay
472 if(fabs(delta) > 50){
475 byte_delta= FFMAX(byte_delta, -size);
479 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
484 static uint8_t *input_tmp= NULL;
485 input_tmp= av_realloc(input_tmp, byte_delta + size);
487 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
490 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
492 memset(input_tmp, 0, byte_delta);
493 memcpy(input_tmp + byte_delta, buf, size);
497 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
499 }else if(audio_sync_method>1){
500 int comp= clip(delta, -audio_sync_method, audio_sync_method);
501 assert(ost->audio_resample);
503 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
504 // 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));
505 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
509 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
510 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec->channels * 2); //FIXME wrong
512 if (ost->audio_resample) {
514 size_out = audio_resample(ost->resample,
515 (short *)buftmp, (short *)buf,
516 size / (ist->st->codec->channels * 2));
517 size_out = size_out * enc->channels * 2;
523 /* now encode as many frames as possible */
524 if (enc->frame_size > 1) {
525 /* output resampled raw samples */
526 fifo_write(&ost->fifo, buftmp, size_out,
529 frame_bytes = enc->frame_size * 2 * enc->channels;
531 while (fifo_read(&ost->fifo, audio_buf, frame_bytes,
532 &ost->fifo.rptr) == 0) {
534 av_init_packet(&pkt);
536 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
539 pkt.stream_index= ost->index;
542 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
543 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
544 pkt.flags |= PKT_FLAG_KEY;
545 av_interleaved_write_frame(s, &pkt);
547 ost->sync_opts += enc->frame_size;
551 av_init_packet(&pkt);
553 ost->sync_opts += size_out / (2 * enc->channels);
555 /* output a pcm frame */
556 /* XXX: change encoding codec API to avoid this ? */
557 switch(enc->codec->id) {
558 case CODEC_ID_PCM_S32LE:
559 case CODEC_ID_PCM_S32BE:
560 case CODEC_ID_PCM_U32LE:
561 case CODEC_ID_PCM_U32BE:
562 size_out = size_out << 1;
564 case CODEC_ID_PCM_S24LE:
565 case CODEC_ID_PCM_S24BE:
566 case CODEC_ID_PCM_U24LE:
567 case CODEC_ID_PCM_U24BE:
568 case CODEC_ID_PCM_S24DAUD:
569 size_out = size_out / 2 * 3;
571 case CODEC_ID_PCM_S16LE:
572 case CODEC_ID_PCM_S16BE:
573 case CODEC_ID_PCM_U16LE:
574 case CODEC_ID_PCM_U16BE:
577 size_out = size_out >> 1;
580 ret = avcodec_encode_audio(enc, audio_out, size_out,
583 pkt.stream_index= ost->index;
586 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
587 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
588 pkt.flags |= PKT_FLAG_KEY;
589 av_interleaved_write_frame(s, &pkt);
593 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
597 AVPicture picture_tmp;
600 dec = ist->st->codec;
602 /* deinterlace : must be done before any resize */
603 if (do_deinterlace || using_vhook) {
606 /* create temporary picture */
607 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
608 buf = av_malloc(size);
612 picture2 = &picture_tmp;
613 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
616 if(avpicture_deinterlace(picture2, picture,
617 dec->pix_fmt, dec->width, dec->height) < 0) {
618 /* if error, do not deinterlace */
624 if (img_convert(picture2, dec->pix_fmt, picture,
625 dec->pix_fmt, dec->width, dec->height) < 0) {
626 /* if error, do not copy */
636 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
638 if (picture != picture2)
639 *picture = *picture2;
643 /* we begin to correct av delay at this threshold */
644 #define AV_DELAY_MAX 0.100
647 /* Expects img to be yuv420 */
648 static void fill_pad_region(AVPicture* img, int height, int width,
649 int padtop, int padbottom, int padleft, int padright, int *color) {
654 for (i = 0; i < 3; i++) {
655 shift = (i == 0) ? 0 : 1;
657 if (padtop || padleft) {
658 memset(img->data[i], color[i], (((img->linesize[i] * padtop) +
662 if (padleft || padright) {
663 optr = img->data[i] + (img->linesize[i] * (padtop >> shift)) +
664 (img->linesize[i] - (padright >> shift));
666 for (y = 0; y < ((height - (padtop + padbottom) - 1) >> shift); y++) {
667 memset(optr, color[i], (padleft + padright) >> shift);
668 optr += img->linesize[i];
672 if (padbottom || padright) {
673 optr = img->data[i] + (((img->linesize[i] * (height - padbottom)) - padright) >> shift);
674 memset(optr, color[i], (((img->linesize[i] * padbottom) + padright) >> shift));
679 static void do_subtitle_out(AVFormatContext *s,
685 static uint8_t *subtitle_out = NULL;
686 int subtitle_out_max_size = 65536;
687 int subtitle_out_size, nb, i;
691 if (pts == AV_NOPTS_VALUE) {
692 fprintf(stderr, "Subtitle packets must have a pts\n");
696 enc = ost->st->codec;
699 subtitle_out = av_malloc(subtitle_out_max_size);
702 /* Note: DVB subtitle need one packet to draw them and one other
703 packet to clear them */
704 /* XXX: signal it in the codec context ? */
705 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
710 for(i = 0; i < nb; i++) {
711 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
712 subtitle_out_max_size, sub);
714 av_init_packet(&pkt);
715 pkt.stream_index = ost->index;
716 pkt.data = subtitle_out;
717 pkt.size = subtitle_out_size;
718 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);
719 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
720 /* XXX: the pts correction is handled here. Maybe handling
721 it in the codec would be better */
723 pkt.pts += 90 * sub->start_display_time;
725 pkt.pts += 90 * sub->end_display_time;
727 av_interleaved_write_frame(s, &pkt);
731 static int bit_buffer_size= 1024*256;
732 static uint8_t *bit_buffer= NULL;
734 static void do_video_out(AVFormatContext *s,
740 int nb_frames, i, ret;
741 AVFrame *final_picture, *formatted_picture;
742 AVFrame picture_format_temp, picture_crop_temp;
743 uint8_t *buf = NULL, *buf1 = NULL;
744 AVCodecContext *enc, *dec;
745 enum PixelFormat target_pixfmt;
747 avcodec_get_frame_defaults(&picture_format_temp);
748 avcodec_get_frame_defaults(&picture_crop_temp);
750 enc = ost->st->codec;
751 dec = ist->st->codec;
753 /* by default, we output a single frame */
758 if(video_sync_method){
760 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
761 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
764 else if (vdelta > 1.1)
765 nb_frames = lrintf(vdelta);
766 //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);
770 fprintf(stderr, "*** drop!\n");
771 }else if (nb_frames > 1) {
772 nb_frames_dup += nb_frames;
774 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
777 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
779 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
783 /* convert pixel format if needed */
784 target_pixfmt = ost->video_resample || ost->video_pad
785 ? PIX_FMT_YUV420P : enc->pix_fmt;
786 if (dec->pix_fmt != target_pixfmt) {
789 /* create temporary picture */
790 size = avpicture_get_size(target_pixfmt, dec->width, dec->height);
791 buf = av_malloc(size);
794 formatted_picture = &picture_format_temp;
795 avpicture_fill((AVPicture*)formatted_picture, buf, target_pixfmt, dec->width, dec->height);
797 if (img_convert((AVPicture*)formatted_picture, target_pixfmt,
798 (AVPicture *)in_picture, dec->pix_fmt,
799 dec->width, dec->height) < 0) {
802 fprintf(stderr, "pixel format conversion not handled\n");
807 formatted_picture = in_picture;
810 /* XXX: resampling could be done before raw format conversion in
811 some cases to go faster */
812 /* XXX: only works for YUV420P */
813 if (ost->video_resample) {
814 final_picture = &ost->pict_tmp;
815 img_resample(ost->img_resample_ctx, (AVPicture*)final_picture, (AVPicture*)formatted_picture);
817 if (ost->padtop || ost->padbottom || ost->padleft || ost->padright) {
818 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
819 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
823 if (enc->pix_fmt != PIX_FMT_YUV420P) {
827 /* create temporary picture */
828 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
829 buf = av_malloc(size);
832 final_picture = &picture_format_temp;
833 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
835 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
836 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
837 enc->width, enc->height) < 0) {
840 fprintf(stderr, "pixel format conversion not handled\n");
845 } else if (ost->video_crop) {
846 picture_crop_temp.data[0] = formatted_picture->data[0] +
847 (ost->topBand * formatted_picture->linesize[0]) + ost->leftBand;
849 picture_crop_temp.data[1] = formatted_picture->data[1] +
850 ((ost->topBand >> 1) * formatted_picture->linesize[1]) +
851 (ost->leftBand >> 1);
853 picture_crop_temp.data[2] = formatted_picture->data[2] +
854 ((ost->topBand >> 1) * formatted_picture->linesize[2]) +
855 (ost->leftBand >> 1);
857 picture_crop_temp.linesize[0] = formatted_picture->linesize[0];
858 picture_crop_temp.linesize[1] = formatted_picture->linesize[1];
859 picture_crop_temp.linesize[2] = formatted_picture->linesize[2];
860 final_picture = &picture_crop_temp;
861 } else if (ost->video_pad) {
862 final_picture = &ost->pict_tmp;
864 for (i = 0; i < 3; i++) {
865 uint8_t *optr, *iptr;
866 int shift = (i == 0) ? 0 : 1;
869 /* set offset to start writing image into */
870 optr = final_picture->data[i] + (((final_picture->linesize[i] *
871 ost->padtop) + ost->padleft) >> shift);
872 iptr = formatted_picture->data[i];
874 yheight = (enc->height - ost->padtop - ost->padbottom) >> shift;
875 for (y = 0; y < yheight; y++) {
876 /* copy unpadded image row into padded image row */
877 memcpy(optr, iptr, formatted_picture->linesize[i]);
878 optr += final_picture->linesize[i];
879 iptr += formatted_picture->linesize[i];
883 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
884 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
887 if (enc->pix_fmt != PIX_FMT_YUV420P) {
891 /* create temporary picture */
892 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
893 buf = av_malloc(size);
896 final_picture = &picture_format_temp;
897 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
899 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
900 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
901 enc->width, enc->height) < 0) {
904 fprintf(stderr, "pixel format conversion not handled\n");
910 final_picture = formatted_picture;
912 /* duplicates frame if needed */
913 for(i=0;i<nb_frames;i++) {
915 av_init_packet(&pkt);
916 pkt.stream_index= ost->index;
918 if (s->oformat->flags & AVFMT_RAWPICTURE) {
919 /* raw pictures are written as AVPicture structure to
920 avoid any copies. We support temorarily the older
922 AVFrame* old_frame = enc->coded_frame;
923 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
924 pkt.data= (uint8_t *)final_picture;
925 pkt.size= sizeof(AVPicture);
926 if(dec->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
927 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
928 if(dec->coded_frame && dec->coded_frame->key_frame)
929 pkt.flags |= PKT_FLAG_KEY;
931 av_interleaved_write_frame(s, &pkt);
932 enc->coded_frame = old_frame;
936 big_picture= *final_picture;
937 /* better than nothing: use input picture interlaced
939 big_picture.interlaced_frame = in_picture->interlaced_frame;
940 if(avctx_opts->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
941 if(top_field_first == -1)
942 big_picture.top_field_first = in_picture->top_field_first;
944 big_picture.top_field_first = top_field_first;
947 /* handles sameq here. This is not correct because it may
948 not be a global option */
950 big_picture.quality = ist->st->quality;
952 big_picture.quality = ost->st->quality;
954 big_picture.pict_type = 0;
955 // big_picture.pts = AV_NOPTS_VALUE;
956 big_picture.pts= ost->sync_opts;
957 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
958 //av_log(NULL, AV_LOG_DEBUG, "%lld -> encoder\n", ost->sync_opts);
959 ret = avcodec_encode_video(enc,
960 bit_buffer, bit_buffer_size,
962 //enc->frame_number = enc->real_pict_num;
964 pkt.data= bit_buffer;
966 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
967 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
968 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %lld/%lld\n",
969 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
970 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
972 if(enc->coded_frame && enc->coded_frame->key_frame)
973 pkt.flags |= PKT_FLAG_KEY;
974 av_interleaved_write_frame(s, &pkt);
976 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
977 // enc->frame_number-1, enc->real_pict_num, ret,
979 /* if two pass, output log */
980 if (ost->logfile && enc->stats_out) {
981 fprintf(ost->logfile, "%s", enc->stats_out);
993 static double psnr(double d){
994 if(d==0) return INFINITY;
995 return -10.0*log(d)/log(10.0);
998 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1001 static FILE *fvstats=NULL;
1005 AVCodecContext *enc;
1008 double ti1, bitrate, avg_bitrate;
1011 today2 = time(NULL);
1012 today = localtime(&today2);
1013 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour,
1016 fvstats = fopen(filename,"w");
1024 enc = ost->st->codec;
1025 if (enc->codec_type == CODEC_TYPE_VIDEO) {
1026 frame_number = ost->frame_number;
1027 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1028 if (enc->flags&CODEC_FLAG_PSNR)
1029 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1031 fprintf(fvstats,"f_size= %6d ", frame_size);
1032 /* compute pts value */
1033 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1037 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1038 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1039 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1040 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1041 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1045 static void print_report(AVFormatContext **output_files,
1046 AVOutputStream **ost_table, int nb_ostreams,
1050 AVOutputStream *ost;
1051 AVFormatContext *oc, *os;
1053 AVCodecContext *enc;
1054 int frame_number, vid, i;
1055 double bitrate, ti1, pts;
1056 static int64_t last_time = -1;
1058 if (!is_last_report) {
1060 /* display the report every 0.5 seconds */
1061 cur_time = av_gettime();
1062 if (last_time == -1) {
1063 last_time = cur_time;
1066 if ((cur_time - last_time) < 500000)
1068 last_time = cur_time;
1072 oc = output_files[0];
1074 total_size = url_ftell(&oc->pb);
1079 for(i=0;i<nb_ostreams;i++) {
1081 os = output_files[ost->file_index];
1082 enc = ost->st->codec;
1083 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1084 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1085 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1087 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1088 frame_number = ost->frame_number;
1089 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d q=%2.1f ",
1090 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : 0);
1092 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1093 if (enc->flags&CODEC_FLAG_PSNR){
1095 double error, error_sum=0;
1096 double scale, scale_sum=0;
1097 char type[3]= {'Y','U','V'};
1098 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1101 error= enc->error[j];
1102 scale= enc->width*enc->height*255.0*255.0*frame_number;
1104 error= enc->coded_frame->error[j];
1105 scale= enc->width*enc->height*255.0*255.0;
1110 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1112 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1116 /* compute min output value */
1117 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1118 if ((pts < ti1) && (pts > 0))
1124 if (verbose || is_last_report) {
1125 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1127 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1128 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
1129 (double)total_size / 1024, ti1, bitrate);
1132 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1133 nb_frames_dup, nb_frames_drop);
1136 fprintf(stderr, "%s \r", buf);
1141 if (is_last_report && verbose >= 0){
1142 int64_t raw= audio_size + video_size + extra_size;
1143 fprintf(stderr, "\n");
1144 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1148 100.0*(total_size - raw)/raw
1153 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1154 static int output_packet(AVInputStream *ist, int ist_index,
1155 AVOutputStream **ost_table, int nb_ostreams,
1156 const AVPacket *pkt)
1158 AVFormatContext *os;
1159 AVOutputStream *ost;
1163 int data_size, got_picture;
1165 void *buffer_to_free;
1166 static int samples_size= 0;
1167 static short *samples= NULL;
1168 AVSubtitle subtitle, *subtitle_to_free;
1172 ist->pts= ist->next_pts; // needed for last packet if vsync=0
1173 } else if (pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1174 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1176 // assert(ist->pts == ist->next_pts);
1190 /* decode the packet if needed */
1191 data_buf = NULL; /* fail safe */
1193 subtitle_to_free = NULL;
1194 if (ist->decoding_needed) {
1195 switch(ist->st->codec->codec_type) {
1196 case CODEC_TYPE_AUDIO:{
1198 samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE));
1199 /* XXX: could avoid copy if PCM 16 bits with same
1200 endianness as CPU */
1201 ret = avcodec_decode_audio(ist->st->codec, samples, &data_size,
1207 /* Some bug in mpeg audio decoder gives */
1208 /* data_size < 0, it seems they are overflows */
1209 if (data_size <= 0) {
1210 /* no audio frame */
1213 data_buf = (uint8_t *)samples;
1214 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1215 (ist->st->codec->sample_rate * ist->st->codec->channels);
1217 case CODEC_TYPE_VIDEO:
1218 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1219 /* XXX: allocate picture correctly */
1220 avcodec_get_frame_defaults(&picture);
1222 ret = avcodec_decode_video(ist->st->codec,
1223 &picture, &got_picture, ptr, len);
1224 ist->st->quality= picture.quality;
1228 /* no picture yet */
1229 goto discard_packet;
1231 if (ist->st->codec->time_base.num != 0) {
1232 ist->next_pts += ((int64_t)AV_TIME_BASE *
1233 ist->st->codec->time_base.num) /
1234 ist->st->codec->time_base.den;
1238 case CODEC_TYPE_SUBTITLE:
1239 ret = avcodec_decode_subtitle(ist->st->codec,
1240 &subtitle, &got_subtitle, ptr, len);
1243 if (!got_subtitle) {
1244 goto discard_packet;
1246 subtitle_to_free = &subtitle;
1253 switch(ist->st->codec->codec_type) {
1254 case CODEC_TYPE_AUDIO:
1255 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1256 (ist->st->codec->sample_rate * ist->st->codec->channels);
1258 case CODEC_TYPE_VIDEO:
1259 if (ist->st->codec->time_base.num != 0) {
1260 ist->next_pts += ((int64_t)AV_TIME_BASE *
1261 ist->st->codec->time_base.num) /
1262 ist->st->codec->time_base.den;
1272 buffer_to_free = NULL;
1273 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1274 pre_process_video_frame(ist, (AVPicture *)&picture,
1278 // preprocess audio (volume)
1279 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1280 if (audio_volume != 256) {
1283 for(i=0;i<(data_size / sizeof(short));i++) {
1284 int v = ((*volp) * audio_volume + 128) >> 8;
1285 if (v < -32768) v = -32768;
1286 if (v > 32767) v = 32767;
1292 /* frame rate emulation */
1293 if (ist->st->codec->rate_emu) {
1294 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
1295 int64_t now = av_gettime() - ist->start;
1303 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1304 is the one of the next displayed one */
1305 /* XXX: add mpeg4 too ? */
1306 if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
1307 if (ist->st->codec->pict_type != B_TYPE) {
1309 tmp = ist->last_ip_pts;
1310 ist->last_ip_pts = ist->frac_pts.val;
1311 ist->frac_pts.val = tmp;
1315 /* if output time reached then transcode raw format,
1316 encode packets and output them */
1317 if (start_time == 0 || ist->pts >= start_time)
1318 for(i=0;i<nb_ostreams;i++) {
1322 if (ost->source_index == ist_index) {
1323 os = output_files[ost->file_index];
1326 printf("%d: got pts=%0.3f %0.3f\n", i,
1327 (double)pkt->pts / AV_TIME_BASE,
1328 ((double)ist->pts / AV_TIME_BASE) -
1329 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1331 /* set the input output pts pairs */
1332 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1334 if (ost->encoding_needed) {
1335 switch(ost->st->codec->codec_type) {
1336 case CODEC_TYPE_AUDIO:
1337 do_audio_out(os, ost, ist, data_buf, data_size);
1339 case CODEC_TYPE_VIDEO:
1340 do_video_out(os, ost, ist, &picture, &frame_size);
1341 video_size += frame_size;
1342 if (do_vstats && frame_size)
1343 do_video_stats(os, ost, frame_size);
1345 case CODEC_TYPE_SUBTITLE:
1346 do_subtitle_out(os, ost, ist, &subtitle,
1353 AVFrame avframe; //FIXME/XXX remove this
1355 av_init_packet(&opkt);
1357 /* no reencoding needed : output the packet directly */
1358 /* force the input stream PTS */
1360 avcodec_get_frame_defaults(&avframe);
1361 ost->st->codec->coded_frame= &avframe;
1362 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1364 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1365 audio_size += data_size;
1366 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1367 video_size += data_size;
1371 opkt.stream_index= ost->index;
1372 if(pkt->pts != AV_NOPTS_VALUE)
1373 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);
1375 opkt.pts= AV_NOPTS_VALUE;
1379 if (pkt->dts == AV_NOPTS_VALUE)
1380 dts = ist->next_pts;
1382 dts= av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1383 opkt.dts= av_rescale_q(dts + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
1385 opkt.flags= pkt->flags;
1386 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1387 opkt.destruct= av_destruct_packet;
1388 av_interleaved_write_frame(os, &opkt);
1389 ost->st->codec->frame_number++;
1390 ost->frame_number++;
1391 av_free_packet(&opkt);
1395 av_free(buffer_to_free);
1396 /* XXX: allocate the subtitles in the codec ? */
1397 if (subtitle_to_free) {
1398 if (subtitle_to_free->rects != NULL) {
1399 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1400 av_free(subtitle_to_free->rects[i].bitmap);
1401 av_free(subtitle_to_free->rects[i].rgba_palette);
1403 av_freep(&subtitle_to_free->rects);
1405 subtitle_to_free->num_rects = 0;
1406 subtitle_to_free = NULL;
1413 for(i=0;i<nb_ostreams;i++) {
1415 if (ost->source_index == ist_index) {
1416 AVCodecContext *enc= ost->st->codec;
1417 os = output_files[ost->file_index];
1419 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1421 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1424 if (ost->encoding_needed) {
1427 av_init_packet(&pkt);
1428 pkt.stream_index= ost->index;
1430 switch(ost->st->codec->codec_type) {
1431 case CODEC_TYPE_AUDIO:
1432 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1434 pkt.flags |= PKT_FLAG_KEY;
1436 case CODEC_TYPE_VIDEO:
1437 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1439 if(enc->coded_frame && enc->coded_frame->key_frame)
1440 pkt.flags |= PKT_FLAG_KEY;
1441 if (ost->logfile && enc->stats_out) {
1442 fprintf(ost->logfile, "%s", enc->stats_out);
1451 pkt.data= bit_buffer;
1453 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1454 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1455 av_interleaved_write_frame(os, &pkt);
1469 * The following code is the main loop of the file converter
1471 static int av_encode(AVFormatContext **output_files,
1472 int nb_output_files,
1473 AVFormatContext **input_files,
1475 AVStreamMap *stream_maps, int nb_stream_maps)
1477 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1478 AVFormatContext *is, *os;
1479 AVCodecContext *codec, *icodec;
1480 AVOutputStream *ost, **ost_table = NULL;
1481 AVInputStream *ist, **ist_table = NULL;
1482 AVInputFile *file_table;
1483 AVFormatContext *stream_no_data;
1486 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1490 /* input stream init */
1492 for(i=0;i<nb_input_files;i++) {
1493 is = input_files[i];
1494 file_table[i].ist_index = j;
1495 file_table[i].nb_streams = is->nb_streams;
1496 j += is->nb_streams;
1500 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1504 for(i=0;i<nb_istreams;i++) {
1505 ist = av_mallocz(sizeof(AVInputStream));
1511 for(i=0;i<nb_input_files;i++) {
1512 is = input_files[i];
1513 for(k=0;k<is->nb_streams;k++) {
1514 ist = ist_table[j++];
1515 ist->st = is->streams[k];
1516 ist->file_index = i;
1518 ist->discard = 1; /* the stream is discarded by default
1521 if (ist->st->codec->rate_emu) {
1522 ist->start = av_gettime();
1528 /* output stream init */
1530 for(i=0;i<nb_output_files;i++) {
1531 os = output_files[i];
1532 nb_ostreams += os->nb_streams;
1534 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1535 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1539 /* Sanity check the mapping args -- do the input files & streams exist? */
1540 for(i=0;i<nb_stream_maps;i++) {
1541 int fi = stream_maps[i].file_index;
1542 int si = stream_maps[i].stream_index;
1544 if (fi < 0 || fi > nb_input_files - 1 ||
1545 si < 0 || si > file_table[fi].nb_streams - 1) {
1546 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1549 fi = stream_maps[i].sync_file_index;
1550 si = stream_maps[i].sync_stream_index;
1551 if (fi < 0 || fi > nb_input_files - 1 ||
1552 si < 0 || si > file_table[fi].nb_streams - 1) {
1553 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1558 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1561 for(i=0;i<nb_ostreams;i++) {
1562 ost = av_mallocz(sizeof(AVOutputStream));
1569 for(k=0;k<nb_output_files;k++) {
1570 os = output_files[k];
1571 for(i=0;i<os->nb_streams;i++) {
1573 ost = ost_table[n++];
1574 ost->file_index = k;
1576 ost->st = os->streams[i];
1577 if (nb_stream_maps > 0) {
1578 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1579 stream_maps[n-1].stream_index;
1581 /* Sanity check that the stream types match */
1582 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1583 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1584 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1585 ost->file_index, ost->index);
1590 /* get corresponding input stream index : we select the first one with the right type */
1592 for(j=0;j<nb_istreams;j++) {
1595 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1596 ost->source_index = j;
1603 /* try again and reuse existing stream */
1604 for(j=0;j<nb_istreams;j++) {
1606 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1607 ost->source_index = j;
1612 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1613 ost->file_index, ost->index);
1618 ist = ist_table[ost->source_index];
1620 ost->sync_ist = (nb_stream_maps > 0) ?
1621 ist_table[file_table[stream_maps[n-1].sync_file_index].ist_index +
1622 stream_maps[n-1].sync_stream_index] : ist;
1626 /* for each output stream, we compute the right encoding parameters */
1627 for(i=0;i<nb_ostreams;i++) {
1629 ist = ist_table[ost->source_index];
1631 codec = ost->st->codec;
1632 icodec = ist->st->codec;
1634 if (ost->st->stream_copy) {
1635 /* if stream_copy is selected, no need to decode or encode */
1636 codec->codec_id = icodec->codec_id;
1637 codec->codec_type = icodec->codec_type;
1638 if(!codec->codec_tag) codec->codec_tag = icodec->codec_tag;
1639 codec->bit_rate = icodec->bit_rate;
1640 codec->extradata= icodec->extradata;
1641 codec->extradata_size= icodec->extradata_size;
1642 codec->time_base = icodec->time_base;
1643 switch(codec->codec_type) {
1644 case CODEC_TYPE_AUDIO:
1645 codec->sample_rate = icodec->sample_rate;
1646 codec->channels = icodec->channels;
1647 codec->frame_size = icodec->frame_size;
1648 codec->block_align= icodec->block_align;
1650 case CODEC_TYPE_VIDEO:
1651 codec->width = icodec->width;
1652 codec->height = icodec->height;
1653 codec->has_b_frames = icodec->has_b_frames;
1655 case CODEC_TYPE_SUBTITLE:
1661 switch(codec->codec_type) {
1662 case CODEC_TYPE_AUDIO:
1663 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1666 if (codec->channels == icodec->channels &&
1667 codec->sample_rate == icodec->sample_rate) {
1668 ost->audio_resample = 0;
1670 if (codec->channels != icodec->channels &&
1671 (icodec->codec_id == CODEC_ID_AC3 ||
1672 icodec->codec_id == CODEC_ID_DTS)) {
1673 /* Special case for 5:1 AC3 and DTS input */
1674 /* and mono or stereo output */
1675 /* Request specific number of channels */
1676 icodec->channels = codec->channels;
1677 if (codec->sample_rate == icodec->sample_rate)
1678 ost->audio_resample = 0;
1680 ost->audio_resample = 1;
1683 ost->audio_resample = 1;
1686 if(audio_sync_method>1)
1687 ost->audio_resample = 1;
1689 if(ost->audio_resample){
1690 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1691 codec->sample_rate, icodec->sample_rate);
1693 printf("Can't resample. Aborting.\n");
1697 ist->decoding_needed = 1;
1698 ost->encoding_needed = 1;
1700 case CODEC_TYPE_VIDEO:
1701 if (codec->width == icodec->width &&
1702 codec->height == icodec->height &&
1703 frame_topBand == 0 &&
1704 frame_bottomBand == 0 &&
1705 frame_leftBand == 0 &&
1706 frame_rightBand == 0 &&
1707 frame_padtop == 0 &&
1708 frame_padbottom == 0 &&
1709 frame_padleft == 0 &&
1710 frame_padright == 0)
1712 ost->video_resample = 0;
1713 ost->video_crop = 0;
1715 } else if ((codec->width == icodec->width -
1716 (frame_leftBand + frame_rightBand)) &&
1717 (codec->height == icodec->height -
1718 (frame_topBand + frame_bottomBand)))
1720 ost->video_resample = 0;
1721 ost->video_crop = 1;
1722 ost->topBand = frame_topBand;
1723 ost->leftBand = frame_leftBand;
1724 } else if ((codec->width == icodec->width +
1725 (frame_padleft + frame_padright)) &&
1726 (codec->height == icodec->height +
1727 (frame_padtop + frame_padbottom))) {
1728 ost->video_resample = 0;
1729 ost->video_crop = 0;
1731 ost->padtop = frame_padtop;
1732 ost->padleft = frame_padleft;
1733 ost->padbottom = frame_padbottom;
1734 ost->padright = frame_padright;
1735 avcodec_get_frame_defaults(&ost->pict_tmp);
1736 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1737 codec->width, codec->height ) )
1740 ost->video_resample = 1;
1741 ost->video_crop = 0; // cropping is handled as part of resample
1742 avcodec_get_frame_defaults(&ost->pict_tmp);
1743 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1744 codec->width, codec->height ) )
1747 ost->img_resample_ctx = img_resample_full_init(
1748 codec->width, codec->height,
1749 icodec->width, icodec->height,
1750 frame_topBand, frame_bottomBand,
1751 frame_leftBand, frame_rightBand,
1752 frame_padtop, frame_padbottom,
1753 frame_padleft, frame_padright);
1755 ost->padtop = frame_padtop;
1756 ost->padleft = frame_padleft;
1757 ost->padbottom = frame_padbottom;
1758 ost->padright = frame_padright;
1761 ost->encoding_needed = 1;
1762 ist->decoding_needed = 1;
1764 case CODEC_TYPE_SUBTITLE:
1765 ost->encoding_needed = 1;
1766 ist->decoding_needed = 1;
1773 if (ost->encoding_needed &&
1774 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1775 char logfilename[1024];
1780 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1782 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1783 if (codec->flags & CODEC_FLAG_PASS1) {
1784 f = fopen(logfilename, "w");
1786 perror(logfilename);
1791 /* read the log file */
1792 f = fopen(logfilename, "r");
1794 perror(logfilename);
1797 fseek(f, 0, SEEK_END);
1799 fseek(f, 0, SEEK_SET);
1800 logbuffer = av_malloc(size + 1);
1802 fprintf(stderr, "Could not allocate log buffer\n");
1805 size = fread(logbuffer, 1, size, f);
1807 logbuffer[size] = '\0';
1808 codec->stats_in = logbuffer;
1812 if(codec->codec_type == CODEC_TYPE_VIDEO){
1813 int size= codec->width * codec->height;
1814 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1819 bit_buffer = av_malloc(bit_buffer_size);
1823 /* dump the file output parameters - cannot be done before in case
1825 for(i=0;i<nb_output_files;i++) {
1826 dump_format(output_files[i], i, output_files[i]->filename, 1);
1829 /* dump the stream mapping */
1831 fprintf(stderr, "Stream mapping:\n");
1832 for(i=0;i<nb_ostreams;i++) {
1834 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1835 ist_table[ost->source_index]->file_index,
1836 ist_table[ost->source_index]->index,
1839 if (ost->sync_ist != ist_table[ost->source_index])
1840 fprintf(stderr, " [sync #%d.%d]",
1841 ost->sync_ist->file_index,
1842 ost->sync_ist->index);
1843 fprintf(stderr, "\n");
1847 /* open each encoder */
1848 for(i=0;i<nb_ostreams;i++) {
1850 if (ost->encoding_needed) {
1852 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1854 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1855 ost->file_index, ost->index);
1858 if (avcodec_open(ost->st->codec, codec) < 0) {
1859 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1860 ost->file_index, ost->index);
1863 extra_size += ost->st->codec->extradata_size;
1867 /* open each decoder */
1868 for(i=0;i<nb_istreams;i++) {
1870 if (ist->decoding_needed) {
1872 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1874 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1875 ist->st->codec->codec_id, ist->file_index, ist->index);
1878 if (avcodec_open(ist->st->codec, codec) < 0) {
1879 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1880 ist->file_index, ist->index);
1883 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1884 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1889 for(i=0;i<nb_istreams;i++) {
1891 is = input_files[ist->file_index];
1893 ist->next_pts = av_rescale_q(ist->st->start_time, ist->st->time_base, AV_TIME_BASE_Q);
1894 if(ist->st->start_time == AV_NOPTS_VALUE)
1896 if(input_files_ts_offset[ist->file_index])
1897 ist->next_pts= AV_NOPTS_VALUE;
1901 /* compute buffer size max (should use a complete heuristic) */
1902 for(i=0;i<nb_input_files;i++) {
1903 file_table[i].buffer_size_max = 2048;
1906 /* set meta data information from input file if required */
1907 for (i=0;i<nb_meta_data_maps;i++) {
1908 AVFormatContext *out_file;
1909 AVFormatContext *in_file;
1911 int out_file_index = meta_data_maps[i].out_file;
1912 int in_file_index = meta_data_maps[i].in_file;
1913 if ( out_file_index < 0 || out_file_index >= nb_output_files ) {
1914 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1918 if ( in_file_index < 0 || in_file_index >= nb_input_files ) {
1919 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1924 out_file = output_files[out_file_index];
1925 in_file = input_files[in_file_index];
1927 strcpy(out_file->title, in_file->title);
1928 strcpy(out_file->author, in_file->author);
1929 strcpy(out_file->copyright, in_file->copyright);
1930 strcpy(out_file->comment, in_file->comment);
1931 strcpy(out_file->album, in_file->album);
1932 out_file->year = in_file->year;
1933 out_file->track = in_file->track;
1934 strcpy(out_file->genre, in_file->genre);
1937 /* open files and write file headers */
1938 for(i=0;i<nb_output_files;i++) {
1939 os = output_files[i];
1940 if (av_write_header(os) < 0) {
1941 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1947 #ifndef CONFIG_WIN32
1948 if ( !using_stdin && verbose >= 0) {
1949 fprintf(stderr, "Press [q] to stop encoding\n");
1950 url_set_interrupt_cb(decode_interrupt_cb);
1958 for(; received_sigterm == 0;) {
1959 int file_index, ist_index;
1967 /* if 'q' pressed, exits */
1971 /* read_key() returns 0 on EOF */
1977 /* select the stream that we must read now by looking at the
1978 smallest output pts */
1980 for(i=0;i<nb_ostreams;i++) {
1983 os = output_files[ost->file_index];
1984 ist = ist_table[ost->source_index];
1985 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
1986 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
1988 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
1989 ipts = (double)ist->pts;
1990 if (!file_table[ist->file_index].eof_reached){
1991 if(ipts < ipts_min) {
1993 if(input_sync ) file_index = ist->file_index;
1995 if(opts < opts_min) {
1997 if(!input_sync) file_index = ist->file_index;
2000 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2005 /* if none, if is finished */
2006 if (file_index < 0) {
2010 /* finish if recording time exhausted */
2011 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
2014 /* finish if limit size exhausted */
2015 if (limit_filesize != 0 && (limit_filesize * 1024) < url_ftell(&output_files[0]->pb))
2018 /* read a frame from it and output it in the fifo */
2019 is = input_files[file_index];
2020 if (av_read_frame(is, &pkt) < 0) {
2021 file_table[file_index].eof_reached = 1;
2022 if (opt_shortest) break; else continue; //
2026 stream_no_data = is;
2031 av_pkt_dump(stdout, &pkt, do_hex_dump);
2033 /* the following test is needed in case new streams appear
2034 dynamically in stream : we ignore them */
2035 if (pkt.stream_index >= file_table[file_index].nb_streams)
2036 goto discard_packet;
2037 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2038 ist = ist_table[ist_index];
2040 goto discard_packet;
2042 // 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);
2043 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
2044 int64_t delta= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q) - ist->next_pts;
2045 if(ABS(delta) > 10LL*AV_TIME_BASE && !copy_ts){
2046 input_files_ts_offset[ist->file_index]-= delta;
2048 fprintf(stderr, "timestamp discontinuity %lld, new offset= %lld\n", delta, input_files_ts_offset[ist->file_index]);
2049 for(i=0; i<file_table[file_index].nb_streams; i++){
2050 int index= file_table[file_index].ist_index + i;
2051 ist_table[index]->next_pts += delta;
2052 ist_table[index]->is_start=1;
2057 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2058 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2061 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2062 ist->file_index, ist->index);
2064 av_free_packet(&pkt);
2069 av_free_packet(&pkt);
2071 /* dump report by using the output first video and audio streams */
2072 print_report(output_files, ost_table, nb_ostreams, 0);
2075 /* at the end of stream, we must flush the decoder buffers */
2076 for(i=0;i<nb_istreams;i++) {
2078 if (ist->decoding_needed) {
2079 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2085 /* write the trailer if needed and close file */
2086 for(i=0;i<nb_output_files;i++) {
2087 os = output_files[i];
2088 av_write_trailer(os);
2091 /* dump report by using the first video and audio streams */
2092 print_report(output_files, ost_table, nb_ostreams, 1);
2094 /* close each encoder */
2095 for(i=0;i<nb_ostreams;i++) {
2097 if (ost->encoding_needed) {
2098 av_freep(&ost->st->codec->stats_in);
2099 avcodec_close(ost->st->codec);
2103 /* close each decoder */
2104 for(i=0;i<nb_istreams;i++) {
2106 if (ist->decoding_needed) {
2107 avcodec_close(ist->st->codec);
2115 av_freep(&bit_buffer);
2116 av_free(file_table);
2119 for(i=0;i<nb_istreams;i++) {
2126 for(i=0;i<nb_ostreams;i++) {
2130 fclose(ost->logfile);
2131 ost->logfile = NULL;
2133 fifo_free(&ost->fifo); /* works even if fifo is not
2134 initialized but set to zero */
2135 av_free(ost->pict_tmp.data[0]);
2136 if (ost->video_resample)
2137 img_resample_close(ost->img_resample_ctx);
2138 if (ost->audio_resample)
2139 audio_resample_close(ost->resample);
2152 int file_read(const char *filename)
2155 unsigned char buffer[1024];
2158 if (url_open(&h, filename, O_RDONLY) < 0) {
2159 printf("could not open '%s'\n", filename);
2163 len = url_read(h, buffer, sizeof(buffer));
2166 for(i=0;i<len;i++) putchar(buffer[i]);
2173 static void opt_image_format(const char *arg)
2177 for(f = first_image_format; f != NULL; f = f->next) {
2178 if (!strcmp(arg, f->name))
2182 fprintf(stderr, "Unknown image format: '%s'\n", arg);
2188 static void opt_format(const char *arg)
2190 /* compatibility stuff for pgmyuv */
2191 if (!strcmp(arg, "pgmyuv")) {
2192 pgmyuv_compatibility_hack=1;
2193 // opt_image_format(arg);
2197 file_iformat = av_find_input_format(arg);
2198 file_oformat = guess_format(arg, NULL, NULL);
2199 if (!file_iformat && !file_oformat) {
2200 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2205 static void opt_video_bitrate(const char *arg)
2207 video_bit_rate = atoi(arg) * 1000;
2210 static void opt_video_bitrate_tolerance(const char *arg)
2212 video_bit_rate_tolerance = atoi(arg) * 1000;
2215 static void opt_video_bitrate_max(const char *arg)
2217 video_rc_max_rate = atoi(arg) * 1000;
2220 static void opt_video_bitrate_min(const char *arg)
2222 video_rc_min_rate = atoi(arg) * 1000;
2225 static void opt_video_buffer_size(const char *arg)
2227 video_rc_buffer_size = atoi(arg) * 8*1024;
2230 static void opt_video_rc_eq(char *arg)
2235 static void opt_video_rc_override_string(char *arg)
2237 video_rc_override_string = arg;
2241 static void opt_workaround_bugs(const char *arg)
2243 workaround_bugs = atoi(arg);
2246 static void opt_me_threshold(const char *arg)
2248 me_threshold = atoi(arg);
2251 static void opt_mb_threshold(const char *arg)
2253 mb_threshold = atoi(arg);
2256 static void opt_verbose(const char *arg)
2258 verbose = atoi(arg);
2259 av_log_set_level(atoi(arg));
2262 static void opt_frame_rate(const char *arg)
2264 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
2265 fprintf(stderr, "Incorrect frame rate\n");
2270 static void opt_frame_crop_top(const char *arg)
2272 frame_topBand = atoi(arg);
2273 if (frame_topBand < 0) {
2274 fprintf(stderr, "Incorrect top crop size\n");
2277 if ((frame_topBand % 2) != 0) {
2278 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2281 if ((frame_topBand) >= frame_height){
2282 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2285 frame_height -= frame_topBand;
2288 static void opt_frame_crop_bottom(const char *arg)
2290 frame_bottomBand = atoi(arg);
2291 if (frame_bottomBand < 0) {
2292 fprintf(stderr, "Incorrect bottom crop size\n");
2295 if ((frame_bottomBand % 2) != 0) {
2296 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2299 if ((frame_bottomBand) >= frame_height){
2300 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2303 frame_height -= frame_bottomBand;
2306 static void opt_frame_crop_left(const char *arg)
2308 frame_leftBand = atoi(arg);
2309 if (frame_leftBand < 0) {
2310 fprintf(stderr, "Incorrect left crop size\n");
2313 if ((frame_leftBand % 2) != 0) {
2314 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2317 if ((frame_leftBand) >= frame_width){
2318 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2321 frame_width -= frame_leftBand;
2324 static void opt_frame_crop_right(const char *arg)
2326 frame_rightBand = atoi(arg);
2327 if (frame_rightBand < 0) {
2328 fprintf(stderr, "Incorrect right crop size\n");
2331 if ((frame_rightBand % 2) != 0) {
2332 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2335 if ((frame_rightBand) >= frame_width){
2336 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2339 frame_width -= frame_rightBand;
2342 static void opt_frame_size(const char *arg)
2344 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2345 fprintf(stderr, "Incorrect frame size\n");
2348 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2349 fprintf(stderr, "Frame size must be a multiple of 2\n");
2355 #define SCALEBITS 10
2356 #define ONE_HALF (1 << (SCALEBITS - 1))
2357 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2359 #define RGB_TO_Y(r, g, b) \
2360 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2361 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2363 #define RGB_TO_U(r1, g1, b1, shift)\
2364 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2365 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2367 #define RGB_TO_V(r1, g1, b1, shift)\
2368 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2369 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2371 static void opt_pad_color(const char *arg) {
2372 /* Input is expected to be six hex digits similar to
2373 how colors are expressed in html tags (but without the #) */
2374 int rgb = strtol(arg, NULL, 16);
2378 g = ((rgb >> 8) & 255);
2381 padcolor[0] = RGB_TO_Y(r,g,b);
2382 padcolor[1] = RGB_TO_U(r,g,b,0);
2383 padcolor[2] = RGB_TO_V(r,g,b,0);
2386 static void opt_frame_pad_top(const char *arg)
2388 frame_padtop = atoi(arg);
2389 if (frame_padtop < 0) {
2390 fprintf(stderr, "Incorrect top pad size\n");
2393 if ((frame_padtop % 2) != 0) {
2394 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2399 static void opt_frame_pad_bottom(const char *arg)
2401 frame_padbottom = atoi(arg);
2402 if (frame_padbottom < 0) {
2403 fprintf(stderr, "Incorrect bottom pad size\n");
2406 if ((frame_padbottom % 2) != 0) {
2407 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2413 static void opt_frame_pad_left(const char *arg)
2415 frame_padleft = atoi(arg);
2416 if (frame_padleft < 0) {
2417 fprintf(stderr, "Incorrect left pad size\n");
2420 if ((frame_padleft % 2) != 0) {
2421 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2427 static void opt_frame_pad_right(const char *arg)
2429 frame_padright = atoi(arg);
2430 if (frame_padright < 0) {
2431 fprintf(stderr, "Incorrect right pad size\n");
2434 if ((frame_padright % 2) != 0) {
2435 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2441 static void opt_frame_pix_fmt(const char *arg)
2443 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2446 static void opt_frame_aspect_ratio(const char *arg)
2452 p = strchr(arg, ':');
2454 x = strtol(arg, (char **)&arg, 10);
2456 y = strtol(arg+1, (char **)&arg, 10);
2458 ar = (double)x / (double)y;
2460 ar = strtod(arg, (char **)&arg);
2463 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2466 frame_aspect_ratio = ar;
2469 static void opt_gop_size(const char *arg)
2471 gop_size = atoi(arg);
2474 static void opt_b_frames(const char *arg)
2476 b_frames = atoi(arg);
2477 if (b_frames > FF_MAX_B_FRAMES) {
2478 fprintf(stderr, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES);
2480 } else if (b_frames < 1) {
2481 fprintf(stderr, "\nNumber of B frames must be higher than 0\n");
2486 static void opt_pre_me(const char *arg)
2491 static void opt_qscale(const char *arg)
2493 video_qscale = atof(arg);
2494 if (video_qscale < 0.01 ||
2495 video_qscale > 255) {
2496 fprintf(stderr, "qscale must be >= 0.01 and <= 255\n");
2501 static void opt_qsquish(const char *arg)
2503 video_qsquish = atof(arg);
2504 if (video_qsquish < 0.0 ||
2505 video_qsquish > 99.0) {
2506 fprintf(stderr, "qsquish must be >= 0.0 and <= 99.0\n");
2511 static void opt_lmax(const char *arg)
2513 video_lmax = atof(arg)*FF_QP2LAMBDA;
2516 static void opt_lmin(const char *arg)
2518 video_lmin = atof(arg)*FF_QP2LAMBDA;
2521 static void opt_qmin(const char *arg)
2523 video_qmin = atoi(arg);
2524 if (video_qmin < 1 ||
2526 fprintf(stderr, "qmin must be >= 1 and <= 31\n");
2531 static void opt_qmax(const char *arg)
2533 video_qmax = atoi(arg);
2534 if (video_qmax < 1 ||
2536 fprintf(stderr, "qmax must be >= 1 and <= 31\n");
2541 static void opt_mb_lmin(const char *arg)
2543 video_mb_lmin = atof(arg)*FF_QP2LAMBDA;
2544 if (video_mb_lmin < 1 ||
2545 video_mb_lmin > FF_LAMBDA_MAX) {
2546 fprintf(stderr, "mblmin must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
2551 static void opt_mb_lmax(const char *arg)
2553 video_mb_lmax = atof(arg)*FF_QP2LAMBDA;
2554 if (video_mb_lmax < 1 ||
2555 video_mb_lmax > FF_LAMBDA_MAX) {
2556 fprintf(stderr, "mblmax must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
2561 static void opt_qdiff(const char *arg)
2563 video_qdiff = atoi(arg);
2564 if (video_qdiff < 0 ||
2566 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2571 static void opt_qblur(const char *arg)
2573 video_qblur = atof(arg);
2576 static void opt_qcomp(const char *arg)
2578 video_qcomp = atof(arg);
2581 static void opt_rc_initial_cplx(const char *arg)
2583 video_rc_initial_cplx = atof(arg);
2585 static void opt_b_qfactor(const char *arg)
2587 video_b_qfactor = atof(arg);
2589 static void opt_i_qfactor(const char *arg)
2591 video_i_qfactor = atof(arg);
2593 static void opt_b_qoffset(const char *arg)
2595 video_b_qoffset = atof(arg);
2597 static void opt_i_qoffset(const char *arg)
2599 video_i_qoffset = atof(arg);
2602 static void opt_ibias(const char *arg)
2604 video_intra_quant_bias = atoi(arg);
2606 static void opt_pbias(const char *arg)
2608 video_inter_quant_bias = atoi(arg);
2611 static void opt_packet_size(const char *arg)
2613 packet_size= atoi(arg);
2616 static void opt_error_rate(const char *arg)
2618 error_rate= atoi(arg);
2621 static void opt_strict(const char *arg)
2626 static void opt_top_field_first(const char *arg)
2628 top_field_first= atoi(arg);
2631 static void opt_sc_threshold(const char *arg)
2633 sc_threshold= atoi(arg);
2636 static void opt_me_range(const char *arg)
2638 me_range = atoi(arg);
2641 static void opt_thread_count(const char *arg)
2643 thread_count= atoi(arg);
2644 #if !defined(HAVE_THREADS)
2646 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2650 static void opt_audio_bitrate(const char *arg)
2652 audio_bit_rate = atoi(arg) * 1000;
2655 static void opt_audio_rate(const char *arg)
2657 audio_sample_rate = atoi(arg);
2660 static void opt_audio_channels(const char *arg)
2662 audio_channels = atoi(arg);
2665 static void opt_video_device(const char *arg)
2667 video_device = av_strdup(arg);
2670 static void opt_grab_device(const char *arg)
2672 grab_device = av_strdup(arg);
2675 static void opt_video_channel(const char *arg)
2677 video_channel = strtol(arg, NULL, 0);
2680 static void opt_video_standard(const char *arg)
2682 video_standard = av_strdup(arg);
2685 static void opt_audio_device(const char *arg)
2687 audio_device = av_strdup(arg);
2690 static void opt_codec(int *pstream_copy, int *pcodec_id,
2691 int codec_type, const char *arg)
2695 if (!strcmp(arg, "copy")) {
2700 if (!strcmp(p->name, arg) && p->type == codec_type)
2705 fprintf(stderr, "Unknown codec '%s'\n", arg);
2713 static void opt_audio_codec(const char *arg)
2715 opt_codec(&audio_stream_copy, &audio_codec_id, CODEC_TYPE_AUDIO, arg);
2718 static void opt_audio_tag(const char *arg)
2721 audio_codec_tag= strtol(arg, &tail, 0);
2724 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2727 static void opt_video_tag(const char *arg)
2730 video_codec_tag= strtol(arg, &tail, 0);
2733 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2736 static void add_frame_hooker(const char *arg)
2741 char *args = av_strdup(arg);
2745 argv[0] = strtok(args, " ");
2746 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2749 i = frame_hook_add(argc, argv);
2752 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2757 const char *motion_str[] = {
2767 static void opt_motion_estimation(const char *arg)
2773 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2776 if (!strcmp(*p, arg))
2780 me_method = (p - motion_str) + 1;
2783 static void opt_video_codec(const char *arg)
2785 opt_codec(&video_stream_copy, &video_codec_id, CODEC_TYPE_VIDEO, arg);
2788 static void opt_subtitle_codec(const char *arg)
2790 opt_codec(&subtitle_stream_copy, &subtitle_codec_id, CODEC_TYPE_SUBTITLE, arg);
2793 static void opt_map(const char *arg)
2799 m = &stream_maps[nb_stream_maps++];
2801 m->file_index = strtol(arg, (char **)&p, 0);
2805 m->stream_index = strtol(p, (char **)&p, 0);
2808 m->sync_file_index = strtol(p, (char **)&p, 0);
2811 m->sync_stream_index = strtol(p, (char **)&p, 0);
2813 m->sync_file_index = m->file_index;
2814 m->sync_stream_index = m->stream_index;
2818 static void opt_map_meta_data(const char *arg)
2824 m = &meta_data_maps[nb_meta_data_maps++];
2826 m->out_file = strtol(arg, (char **)&p, 0);
2830 m->in_file = strtol(p, (char **)&p, 0);
2833 static void opt_recording_time(const char *arg)
2835 recording_time = parse_date(arg, 1);
2838 static void opt_start_time(const char *arg)
2840 start_time = parse_date(arg, 1);
2843 static void opt_rec_timestamp(const char *arg)
2845 rec_timestamp = parse_date(arg, 0) / 1000000;
2848 static void opt_input_ts_offset(const char *arg)
2850 input_ts_offset = parse_date(arg, 1);
2853 static void opt_input_file(const char *filename)
2855 AVFormatContext *ic;
2856 AVFormatParameters params, *ap = ¶ms;
2857 int err, i, ret, rfps, rfps_base;
2860 if (!strcmp(filename, "-"))
2863 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2864 !strcmp( filename, "/dev/stdin" );
2866 /* get default parameters from command line */
2867 memset(ap, 0, sizeof(*ap));
2868 ap->sample_rate = audio_sample_rate;
2869 ap->channels = audio_channels;
2870 ap->time_base.den = frame_rate;
2871 ap->time_base.num = frame_rate_base;
2872 ap->width = frame_width + frame_padleft + frame_padright;
2873 ap->height = frame_height + frame_padtop + frame_padbottom;
2874 ap->image_format = image_format;
2875 ap->pix_fmt = frame_pix_fmt;
2876 ap->device = grab_device;
2877 ap->channel = video_channel;
2878 ap->standard = video_standard;
2879 ap->video_codec_id = video_codec_id;
2880 ap->audio_codec_id = audio_codec_id;
2881 if(pgmyuv_compatibility_hack)
2882 ap->video_codec_id= CODEC_ID_PGMYUV;
2884 /* open the input file with generic libav function */
2885 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2887 print_error(filename, err);
2892 ic->flags|= AVFMT_FLAG_GENPTS;
2894 /* If not enough info to get the stream parameters, we decode the
2895 first frames to get it. (used in mpeg case for example) */
2896 ret = av_find_stream_info(ic);
2897 if (ret < 0 && verbose >= 0) {
2898 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2902 timestamp = start_time;
2903 /* add the stream start time */
2904 if (ic->start_time != AV_NOPTS_VALUE)
2905 timestamp += ic->start_time;
2907 /* if seeking requested, we execute it */
2908 if (start_time != 0) {
2909 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2911 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2912 filename, (double)timestamp / AV_TIME_BASE);
2914 /* reset seek info */
2918 /* update the current parameters so that they match the one of the input stream */
2919 for(i=0;i<ic->nb_streams;i++) {
2921 AVCodecContext *enc = ic->streams[i]->codec;
2922 #if defined(HAVE_THREADS)
2924 avcodec_thread_init(enc, thread_count);
2926 enc->thread_count= thread_count;
2927 switch(enc->codec_type) {
2928 case CODEC_TYPE_AUDIO:
2929 for(j=0; j<opt_name_count; j++){
2931 double d= av_get_double(avctx_opts, opt_names[j], &opt);
2932 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2933 av_set_double(enc, opt_names[j], d);
2935 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2936 audio_channels = enc->channels;
2937 audio_sample_rate = enc->sample_rate;
2939 ic->streams[i]->discard= AVDISCARD_ALL;
2941 case CODEC_TYPE_VIDEO:
2942 for(j=0; j<opt_name_count; j++){
2944 double d= av_get_double(avctx_opts, opt_names[j], &opt);
2945 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2946 av_set_double(enc, opt_names[j], d);
2948 frame_height = enc->height;
2949 frame_width = enc->width;
2950 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2951 frame_pix_fmt = enc->pix_fmt;
2952 rfps = ic->streams[i]->r_frame_rate.num;
2953 rfps_base = ic->streams[i]->r_frame_rate.den;
2954 enc->workaround_bugs = workaround_bugs;
2955 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2957 enc->debug |= FF_DEBUG_MV;
2959 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2962 fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2963 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2965 (float)rfps / rfps_base, rfps, rfps_base);
2967 /* update the current frame rate to match the stream frame rate */
2969 frame_rate_base = rfps_base;
2971 enc->rate_emu = rate_emu;
2973 ic->streams[i]->discard= AVDISCARD_ALL;
2974 else if(video_discard)
2975 ic->streams[i]->discard= video_discard;
2977 case CODEC_TYPE_DATA:
2979 case CODEC_TYPE_SUBTITLE:
2981 case CODEC_TYPE_UNKNOWN:
2988 input_files[nb_input_files] = ic;
2989 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2990 /* dump the file content */
2992 dump_format(ic, nb_input_files, filename, 0);
2995 file_iformat = NULL;
2996 file_oformat = NULL;
2997 image_format = NULL;
3005 static void opt_grab(const char *arg)
3007 file_iformat = av_find_input_format(arg);
3011 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
3013 int has_video, has_audio, i, j;
3014 AVFormatContext *ic;
3018 for(j=0;j<nb_input_files;j++) {
3019 ic = input_files[j];
3020 for(i=0;i<ic->nb_streams;i++) {
3021 AVCodecContext *enc = ic->streams[i]->codec;
3022 switch(enc->codec_type) {
3023 case CODEC_TYPE_AUDIO:
3026 case CODEC_TYPE_VIDEO:
3029 case CODEC_TYPE_DATA:
3030 case CODEC_TYPE_UNKNOWN:
3031 case CODEC_TYPE_SUBTITLE:
3038 *has_video_ptr = has_video;
3039 *has_audio_ptr = has_audio;
3042 static void new_video_stream(AVFormatContext *oc)
3045 AVCodecContext *video_enc;
3048 st = av_new_stream(oc, oc->nb_streams);
3050 fprintf(stderr, "Could not alloc stream\n");
3053 #if defined(HAVE_THREADS)
3055 avcodec_thread_init(st->codec, thread_count);
3058 video_enc = st->codec;
3061 video_enc->codec_tag= video_codec_tag;
3063 if( (video_global_header&1)
3064 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3065 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3066 avctx_opts->flags|= CODEC_FLAG_GLOBAL_HEADER;
3068 if(video_global_header&2){
3069 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3070 avctx_opts->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3073 if (video_stream_copy) {
3074 st->stream_copy = 1;
3075 video_enc->codec_type = CODEC_TYPE_VIDEO;
3081 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
3082 if (video_codec_id != CODEC_ID_NONE)
3083 codec_id = video_codec_id;
3085 video_enc->codec_id = codec_id;
3086 codec = avcodec_find_encoder(codec_id);
3088 for(i=0; i<opt_name_count; i++){
3090 double d= av_get_double(avctx_opts, opt_names[i], &opt);
3091 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3092 av_set_double(video_enc, opt_names[i], d);
3095 video_enc->bit_rate = video_bit_rate;
3096 video_enc->bit_rate_tolerance = video_bit_rate_tolerance;
3097 video_enc->time_base.den = frame_rate;
3098 video_enc->time_base.num = frame_rate_base;
3099 if(codec && codec->supported_framerates){
3100 const AVRational *p= codec->supported_framerates;
3101 AVRational req= (AVRational){frame_rate, frame_rate_base};
3102 const AVRational *best=NULL;
3103 AVRational best_error= (AVRational){INT_MAX, 1};
3104 for(; p->den!=0; p++){
3105 AVRational error= av_sub_q(req, *p);
3106 if(error.num <0) error.num *= -1;
3107 if(av_cmp_q(error, best_error) < 0){
3112 video_enc->time_base.den= best->num;
3113 video_enc->time_base.num= best->den;
3116 video_enc->width = frame_width + frame_padright + frame_padleft;
3117 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3118 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3119 video_enc->pix_fmt = frame_pix_fmt;
3121 if(codec && codec->pix_fmts){
3122 const enum PixelFormat *p= codec->pix_fmts;
3124 if(*p == video_enc->pix_fmt)
3128 video_enc->pix_fmt = codec->pix_fmts[0];
3132 video_enc->gop_size = gop_size;
3134 video_enc->gop_size = 0;
3135 if (video_qscale || same_quality) {
3136 video_enc->flags |= CODEC_FLAG_QSCALE;
3137 video_enc->global_quality=
3138 st->quality = FF_QP2LAMBDA * video_qscale;
3142 video_enc->intra_matrix = intra_matrix;
3144 video_enc->inter_matrix = inter_matrix;
3146 video_enc->pre_me = pre_me;
3149 video_enc->max_b_frames = b_frames;
3150 video_enc->b_frame_strategy = b_strategy;
3151 video_enc->b_quant_factor = 2.0;
3153 video_enc->qmin = video_qmin;
3154 video_enc->qmax = video_qmax;
3155 video_enc->lmin = video_lmin;
3156 video_enc->lmax = video_lmax;
3157 video_enc->rc_qsquish = video_qsquish;
3158 video_enc->mb_lmin = video_mb_lmin;
3159 video_enc->mb_lmax = video_mb_lmax;
3160 video_enc->max_qdiff = video_qdiff;
3161 video_enc->qblur = video_qblur;
3162 video_enc->qcompress = video_qcomp;
3163 video_enc->rc_eq = video_rc_eq;
3164 video_enc->workaround_bugs = workaround_bugs;
3165 video_enc->thread_count = thread_count;
3166 p= video_rc_override_string;
3169 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3171 fprintf(stderr, "error parsing rc_override\n");
3174 video_enc->rc_override=
3175 av_realloc(video_enc->rc_override,
3176 sizeof(RcOverride)*(i+1));
3177 video_enc->rc_override[i].start_frame= start;
3178 video_enc->rc_override[i].end_frame = end;
3180 video_enc->rc_override[i].qscale= q;
3181 video_enc->rc_override[i].quality_factor= 1.0;
3184 video_enc->rc_override[i].qscale= 0;
3185 video_enc->rc_override[i].quality_factor= -q/100.0;
3190 video_enc->rc_override_count=i;
3192 video_enc->rc_max_rate = video_rc_max_rate;
3193 video_enc->rc_min_rate = video_rc_min_rate;
3194 video_enc->rc_buffer_size = video_rc_buffer_size;
3195 video_enc->rc_initial_buffer_occupancy = video_rc_buffer_size*3/4;
3196 video_enc->rc_buffer_aggressivity= video_rc_buffer_aggressivity;
3197 video_enc->rc_initial_cplx= video_rc_initial_cplx;
3198 video_enc->i_quant_factor = video_i_qfactor;
3199 video_enc->b_quant_factor = video_b_qfactor;
3200 video_enc->i_quant_offset = video_i_qoffset;
3201 video_enc->b_quant_offset = video_b_qoffset;
3202 video_enc->intra_quant_bias = video_intra_quant_bias;
3203 video_enc->inter_quant_bias = video_inter_quant_bias;
3204 video_enc->me_threshold= me_threshold;
3205 video_enc->mb_threshold= mb_threshold;
3206 video_enc->intra_dc_precision= intra_dc_precision - 8;
3207 video_enc->strict_std_compliance = strict;
3208 video_enc->error_rate = error_rate;
3209 video_enc->scenechange_threshold= sc_threshold;
3210 video_enc->me_range = me_range;
3211 video_enc->me_penalty_compensation= me_penalty_compensation;
3212 video_enc->frame_skip_threshold= frame_skip_threshold;
3213 video_enc->frame_skip_factor= frame_skip_factor;
3214 video_enc->frame_skip_exp= frame_skip_exp;
3217 video_enc->rtp_mode= 1;
3218 video_enc->rtp_payload_size= packet_size;
3222 video_enc->flags|= CODEC_FLAG_PSNR;
3224 video_enc->me_method = me_method;
3229 video_enc->flags |= CODEC_FLAG_PASS1;
3231 video_enc->flags |= CODEC_FLAG_PASS2;
3236 /* reset some key parameters */
3238 video_codec_id = CODEC_ID_NONE;
3239 video_stream_copy = 0;
3242 static void new_audio_stream(AVFormatContext *oc)
3245 AVCodecContext *audio_enc;
3248 st = av_new_stream(oc, oc->nb_streams);
3250 fprintf(stderr, "Could not alloc stream\n");
3253 #if defined(HAVE_THREADS)
3255 avcodec_thread_init(st->codec, thread_count);
3258 audio_enc = st->codec;
3259 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3262 audio_enc->codec_tag= audio_codec_tag;
3264 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3265 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3266 avctx_opts->flags|= CODEC_FLAG_GLOBAL_HEADER;
3268 if (audio_stream_copy) {
3269 st->stream_copy = 1;
3270 audio_enc->channels = audio_channels;
3272 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3274 for(i=0; i<opt_name_count; i++){
3276 double d= av_get_double(avctx_opts, opt_names[i], &opt);
3277 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3278 av_set_double(audio_enc, opt_names[i], d);
3281 if (audio_codec_id != CODEC_ID_NONE)
3282 codec_id = audio_codec_id;
3283 audio_enc->codec_id = codec_id;
3285 audio_enc->bit_rate = audio_bit_rate;
3286 if (audio_qscale > QSCALE_NONE) {
3287 audio_enc->flags |= CODEC_FLAG_QSCALE;
3288 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3290 audio_enc->strict_std_compliance = strict;
3291 audio_enc->thread_count = thread_count;
3292 /* For audio codecs other than AC3 or DTS we limit */
3293 /* the number of coded channels to stereo */
3294 if (audio_channels > 2 && codec_id != CODEC_ID_AC3
3295 && codec_id != CODEC_ID_DTS) {
3296 audio_enc->channels = 2;
3298 audio_enc->channels = audio_channels;
3300 audio_enc->sample_rate = audio_sample_rate;
3301 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3302 if (audio_language) {
3303 pstrcpy(st->language, sizeof(st->language), audio_language);
3304 av_free(audio_language);
3305 audio_language = NULL;
3308 /* reset some key parameters */
3310 audio_codec_id = CODEC_ID_NONE;
3311 audio_stream_copy = 0;
3314 static void opt_new_subtitle_stream(void)
3316 AVFormatContext *oc;
3318 AVCodecContext *subtitle_enc;
3321 if (nb_output_files <= 0) {
3322 fprintf(stderr, "At least one output file must be specified\n");
3325 oc = output_files[nb_output_files - 1];
3327 st = av_new_stream(oc, oc->nb_streams);
3329 fprintf(stderr, "Could not alloc stream\n");
3333 subtitle_enc = st->codec;
3334 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3335 if (subtitle_stream_copy) {
3336 st->stream_copy = 1;
3338 for(i=0; i<opt_name_count; i++){
3340 double d= av_get_double(avctx_opts, opt_names[i], &opt);
3341 if(d==d && (opt->flags&AV_OPT_FLAG_SUBTITLE_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3342 av_set_double(subtitle_enc, opt_names[i], d);
3344 subtitle_enc->codec_id = subtitle_codec_id;
3347 if (subtitle_language) {
3348 pstrcpy(st->language, sizeof(st->language), subtitle_language);
3349 av_free(subtitle_language);
3350 subtitle_language = NULL;
3353 subtitle_codec_id = CODEC_ID_NONE;
3354 subtitle_stream_copy = 0;
3357 static void opt_new_audio_stream(void)
3359 AVFormatContext *oc;
3360 if (nb_output_files <= 0) {
3361 fprintf(stderr, "At least one output file must be specified\n");
3364 oc = output_files[nb_output_files - 1];
3365 new_audio_stream(oc);
3368 static void opt_new_video_stream(void)
3370 AVFormatContext *oc;
3371 if (nb_output_files <= 0) {
3372 fprintf(stderr, "At least one output file must be specified\n");
3375 oc = output_files[nb_output_files - 1];
3376 new_video_stream(oc);
3379 static void opt_output_file(const char *filename)
3381 AVFormatContext *oc;
3382 int use_video, use_audio, input_has_video, input_has_audio;
3383 AVFormatParameters params, *ap = ¶ms;
3385 if (!strcmp(filename, "-"))
3388 oc = av_alloc_format_context();
3390 if (!file_oformat) {
3391 file_oformat = guess_format(NULL, filename, NULL);
3392 if (!file_oformat) {
3393 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
3399 oc->oformat = file_oformat;
3400 pstrcpy(oc->filename, sizeof(oc->filename), filename);
3402 if (!strcmp(file_oformat->name, "ffm") &&
3403 strstart(filename, "http:", NULL)) {
3404 /* special case for files sent to ffserver: we get the stream
3405 parameters from ffserver */
3406 if (read_ffserver_streams(oc, filename) < 0) {
3407 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
3411 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_id != CODEC_ID_NONE;
3412 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_id != CODEC_ID_NONE;
3414 /* disable if no corresponding type found and at least one
3416 if (nb_input_files > 0) {
3417 check_audio_video_inputs(&input_has_video, &input_has_audio);
3418 if (!input_has_video)
3420 if (!input_has_audio)
3424 /* manual disable */
3425 if (audio_disable) {
3428 if (video_disable) {
3433 new_video_stream(oc);
3437 new_audio_stream(oc);
3440 if (!oc->nb_streams) {
3441 fprintf(stderr, "No audio or video streams available\n");
3445 oc->timestamp = rec_timestamp;
3448 pstrcpy(oc->title, sizeof(oc->title), str_title);
3450 pstrcpy(oc->author, sizeof(oc->author), str_author);
3452 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3454 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3457 output_files[nb_output_files++] = oc;
3459 /* check filename in case of an image number is expected */
3460 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3461 if (filename_number_test(oc->filename) < 0) {
3462 print_error(oc->filename, AVERROR_NUMEXPECTED);
3467 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3468 /* test if it already exists to avoid loosing precious files */
3469 if (!file_overwrite &&
3470 (strchr(filename, ':') == NULL ||
3471 strstart(filename, "file:", NULL))) {
3472 if (url_exist(filename)) {
3475 if ( !using_stdin ) {
3476 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3479 if (toupper(c) != 'Y') {
3480 fprintf(stderr, "Not overwriting - exiting\n");
3485 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3492 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3493 fprintf(stderr, "Could not open '%s'\n", filename);
3498 memset(ap, 0, sizeof(*ap));
3499 ap->image_format = image_format;
3500 if (av_set_parameters(oc, ap) < 0) {
3501 fprintf(stderr, "%s: Invalid encoding parameters\n",
3506 oc->packet_size= mux_packet_size;
3507 oc->mux_rate= mux_rate;
3508 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3509 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3510 oc->loop_output = loop_output;
3512 /* reset some options */
3513 file_oformat = NULL;
3514 file_iformat = NULL;
3515 image_format = NULL;
3518 /* prepare dummy protocols for grab */
3519 static void prepare_grab(void)
3521 int has_video, has_audio, i, j;
3522 AVFormatContext *oc;
3523 AVFormatContext *ic;
3524 AVFormatParameters vp1, *vp = &vp1;
3525 AVFormatParameters ap1, *ap = &ap1;
3527 /* see if audio/video inputs are needed */
3530 memset(ap, 0, sizeof(*ap));
3531 memset(vp, 0, sizeof(*vp));
3532 vp->time_base.num= 1;
3533 for(j=0;j<nb_output_files;j++) {
3534 oc = output_files[j];
3535 for(i=0;i<oc->nb_streams;i++) {
3536 AVCodecContext *enc = oc->streams[i]->codec;
3537 switch(enc->codec_type) {
3538 case CODEC_TYPE_AUDIO:
3539 if (enc->sample_rate > ap->sample_rate)
3540 ap->sample_rate = enc->sample_rate;
3541 if (enc->channels > ap->channels)
3542 ap->channels = enc->channels;
3545 case CODEC_TYPE_VIDEO:
3546 if (enc->width > vp->width)
3547 vp->width = enc->width;
3548 if (enc->height > vp->height)
3549 vp->height = enc->height;
3551 if (vp->time_base.num*(int64_t)enc->time_base.den > enc->time_base.num*(int64_t)vp->time_base.den){
3552 vp->time_base = enc->time_base;
3562 if (has_video == 0 && has_audio == 0) {
3563 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3568 AVInputFormat *fmt1;
3569 fmt1 = av_find_input_format(video_grab_format);
3570 vp->device = video_device;
3571 vp->channel = video_channel;
3572 vp->standard = video_standard;
3573 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3574 fprintf(stderr, "Could not find video grab device\n");
3577 /* If not enough info to get the stream parameters, we decode the
3578 first frames to get it. */
3579 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3580 fprintf(stderr, "Could not find video grab parameters\n");
3583 /* by now video grab has one stream */
3584 ic->streams[0]->r_frame_rate.num = vp->time_base.den;
3585 ic->streams[0]->r_frame_rate.den = vp->time_base.num;
3586 input_files[nb_input_files] = ic;
3589 dump_format(ic, nb_input_files, "", 0);
3593 if (has_audio && audio_grab_format) {
3594 AVInputFormat *fmt1;
3595 fmt1 = av_find_input_format(audio_grab_format);
3596 ap->device = audio_device;
3597 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3598 fprintf(stderr, "Could not find audio grab device\n");
3601 input_files[nb_input_files] = ic;
3604 dump_format(ic, nb_input_files, "", 0);
3610 /* same option as mencoder */
3611 static void opt_pass(const char *pass_str)
3614 pass = atoi(pass_str);
3615 if (pass != 1 && pass != 2) {
3616 fprintf(stderr, "pass number can be only 1 or 2\n");
3622 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3623 static int64_t getutime(void)
3625 return av_gettime();
3628 static int64_t getutime(void)
3630 struct rusage rusage;
3632 getrusage(RUSAGE_SELF, &rusage);
3633 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3637 extern int ffm_nopts;
3639 static void show_formats(void)
3641 AVInputFormat *ifmt;
3642 AVOutputFormat *ofmt;
3643 AVImageFormat *image_fmt;
3646 const char **pp, *last_name;
3648 printf("File formats:\n");
3653 const char *name=NULL;
3654 const char *long_name=NULL;
3656 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3657 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3658 strcmp(ofmt->name, last_name)>0){
3660 long_name= ofmt->long_name;
3664 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3665 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3666 strcmp(ifmt->name, last_name)>0){
3668 long_name= ifmt->long_name;
3671 if(name && strcmp(ifmt->name, name)==0)
3683 long_name ? long_name:" ");
3687 printf("Image formats (filename extensions, if any, follow):\n");
3688 for(image_fmt = first_image_format; image_fmt != NULL;
3689 image_fmt = image_fmt->next) {
3692 image_fmt->img_read ? "D":" ",
3693 image_fmt->img_write ? "E":" ",
3695 image_fmt->extensions ? image_fmt->extensions:" ");
3699 printf("Codecs:\n");
3705 const char *type_str;
3708 for(p = first_avcodec; p != NULL; p = p->next) {
3709 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3710 strcmp(p->name, last_name)>0){
3712 decode= encode= cap=0;
3714 if(p2 && strcmp(p->name, p2->name)==0){
3715 if(p->decode) decode=1;
3716 if(p->encode) encode=1;
3717 cap |= p->capabilities;
3722 last_name= p2->name;
3725 case CODEC_TYPE_VIDEO:
3728 case CODEC_TYPE_AUDIO:
3731 case CODEC_TYPE_SUBTITLE:
3740 decode ? "D": (/*p2->decoder ? "d":*/" "),
3743 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3744 cap & CODEC_CAP_DR1 ? "D":" ",
3745 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3747 /* if(p2->decoder && decode==0)
3748 printf(" use %s for decoding", p2->decoder->name);*/
3753 printf("Supported file protocols:\n");
3754 for(up = first_protocol; up != NULL; up = up->next)
3755 printf(" %s:", up->name);
3758 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3759 printf("Motion estimation methods:\n");
3763 if ((pp - motion_str + 1) == ME_ZERO)
3764 printf("(fastest)");
3765 else if ((pp - motion_str + 1) == ME_FULL)
3766 printf("(slowest)");
3767 else if ((pp - motion_str + 1) == ME_EPZS)
3768 printf("(default)");
3773 "Note, the names of encoders and decoders dont always match, so there are\n"
3774 "several cases where the above table shows encoder only or decoder only entries\n"
3775 "even though both encoding and decoding are supported for example, the h263\n"
3776 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3781 void parse_matrix_coeffs(uint16_t *dest, const char *str)
3784 const char *p = str;
3791 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3798 void opt_inter_matrix(const char *arg)
3800 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3801 parse_matrix_coeffs(inter_matrix, arg);
3804 void opt_intra_matrix(const char *arg)
3806 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3807 parse_matrix_coeffs(intra_matrix, arg);
3810 static void opt_target(const char *arg)
3813 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3815 if(!strncmp(arg, "pal-", 4)) {
3818 } else if(!strncmp(arg, "ntsc-", 5)) {
3821 } else if(!strncmp(arg, "film-", 5)) {
3826 /* Calculate FR via float to avoid int overflow */
3827 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3830 } else if((fr == 29970) || (fr == 23976)) {
3833 /* Try to determine PAL/NTSC by peeking in the input files */
3834 if(nb_input_files) {
3836 for(j = 0; j < nb_input_files; j++) {
3837 for(i = 0; i < input_files[j]->nb_streams; i++) {
3838 AVCodecContext *c = input_files[j]->streams[i]->codec;
3839 if(c->codec_type != CODEC_TYPE_VIDEO)
3841 fr = c->time_base.den * 1000 / c->time_base.num;
3845 } else if((fr == 29970) || (fr == 23976)) {
3855 if(verbose && norm >= 0)
3856 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3860 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3861 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3862 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3866 if(!strcmp(arg, "vcd")) {
3868 opt_video_codec("mpeg1video");
3869 opt_audio_codec("mp2");
3872 opt_frame_size(norm ? "352x240" : "352x288");
3873 opt_frame_rate(frame_rates[norm]);
3874 opt_gop_size(norm ? "18" : "15");
3876 video_bit_rate = 1150000;
3877 video_rc_max_rate = 1150000;
3878 video_rc_min_rate = 1150000;
3879 video_rc_buffer_size = 40*1024*8;
3881 audio_bit_rate = 224000;
3882 audio_sample_rate = 44100;
3884 mux_packet_size= 2324;
3885 mux_rate= 2352 * 75 * 8;
3887 /* We have to offset the PTS, so that it is consistent with the SCR.
3888 SCR starts at 36000, but the first two packs contain only padding
3889 and the first pack from the other stream, respectively, may also have
3890 been written before.
3891 So the real data starts at SCR 36000+3*1200. */
3892 mux_preload= (36000+3*1200) / 90000.0; //0.44
3893 } else if(!strcmp(arg, "svcd")) {
3895 opt_video_codec("mpeg2video");
3896 opt_audio_codec("mp2");
3899 opt_frame_size(norm ? "480x480" : "480x576");
3900 opt_frame_rate(frame_rates[norm]);
3901 opt_gop_size(norm ? "18" : "15");
3903 video_bit_rate = 2040000;
3904 video_rc_max_rate = 2516000;
3905 video_rc_min_rate = 0; //1145000;
3906 video_rc_buffer_size = 224*1024*8;
3907 opt_default("flags", "+SCAN_OFFSET");
3910 audio_bit_rate = 224000;
3911 audio_sample_rate = 44100;
3913 mux_packet_size= 2324;
3915 } else if(!strcmp(arg, "dvd")) {
3917 opt_video_codec("mpeg2video");
3918 opt_audio_codec("ac3");
3921 opt_frame_size(norm ? "720x480" : "720x576");
3922 opt_frame_rate(frame_rates[norm]);
3923 opt_gop_size(norm ? "18" : "15");
3925 video_bit_rate = 6000000;
3926 video_rc_max_rate = 9000000;
3927 video_rc_min_rate = 0; //1500000;
3928 video_rc_buffer_size = 224*1024*8;
3930 mux_packet_size= 2048; // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3931 mux_rate = 10080000; // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3933 audio_bit_rate = 448000;
3934 audio_sample_rate = 48000;
3936 } else if(!strcmp(arg, "dv")) {
3940 opt_frame_size(norm ? "720x480" : "720x576");
3941 opt_frame_rate(frame_rates[norm]);
3943 audio_sample_rate = 48000;
3947 fprintf(stderr, "Unknown target: %s\n", arg);
3952 static void show_version(void)
3954 fprintf(stderr, "ffmpeg " FFMPEG_VERSION "\n"
3957 avcodec_build(), LIBAVFORMAT_BUILD);
3961 static int opt_default(const char *opt, const char *arg){
3962 AVOption *o= av_set_string(avctx_opts, opt, arg);
3966 // 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));
3968 //FIXME we should always use avctx_opts, ... for storing options so there wont be any need to keep track of whats set over this
3969 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
3970 opt_names[opt_name_count++]= o->name;
3972 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3973 if(avctx_opts->flags & CODEC_FLAG_BITEXACT)
3976 if(avctx_opts->debug)
3977 av_log_set_level(AV_LOG_DEBUG);
3981 const OptionDef options[] = {
3983 { "L", 0, {(void*)show_license}, "show license" },
3984 { "h", 0, {(void*)show_help}, "show help" },
3985 { "version", 0, {(void*)show_version}, "show version" },
3986 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3987 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3988 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
3989 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3990 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3991 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3992 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3993 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3994 { "fs", HAS_ARG | OPT_INT, {(void*)&limit_filesize}, "set the limit file size", "limit_size" }, //
3995 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3996 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3997 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3998 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3999 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
4000 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
4001 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
4002 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4003 "add timings for benchmarking" },
4004 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4005 "dump each input packet" },
4006 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4007 "when dumping packets, also dump the payload" },
4008 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4009 { "loop", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4010 { "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)", "" },
4011 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
4012 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4013 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4014 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4015 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4016 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4017 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4018 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4021 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
4022 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4023 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4024 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
4025 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4026 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4027 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4028 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
4029 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
4030 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
4031 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
4032 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
4033 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
4034 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
4035 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
4036 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
4037 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
4038 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
4039 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4040 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4041 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4042 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
4043 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
4044 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
4045 { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
4046 { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
4047 { "mblmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmin}, "min macroblock quantiser scale (VBR)", "q" },
4048 { "mblmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmax}, "max macroblock quantiser scale (VBR)", "q" },
4049 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
4050 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
4051 { "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" },
4052 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
4053 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
4054 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
4055 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
4056 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
4057 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
4058 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
4059 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
4060 { "b_strategy", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&b_strategy}, "dynamic b frame selection strategy", "strategy" },
4061 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
4062 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4063 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
4064 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
4065 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
4066 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffer size (in kByte)", "size" },
4067 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4068 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
4070 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
4071 { "mb_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_threshold}, "macroblock threshold", "" },
4072 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
4073 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
4074 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
4075 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
4076 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
4077 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
4078 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4079 "use same video quality as source (implies VBR)" },
4080 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4081 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
4082 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4083 "deinterlace pictures" },
4084 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4085 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
4086 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
4087 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4088 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4089 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4090 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
4091 { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
4092 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4093 { "mepc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&me_penalty_compensation}, "motion estimation bitrate penalty compensation", "factor (1.0 = 256)" },
4094 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4095 { "skip_threshold", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_threshold}, "frame skip threshold", "threshold" },
4096 { "skip_factor", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_factor}, "frame skip factor", "factor" },
4097 { "skip_exp", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_exp}, "frame skip exponent", "exponent" },
4098 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
4099 { "genpts", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&genpts }, "generate pts" },
4102 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
4103 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4104 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4105 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4106 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4107 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4108 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4109 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4110 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
4111 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4113 /* subtitle options */
4114 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4115 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
4116 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4119 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
4120 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4121 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4122 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
4124 /* G.2 grab options */
4125 { "grab", HAS_ARG | OPT_EXPERT | OPT_GRAB, {(void*)opt_grab}, "request grabbing using", "format" },
4126 { "gd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_grab_device}, "set grab device", "device" },
4129 { "muxrate", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_rate}, "set mux rate", "rate" },
4130 { "packetsize", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_packet_size}, "set packet size", "size" },
4131 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4132 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4133 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4137 static void show_banner(void)
4139 fprintf(stderr, "ffmpeg version " FFMPEG_VERSION ", build %d, Copyright (c) 2000-2004 Fabrice Bellard\n",
4141 fprintf(stderr, " configuration: %s\n", FFMPEG_CONFIGURATION);
4142 fprintf(stderr, " built on " __DATE__ " " __TIME__);
4144 fprintf(stderr, ", gcc: %s\n", __VERSION__);
4146 fprintf(stderr, ", using a non-gcc compiler\n");
4150 static void show_license(void)
4155 "This program is free software; you can redistribute it and/or modify\n"
4156 "it under the terms of the GNU General Public License as published by\n"
4157 "the Free Software Foundation; either version 2 of the License, or\n"
4158 "(at your option) any later version.\n"
4160 "This program is distributed in the hope that it will be useful,\n"
4161 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
4162 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
4163 "GNU General Public License for more details.\n"
4165 "You should have received a copy of the GNU General Public License\n"
4166 "along with this program; if not, write to the Free Software\n"
4167 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
4171 "This library is free software; you can redistribute it and/or\n"
4172 "modify it under the terms of the GNU Lesser General Public\n"
4173 "License as published by the Free Software Foundation; either\n"
4174 "version 2 of the License, or (at your option) any later version.\n"
4176 "This library is distributed in the hope that it will be useful,\n"
4177 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
4178 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
4179 "Lesser General Public License for more details.\n"
4181 "You should have received a copy of the GNU Lesser General Public\n"
4182 "License along with this library; if not, write to the Free Software\n"
4183 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
4189 static void show_help(void)
4192 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
4193 "Hyper fast Audio and Video encoder\n");
4195 show_help_options(options, "Main options:\n",
4196 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
4197 show_help_options(options, "\nVideo options:\n",
4198 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4200 show_help_options(options, "\nAdvanced Video options:\n",
4201 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4202 OPT_VIDEO | OPT_EXPERT);
4203 show_help_options(options, "\nAudio options:\n",
4204 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4206 show_help_options(options, "\nAdvanced Audio options:\n",
4207 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4208 OPT_AUDIO | OPT_EXPERT);
4209 show_help_options(options, "\nSubtitle options:\n",
4210 OPT_SUBTITLE | OPT_GRAB,
4212 show_help_options(options, "\nAudio/Video grab options:\n",
4215 show_help_options(options, "\nAdvanced options:\n",
4216 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4218 av_opt_show(avctx_opts, NULL);
4223 void parse_arg_file(const char *filename)
4225 opt_output_file(filename);
4228 int main(int argc, char **argv)
4235 avctx_opts= avcodec_alloc_context();
4243 parse_options(argc, argv, options);
4245 /* file converter / grab */
4246 if (nb_output_files <= 0) {
4247 fprintf(stderr, "Must supply at least one output file\n");
4251 if (nb_input_files == 0) {
4257 av_encode(output_files, nb_output_files, input_files, nb_input_files,
4258 stream_maps, nb_stream_maps);
4259 ti = getutime() - ti;
4261 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
4265 for(i=0;i<nb_output_files;i++) {
4266 /* maybe av_close_output_file ??? */
4267 AVFormatContext *s = output_files[i];
4269 if (!(s->oformat->flags & AVFMT_NOFILE))
4271 for(j=0;j<s->nb_streams;j++)
4272 av_free(s->streams[j]);
4275 for(i=0;i<nb_input_files;i++)
4276 av_close_input_file(input_files[i]);
4281 av_free(intra_matrix);
4283 av_free(inter_matrix);
4285 #ifdef POWERPC_PERFORMANCE_REPORT
4286 extern void powerpc_display_perf_report(void);
4287 powerpc_display_perf_report();
4288 #endif /* POWERPC_PERFORMANCE_REPORT */
4290 #ifndef CONFIG_WIN32
4291 if (received_sigterm) {
4293 "Received signal %d: terminating.\n",
4294 (int) received_sigterm);
4298 exit(0); /* not all OS-es handle main() return value */