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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 pre_me = 0;
147 static int do_deinterlace = 0;
148 static int workaround_bugs = FF_BUG_AUTODETECT;
149 static int packet_size = 0;
150 static int error_rate = 0;
151 static int strict = 0;
152 static int top_field_first = -1;
153 static int sc_threshold = 0;
154 static int me_threshold = 0;
155 static int mb_threshold = 0;
156 static int intra_dc_precision = 8;
157 static int me_penalty_compensation= 256;
158 static int frame_skip_threshold= 0;
159 static int frame_skip_factor= 0;
160 static int frame_skip_exp= 0;
161 extern int loop_input; /* currently a hack */
162 static int loop_output = AVFMT_NOOUTPUTLOOP;
163 static int genpts = 0;
164 static int qp_hist = 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 #ifdef CONFIG_VIDEO4LINUX2
217 static char *video_grab_format = "video4linux2";
219 static char *video_grab_format = "video4linux";
222 static char *video_device = NULL;
223 static char *grab_device = NULL;
224 static int video_channel = 0;
225 static char *video_standard = "ntsc";
227 static char *audio_grab_format = "audio_device";
228 static char *audio_device = NULL;
229 static int audio_volume = 256;
231 static int using_stdin = 0;
232 static int using_vhook = 0;
233 static int verbose = 1;
234 static int thread_count= 1;
235 static int q_pressed = 0;
236 static int me_range = 0;
237 static int64_t video_size = 0;
238 static int64_t audio_size = 0;
239 static int64_t extra_size = 0;
240 static int nb_frames_dup = 0;
241 static int nb_frames_drop = 0;
242 static int input_sync;
243 static int limit_filesize = 0; //
245 static int pgmyuv_compatibility_hack=0;
246 static int dts_delta_threshold = 10;
248 const char **opt_names=NULL;
249 int opt_name_count=0;
250 AVCodecContext *avctx_opts;
253 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
255 struct AVInputStream;
257 typedef struct AVOutputStream {
258 int file_index; /* file index */
259 int index; /* stream index in the output file */
260 int source_index; /* AVInputStream index */
261 AVStream *st; /* stream in the output file */
262 int encoding_needed; /* true if encoding needed for this stream */
264 /* input pts and corresponding output pts
266 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
267 struct AVInputStream *sync_ist; /* input stream to sync against */
268 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
270 int video_resample; /* video_resample and video_crop are mutually exclusive */
271 AVFrame pict_tmp; /* temporary image for resampling */
272 ImgReSampleContext *img_resample_ctx; /* for image resampling */
274 int video_crop; /* video_resample and video_crop are mutually exclusive */
275 int topBand; /* cropping area sizes */
278 int video_pad; /* video_resample and video_pad are mutually exclusive */
279 int padtop; /* padding area sizes */
286 ReSampleContext *resample; /* for audio resampling */
287 FifoBuffer fifo; /* for compression: one audio fifo per codec */
291 typedef struct AVInputStream {
295 int discard; /* true if stream data should be discarded */
296 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
297 int64_t sample_index; /* current sample */
299 int64_t start; /* time when read started */
300 unsigned long frame; /* current frame */
301 int64_t next_pts; /* synthetic pts for cases where pkt.pts
303 int64_t pts; /* current pts */
304 int is_start; /* is 1 at the start and after a discontinuity */
307 typedef struct AVInputFile {
308 int eof_reached; /* true if eof reached */
309 int ist_index; /* index of first stream in ist_table */
310 int buffer_size; /* current total buffer size */
311 int buffer_size_max; /* buffer size at which we consider we can stop
313 int nb_streams; /* nb streams we are aware of */
318 /* init terminal so that we can grab keys */
319 static struct termios oldtty;
321 static void term_exit(void)
323 tcsetattr (0, TCSANOW, &oldtty);
326 static volatile sig_atomic_t received_sigterm = 0;
329 sigterm_handler(int sig)
331 received_sigterm = sig;
335 static void term_init(void)
342 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
343 |INLCR|IGNCR|ICRNL|IXON);
344 tty.c_oflag |= OPOST;
345 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
346 tty.c_cflag &= ~(CSIZE|PARENB);
351 tcsetattr (0, TCSANOW, &tty);
353 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
354 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
355 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
357 register a function to be called at normal program termination
360 #ifdef CONFIG_BEOS_NETSERVER
361 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
365 /* read a key without blocking */
366 static int read_key(void)
370 #ifndef CONFIG_BEOS_NETSERVER
378 n = select(1, &rfds, NULL, NULL, &tv);
390 static int decode_interrupt_cb(void)
392 return q_pressed || (q_pressed = read_key() == 'q');
397 static volatile int received_sigterm = 0;
399 /* no interactive support */
400 static void term_exit(void)
404 static void term_init(void)
408 static int read_key(void)
415 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
420 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
423 /* copy stream format */
424 s->nb_streams = ic->nb_streams;
425 for(i=0;i<ic->nb_streams;i++) {
428 // FIXME: a more elegant solution is needed
429 st = av_mallocz(sizeof(AVStream));
430 memcpy(st, ic->streams[i], sizeof(AVStream));
431 st->codec = avcodec_alloc_context();
432 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
436 av_close_input_file(ic);
441 get_sync_ipts(const AVOutputStream *ost)
443 const AVInputStream *ist = ost->sync_ist;
444 return (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/AV_TIME_BASE;
447 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
449 static void do_audio_out(AVFormatContext *s,
452 unsigned char *buf, int size)
455 static uint8_t *audio_buf = NULL;
456 static uint8_t *audio_out = NULL;
457 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
459 int size_out, frame_bytes, ret;
460 AVCodecContext *enc= ost->st->codec;
462 /* SC: dynamic allocation of buffers */
464 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
466 audio_out = av_malloc(audio_out_size);
467 if (!audio_buf || !audio_out)
468 return; /* Should signal an error ! */
470 if(audio_sync_method){
471 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
472 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec->channels * 2);
473 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
474 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
476 //FIXME resample delay
477 if(fabs(delta) > 50){
480 byte_delta= FFMAX(byte_delta, -size);
484 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
489 static uint8_t *input_tmp= NULL;
490 input_tmp= av_realloc(input_tmp, byte_delta + size);
492 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
495 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
497 memset(input_tmp, 0, byte_delta);
498 memcpy(input_tmp + byte_delta, buf, size);
502 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
504 }else if(audio_sync_method>1){
505 int comp= clip(delta, -audio_sync_method, audio_sync_method);
506 assert(ost->audio_resample);
508 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
509 // 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));
510 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
514 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
515 - fifo_size(&ost->fifo, ost->fifo.rptr)/(ost->st->codec->channels * 2); //FIXME wrong
517 if (ost->audio_resample) {
519 size_out = audio_resample(ost->resample,
520 (short *)buftmp, (short *)buf,
521 size / (ist->st->codec->channels * 2));
522 size_out = size_out * enc->channels * 2;
528 /* now encode as many frames as possible */
529 if (enc->frame_size > 1) {
530 /* output resampled raw samples */
531 fifo_write(&ost->fifo, buftmp, size_out,
534 frame_bytes = enc->frame_size * 2 * enc->channels;
536 while (fifo_read(&ost->fifo, audio_buf, frame_bytes,
537 &ost->fifo.rptr) == 0) {
539 av_init_packet(&pkt);
541 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
544 pkt.stream_index= ost->index;
547 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
548 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
549 pkt.flags |= PKT_FLAG_KEY;
550 av_interleaved_write_frame(s, &pkt);
552 ost->sync_opts += enc->frame_size;
556 av_init_packet(&pkt);
558 ost->sync_opts += size_out / (2 * enc->channels);
560 /* output a pcm frame */
561 /* XXX: change encoding codec API to avoid this ? */
562 switch(enc->codec->id) {
563 case CODEC_ID_PCM_S32LE:
564 case CODEC_ID_PCM_S32BE:
565 case CODEC_ID_PCM_U32LE:
566 case CODEC_ID_PCM_U32BE:
567 size_out = size_out << 1;
569 case CODEC_ID_PCM_S24LE:
570 case CODEC_ID_PCM_S24BE:
571 case CODEC_ID_PCM_U24LE:
572 case CODEC_ID_PCM_U24BE:
573 case CODEC_ID_PCM_S24DAUD:
574 size_out = size_out / 2 * 3;
576 case CODEC_ID_PCM_S16LE:
577 case CODEC_ID_PCM_S16BE:
578 case CODEC_ID_PCM_U16LE:
579 case CODEC_ID_PCM_U16BE:
582 size_out = size_out >> 1;
585 ret = avcodec_encode_audio(enc, audio_out, size_out,
588 pkt.stream_index= ost->index;
591 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
592 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
593 pkt.flags |= PKT_FLAG_KEY;
594 av_interleaved_write_frame(s, &pkt);
598 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
602 AVPicture picture_tmp;
605 dec = ist->st->codec;
607 /* deinterlace : must be done before any resize */
608 if (do_deinterlace || using_vhook) {
611 /* create temporary picture */
612 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
613 buf = av_malloc(size);
617 picture2 = &picture_tmp;
618 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
621 if(avpicture_deinterlace(picture2, picture,
622 dec->pix_fmt, dec->width, dec->height) < 0) {
623 /* if error, do not deinterlace */
629 if (img_convert(picture2, dec->pix_fmt, picture,
630 dec->pix_fmt, dec->width, dec->height) < 0) {
631 /* if error, do not copy */
641 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
643 if (picture != picture2)
644 *picture = *picture2;
648 /* we begin to correct av delay at this threshold */
649 #define AV_DELAY_MAX 0.100
652 /* Expects img to be yuv420 */
653 static void fill_pad_region(AVPicture* img, int height, int width,
654 int padtop, int padbottom, int padleft, int padright, int *color) {
659 for (i = 0; i < 3; i++) {
660 shift = (i == 0) ? 0 : 1;
662 if (padtop || padleft) {
663 memset(img->data[i], color[i], (((img->linesize[i] * padtop) +
667 if (padleft || padright) {
668 optr = img->data[i] + (img->linesize[i] * (padtop >> shift)) +
669 (img->linesize[i] - (padright >> shift));
671 for (y = 0; y < ((height - (padtop + padbottom) - 1) >> shift); y++) {
672 memset(optr, color[i], (padleft + padright) >> shift);
673 optr += img->linesize[i];
677 if (padbottom || padright) {
678 optr = img->data[i] + (((img->linesize[i] * (height - padbottom)) - padright) >> shift);
679 memset(optr, color[i], (((img->linesize[i] * padbottom) + padright) >> shift));
684 static void do_subtitle_out(AVFormatContext *s,
690 static uint8_t *subtitle_out = NULL;
691 int subtitle_out_max_size = 65536;
692 int subtitle_out_size, nb, i;
696 if (pts == AV_NOPTS_VALUE) {
697 fprintf(stderr, "Subtitle packets must have a pts\n");
701 enc = ost->st->codec;
704 subtitle_out = av_malloc(subtitle_out_max_size);
707 /* Note: DVB subtitle need one packet to draw them and one other
708 packet to clear them */
709 /* XXX: signal it in the codec context ? */
710 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
715 for(i = 0; i < nb; i++) {
716 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
717 subtitle_out_max_size, sub);
719 av_init_packet(&pkt);
720 pkt.stream_index = ost->index;
721 pkt.data = subtitle_out;
722 pkt.size = subtitle_out_size;
723 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);
724 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
725 /* XXX: the pts correction is handled here. Maybe handling
726 it in the codec would be better */
728 pkt.pts += 90 * sub->start_display_time;
730 pkt.pts += 90 * sub->end_display_time;
732 av_interleaved_write_frame(s, &pkt);
736 static int bit_buffer_size= 1024*256;
737 static uint8_t *bit_buffer= NULL;
739 static void do_video_out(AVFormatContext *s,
745 int nb_frames, i, ret;
746 AVFrame *final_picture, *formatted_picture;
747 AVFrame picture_format_temp, picture_crop_temp;
748 uint8_t *buf = NULL, *buf1 = NULL;
749 AVCodecContext *enc, *dec;
750 enum PixelFormat target_pixfmt;
752 avcodec_get_frame_defaults(&picture_format_temp);
753 avcodec_get_frame_defaults(&picture_crop_temp);
755 enc = ost->st->codec;
756 dec = ist->st->codec;
758 /* by default, we output a single frame */
763 if(video_sync_method){
765 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
766 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
769 else if (vdelta > 1.1)
770 nb_frames = lrintf(vdelta);
771 //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);
775 fprintf(stderr, "*** drop!\n");
776 }else if (nb_frames > 1) {
777 nb_frames_dup += nb_frames;
779 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
782 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
784 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
788 /* convert pixel format if needed */
789 target_pixfmt = ost->video_resample || ost->video_pad
790 ? PIX_FMT_YUV420P : enc->pix_fmt;
791 if (dec->pix_fmt != target_pixfmt) {
794 /* create temporary picture */
795 size = avpicture_get_size(target_pixfmt, dec->width, dec->height);
796 buf = av_malloc(size);
799 formatted_picture = &picture_format_temp;
800 avpicture_fill((AVPicture*)formatted_picture, buf, target_pixfmt, dec->width, dec->height);
802 if (img_convert((AVPicture*)formatted_picture, target_pixfmt,
803 (AVPicture *)in_picture, dec->pix_fmt,
804 dec->width, dec->height) < 0) {
807 fprintf(stderr, "pixel format conversion not handled\n");
812 formatted_picture = in_picture;
815 /* XXX: resampling could be done before raw format conversion in
816 some cases to go faster */
817 /* XXX: only works for YUV420P */
818 if (ost->video_resample) {
819 final_picture = &ost->pict_tmp;
820 img_resample(ost->img_resample_ctx, (AVPicture*)final_picture, (AVPicture*)formatted_picture);
822 if (ost->padtop || ost->padbottom || ost->padleft || ost->padright) {
823 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
824 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
828 if (enc->pix_fmt != PIX_FMT_YUV420P) {
832 /* create temporary picture */
833 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
834 buf = av_malloc(size);
837 final_picture = &picture_format_temp;
838 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
840 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
841 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
842 enc->width, enc->height) < 0) {
845 fprintf(stderr, "pixel format conversion not handled\n");
850 } else if (ost->video_crop) {
851 if (img_crop((AVPicture *)&picture_crop_temp, (AVPicture *)formatted_picture, enc->pix_fmt, ost->topBand, ost->leftBand) < 0) {
852 av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
855 final_picture = &picture_crop_temp;
856 } else if (ost->video_pad) {
857 final_picture = &ost->pict_tmp;
859 for (i = 0; i < 3; i++) {
860 uint8_t *optr, *iptr;
861 int shift = (i == 0) ? 0 : 1;
864 /* set offset to start writing image into */
865 optr = final_picture->data[i] + (((final_picture->linesize[i] *
866 ost->padtop) + ost->padleft) >> shift);
867 iptr = formatted_picture->data[i];
869 yheight = (enc->height - ost->padtop - ost->padbottom) >> shift;
870 for (y = 0; y < yheight; y++) {
871 /* copy unpadded image row into padded image row */
872 memcpy(optr, iptr, formatted_picture->linesize[i]);
873 optr += final_picture->linesize[i];
874 iptr += formatted_picture->linesize[i];
878 fill_pad_region((AVPicture*)final_picture, enc->height, enc->width,
879 ost->padtop, ost->padbottom, ost->padleft, ost->padright,
882 if (enc->pix_fmt != PIX_FMT_YUV420P) {
886 /* create temporary picture */
887 size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height);
888 buf = av_malloc(size);
891 final_picture = &picture_format_temp;
892 avpicture_fill((AVPicture*)final_picture, buf, enc->pix_fmt, enc->width, enc->height);
894 if (img_convert((AVPicture*)final_picture, enc->pix_fmt,
895 (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
896 enc->width, enc->height) < 0) {
899 fprintf(stderr, "pixel format conversion not handled\n");
905 final_picture = formatted_picture;
907 /* duplicates frame if needed */
908 for(i=0;i<nb_frames;i++) {
910 av_init_packet(&pkt);
911 pkt.stream_index= ost->index;
913 if (s->oformat->flags & AVFMT_RAWPICTURE) {
914 /* raw pictures are written as AVPicture structure to
915 avoid any copies. We support temorarily the older
917 AVFrame* old_frame = enc->coded_frame;
918 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
919 pkt.data= (uint8_t *)final_picture;
920 pkt.size= sizeof(AVPicture);
921 if(dec->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
922 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
923 if(dec->coded_frame && dec->coded_frame->key_frame)
924 pkt.flags |= PKT_FLAG_KEY;
926 av_interleaved_write_frame(s, &pkt);
927 enc->coded_frame = old_frame;
931 big_picture= *final_picture;
932 /* better than nothing: use input picture interlaced
934 big_picture.interlaced_frame = in_picture->interlaced_frame;
935 if(avctx_opts->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
936 if(top_field_first == -1)
937 big_picture.top_field_first = in_picture->top_field_first;
939 big_picture.top_field_first = top_field_first;
942 /* handles sameq here. This is not correct because it may
943 not be a global option */
945 big_picture.quality = ist->st->quality;
947 big_picture.quality = ost->st->quality;
949 big_picture.pict_type = 0;
950 // big_picture.pts = AV_NOPTS_VALUE;
951 big_picture.pts= ost->sync_opts;
952 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
953 //av_log(NULL, AV_LOG_DEBUG, "%lld -> encoder\n", ost->sync_opts);
954 ret = avcodec_encode_video(enc,
955 bit_buffer, bit_buffer_size,
957 //enc->frame_number = enc->real_pict_num;
959 pkt.data= bit_buffer;
961 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
962 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
963 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %lld/%lld\n",
964 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
965 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
967 if(enc->coded_frame && enc->coded_frame->key_frame)
968 pkt.flags |= PKT_FLAG_KEY;
969 av_interleaved_write_frame(s, &pkt);
971 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
972 // enc->frame_number-1, enc->real_pict_num, ret,
974 /* if two pass, output log */
975 if (ost->logfile && enc->stats_out) {
976 fprintf(ost->logfile, "%s", enc->stats_out);
988 static double psnr(double d){
989 if(d==0) return INFINITY;
990 return -10.0*log(d)/log(10.0);
993 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
996 static FILE *fvstats=NULL;
1000 AVCodecContext *enc;
1003 double ti1, bitrate, avg_bitrate;
1006 today2 = time(NULL);
1007 today = localtime(&today2);
1008 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour,
1011 fvstats = fopen(filename,"w");
1019 enc = ost->st->codec;
1020 if (enc->codec_type == CODEC_TYPE_VIDEO) {
1021 frame_number = ost->frame_number;
1022 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1023 if (enc->flags&CODEC_FLAG_PSNR)
1024 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1026 fprintf(fvstats,"f_size= %6d ", frame_size);
1027 /* compute pts value */
1028 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1032 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1033 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1034 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1035 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1036 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1040 static void print_report(AVFormatContext **output_files,
1041 AVOutputStream **ost_table, int nb_ostreams,
1045 AVOutputStream *ost;
1046 AVFormatContext *oc, *os;
1048 AVCodecContext *enc;
1049 int frame_number, vid, i;
1050 double bitrate, ti1, pts;
1051 static int64_t last_time = -1;
1052 static int qp_histogram[52];
1054 if (!is_last_report) {
1056 /* display the report every 0.5 seconds */
1057 cur_time = av_gettime();
1058 if (last_time == -1) {
1059 last_time = cur_time;
1062 if ((cur_time - last_time) < 500000)
1064 last_time = cur_time;
1068 oc = output_files[0];
1070 total_size = url_ftell(&oc->pb);
1075 for(i=0;i<nb_ostreams;i++) {
1077 os = output_files[ost->file_index];
1078 enc = ost->st->codec;
1079 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1080 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1081 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1083 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1084 frame_number = ost->frame_number;
1085 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d q=%3.1f ",
1086 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1088 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1089 if(qp_hist && enc->coded_frame){
1091 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1092 if(qp>=0 && qp<sizeof(qp_histogram)/sizeof(int))
1095 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1097 if (enc->flags&CODEC_FLAG_PSNR){
1099 double error, error_sum=0;
1100 double scale, scale_sum=0;
1101 char type[3]= {'Y','U','V'};
1102 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1105 error= enc->error[j];
1106 scale= enc->width*enc->height*255.0*255.0*frame_number;
1108 error= enc->coded_frame->error[j];
1109 scale= enc->width*enc->height*255.0*255.0;
1114 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1116 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1120 /* compute min output value */
1121 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
1122 if ((pts < ti1) && (pts > 0))
1128 if (verbose || is_last_report) {
1129 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1131 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1132 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
1133 (double)total_size / 1024, ti1, bitrate);
1136 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1137 nb_frames_dup, nb_frames_drop);
1140 fprintf(stderr, "%s \r", buf);
1145 if (is_last_report && verbose >= 0){
1146 int64_t raw= audio_size + video_size + extra_size;
1147 fprintf(stderr, "\n");
1148 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1152 100.0*(total_size - raw)/raw
1157 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1158 static int output_packet(AVInputStream *ist, int ist_index,
1159 AVOutputStream **ost_table, int nb_ostreams,
1160 const AVPacket *pkt)
1162 AVFormatContext *os;
1163 AVOutputStream *ost;
1167 int data_size, got_picture;
1169 void *buffer_to_free;
1170 static unsigned int samples_size= 0;
1171 static short *samples= NULL;
1172 AVSubtitle subtitle, *subtitle_to_free;
1176 ist->pts= ist->next_pts; // needed for last packet if vsync=0
1177 } else if (pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1178 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1180 // assert(ist->pts == ist->next_pts);
1194 /* decode the packet if needed */
1195 data_buf = NULL; /* fail safe */
1197 subtitle_to_free = NULL;
1198 if (ist->decoding_needed) {
1199 switch(ist->st->codec->codec_type) {
1200 case CODEC_TYPE_AUDIO:{
1202 samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE));
1203 /* XXX: could avoid copy if PCM 16 bits with same
1204 endianness as CPU */
1205 ret = avcodec_decode_audio(ist->st->codec, samples, &data_size,
1211 /* Some bug in mpeg audio decoder gives */
1212 /* data_size < 0, it seems they are overflows */
1213 if (data_size <= 0) {
1214 /* no audio frame */
1217 data_buf = (uint8_t *)samples;
1218 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1219 (ist->st->codec->sample_rate * ist->st->codec->channels);
1221 case CODEC_TYPE_VIDEO:
1222 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1223 /* XXX: allocate picture correctly */
1224 avcodec_get_frame_defaults(&picture);
1226 ret = avcodec_decode_video(ist->st->codec,
1227 &picture, &got_picture, ptr, len);
1228 ist->st->quality= picture.quality;
1232 /* no picture yet */
1233 goto discard_packet;
1235 if (ist->st->codec->time_base.num != 0) {
1236 ist->next_pts += ((int64_t)AV_TIME_BASE *
1237 ist->st->codec->time_base.num) /
1238 ist->st->codec->time_base.den;
1242 case CODEC_TYPE_SUBTITLE:
1243 ret = avcodec_decode_subtitle(ist->st->codec,
1244 &subtitle, &got_subtitle, ptr, len);
1247 if (!got_subtitle) {
1248 goto discard_packet;
1250 subtitle_to_free = &subtitle;
1257 switch(ist->st->codec->codec_type) {
1258 case CODEC_TYPE_AUDIO:
1259 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1260 (ist->st->codec->sample_rate * ist->st->codec->channels);
1262 case CODEC_TYPE_VIDEO:
1263 if (ist->st->codec->time_base.num != 0) {
1264 ist->next_pts += ((int64_t)AV_TIME_BASE *
1265 ist->st->codec->time_base.num) /
1266 ist->st->codec->time_base.den;
1276 buffer_to_free = NULL;
1277 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1278 pre_process_video_frame(ist, (AVPicture *)&picture,
1282 // preprocess audio (volume)
1283 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1284 if (audio_volume != 256) {
1287 for(i=0;i<(data_size / sizeof(short));i++) {
1288 int v = ((*volp) * audio_volume + 128) >> 8;
1289 if (v < -32768) v = -32768;
1290 if (v > 32767) v = 32767;
1296 /* frame rate emulation */
1297 if (ist->st->codec->rate_emu) {
1298 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
1299 int64_t now = av_gettime() - ist->start;
1307 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1308 is the one of the next displayed one */
1309 /* XXX: add mpeg4 too ? */
1310 if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
1311 if (ist->st->codec->pict_type != B_TYPE) {
1313 tmp = ist->last_ip_pts;
1314 ist->last_ip_pts = ist->frac_pts.val;
1315 ist->frac_pts.val = tmp;
1319 /* if output time reached then transcode raw format,
1320 encode packets and output them */
1321 if (start_time == 0 || ist->pts >= start_time)
1322 for(i=0;i<nb_ostreams;i++) {
1326 if (ost->source_index == ist_index) {
1327 os = output_files[ost->file_index];
1330 printf("%d: got pts=%0.3f %0.3f\n", i,
1331 (double)pkt->pts / AV_TIME_BASE,
1332 ((double)ist->pts / AV_TIME_BASE) -
1333 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1335 /* set the input output pts pairs */
1336 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1338 if (ost->encoding_needed) {
1339 switch(ost->st->codec->codec_type) {
1340 case CODEC_TYPE_AUDIO:
1341 do_audio_out(os, ost, ist, data_buf, data_size);
1343 case CODEC_TYPE_VIDEO:
1344 do_video_out(os, ost, ist, &picture, &frame_size);
1345 video_size += frame_size;
1346 if (do_vstats && frame_size)
1347 do_video_stats(os, ost, frame_size);
1349 case CODEC_TYPE_SUBTITLE:
1350 do_subtitle_out(os, ost, ist, &subtitle,
1357 AVFrame avframe; //FIXME/XXX remove this
1359 av_init_packet(&opkt);
1361 /* no reencoding needed : output the packet directly */
1362 /* force the input stream PTS */
1364 avcodec_get_frame_defaults(&avframe);
1365 ost->st->codec->coded_frame= &avframe;
1366 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1368 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1369 audio_size += data_size;
1370 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1371 video_size += data_size;
1375 opkt.stream_index= ost->index;
1376 if(pkt->pts != AV_NOPTS_VALUE)
1377 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);
1379 opkt.pts= AV_NOPTS_VALUE;
1383 if (pkt->dts == AV_NOPTS_VALUE)
1384 dts = ist->next_pts;
1386 dts= av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1387 opkt.dts= av_rescale_q(dts + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
1389 opkt.flags= pkt->flags;
1390 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1391 opkt.destruct= av_destruct_packet;
1392 av_interleaved_write_frame(os, &opkt);
1393 ost->st->codec->frame_number++;
1394 ost->frame_number++;
1395 av_free_packet(&opkt);
1399 av_free(buffer_to_free);
1400 /* XXX: allocate the subtitles in the codec ? */
1401 if (subtitle_to_free) {
1402 if (subtitle_to_free->rects != NULL) {
1403 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1404 av_free(subtitle_to_free->rects[i].bitmap);
1405 av_free(subtitle_to_free->rects[i].rgba_palette);
1407 av_freep(&subtitle_to_free->rects);
1409 subtitle_to_free->num_rects = 0;
1410 subtitle_to_free = NULL;
1417 for(i=0;i<nb_ostreams;i++) {
1419 if (ost->source_index == ist_index) {
1420 AVCodecContext *enc= ost->st->codec;
1421 os = output_files[ost->file_index];
1423 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1425 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1428 if (ost->encoding_needed) {
1431 av_init_packet(&pkt);
1432 pkt.stream_index= ost->index;
1434 switch(ost->st->codec->codec_type) {
1435 case CODEC_TYPE_AUDIO:
1436 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1438 pkt.flags |= PKT_FLAG_KEY;
1440 case CODEC_TYPE_VIDEO:
1441 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1443 if(enc->coded_frame && enc->coded_frame->key_frame)
1444 pkt.flags |= PKT_FLAG_KEY;
1445 if (ost->logfile && enc->stats_out) {
1446 fprintf(ost->logfile, "%s", enc->stats_out);
1455 pkt.data= bit_buffer;
1457 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1458 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1459 av_interleaved_write_frame(os, &pkt);
1473 * The following code is the main loop of the file converter
1475 static int av_encode(AVFormatContext **output_files,
1476 int nb_output_files,
1477 AVFormatContext **input_files,
1479 AVStreamMap *stream_maps, int nb_stream_maps)
1481 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1482 AVFormatContext *is, *os;
1483 AVCodecContext *codec, *icodec;
1484 AVOutputStream *ost, **ost_table = NULL;
1485 AVInputStream *ist, **ist_table = NULL;
1486 AVInputFile *file_table;
1487 AVFormatContext *stream_no_data;
1490 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1494 /* input stream init */
1496 for(i=0;i<nb_input_files;i++) {
1497 is = input_files[i];
1498 file_table[i].ist_index = j;
1499 file_table[i].nb_streams = is->nb_streams;
1500 j += is->nb_streams;
1504 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1508 for(i=0;i<nb_istreams;i++) {
1509 ist = av_mallocz(sizeof(AVInputStream));
1515 for(i=0;i<nb_input_files;i++) {
1516 is = input_files[i];
1517 for(k=0;k<is->nb_streams;k++) {
1518 ist = ist_table[j++];
1519 ist->st = is->streams[k];
1520 ist->file_index = i;
1522 ist->discard = 1; /* the stream is discarded by default
1525 if (ist->st->codec->rate_emu) {
1526 ist->start = av_gettime();
1532 /* output stream init */
1534 for(i=0;i<nb_output_files;i++) {
1535 os = output_files[i];
1536 nb_ostreams += os->nb_streams;
1538 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1539 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1543 /* Sanity check the mapping args -- do the input files & streams exist? */
1544 for(i=0;i<nb_stream_maps;i++) {
1545 int fi = stream_maps[i].file_index;
1546 int si = stream_maps[i].stream_index;
1548 if (fi < 0 || fi > nb_input_files - 1 ||
1549 si < 0 || si > file_table[fi].nb_streams - 1) {
1550 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1553 fi = stream_maps[i].sync_file_index;
1554 si = stream_maps[i].sync_stream_index;
1555 if (fi < 0 || fi > nb_input_files - 1 ||
1556 si < 0 || si > file_table[fi].nb_streams - 1) {
1557 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1562 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1565 for(i=0;i<nb_ostreams;i++) {
1566 ost = av_mallocz(sizeof(AVOutputStream));
1573 for(k=0;k<nb_output_files;k++) {
1574 os = output_files[k];
1575 for(i=0;i<os->nb_streams;i++) {
1577 ost = ost_table[n++];
1578 ost->file_index = k;
1580 ost->st = os->streams[i];
1581 if (nb_stream_maps > 0) {
1582 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1583 stream_maps[n-1].stream_index;
1585 /* Sanity check that the stream types match */
1586 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1587 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1588 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1589 ost->file_index, ost->index);
1594 /* get corresponding input stream index : we select the first one with the right type */
1596 for(j=0;j<nb_istreams;j++) {
1599 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1600 ost->source_index = j;
1607 /* try again and reuse existing stream */
1608 for(j=0;j<nb_istreams;j++) {
1610 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1611 ost->source_index = j;
1616 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1617 ost->file_index, ost->index);
1622 ist = ist_table[ost->source_index];
1624 ost->sync_ist = (nb_stream_maps > 0) ?
1625 ist_table[file_table[stream_maps[n-1].sync_file_index].ist_index +
1626 stream_maps[n-1].sync_stream_index] : ist;
1630 /* for each output stream, we compute the right encoding parameters */
1631 for(i=0;i<nb_ostreams;i++) {
1633 ist = ist_table[ost->source_index];
1635 codec = ost->st->codec;
1636 icodec = ist->st->codec;
1638 if (ost->st->stream_copy) {
1639 /* if stream_copy is selected, no need to decode or encode */
1640 codec->codec_id = icodec->codec_id;
1641 codec->codec_type = icodec->codec_type;
1642 if(!codec->codec_tag) codec->codec_tag = icodec->codec_tag;
1643 codec->bit_rate = icodec->bit_rate;
1644 codec->extradata= icodec->extradata;
1645 codec->extradata_size= icodec->extradata_size;
1646 codec->time_base = icodec->time_base;
1647 switch(codec->codec_type) {
1648 case CODEC_TYPE_AUDIO:
1649 codec->sample_rate = icodec->sample_rate;
1650 codec->channels = icodec->channels;
1651 codec->frame_size = icodec->frame_size;
1652 codec->block_align= icodec->block_align;
1654 case CODEC_TYPE_VIDEO:
1655 codec->pix_fmt = icodec->pix_fmt;
1656 codec->width = icodec->width;
1657 codec->height = icodec->height;
1658 codec->has_b_frames = icodec->has_b_frames;
1660 case CODEC_TYPE_SUBTITLE:
1666 switch(codec->codec_type) {
1667 case CODEC_TYPE_AUDIO:
1668 if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1671 if (codec->channels == icodec->channels &&
1672 codec->sample_rate == icodec->sample_rate) {
1673 ost->audio_resample = 0;
1675 if (codec->channels != icodec->channels &&
1676 (icodec->codec_id == CODEC_ID_AC3 ||
1677 icodec->codec_id == CODEC_ID_DTS)) {
1678 /* Special case for 5:1 AC3 and DTS input */
1679 /* and mono or stereo output */
1680 /* Request specific number of channels */
1681 icodec->channels = codec->channels;
1682 if (codec->sample_rate == icodec->sample_rate)
1683 ost->audio_resample = 0;
1685 ost->audio_resample = 1;
1688 ost->audio_resample = 1;
1691 if(audio_sync_method>1)
1692 ost->audio_resample = 1;
1694 if(ost->audio_resample){
1695 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1696 codec->sample_rate, icodec->sample_rate);
1698 printf("Can't resample. Aborting.\n");
1702 ist->decoding_needed = 1;
1703 ost->encoding_needed = 1;
1705 case CODEC_TYPE_VIDEO:
1706 if (codec->width == icodec->width &&
1707 codec->height == icodec->height &&
1708 frame_topBand == 0 &&
1709 frame_bottomBand == 0 &&
1710 frame_leftBand == 0 &&
1711 frame_rightBand == 0 &&
1712 frame_padtop == 0 &&
1713 frame_padbottom == 0 &&
1714 frame_padleft == 0 &&
1715 frame_padright == 0)
1717 ost->video_resample = 0;
1718 ost->video_crop = 0;
1720 } else if ((codec->width == icodec->width -
1721 (frame_leftBand + frame_rightBand)) &&
1722 (codec->height == icodec->height -
1723 (frame_topBand + frame_bottomBand)) &&
1724 (frame_rightBand + frame_leftBand + frame_topBand + frame_bottomBand)) {
1725 ost->video_resample = 0;
1726 ost->video_crop = 1;
1727 ost->topBand = frame_topBand;
1728 ost->leftBand = frame_leftBand;
1729 } else if ((codec->width == icodec->width +
1730 (frame_padleft + frame_padright)) &&
1731 (codec->height == icodec->height +
1732 (frame_padtop + frame_padbottom)) &&
1733 (frame_padright + frame_padleft + frame_padtop + frame_padbottom)) {
1734 ost->video_resample = 0;
1735 ost->video_crop = 0;
1737 ost->padtop = frame_padtop;
1738 ost->padleft = frame_padleft;
1739 ost->padbottom = frame_padbottom;
1740 ost->padright = frame_padright;
1741 avcodec_get_frame_defaults(&ost->pict_tmp);
1742 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1743 codec->width, codec->height ) )
1746 ost->video_resample = 1;
1747 ost->video_crop = 0; // cropping is handled as part of resample
1748 avcodec_get_frame_defaults(&ost->pict_tmp);
1749 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, PIX_FMT_YUV420P,
1750 codec->width, codec->height ) )
1753 ost->img_resample_ctx = img_resample_full_init(
1754 codec->width, codec->height,
1755 icodec->width, icodec->height,
1756 frame_topBand, frame_bottomBand,
1757 frame_leftBand, frame_rightBand,
1758 frame_padtop, frame_padbottom,
1759 frame_padleft, frame_padright);
1761 ost->padtop = frame_padtop;
1762 ost->padleft = frame_padleft;
1763 ost->padbottom = frame_padbottom;
1764 ost->padright = frame_padright;
1767 ost->encoding_needed = 1;
1768 ist->decoding_needed = 1;
1770 case CODEC_TYPE_SUBTITLE:
1771 ost->encoding_needed = 1;
1772 ist->decoding_needed = 1;
1779 if (ost->encoding_needed &&
1780 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1781 char logfilename[1024];
1786 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1788 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1789 if (codec->flags & CODEC_FLAG_PASS1) {
1790 f = fopen(logfilename, "w");
1792 perror(logfilename);
1797 /* read the log file */
1798 f = fopen(logfilename, "r");
1800 perror(logfilename);
1803 fseek(f, 0, SEEK_END);
1805 fseek(f, 0, SEEK_SET);
1806 logbuffer = av_malloc(size + 1);
1808 fprintf(stderr, "Could not allocate log buffer\n");
1811 size = fread(logbuffer, 1, size, f);
1813 logbuffer[size] = '\0';
1814 codec->stats_in = logbuffer;
1818 if(codec->codec_type == CODEC_TYPE_VIDEO){
1819 int size= codec->width * codec->height;
1820 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1825 bit_buffer = av_malloc(bit_buffer_size);
1829 /* dump the file output parameters - cannot be done before in case
1831 for(i=0;i<nb_output_files;i++) {
1832 dump_format(output_files[i], i, output_files[i]->filename, 1);
1835 /* dump the stream mapping */
1837 fprintf(stderr, "Stream mapping:\n");
1838 for(i=0;i<nb_ostreams;i++) {
1840 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1841 ist_table[ost->source_index]->file_index,
1842 ist_table[ost->source_index]->index,
1845 if (ost->sync_ist != ist_table[ost->source_index])
1846 fprintf(stderr, " [sync #%d.%d]",
1847 ost->sync_ist->file_index,
1848 ost->sync_ist->index);
1849 fprintf(stderr, "\n");
1853 /* open each encoder */
1854 for(i=0;i<nb_ostreams;i++) {
1856 if (ost->encoding_needed) {
1858 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1860 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1861 ost->file_index, ost->index);
1864 if (avcodec_open(ost->st->codec, codec) < 0) {
1865 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1866 ost->file_index, ost->index);
1869 extra_size += ost->st->codec->extradata_size;
1873 /* open each decoder */
1874 for(i=0;i<nb_istreams;i++) {
1876 if (ist->decoding_needed) {
1878 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1880 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1881 ist->st->codec->codec_id, ist->file_index, ist->index);
1884 if (avcodec_open(ist->st->codec, codec) < 0) {
1885 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1886 ist->file_index, ist->index);
1889 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1890 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1895 for(i=0;i<nb_istreams;i++) {
1897 is = input_files[ist->file_index];
1899 ist->next_pts = av_rescale_q(ist->st->start_time, ist->st->time_base, AV_TIME_BASE_Q);
1900 if(ist->st->start_time == AV_NOPTS_VALUE)
1902 if(input_files_ts_offset[ist->file_index])
1903 ist->next_pts= AV_NOPTS_VALUE;
1907 /* compute buffer size max (should use a complete heuristic) */
1908 for(i=0;i<nb_input_files;i++) {
1909 file_table[i].buffer_size_max = 2048;
1912 /* set meta data information from input file if required */
1913 for (i=0;i<nb_meta_data_maps;i++) {
1914 AVFormatContext *out_file;
1915 AVFormatContext *in_file;
1917 int out_file_index = meta_data_maps[i].out_file;
1918 int in_file_index = meta_data_maps[i].in_file;
1919 if ( out_file_index < 0 || out_file_index >= nb_output_files ) {
1920 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1924 if ( in_file_index < 0 || in_file_index >= nb_input_files ) {
1925 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1930 out_file = output_files[out_file_index];
1931 in_file = input_files[in_file_index];
1933 strcpy(out_file->title, in_file->title);
1934 strcpy(out_file->author, in_file->author);
1935 strcpy(out_file->copyright, in_file->copyright);
1936 strcpy(out_file->comment, in_file->comment);
1937 strcpy(out_file->album, in_file->album);
1938 out_file->year = in_file->year;
1939 out_file->track = in_file->track;
1940 strcpy(out_file->genre, in_file->genre);
1943 /* open files and write file headers */
1944 for(i=0;i<nb_output_files;i++) {
1945 os = output_files[i];
1946 if (av_write_header(os) < 0) {
1947 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1953 #ifndef CONFIG_WIN32
1954 if ( !using_stdin && verbose >= 0) {
1955 fprintf(stderr, "Press [q] to stop encoding\n");
1956 url_set_interrupt_cb(decode_interrupt_cb);
1964 for(; received_sigterm == 0;) {
1965 int file_index, ist_index;
1973 /* if 'q' pressed, exits */
1977 /* read_key() returns 0 on EOF */
1983 /* select the stream that we must read now by looking at the
1984 smallest output pts */
1986 for(i=0;i<nb_ostreams;i++) {
1989 os = output_files[ost->file_index];
1990 ist = ist_table[ost->source_index];
1991 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
1992 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
1994 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
1995 ipts = (double)ist->pts;
1996 if (!file_table[ist->file_index].eof_reached){
1997 if(ipts < ipts_min) {
1999 if(input_sync ) file_index = ist->file_index;
2001 if(opts < opts_min) {
2003 if(!input_sync) file_index = ist->file_index;
2006 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2011 /* if none, if is finished */
2012 if (file_index < 0) {
2016 /* finish if recording time exhausted */
2017 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
2020 /* finish if limit size exhausted */
2021 if (limit_filesize != 0 && (limit_filesize * 1024) < url_ftell(&output_files[0]->pb))
2024 /* read a frame from it and output it in the fifo */
2025 is = input_files[file_index];
2026 if (av_read_frame(is, &pkt) < 0) {
2027 file_table[file_index].eof_reached = 1;
2028 if (opt_shortest) break; else continue; //
2032 stream_no_data = is;
2037 av_pkt_dump(stdout, &pkt, do_hex_dump);
2039 /* the following test is needed in case new streams appear
2040 dynamically in stream : we ignore them */
2041 if (pkt.stream_index >= file_table[file_index].nb_streams)
2042 goto discard_packet;
2043 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2044 ist = ist_table[ist_index];
2046 goto discard_packet;
2048 // 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);
2049 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
2050 int64_t delta= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q) - ist->next_pts;
2051 if(ABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE && !copy_ts){
2052 input_files_ts_offset[ist->file_index]-= delta;
2054 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2055 for(i=0; i<file_table[file_index].nb_streams; i++){
2056 int index= file_table[file_index].ist_index + i;
2057 ist_table[index]->next_pts += delta;
2058 ist_table[index]->is_start=1;
2063 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2064 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2067 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2068 ist->file_index, ist->index);
2070 av_free_packet(&pkt);
2075 av_free_packet(&pkt);
2077 /* dump report by using the output first video and audio streams */
2078 print_report(output_files, ost_table, nb_ostreams, 0);
2081 /* at the end of stream, we must flush the decoder buffers */
2082 for(i=0;i<nb_istreams;i++) {
2084 if (ist->decoding_needed) {
2085 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2091 /* write the trailer if needed and close file */
2092 for(i=0;i<nb_output_files;i++) {
2093 os = output_files[i];
2094 av_write_trailer(os);
2097 /* dump report by using the first video and audio streams */
2098 print_report(output_files, ost_table, nb_ostreams, 1);
2100 /* close each encoder */
2101 for(i=0;i<nb_ostreams;i++) {
2103 if (ost->encoding_needed) {
2104 av_freep(&ost->st->codec->stats_in);
2105 avcodec_close(ost->st->codec);
2109 /* close each decoder */
2110 for(i=0;i<nb_istreams;i++) {
2112 if (ist->decoding_needed) {
2113 avcodec_close(ist->st->codec);
2121 av_freep(&bit_buffer);
2122 av_free(file_table);
2125 for(i=0;i<nb_istreams;i++) {
2132 for(i=0;i<nb_ostreams;i++) {
2136 fclose(ost->logfile);
2137 ost->logfile = NULL;
2139 fifo_free(&ost->fifo); /* works even if fifo is not
2140 initialized but set to zero */
2141 av_free(ost->pict_tmp.data[0]);
2142 if (ost->video_resample)
2143 img_resample_close(ost->img_resample_ctx);
2144 if (ost->audio_resample)
2145 audio_resample_close(ost->resample);
2158 int file_read(const char *filename)
2161 unsigned char buffer[1024];
2164 if (url_open(&h, filename, O_RDONLY) < 0) {
2165 printf("could not open '%s'\n", filename);
2169 len = url_read(h, buffer, sizeof(buffer));
2172 for(i=0;i<len;i++) putchar(buffer[i]);
2179 static void opt_image_format(const char *arg)
2183 for(f = first_image_format; f != NULL; f = f->next) {
2184 if (!strcmp(arg, f->name))
2188 fprintf(stderr, "Unknown image format: '%s'\n", arg);
2194 static void opt_format(const char *arg)
2196 /* compatibility stuff for pgmyuv */
2197 if (!strcmp(arg, "pgmyuv")) {
2198 pgmyuv_compatibility_hack=1;
2199 // opt_image_format(arg);
2203 file_iformat = av_find_input_format(arg);
2204 file_oformat = guess_format(arg, NULL, NULL);
2205 if (!file_iformat && !file_oformat) {
2206 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2211 static void opt_video_bitrate(const char *arg)
2213 video_bit_rate = atoi(arg) * 1000;
2216 static void opt_video_bitrate_tolerance(const char *arg)
2218 video_bit_rate_tolerance = atoi(arg) * 1000;
2221 static void opt_video_bitrate_max(const char *arg)
2223 video_rc_max_rate = atoi(arg) * 1000;
2226 static void opt_video_bitrate_min(const char *arg)
2228 video_rc_min_rate = atoi(arg) * 1000;
2231 static void opt_video_buffer_size(const char *arg)
2233 video_rc_buffer_size = atoi(arg) * 8*1024;
2236 static void opt_video_rc_eq(char *arg)
2241 static void opt_video_rc_override_string(char *arg)
2243 video_rc_override_string = arg;
2247 static void opt_workaround_bugs(const char *arg)
2249 workaround_bugs = atoi(arg);
2252 static void opt_me_threshold(const char *arg)
2254 me_threshold = atoi(arg);
2257 static void opt_mb_threshold(const char *arg)
2259 mb_threshold = atoi(arg);
2262 static void opt_verbose(const char *arg)
2264 verbose = atoi(arg);
2265 av_log_set_level(atoi(arg));
2268 static void opt_frame_rate(const char *arg)
2270 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
2271 fprintf(stderr, "Incorrect frame rate\n");
2276 static void opt_frame_crop_top(const char *arg)
2278 frame_topBand = atoi(arg);
2279 if (frame_topBand < 0) {
2280 fprintf(stderr, "Incorrect top crop size\n");
2283 if ((frame_topBand % 2) != 0) {
2284 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2287 if ((frame_topBand) >= frame_height){
2288 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2291 frame_height -= frame_topBand;
2294 static void opt_frame_crop_bottom(const char *arg)
2296 frame_bottomBand = atoi(arg);
2297 if (frame_bottomBand < 0) {
2298 fprintf(stderr, "Incorrect bottom crop size\n");
2301 if ((frame_bottomBand % 2) != 0) {
2302 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2305 if ((frame_bottomBand) >= frame_height){
2306 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2309 frame_height -= frame_bottomBand;
2312 static void opt_frame_crop_left(const char *arg)
2314 frame_leftBand = atoi(arg);
2315 if (frame_leftBand < 0) {
2316 fprintf(stderr, "Incorrect left crop size\n");
2319 if ((frame_leftBand % 2) != 0) {
2320 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2323 if ((frame_leftBand) >= frame_width){
2324 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2327 frame_width -= frame_leftBand;
2330 static void opt_frame_crop_right(const char *arg)
2332 frame_rightBand = atoi(arg);
2333 if (frame_rightBand < 0) {
2334 fprintf(stderr, "Incorrect right crop size\n");
2337 if ((frame_rightBand % 2) != 0) {
2338 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2341 if ((frame_rightBand) >= frame_width){
2342 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2345 frame_width -= frame_rightBand;
2348 static void opt_frame_size(const char *arg)
2350 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2351 fprintf(stderr, "Incorrect frame size\n");
2354 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2355 fprintf(stderr, "Frame size must be a multiple of 2\n");
2361 #define SCALEBITS 10
2362 #define ONE_HALF (1 << (SCALEBITS - 1))
2363 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2365 #define RGB_TO_Y(r, g, b) \
2366 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2367 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2369 #define RGB_TO_U(r1, g1, b1, shift)\
2370 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2371 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2373 #define RGB_TO_V(r1, g1, b1, shift)\
2374 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2375 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2377 static void opt_pad_color(const char *arg) {
2378 /* Input is expected to be six hex digits similar to
2379 how colors are expressed in html tags (but without the #) */
2380 int rgb = strtol(arg, NULL, 16);
2384 g = ((rgb >> 8) & 255);
2387 padcolor[0] = RGB_TO_Y(r,g,b);
2388 padcolor[1] = RGB_TO_U(r,g,b,0);
2389 padcolor[2] = RGB_TO_V(r,g,b,0);
2392 static void opt_frame_pad_top(const char *arg)
2394 frame_padtop = atoi(arg);
2395 if (frame_padtop < 0) {
2396 fprintf(stderr, "Incorrect top pad size\n");
2399 if ((frame_padtop % 2) != 0) {
2400 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2405 static void opt_frame_pad_bottom(const char *arg)
2407 frame_padbottom = atoi(arg);
2408 if (frame_padbottom < 0) {
2409 fprintf(stderr, "Incorrect bottom pad size\n");
2412 if ((frame_padbottom % 2) != 0) {
2413 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2419 static void opt_frame_pad_left(const char *arg)
2421 frame_padleft = atoi(arg);
2422 if (frame_padleft < 0) {
2423 fprintf(stderr, "Incorrect left pad size\n");
2426 if ((frame_padleft % 2) != 0) {
2427 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2433 static void opt_frame_pad_right(const char *arg)
2435 frame_padright = atoi(arg);
2436 if (frame_padright < 0) {
2437 fprintf(stderr, "Incorrect right pad size\n");
2440 if ((frame_padright % 2) != 0) {
2441 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2447 static void opt_frame_pix_fmt(const char *arg)
2449 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2452 static void opt_frame_aspect_ratio(const char *arg)
2458 p = strchr(arg, ':');
2460 x = strtol(arg, (char **)&arg, 10);
2462 y = strtol(arg+1, (char **)&arg, 10);
2464 ar = (double)x / (double)y;
2466 ar = strtod(arg, (char **)&arg);
2469 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2472 frame_aspect_ratio = ar;
2475 static void opt_gop_size(const char *arg)
2477 gop_size = atoi(arg);
2480 static void opt_b_frames(const char *arg)
2482 b_frames = atoi(arg);
2483 if (b_frames > FF_MAX_B_FRAMES) {
2484 fprintf(stderr, "\nCannot have more than %d B frames, increase FF_MAX_B_FRAMES.\n", FF_MAX_B_FRAMES);
2486 } else if (b_frames < 1) {
2487 fprintf(stderr, "\nNumber of B frames must be higher than 0\n");
2492 static void opt_pre_me(const char *arg)
2497 static void opt_qscale(const char *arg)
2499 video_qscale = atof(arg);
2500 if (video_qscale < 0.01 ||
2501 video_qscale > 255) {
2502 fprintf(stderr, "qscale must be >= 0.01 and <= 255\n");
2507 static void opt_qsquish(const char *arg)
2509 video_qsquish = atof(arg);
2510 if (video_qsquish < 0.0 ||
2511 video_qsquish > 99.0) {
2512 fprintf(stderr, "qsquish must be >= 0.0 and <= 99.0\n");
2517 static void opt_lmax(const char *arg)
2519 video_lmax = atof(arg)*FF_QP2LAMBDA;
2522 static void opt_lmin(const char *arg)
2524 video_lmin = atof(arg)*FF_QP2LAMBDA;
2527 static void opt_qmin(const char *arg)
2529 video_qmin = atoi(arg);
2530 if (video_qmin < 1 ||
2532 fprintf(stderr, "qmin must be >= 1 and <= 51\n");
2537 static void opt_qmax(const char *arg)
2539 video_qmax = atoi(arg);
2540 if (video_qmax < 1 ||
2542 fprintf(stderr, "qmax must be >= 1 and <= 51\n");
2547 static void opt_mb_lmin(const char *arg)
2549 video_mb_lmin = atof(arg)*FF_QP2LAMBDA;
2550 if (video_mb_lmin < 1 ||
2551 video_mb_lmin > FF_LAMBDA_MAX) {
2552 fprintf(stderr, "mblmin must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
2557 static void opt_mb_lmax(const char *arg)
2559 video_mb_lmax = atof(arg)*FF_QP2LAMBDA;
2560 if (video_mb_lmax < 1 ||
2561 video_mb_lmax > FF_LAMBDA_MAX) {
2562 fprintf(stderr, "mblmax must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
2567 static void opt_qdiff(const char *arg)
2569 video_qdiff = atoi(arg);
2570 if (video_qdiff < 0 ||
2572 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2577 static void opt_qblur(const char *arg)
2579 video_qblur = atof(arg);
2582 static void opt_qcomp(const char *arg)
2584 video_qcomp = atof(arg);
2587 static void opt_rc_initial_cplx(const char *arg)
2589 video_rc_initial_cplx = atof(arg);
2591 static void opt_b_qfactor(const char *arg)
2593 video_b_qfactor = atof(arg);
2595 static void opt_i_qfactor(const char *arg)
2597 video_i_qfactor = atof(arg);
2599 static void opt_b_qoffset(const char *arg)
2601 video_b_qoffset = atof(arg);
2603 static void opt_i_qoffset(const char *arg)
2605 video_i_qoffset = atof(arg);
2608 static void opt_ibias(const char *arg)
2610 video_intra_quant_bias = atoi(arg);
2612 static void opt_pbias(const char *arg)
2614 video_inter_quant_bias = atoi(arg);
2617 static void opt_packet_size(const char *arg)
2619 packet_size= atoi(arg);
2622 static void opt_error_rate(const char *arg)
2624 error_rate= atoi(arg);
2627 static void opt_strict(const char *arg)
2632 static void opt_top_field_first(const char *arg)
2634 top_field_first= atoi(arg);
2637 static void opt_sc_threshold(const char *arg)
2639 sc_threshold= atoi(arg);
2642 static void opt_me_range(const char *arg)
2644 me_range = atoi(arg);
2647 static void opt_thread_count(const char *arg)
2649 thread_count= atoi(arg);
2650 #if !defined(HAVE_THREADS)
2652 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2656 static void opt_audio_bitrate(const char *arg)
2658 audio_bit_rate = atoi(arg) * 1000;
2661 static void opt_audio_rate(const char *arg)
2663 audio_sample_rate = atoi(arg);
2666 static void opt_audio_channels(const char *arg)
2668 audio_channels = atoi(arg);
2671 static void opt_video_device(const char *arg)
2673 video_device = av_strdup(arg);
2676 static void opt_grab_device(const char *arg)
2678 grab_device = av_strdup(arg);
2681 static void opt_video_channel(const char *arg)
2683 video_channel = strtol(arg, NULL, 0);
2686 static void opt_video_standard(const char *arg)
2688 video_standard = av_strdup(arg);
2691 static void opt_audio_device(const char *arg)
2693 audio_device = av_strdup(arg);
2696 static void opt_codec(int *pstream_copy, int *pcodec_id,
2697 int codec_type, const char *arg)
2701 if (!strcmp(arg, "copy")) {
2706 if (!strcmp(p->name, arg) && p->type == codec_type)
2711 fprintf(stderr, "Unknown codec '%s'\n", arg);
2719 static void opt_audio_codec(const char *arg)
2721 opt_codec(&audio_stream_copy, &audio_codec_id, CODEC_TYPE_AUDIO, arg);
2724 static void opt_audio_tag(const char *arg)
2727 audio_codec_tag= strtol(arg, &tail, 0);
2730 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2733 static void opt_video_tag(const char *arg)
2736 video_codec_tag= strtol(arg, &tail, 0);
2739 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2742 static void add_frame_hooker(const char *arg)
2747 char *args = av_strdup(arg);
2751 argv[0] = strtok(args, " ");
2752 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2755 i = frame_hook_add(argc, argv);
2758 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2763 const char *motion_str[] = {
2776 static void opt_motion_estimation(const char *arg)
2782 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2785 if (!strcmp(*p, arg))
2789 me_method = (p - motion_str) + 1;
2792 static void opt_video_codec(const char *arg)
2794 opt_codec(&video_stream_copy, &video_codec_id, CODEC_TYPE_VIDEO, arg);
2797 static void opt_subtitle_codec(const char *arg)
2799 opt_codec(&subtitle_stream_copy, &subtitle_codec_id, CODEC_TYPE_SUBTITLE, arg);
2802 static void opt_map(const char *arg)
2808 m = &stream_maps[nb_stream_maps++];
2810 m->file_index = strtol(arg, (char **)&p, 0);
2814 m->stream_index = strtol(p, (char **)&p, 0);
2817 m->sync_file_index = strtol(p, (char **)&p, 0);
2820 m->sync_stream_index = strtol(p, (char **)&p, 0);
2822 m->sync_file_index = m->file_index;
2823 m->sync_stream_index = m->stream_index;
2827 static void opt_map_meta_data(const char *arg)
2833 m = &meta_data_maps[nb_meta_data_maps++];
2835 m->out_file = strtol(arg, (char **)&p, 0);
2839 m->in_file = strtol(p, (char **)&p, 0);
2842 static void opt_recording_time(const char *arg)
2844 recording_time = parse_date(arg, 1);
2847 static void opt_start_time(const char *arg)
2849 start_time = parse_date(arg, 1);
2852 static void opt_rec_timestamp(const char *arg)
2854 rec_timestamp = parse_date(arg, 0) / 1000000;
2857 static void opt_input_ts_offset(const char *arg)
2859 input_ts_offset = parse_date(arg, 1);
2862 static void opt_input_file(const char *filename)
2864 AVFormatContext *ic;
2865 AVFormatParameters params, *ap = ¶ms;
2866 int err, i, ret, rfps, rfps_base;
2869 if (!strcmp(filename, "-"))
2872 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2873 !strcmp( filename, "/dev/stdin" );
2875 /* get default parameters from command line */
2876 memset(ap, 0, sizeof(*ap));
2877 ap->sample_rate = audio_sample_rate;
2878 ap->channels = audio_channels;
2879 ap->time_base.den = frame_rate;
2880 ap->time_base.num = frame_rate_base;
2881 ap->width = frame_width + frame_padleft + frame_padright;
2882 ap->height = frame_height + frame_padtop + frame_padbottom;
2883 ap->image_format = image_format;
2884 ap->pix_fmt = frame_pix_fmt;
2885 ap->device = grab_device;
2886 ap->channel = video_channel;
2887 ap->standard = video_standard;
2888 ap->video_codec_id = video_codec_id;
2889 ap->audio_codec_id = audio_codec_id;
2890 if(pgmyuv_compatibility_hack)
2891 ap->video_codec_id= CODEC_ID_PGMYUV;
2893 /* open the input file with generic libav function */
2894 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2896 print_error(filename, err);
2901 ic->flags|= AVFMT_FLAG_GENPTS;
2903 /* If not enough info to get the stream parameters, we decode the
2904 first frames to get it. (used in mpeg case for example) */
2905 ret = av_find_stream_info(ic);
2906 if (ret < 0 && verbose >= 0) {
2907 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2911 timestamp = start_time;
2912 /* add the stream start time */
2913 if (ic->start_time != AV_NOPTS_VALUE)
2914 timestamp += ic->start_time;
2916 /* if seeking requested, we execute it */
2917 if (start_time != 0) {
2918 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2920 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2921 filename, (double)timestamp / AV_TIME_BASE);
2923 /* reset seek info */
2927 /* update the current parameters so that they match the one of the input stream */
2928 for(i=0;i<ic->nb_streams;i++) {
2930 AVCodecContext *enc = ic->streams[i]->codec;
2931 #if defined(HAVE_THREADS)
2933 avcodec_thread_init(enc, thread_count);
2935 enc->thread_count= thread_count;
2936 switch(enc->codec_type) {
2937 case CODEC_TYPE_AUDIO:
2938 for(j=0; j<opt_name_count; j++){
2940 double d= av_get_double(avctx_opts, opt_names[j], &opt);
2941 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2942 av_set_double(enc, opt_names[j], d);
2944 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2945 audio_channels = enc->channels;
2946 audio_sample_rate = enc->sample_rate;
2948 ic->streams[i]->discard= AVDISCARD_ALL;
2950 case CODEC_TYPE_VIDEO:
2951 for(j=0; j<opt_name_count; j++){
2953 double d= av_get_double(avctx_opts, opt_names[j], &opt);
2954 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2955 av_set_double(enc, opt_names[j], d);
2957 frame_height = enc->height;
2958 frame_width = enc->width;
2959 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2960 frame_pix_fmt = enc->pix_fmt;
2961 rfps = ic->streams[i]->r_frame_rate.num;
2962 rfps_base = ic->streams[i]->r_frame_rate.den;
2963 enc->workaround_bugs = workaround_bugs;
2964 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2966 enc->debug |= FF_DEBUG_MV;
2968 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2971 fprintf(stderr,"\nSeems that stream %d comes from film source: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2972 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2974 (float)rfps / rfps_base, rfps, rfps_base);
2976 /* update the current frame rate to match the stream frame rate */
2978 frame_rate_base = rfps_base;
2980 enc->rate_emu = rate_emu;
2982 ic->streams[i]->discard= AVDISCARD_ALL;
2983 else if(video_discard)
2984 ic->streams[i]->discard= video_discard;
2986 case CODEC_TYPE_DATA:
2988 case CODEC_TYPE_SUBTITLE:
2990 case CODEC_TYPE_UNKNOWN:
2997 input_files[nb_input_files] = ic;
2998 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2999 /* dump the file content */
3001 dump_format(ic, nb_input_files, filename, 0);
3004 file_iformat = NULL;
3005 file_oformat = NULL;
3006 image_format = NULL;
3014 static void opt_grab(const char *arg)
3016 file_iformat = av_find_input_format(arg);
3020 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
3022 int has_video, has_audio, i, j;
3023 AVFormatContext *ic;
3027 for(j=0;j<nb_input_files;j++) {
3028 ic = input_files[j];
3029 for(i=0;i<ic->nb_streams;i++) {
3030 AVCodecContext *enc = ic->streams[i]->codec;
3031 switch(enc->codec_type) {
3032 case CODEC_TYPE_AUDIO:
3035 case CODEC_TYPE_VIDEO:
3038 case CODEC_TYPE_DATA:
3039 case CODEC_TYPE_UNKNOWN:
3040 case CODEC_TYPE_SUBTITLE:
3047 *has_video_ptr = has_video;
3048 *has_audio_ptr = has_audio;
3051 static void new_video_stream(AVFormatContext *oc)
3054 AVCodecContext *video_enc;
3057 st = av_new_stream(oc, oc->nb_streams);
3059 fprintf(stderr, "Could not alloc stream\n");
3062 #if defined(HAVE_THREADS)
3064 avcodec_thread_init(st->codec, thread_count);
3067 video_enc = st->codec;
3070 video_enc->codec_tag= video_codec_tag;
3072 if( (video_global_header&1)
3073 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3074 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3075 avctx_opts->flags|= CODEC_FLAG_GLOBAL_HEADER;
3077 if(video_global_header&2){
3078 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3079 avctx_opts->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3082 if (video_stream_copy) {
3083 st->stream_copy = 1;
3084 video_enc->codec_type = CODEC_TYPE_VIDEO;
3090 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
3091 if (video_codec_id != CODEC_ID_NONE)
3092 codec_id = video_codec_id;
3094 video_enc->codec_id = codec_id;
3095 codec = avcodec_find_encoder(codec_id);
3097 for(i=0; i<opt_name_count; i++){
3099 double d= av_get_double(avctx_opts, opt_names[i], &opt);
3100 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3101 av_set_double(video_enc, opt_names[i], d);
3104 video_enc->bit_rate = video_bit_rate;
3105 video_enc->bit_rate_tolerance = video_bit_rate_tolerance;
3106 video_enc->time_base.den = frame_rate;
3107 video_enc->time_base.num = frame_rate_base;
3108 if(codec && codec->supported_framerates){
3109 const AVRational *p= codec->supported_framerates;
3110 AVRational req= (AVRational){frame_rate, frame_rate_base};
3111 const AVRational *best=NULL;
3112 AVRational best_error= (AVRational){INT_MAX, 1};
3113 for(; p->den!=0; p++){
3114 AVRational error= av_sub_q(req, *p);
3115 if(error.num <0) error.num *= -1;
3116 if(av_cmp_q(error, best_error) < 0){
3121 video_enc->time_base.den= best->num;
3122 video_enc->time_base.num= best->den;
3125 video_enc->width = frame_width + frame_padright + frame_padleft;
3126 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3127 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3128 video_enc->pix_fmt = frame_pix_fmt;
3130 if(codec && codec->pix_fmts){
3131 const enum PixelFormat *p= codec->pix_fmts;
3133 if(*p == video_enc->pix_fmt)
3137 video_enc->pix_fmt = codec->pix_fmts[0];
3141 video_enc->gop_size = gop_size;
3143 video_enc->gop_size = 0;
3144 if (video_qscale || same_quality) {
3145 video_enc->flags |= CODEC_FLAG_QSCALE;
3146 video_enc->global_quality=
3147 st->quality = FF_QP2LAMBDA * video_qscale;
3151 video_enc->intra_matrix = intra_matrix;
3153 video_enc->inter_matrix = inter_matrix;
3155 video_enc->pre_me = pre_me;
3158 video_enc->max_b_frames = b_frames;
3159 video_enc->b_quant_factor = 2.0;
3161 video_enc->qmin = video_qmin;
3162 video_enc->qmax = video_qmax;
3163 video_enc->lmin = video_lmin;
3164 video_enc->lmax = video_lmax;
3165 video_enc->rc_qsquish = video_qsquish;
3166 video_enc->mb_lmin = video_mb_lmin;
3167 video_enc->mb_lmax = video_mb_lmax;
3168 video_enc->max_qdiff = video_qdiff;
3169 video_enc->qblur = video_qblur;
3170 video_enc->qcompress = video_qcomp;
3171 video_enc->rc_eq = video_rc_eq;
3172 video_enc->workaround_bugs = workaround_bugs;
3173 video_enc->thread_count = thread_count;
3174 p= video_rc_override_string;
3177 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3179 fprintf(stderr, "error parsing rc_override\n");
3182 video_enc->rc_override=
3183 av_realloc(video_enc->rc_override,
3184 sizeof(RcOverride)*(i+1));
3185 video_enc->rc_override[i].start_frame= start;
3186 video_enc->rc_override[i].end_frame = end;
3188 video_enc->rc_override[i].qscale= q;
3189 video_enc->rc_override[i].quality_factor= 1.0;
3192 video_enc->rc_override[i].qscale= 0;
3193 video_enc->rc_override[i].quality_factor= -q/100.0;
3198 video_enc->rc_override_count=i;
3200 video_enc->rc_max_rate = video_rc_max_rate;
3201 video_enc->rc_min_rate = video_rc_min_rate;
3202 video_enc->rc_buffer_size = video_rc_buffer_size;
3203 video_enc->rc_initial_buffer_occupancy = video_rc_buffer_size*3/4;
3204 video_enc->rc_buffer_aggressivity= video_rc_buffer_aggressivity;
3205 video_enc->rc_initial_cplx= video_rc_initial_cplx;
3206 video_enc->i_quant_factor = video_i_qfactor;
3207 video_enc->b_quant_factor = video_b_qfactor;
3208 video_enc->i_quant_offset = video_i_qoffset;
3209 video_enc->b_quant_offset = video_b_qoffset;
3210 video_enc->intra_quant_bias = video_intra_quant_bias;
3211 video_enc->inter_quant_bias = video_inter_quant_bias;
3212 video_enc->me_threshold= me_threshold;
3213 video_enc->mb_threshold= mb_threshold;
3214 video_enc->intra_dc_precision= intra_dc_precision - 8;
3215 video_enc->strict_std_compliance = strict;
3216 video_enc->error_rate = error_rate;
3217 video_enc->scenechange_threshold= sc_threshold;
3218 video_enc->me_range = me_range;
3219 video_enc->me_penalty_compensation= me_penalty_compensation;
3220 video_enc->frame_skip_threshold= frame_skip_threshold;
3221 video_enc->frame_skip_factor= frame_skip_factor;
3222 video_enc->frame_skip_exp= frame_skip_exp;
3225 video_enc->rtp_mode= 1;
3226 video_enc->rtp_payload_size= packet_size;
3230 video_enc->flags|= CODEC_FLAG_PSNR;
3232 video_enc->me_method = me_method;
3237 video_enc->flags |= CODEC_FLAG_PASS1;
3239 video_enc->flags |= CODEC_FLAG_PASS2;
3244 /* reset some key parameters */
3246 video_codec_id = CODEC_ID_NONE;
3247 video_stream_copy = 0;
3250 static void new_audio_stream(AVFormatContext *oc)
3253 AVCodecContext *audio_enc;
3256 st = av_new_stream(oc, oc->nb_streams);
3258 fprintf(stderr, "Could not alloc stream\n");
3261 #if defined(HAVE_THREADS)
3263 avcodec_thread_init(st->codec, thread_count);
3266 audio_enc = st->codec;
3267 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3270 audio_enc->codec_tag= audio_codec_tag;
3272 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3273 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3274 avctx_opts->flags|= CODEC_FLAG_GLOBAL_HEADER;
3276 if (audio_stream_copy) {
3277 st->stream_copy = 1;
3278 audio_enc->channels = audio_channels;
3280 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3282 for(i=0; i<opt_name_count; i++){
3284 double d= av_get_double(avctx_opts, opt_names[i], &opt);
3285 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3286 av_set_double(audio_enc, opt_names[i], d);
3289 if (audio_codec_id != CODEC_ID_NONE)
3290 codec_id = audio_codec_id;
3291 audio_enc->codec_id = codec_id;
3293 audio_enc->bit_rate = audio_bit_rate;
3294 if (audio_qscale > QSCALE_NONE) {
3295 audio_enc->flags |= CODEC_FLAG_QSCALE;
3296 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3298 audio_enc->strict_std_compliance = strict;
3299 audio_enc->thread_count = thread_count;
3300 /* For audio codecs other than AC3 or DTS we limit */
3301 /* the number of coded channels to stereo */
3302 if (audio_channels > 2 && codec_id != CODEC_ID_AC3
3303 && codec_id != CODEC_ID_DTS) {
3304 audio_enc->channels = 2;
3306 audio_enc->channels = audio_channels;
3308 audio_enc->sample_rate = audio_sample_rate;
3309 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3310 if (audio_language) {
3311 pstrcpy(st->language, sizeof(st->language), audio_language);
3312 av_free(audio_language);
3313 audio_language = NULL;
3316 /* reset some key parameters */
3318 audio_codec_id = CODEC_ID_NONE;
3319 audio_stream_copy = 0;
3322 static void opt_new_subtitle_stream(void)
3324 AVFormatContext *oc;
3326 AVCodecContext *subtitle_enc;
3329 if (nb_output_files <= 0) {
3330 fprintf(stderr, "At least one output file must be specified\n");
3333 oc = output_files[nb_output_files - 1];
3335 st = av_new_stream(oc, oc->nb_streams);
3337 fprintf(stderr, "Could not alloc stream\n");
3341 subtitle_enc = st->codec;
3342 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3343 if (subtitle_stream_copy) {
3344 st->stream_copy = 1;
3346 for(i=0; i<opt_name_count; i++){
3348 double d= av_get_double(avctx_opts, opt_names[i], &opt);
3349 if(d==d && (opt->flags&AV_OPT_FLAG_SUBTITLE_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3350 av_set_double(subtitle_enc, opt_names[i], d);
3352 subtitle_enc->codec_id = subtitle_codec_id;
3355 if (subtitle_language) {
3356 pstrcpy(st->language, sizeof(st->language), subtitle_language);
3357 av_free(subtitle_language);
3358 subtitle_language = NULL;
3361 subtitle_codec_id = CODEC_ID_NONE;
3362 subtitle_stream_copy = 0;
3365 static void opt_new_audio_stream(void)
3367 AVFormatContext *oc;
3368 if (nb_output_files <= 0) {
3369 fprintf(stderr, "At least one output file must be specified\n");
3372 oc = output_files[nb_output_files - 1];
3373 new_audio_stream(oc);
3376 static void opt_new_video_stream(void)
3378 AVFormatContext *oc;
3379 if (nb_output_files <= 0) {
3380 fprintf(stderr, "At least one output file must be specified\n");
3383 oc = output_files[nb_output_files - 1];
3384 new_video_stream(oc);
3387 static void opt_output_file(const char *filename)
3389 AVFormatContext *oc;
3390 int use_video, use_audio, input_has_video, input_has_audio;
3391 AVFormatParameters params, *ap = ¶ms;
3393 if (!strcmp(filename, "-"))
3396 oc = av_alloc_format_context();
3398 if (!file_oformat) {
3399 file_oformat = guess_format(NULL, filename, NULL);
3400 if (!file_oformat) {
3401 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
3407 oc->oformat = file_oformat;
3408 pstrcpy(oc->filename, sizeof(oc->filename), filename);
3410 if (!strcmp(file_oformat->name, "ffm") &&
3411 strstart(filename, "http:", NULL)) {
3412 /* special case for files sent to ffserver: we get the stream
3413 parameters from ffserver */
3414 if (read_ffserver_streams(oc, filename) < 0) {
3415 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
3419 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_id != CODEC_ID_NONE;
3420 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_id != CODEC_ID_NONE;
3422 /* disable if no corresponding type found and at least one
3424 if (nb_input_files > 0) {
3425 check_audio_video_inputs(&input_has_video, &input_has_audio);
3426 if (!input_has_video)
3428 if (!input_has_audio)
3432 /* manual disable */
3433 if (audio_disable) {
3436 if (video_disable) {
3441 new_video_stream(oc);
3445 new_audio_stream(oc);
3448 if (!oc->nb_streams) {
3449 fprintf(stderr, "No audio or video streams available\n");
3453 oc->timestamp = rec_timestamp;
3456 pstrcpy(oc->title, sizeof(oc->title), str_title);
3458 pstrcpy(oc->author, sizeof(oc->author), str_author);
3460 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3462 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3465 output_files[nb_output_files++] = oc;
3467 /* check filename in case of an image number is expected */
3468 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3469 if (filename_number_test(oc->filename) < 0) {
3470 print_error(oc->filename, AVERROR_NUMEXPECTED);
3475 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3476 /* test if it already exists to avoid loosing precious files */
3477 if (!file_overwrite &&
3478 (strchr(filename, ':') == NULL ||
3479 strstart(filename, "file:", NULL))) {
3480 if (url_exist(filename)) {
3483 if ( !using_stdin ) {
3484 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3487 if (toupper(c) != 'Y') {
3488 fprintf(stderr, "Not overwriting - exiting\n");
3493 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3500 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3501 fprintf(stderr, "Could not open '%s'\n", filename);
3506 memset(ap, 0, sizeof(*ap));
3507 ap->image_format = image_format;
3508 if (av_set_parameters(oc, ap) < 0) {
3509 fprintf(stderr, "%s: Invalid encoding parameters\n",
3514 oc->packet_size= mux_packet_size;
3515 oc->mux_rate= mux_rate;
3516 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3517 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3518 oc->loop_output = loop_output;
3520 /* reset some options */
3521 file_oformat = NULL;
3522 file_iformat = NULL;
3523 image_format = NULL;
3526 /* prepare dummy protocols for grab */
3527 static void prepare_grab(void)
3529 int has_video, has_audio, i, j;
3530 AVFormatContext *oc;
3531 AVFormatContext *ic;
3532 AVFormatParameters vp1, *vp = &vp1;
3533 AVFormatParameters ap1, *ap = &ap1;
3535 /* see if audio/video inputs are needed */
3538 memset(ap, 0, sizeof(*ap));
3539 memset(vp, 0, sizeof(*vp));
3540 vp->time_base.num= 1;
3541 for(j=0;j<nb_output_files;j++) {
3542 oc = output_files[j];
3543 for(i=0;i<oc->nb_streams;i++) {
3544 AVCodecContext *enc = oc->streams[i]->codec;
3545 switch(enc->codec_type) {
3546 case CODEC_TYPE_AUDIO:
3547 if (enc->sample_rate > ap->sample_rate)
3548 ap->sample_rate = enc->sample_rate;
3549 if (enc->channels > ap->channels)
3550 ap->channels = enc->channels;
3553 case CODEC_TYPE_VIDEO:
3554 if (enc->width > vp->width)
3555 vp->width = enc->width;
3556 if (enc->height > vp->height)
3557 vp->height = enc->height;
3559 if (vp->time_base.num*(int64_t)enc->time_base.den > enc->time_base.num*(int64_t)vp->time_base.den){
3560 vp->time_base = enc->time_base;
3570 if (has_video == 0 && has_audio == 0) {
3571 fprintf(stderr, "Output file must have at least one audio or video stream\n");
3576 AVInputFormat *fmt1;
3577 fmt1 = av_find_input_format(video_grab_format);
3578 vp->device = video_device;
3579 vp->channel = video_channel;
3580 vp->standard = video_standard;
3581 vp->pix_fmt = frame_pix_fmt;
3582 if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) {
3583 fprintf(stderr, "Could not find video grab device\n");
3586 /* If not enough info to get the stream parameters, we decode the
3587 first frames to get it. */
3588 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) && av_find_stream_info(ic) < 0) {
3589 fprintf(stderr, "Could not find video grab parameters\n");
3592 /* by now video grab has one stream */
3593 ic->streams[0]->r_frame_rate.num = vp->time_base.den;
3594 ic->streams[0]->r_frame_rate.den = vp->time_base.num;
3595 input_files[nb_input_files] = ic;
3598 dump_format(ic, nb_input_files, "", 0);
3602 if (has_audio && audio_grab_format) {
3603 AVInputFormat *fmt1;
3604 fmt1 = av_find_input_format(audio_grab_format);
3605 ap->device = audio_device;
3606 if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
3607 fprintf(stderr, "Could not find audio grab device\n");
3610 input_files[nb_input_files] = ic;
3613 dump_format(ic, nb_input_files, "", 0);
3619 /* same option as mencoder */
3620 static void opt_pass(const char *pass_str)
3623 pass = atoi(pass_str);
3624 if (pass != 1 && pass != 2) {
3625 fprintf(stderr, "pass number can be only 1 or 2\n");
3631 #if defined(CONFIG_WIN32) || defined(CONFIG_OS2)
3632 static int64_t getutime(void)
3634 return av_gettime();
3637 static int64_t getutime(void)
3639 struct rusage rusage;
3641 getrusage(RUSAGE_SELF, &rusage);
3642 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3646 extern int ffm_nopts;
3648 static void show_formats(void)
3650 AVInputFormat *ifmt;
3651 AVOutputFormat *ofmt;
3652 AVImageFormat *image_fmt;
3655 const char **pp, *last_name;
3657 printf("File formats:\n");
3662 const char *name=NULL;
3663 const char *long_name=NULL;
3665 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3666 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3667 strcmp(ofmt->name, last_name)>0){
3669 long_name= ofmt->long_name;
3673 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3674 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3675 strcmp(ifmt->name, last_name)>0){
3677 long_name= ifmt->long_name;
3680 if(name && strcmp(ifmt->name, name)==0)
3692 long_name ? long_name:" ");
3696 printf("Image formats (filename extensions, if any, follow):\n");
3697 for(image_fmt = first_image_format; image_fmt != NULL;
3698 image_fmt = image_fmt->next) {
3701 image_fmt->img_read ? "D":" ",
3702 image_fmt->img_write ? "E":" ",
3704 image_fmt->extensions ? image_fmt->extensions:" ");
3708 printf("Codecs:\n");
3714 const char *type_str;
3717 for(p = first_avcodec; p != NULL; p = p->next) {
3718 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3719 strcmp(p->name, last_name)>0){
3721 decode= encode= cap=0;
3723 if(p2 && strcmp(p->name, p2->name)==0){
3724 if(p->decode) decode=1;
3725 if(p->encode) encode=1;
3726 cap |= p->capabilities;
3731 last_name= p2->name;
3734 case CODEC_TYPE_VIDEO:
3737 case CODEC_TYPE_AUDIO:
3740 case CODEC_TYPE_SUBTITLE:
3749 decode ? "D": (/*p2->decoder ? "d":*/" "),
3752 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3753 cap & CODEC_CAP_DR1 ? "D":" ",
3754 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3756 /* if(p2->decoder && decode==0)
3757 printf(" use %s for decoding", p2->decoder->name);*/
3762 printf("Supported file protocols:\n");
3763 for(up = first_protocol; up != NULL; up = up->next)
3764 printf(" %s:", up->name);
3767 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3768 printf("Motion estimation methods:\n");
3772 if ((pp - motion_str + 1) == ME_ZERO)
3773 printf("(fastest)");
3774 else if ((pp - motion_str + 1) == ME_FULL)
3775 printf("(slowest)");
3776 else if ((pp - motion_str + 1) == ME_EPZS)
3777 printf("(default)");
3782 "Note, the names of encoders and decoders dont always match, so there are\n"
3783 "several cases where the above table shows encoder only or decoder only entries\n"
3784 "even though both encoding and decoding are supported for example, the h263\n"
3785 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3790 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3793 const char *p = str;
3800 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3807 static void opt_inter_matrix(const char *arg)
3809 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3810 parse_matrix_coeffs(inter_matrix, arg);
3813 static void opt_intra_matrix(const char *arg)
3815 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3816 parse_matrix_coeffs(intra_matrix, arg);
3819 static void opt_target(const char *arg)
3822 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3824 if(!strncmp(arg, "pal-", 4)) {
3827 } else if(!strncmp(arg, "ntsc-", 5)) {
3830 } else if(!strncmp(arg, "film-", 5)) {
3835 /* Calculate FR via float to avoid int overflow */
3836 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3839 } else if((fr == 29970) || (fr == 23976)) {
3842 /* Try to determine PAL/NTSC by peeking in the input files */
3843 if(nb_input_files) {
3845 for(j = 0; j < nb_input_files; j++) {
3846 for(i = 0; i < input_files[j]->nb_streams; i++) {
3847 AVCodecContext *c = input_files[j]->streams[i]->codec;
3848 if(c->codec_type != CODEC_TYPE_VIDEO)
3850 fr = c->time_base.den * 1000 / c->time_base.num;
3854 } else if((fr == 29970) || (fr == 23976)) {
3864 if(verbose && norm >= 0)
3865 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3869 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3870 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3871 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3875 if(!strcmp(arg, "vcd")) {
3877 opt_video_codec("mpeg1video");
3878 opt_audio_codec("mp2");
3881 opt_frame_size(norm ? "352x240" : "352x288");
3882 opt_frame_rate(frame_rates[norm]);
3883 opt_gop_size(norm ? "18" : "15");
3885 video_bit_rate = 1150000;
3886 video_rc_max_rate = 1150000;
3887 video_rc_min_rate = 1150000;
3888 video_rc_buffer_size = 40*1024*8;
3890 audio_bit_rate = 224000;
3891 audio_sample_rate = 44100;
3893 mux_packet_size= 2324;
3894 mux_rate= 2352 * 75 * 8;
3896 /* We have to offset the PTS, so that it is consistent with the SCR.
3897 SCR starts at 36000, but the first two packs contain only padding
3898 and the first pack from the other stream, respectively, may also have
3899 been written before.
3900 So the real data starts at SCR 36000+3*1200. */
3901 mux_preload= (36000+3*1200) / 90000.0; //0.44
3902 } else if(!strcmp(arg, "svcd")) {
3904 opt_video_codec("mpeg2video");
3905 opt_audio_codec("mp2");
3908 opt_frame_size(norm ? "480x480" : "480x576");
3909 opt_frame_rate(frame_rates[norm]);
3910 opt_gop_size(norm ? "18" : "15");
3912 video_bit_rate = 2040000;
3913 video_rc_max_rate = 2516000;
3914 video_rc_min_rate = 0; //1145000;
3915 video_rc_buffer_size = 224*1024*8;
3916 opt_default("flags", "+SCAN_OFFSET");
3919 audio_bit_rate = 224000;
3920 audio_sample_rate = 44100;
3922 mux_packet_size= 2324;
3924 } else if(!strcmp(arg, "dvd")) {
3926 opt_video_codec("mpeg2video");
3927 opt_audio_codec("ac3");
3930 opt_frame_size(norm ? "720x480" : "720x576");
3931 opt_frame_rate(frame_rates[norm]);
3932 opt_gop_size(norm ? "18" : "15");
3934 video_bit_rate = 6000000;
3935 video_rc_max_rate = 9000000;
3936 video_rc_min_rate = 0; //1500000;
3937 video_rc_buffer_size = 224*1024*8;
3939 mux_packet_size= 2048; // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3940 mux_rate = 10080000; // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3942 audio_bit_rate = 448000;
3943 audio_sample_rate = 48000;
3945 } else if(!strcmp(arg, "dv")) {
3949 opt_frame_size(norm ? "720x480" : "720x576");
3950 opt_frame_rate(frame_rates[norm]);
3952 audio_sample_rate = 48000;
3956 fprintf(stderr, "Unknown target: %s\n", arg);
3961 static void show_version(void)
3963 /* TODO: add function interface to avutil and avformat */
3964 fprintf(stderr, "ffmpeg " FFMPEG_VERSION "\n"
3968 LIBAVUTIL_BUILD, avcodec_build(), LIBAVFORMAT_BUILD);
3972 static int opt_default(const char *opt, const char *arg){
3973 AVOption *o= av_set_string(avctx_opts, opt, arg);
3977 // 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));
3979 //FIXME we should always use avctx_opts, ... for storing options so there wont be any need to keep track of whats set over this
3980 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
3981 opt_names[opt_name_count++]= o->name;
3983 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3984 if(avctx_opts->flags & CODEC_FLAG_BITEXACT)
3987 if(avctx_opts->debug)
3988 av_log_set_level(AV_LOG_DEBUG);
3992 const OptionDef options[] = {
3994 { "L", 0, {(void*)show_license}, "show license" },
3995 { "h", 0, {(void*)show_help}, "show help" },
3996 { "version", 0, {(void*)show_version}, "show version" },
3997 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3998 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3999 { "img", HAS_ARG, {(void*)opt_image_format}, "force image format", "img_fmt" },
4000 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4001 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4002 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
4003 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
4004 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
4005 { "fs", HAS_ARG | OPT_INT, {(void*)&limit_filesize}, "set the limit file size", "limit_size" }, //
4006 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4007 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4008 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
4009 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
4010 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
4011 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
4012 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
4013 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4014 "add timings for benchmarking" },
4015 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4016 "dump each input packet" },
4017 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4018 "when dumping packets, also dump the payload" },
4019 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4020 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4021 { "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)", "" },
4022 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
4023 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4024 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4025 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4026 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4027 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4028 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4029 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4030 { "dts_delta_threshold", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "" },
4033 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
4034 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4035 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4036 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
4037 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4038 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4039 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4040 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
4041 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
4042 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
4043 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
4044 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
4045 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
4046 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
4047 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
4048 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
4049 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
4050 { "g", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_gop_size}, "set the group of picture size", "gop_size" },
4051 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4052 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4053 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4054 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
4055 { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
4056 { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
4057 { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
4058 { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
4059 { "mblmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmin}, "min macroblock quantiser scale (VBR)", "q" },
4060 { "mblmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmax}, "max macroblock quantiser scale (VBR)", "q" },
4061 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
4062 { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
4063 { "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" },
4064 { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
4065 { "rc_init_cplx", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_rc_initial_cplx}, "initial complexity for 1-pass encoding", "complexity" },
4066 { "b_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qfactor}, "qp factor between p and b frames", "factor" },
4067 { "i_qfactor", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qfactor}, "qp factor between p and i frames", "factor" },
4068 { "b_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_qoffset}, "qp offset between p and b frames", "offset" },
4069 { "i_qoffset", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_i_qoffset}, "qp offset between p and i frames", "offset" },
4070 { "ibias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_ibias}, "intra quant bias", "bias" },
4071 { "pbias", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pbias}, "inter quant bias", "bias" },
4072 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
4073 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4074 { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
4075 { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
4076 { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
4077 { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffer size (in kByte)", "size" },
4078 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4079 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
4081 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
4082 { "mb_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_threshold}, "macroblock threshold", "" },
4083 { "bf", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_b_frames}, "use 'frames' B frames", "frames" },
4084 { "preme", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_pre_me}, "pre motion estimation", "" },
4085 { "bug", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_workaround_bugs}, "workaround not auto detected encoder bugs", "param" },
4086 { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
4087 { "error", HAS_ARG | OPT_EXPERT, {(void*)opt_error_rate}, "error rate", "rate" },
4088 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
4089 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4090 "use same video quality as source (implies VBR)" },
4091 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4092 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
4093 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4094 "deinterlace pictures" },
4095 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4096 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
4097 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
4098 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4099 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4100 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4101 { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
4102 { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
4103 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4104 { "mepc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&me_penalty_compensation}, "motion estimation bitrate penalty compensation", "factor (1.0 = 256)" },
4105 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4106 { "skip_threshold", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_threshold}, "frame skip threshold", "threshold" },
4107 { "skip_factor", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_factor}, "frame skip factor", "factor" },
4108 { "skip_exp", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&frame_skip_exp}, "frame skip exponent", "exponent" },
4109 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
4110 { "genpts", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&genpts }, "generate pts" },
4111 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4114 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
4115 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4116 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4117 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4118 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4119 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4120 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4121 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4122 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
4123 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4125 /* subtitle options */
4126 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4127 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
4128 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4131 { "vd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_device}, "set video grab device", "device" },
4132 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4133 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4134 { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" },
4136 /* G.2 grab options */
4137 { "grab", HAS_ARG | OPT_EXPERT | OPT_GRAB, {(void*)opt_grab}, "request grabbing using", "format" },
4138 { "gd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_grab_device}, "set grab device", "device" },
4141 { "muxrate", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_rate}, "set mux rate", "rate" },
4142 { "packetsize", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_packet_size}, "set packet size", "size" },
4143 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4144 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4145 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4149 static void show_banner(void)
4151 fprintf(stderr, "FFmpeg version " FFMPEG_VERSION ", Copyright (c) 2000-2004 Fabrice Bellard\n");
4152 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
4153 fprintf(stderr, " libavutil version: " AV_STRINGIFY(LIBAVUTIL_VERSION) "\n");
4154 fprintf(stderr, " libavcodec version: " AV_STRINGIFY(LIBAVCODEC_VERSION) "\n");
4155 fprintf(stderr, " libavformat version: " AV_STRINGIFY(LIBAVFORMAT_VERSION) "\n");
4156 fprintf(stderr, " built on " __DATE__ " " __TIME__);
4158 fprintf(stderr, ", gcc: " __VERSION__ "\n");
4160 fprintf(stderr, ", using a non-gcc compiler\n");
4164 static void show_license(void)
4169 "This program is free software; you can redistribute it and/or modify\n"
4170 "it under the terms of the GNU General Public License as published by\n"
4171 "the Free Software Foundation; either version 2 of the License, or\n"
4172 "(at your option) any later version.\n"
4174 "This program is distributed in the hope that it will be useful,\n"
4175 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
4176 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
4177 "GNU General Public License for more details.\n"
4179 "You should have received a copy of the GNU General Public License\n"
4180 "along with this program; if not, write to the Free Software\n"
4181 "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
4185 "This library is free software; you can redistribute it and/or\n"
4186 "modify it under the terms of the GNU Lesser General Public\n"
4187 "License as published by the Free Software Foundation; either\n"
4188 "version 2 of the License, or (at your option) any later version.\n"
4190 "This library is distributed in the hope that it will be useful,\n"
4191 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
4192 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
4193 "Lesser General Public License for more details.\n"
4195 "You should have received a copy of the GNU Lesser General Public\n"
4196 "License along with this library; if not, write to the Free Software\n"
4197 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
4203 static void show_help(void)
4206 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
4207 "Hyper fast Audio and Video encoder\n");
4209 show_help_options(options, "Main options:\n",
4210 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
4211 show_help_options(options, "\nVideo options:\n",
4212 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4214 show_help_options(options, "\nAdvanced Video options:\n",
4215 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4216 OPT_VIDEO | OPT_EXPERT);
4217 show_help_options(options, "\nAudio options:\n",
4218 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4220 show_help_options(options, "\nAdvanced Audio options:\n",
4221 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4222 OPT_AUDIO | OPT_EXPERT);
4223 show_help_options(options, "\nSubtitle options:\n",
4224 OPT_SUBTITLE | OPT_GRAB,
4226 show_help_options(options, "\nAudio/Video grab options:\n",
4229 show_help_options(options, "\nAdvanced options:\n",
4230 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4232 av_opt_show(avctx_opts, NULL);
4237 void parse_arg_file(const char *filename)
4239 opt_output_file(filename);
4242 int main(int argc, char **argv)
4249 avctx_opts= avcodec_alloc_context();
4257 parse_options(argc, argv, options);
4259 /* file converter / grab */
4260 if (nb_output_files <= 0) {
4261 fprintf(stderr, "Must supply at least one output file\n");
4265 if (nb_input_files == 0) {
4271 av_encode(output_files, nb_output_files, input_files, nb_input_files,
4272 stream_maps, nb_stream_maps);
4273 ti = getutime() - ti;
4275 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
4279 for(i=0;i<nb_output_files;i++) {
4280 /* maybe av_close_output_file ??? */
4281 AVFormatContext *s = output_files[i];
4283 if (!(s->oformat->flags & AVFMT_NOFILE))
4285 for(j=0;j<s->nb_streams;j++)
4286 av_free(s->streams[j]);
4289 for(i=0;i<nb_input_files;i++)
4290 av_close_input_file(input_files[i]);
4295 av_free(intra_matrix);
4297 av_free(inter_matrix);
4299 #ifdef POWERPC_PERFORMANCE_REPORT
4300 extern void powerpc_display_perf_report(void);
4301 powerpc_display_perf_report();
4302 #endif /* POWERPC_PERFORMANCE_REPORT */
4304 #ifndef CONFIG_WIN32
4305 if (received_sigterm) {
4307 "Received signal %d: terminating.\n",
4308 (int) received_sigterm);
4312 exit(0); /* not all OS-es handle main() return value */