3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
32 #include "framehook.h"
37 #if !defined(HAVE_GETRUSAGE) && defined(HAVE_GETPROCESSTIMES)
41 #if defined(HAVE_TERMIOS_H)
44 #include <sys/ioctl.h>
47 #include <sys/resource.h>
48 #elif defined(HAVE_CONIO_H)
51 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
60 #if !defined(INFINITY) && defined(HUGE_VAL)
61 #define INFINITY HUGE_VAL
66 static const char program_name[] = "FFmpeg";
67 static const int program_birth_year = 2000;
69 /* select an input stream for an output stream */
70 typedef struct AVStreamMap {
74 int sync_stream_index;
77 /** select an input file for an output file */
78 typedef struct AVMetaDataMap {
83 extern const OptionDef options[];
87 static AVFormatContext *input_files[MAX_FILES];
88 static int64_t input_files_ts_offset[MAX_FILES];
89 static int nb_input_files = 0;
91 static AVFormatContext *output_files[MAX_FILES];
92 static int nb_output_files = 0;
94 static AVStreamMap stream_maps[MAX_FILES];
95 static int nb_stream_maps;
97 static AVMetaDataMap meta_data_maps[MAX_FILES];
98 static int nb_meta_data_maps;
100 static AVInputFormat *file_iformat;
101 static AVOutputFormat *file_oformat;
102 static int frame_width = 0;
103 static int frame_height = 0;
104 static float frame_aspect_ratio = 0;
105 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
106 static int frame_padtop = 0;
107 static int frame_padbottom = 0;
108 static int frame_padleft = 0;
109 static int frame_padright = 0;
110 static int padcolor[3] = {16,128,128}; /* default to black */
111 static int frame_topBand = 0;
112 static int frame_bottomBand = 0;
113 static int frame_leftBand = 0;
114 static int frame_rightBand = 0;
115 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
116 static AVRational frame_rate = (AVRational) {25,1};
117 static float video_qscale = 0;
118 static int video_qdiff = 3;
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_disable = 0;
129 static int video_discard = 0;
130 static char *video_codec_name = NULL;
131 static int video_codec_tag = 0;
132 static int same_quality = 0;
133 static int do_deinterlace = 0;
134 static int strict = 0;
135 static int top_field_first = -1;
136 static int me_threshold = 0;
137 static int intra_dc_precision = 8;
138 static int loop_input = 0;
139 static int loop_output = AVFMT_NOOUTPUTLOOP;
140 static int qp_hist = 0;
142 static int intra_only = 0;
143 static int audio_sample_rate = 44100;
144 #define QSCALE_NONE -99999
145 static float audio_qscale = QSCALE_NONE;
146 static int audio_disable = 0;
147 static int audio_channels = 1;
148 static char *audio_codec_name = NULL;
149 static int audio_codec_tag = 0;
150 static char *audio_language = NULL;
152 static int subtitle_disable = 0;
153 static char *subtitle_codec_name = NULL;
154 static char *subtitle_language = NULL;
156 static float mux_preload= 0.5;
157 static float mux_max_delay= 0.7;
159 static int64_t recording_time = 0;
160 static int64_t start_time = 0;
161 static int64_t rec_timestamp = 0;
162 static int64_t input_ts_offset = 0;
163 static int file_overwrite = 0;
164 static char *str_title = NULL;
165 static char *str_author = NULL;
166 static char *str_copyright = NULL;
167 static char *str_comment = NULL;
168 static char *str_album = NULL;
169 static int do_benchmark = 0;
170 static int do_hex_dump = 0;
171 static int do_pkt_dump = 0;
172 static int do_psnr = 0;
173 static int do_pass = 0;
174 static char *pass_logfilename = NULL;
175 static int audio_stream_copy = 0;
176 static int video_stream_copy = 0;
177 static int subtitle_stream_copy = 0;
178 static int video_sync_method= 1;
179 static int audio_sync_method= 0;
180 static float audio_drift_threshold= 0.1;
181 static int copy_ts= 0;
182 static int opt_shortest = 0; //
183 static int video_global_header = 0;
184 static char *vstats_filename;
185 static FILE *vstats_file;
186 static int opt_programid = 0;
188 static int rate_emu = 0;
190 static int video_channel = 0;
191 static char *video_standard;
193 static int audio_volume = 256;
195 static int using_stdin = 0;
196 static int using_vhook = 0;
197 static int verbose = 1;
198 static int thread_count= 1;
199 static int q_pressed = 0;
200 static int64_t video_size = 0;
201 static int64_t audio_size = 0;
202 static int64_t extra_size = 0;
203 static int nb_frames_dup = 0;
204 static int nb_frames_drop = 0;
205 static int input_sync;
206 static uint64_t limit_filesize = 0; //
208 static int pgmyuv_compatibility_hack=0;
209 static float dts_delta_threshold = 10;
211 static int sws_flags = SWS_BICUBIC;
213 static const char **opt_names;
214 static int opt_name_count;
215 static AVCodecContext *avctx_opts[CODEC_TYPE_NB];
216 static AVFormatContext *avformat_opts;
217 static struct SwsContext *sws_opts;
218 static int64_t timer_start;
220 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
221 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
222 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
224 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
226 struct AVInputStream;
228 typedef struct AVOutputStream {
229 int file_index; /* file index */
230 int index; /* stream index in the output file */
231 int source_index; /* AVInputStream index */
232 AVStream *st; /* stream in the output file */
233 int encoding_needed; /* true if encoding needed for this stream */
235 /* input pts and corresponding output pts
237 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
238 struct AVInputStream *sync_ist; /* input stream to sync against */
239 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
242 AVFrame pict_tmp; /* temporary image for resampling */
243 struct SwsContext *img_resample_ctx; /* for image resampling */
247 int topBand; /* cropping area sizes */
251 int padtop; /* padding area sizes */
258 ReSampleContext *resample; /* for audio resampling */
259 AVFifoBuffer fifo; /* for compression: one audio fifo per codec */
263 typedef struct AVInputStream {
267 int discard; /* true if stream data should be discarded */
268 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
269 int64_t sample_index; /* current sample */
271 int64_t start; /* time when read started */
272 unsigned long frame; /* current frame */
273 int64_t next_pts; /* synthetic pts for cases where pkt.pts
275 int64_t pts; /* current pts */
276 int is_start; /* is 1 at the start and after a discontinuity */
279 typedef struct AVInputFile {
280 int eof_reached; /* true if eof reached */
281 int ist_index; /* index of first stream in ist_table */
282 int buffer_size; /* current total buffer size */
283 int nb_streams; /* nb streams we are aware of */
286 #ifdef HAVE_TERMIOS_H
288 /* init terminal so that we can grab keys */
289 static struct termios oldtty;
292 static void term_exit(void)
294 #ifdef HAVE_TERMIOS_H
295 tcsetattr (0, TCSANOW, &oldtty);
299 static volatile sig_atomic_t received_sigterm = 0;
302 sigterm_handler(int sig)
304 received_sigterm = sig;
308 static void term_init(void)
310 #ifdef HAVE_TERMIOS_H
316 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
317 |INLCR|IGNCR|ICRNL|IXON);
318 tty.c_oflag |= OPOST;
319 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
320 tty.c_cflag &= ~(CSIZE|PARENB);
325 tcsetattr (0, TCSANOW, &tty);
326 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
329 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
330 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
332 register a function to be called at normal program termination
335 #ifdef CONFIG_BEOS_NETSERVER
336 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
340 /* read a key without blocking */
341 static int read_key(void)
343 #if defined(HAVE_TERMIOS_H)
346 #ifndef CONFIG_BEOS_NETSERVER
354 n = select(1, &rfds, NULL, NULL, &tv);
363 #elif defined(HAVE_CONIO_H)
370 static int decode_interrupt_cb(void)
372 return q_pressed || (q_pressed = read_key() == 'q');
375 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
380 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
383 /* copy stream format */
384 s->nb_streams = ic->nb_streams;
385 for(i=0;i<ic->nb_streams;i++) {
388 // FIXME: a more elegant solution is needed
389 st = av_mallocz(sizeof(AVStream));
390 memcpy(st, ic->streams[i], sizeof(AVStream));
391 st->codec = avcodec_alloc_context();
392 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
396 av_close_input_file(ic);
401 get_sync_ipts(const AVOutputStream *ost)
403 const AVInputStream *ist = ost->sync_ist;
404 return (double)(ist->pts - start_time)/AV_TIME_BASE;
407 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
411 AVPacket new_pkt= *pkt;
412 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
413 &new_pkt.data, &new_pkt.size,
414 pkt->data, pkt->size,
415 pkt->flags & PKT_FLAG_KEY);
418 new_pkt.destruct= av_destruct_packet;
425 ret= av_interleaved_write_frame(s, pkt);
427 print_error("av_interleaved_write_frame()", ret);
432 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
434 static void do_audio_out(AVFormatContext *s,
437 unsigned char *buf, int size)
440 static uint8_t *audio_buf = NULL;
441 static uint8_t *audio_out = NULL;
442 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
444 int size_out, frame_bytes, ret;
445 AVCodecContext *enc= ost->st->codec;
447 /* SC: dynamic allocation of buffers */
449 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
451 audio_out = av_malloc(audio_out_size);
452 if (!audio_buf || !audio_out)
453 return; /* Should signal an error ! */
455 if(audio_sync_method){
456 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
457 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2);
458 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
459 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
461 //FIXME resample delay
462 if(fabs(delta) > 50){
463 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
465 byte_delta= FFMAX(byte_delta, -size);
469 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
474 static uint8_t *input_tmp= NULL;
475 input_tmp= av_realloc(input_tmp, byte_delta + size);
477 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
480 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
482 memset(input_tmp, 0, byte_delta);
483 memcpy(input_tmp + byte_delta, buf, size);
487 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
489 }else if(audio_sync_method>1){
490 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
491 assert(ost->audio_resample);
493 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
494 // fprintf(stderr, "drift:%f len:%d opts:%"PRId64" ipts:%"PRId64" fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(get_sync_ipts(ost) * enc->sample_rate), av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2));
495 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
499 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
500 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
502 if (ost->audio_resample) {
504 size_out = audio_resample(ost->resample,
505 (short *)buftmp, (short *)buf,
506 size / (ist->st->codec->channels * 2));
507 size_out = size_out * enc->channels * 2;
513 /* now encode as many frames as possible */
514 if (enc->frame_size > 1) {
515 /* output resampled raw samples */
516 av_fifo_write(&ost->fifo, buftmp, size_out);
518 frame_bytes = enc->frame_size * 2 * enc->channels;
520 while (av_fifo_read(&ost->fifo, audio_buf, frame_bytes) == 0) {
522 av_init_packet(&pkt);
524 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
527 pkt.stream_index= ost->index;
530 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
531 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
532 pkt.flags |= PKT_FLAG_KEY;
533 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
535 ost->sync_opts += enc->frame_size;
539 av_init_packet(&pkt);
541 ost->sync_opts += size_out / (2 * enc->channels);
543 /* output a pcm frame */
544 /* XXX: change encoding codec API to avoid this ? */
545 switch(enc->codec->id) {
546 case CODEC_ID_PCM_S32LE:
547 case CODEC_ID_PCM_S32BE:
548 case CODEC_ID_PCM_U32LE:
549 case CODEC_ID_PCM_U32BE:
550 size_out = size_out << 1;
552 case CODEC_ID_PCM_S24LE:
553 case CODEC_ID_PCM_S24BE:
554 case CODEC_ID_PCM_U24LE:
555 case CODEC_ID_PCM_U24BE:
556 case CODEC_ID_PCM_S24DAUD:
557 size_out = size_out / 2 * 3;
559 case CODEC_ID_PCM_S16LE:
560 case CODEC_ID_PCM_S16BE:
561 case CODEC_ID_PCM_U16LE:
562 case CODEC_ID_PCM_U16BE:
565 size_out = size_out >> 1;
568 ret = avcodec_encode_audio(enc, audio_out, size_out,
571 pkt.stream_index= ost->index;
574 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
575 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
576 pkt.flags |= PKT_FLAG_KEY;
577 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
581 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
585 AVPicture picture_tmp;
588 dec = ist->st->codec;
590 /* deinterlace : must be done before any resize */
591 if (do_deinterlace || using_vhook) {
594 /* create temporary picture */
595 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
596 buf = av_malloc(size);
600 picture2 = &picture_tmp;
601 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
604 if(avpicture_deinterlace(picture2, picture,
605 dec->pix_fmt, dec->width, dec->height) < 0) {
606 /* if error, do not deinterlace */
612 av_picture_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
619 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height,
620 1000000 * ist->pts / AV_TIME_BASE);
622 if (picture != picture2)
623 *picture = *picture2;
627 /* we begin to correct av delay at this threshold */
628 #define AV_DELAY_MAX 0.100
630 static void do_subtitle_out(AVFormatContext *s,
636 static uint8_t *subtitle_out = NULL;
637 int subtitle_out_max_size = 65536;
638 int subtitle_out_size, nb, i;
642 if (pts == AV_NOPTS_VALUE) {
643 fprintf(stderr, "Subtitle packets must have a pts\n");
647 enc = ost->st->codec;
650 subtitle_out = av_malloc(subtitle_out_max_size);
653 /* Note: DVB subtitle need one packet to draw them and one other
654 packet to clear them */
655 /* XXX: signal it in the codec context ? */
656 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
661 for(i = 0; i < nb; i++) {
662 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
663 subtitle_out_max_size, sub);
665 av_init_packet(&pkt);
666 pkt.stream_index = ost->index;
667 pkt.data = subtitle_out;
668 pkt.size = subtitle_out_size;
669 pkt.pts = av_rescale_q(pts, ist->st->time_base, ost->st->time_base);
670 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
671 /* XXX: the pts correction is handled here. Maybe handling
672 it in the codec would be better */
674 pkt.pts += 90 * sub->start_display_time;
676 pkt.pts += 90 * sub->end_display_time;
678 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
682 static int bit_buffer_size= 1024*256;
683 static uint8_t *bit_buffer= NULL;
685 static void do_video_out(AVFormatContext *s,
691 int nb_frames, i, ret;
692 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
693 AVFrame picture_crop_temp, picture_pad_temp;
694 AVCodecContext *enc, *dec;
696 avcodec_get_frame_defaults(&picture_crop_temp);
697 avcodec_get_frame_defaults(&picture_pad_temp);
699 enc = ost->st->codec;
700 dec = ist->st->codec;
702 /* by default, we output a single frame */
707 if(video_sync_method){
709 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
710 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
713 else if (vdelta > 1.1)
714 nb_frames = lrintf(vdelta);
715 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, ost->sync_ipts, nb_frames);
719 fprintf(stderr, "*** drop!\n");
720 }else if (nb_frames > 1) {
721 nb_frames_dup += nb_frames;
723 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
726 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
728 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
732 if (ost->video_crop) {
733 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
734 av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
737 formatted_picture = &picture_crop_temp;
739 formatted_picture = in_picture;
742 final_picture = formatted_picture;
743 padding_src = formatted_picture;
744 resampling_dst = &ost->pict_tmp;
745 if (ost->video_pad) {
746 final_picture = &ost->pict_tmp;
747 if (ost->video_resample) {
748 if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
749 av_log(NULL, AV_LOG_ERROR, "error padding picture\n");
752 resampling_dst = &picture_pad_temp;
756 if (ost->video_resample) {
758 final_picture = &ost->pict_tmp;
759 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
760 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
763 if (ost->video_pad) {
764 av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
765 enc->height, enc->width, enc->pix_fmt,
766 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
769 /* duplicates frame if needed */
770 for(i=0;i<nb_frames;i++) {
772 av_init_packet(&pkt);
773 pkt.stream_index= ost->index;
775 if (s->oformat->flags & AVFMT_RAWPICTURE) {
776 /* raw pictures are written as AVPicture structure to
777 avoid any copies. We support temorarily the older
779 AVFrame* old_frame = enc->coded_frame;
780 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
781 pkt.data= (uint8_t *)final_picture;
782 pkt.size= sizeof(AVPicture);
783 if(dec->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
784 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
785 if(dec->coded_frame && dec->coded_frame->key_frame)
786 pkt.flags |= PKT_FLAG_KEY;
788 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
789 enc->coded_frame = old_frame;
793 big_picture= *final_picture;
794 /* better than nothing: use input picture interlaced
796 big_picture.interlaced_frame = in_picture->interlaced_frame;
797 if(avctx_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
798 if(top_field_first == -1)
799 big_picture.top_field_first = in_picture->top_field_first;
801 big_picture.top_field_first = top_field_first;
804 /* handles sameq here. This is not correct because it may
805 not be a global option */
807 big_picture.quality = ist->st->quality;
809 big_picture.quality = ost->st->quality;
811 big_picture.pict_type = 0;
812 // big_picture.pts = AV_NOPTS_VALUE;
813 big_picture.pts= ost->sync_opts;
814 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
815 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
816 ret = avcodec_encode_video(enc,
817 bit_buffer, bit_buffer_size,
820 fprintf(stderr, "Video encoding failed\n");
823 //enc->frame_number = enc->real_pict_num;
825 pkt.data= bit_buffer;
827 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
828 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
829 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
830 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
831 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
833 if(enc->coded_frame && enc->coded_frame->key_frame)
834 pkt.flags |= PKT_FLAG_KEY;
835 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
837 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
838 // enc->frame_number-1, enc->real_pict_num, ret,
840 /* if two pass, output log */
841 if (ost->logfile && enc->stats_out) {
842 fprintf(ost->logfile, "%s", enc->stats_out);
851 static double psnr(double d){
852 if(d==0) return INFINITY;
853 return -10.0*log(d)/log(10.0);
856 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
861 double ti1, bitrate, avg_bitrate;
863 /* this is executed just the first time do_video_stats is called */
865 vstats_file = fopen(vstats_filename, "w");
872 enc = ost->st->codec;
873 if (enc->codec_type == CODEC_TYPE_VIDEO) {
874 frame_number = ost->frame_number;
875 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
876 if (enc->flags&CODEC_FLAG_PSNR)
877 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
879 fprintf(vstats_file,"f_size= %6d ", frame_size);
880 /* compute pts value */
881 ti1 = ost->sync_opts * av_q2d(enc->time_base);
885 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
886 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
887 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
888 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
889 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
893 static void print_report(AVFormatContext **output_files,
894 AVOutputStream **ost_table, int nb_ostreams,
899 AVFormatContext *oc, *os;
902 int frame_number, vid, i;
903 double bitrate, ti1, pts;
904 static int64_t last_time = -1;
905 static int qp_histogram[52];
907 if (!is_last_report) {
909 /* display the report every 0.5 seconds */
910 cur_time = av_gettime();
911 if (last_time == -1) {
912 last_time = cur_time;
915 if ((cur_time - last_time) < 500000)
917 last_time = cur_time;
921 oc = output_files[0];
923 total_size = url_fsize(oc->pb);
924 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
925 total_size= url_ftell(oc->pb);
930 for(i=0;i<nb_ostreams;i++) {
932 os = output_files[ost->file_index];
933 enc = ost->st->codec;
934 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
935 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
936 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
938 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
939 float t = (av_gettime()-timer_start) / 1000000.0;
941 frame_number = ost->frame_number;
942 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
943 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
944 enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
946 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
947 if(qp_hist && enc->coded_frame){
949 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
950 if(qp>=0 && qp<sizeof(qp_histogram)/sizeof(int))
953 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
955 if (enc->flags&CODEC_FLAG_PSNR){
957 double error, error_sum=0;
958 double scale, scale_sum=0;
959 char type[3]= {'Y','U','V'};
960 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
963 error= enc->error[j];
964 scale= enc->width*enc->height*255.0*255.0*frame_number;
966 error= enc->coded_frame->error[j];
967 scale= enc->width*enc->height*255.0*255.0;
972 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
974 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
978 /* compute min output value */
979 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
980 if ((pts < ti1) && (pts > 0))
986 if (verbose || is_last_report) {
987 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
989 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
990 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
991 (double)total_size / 1024, ti1, bitrate);
994 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
995 nb_frames_dup, nb_frames_drop);
998 fprintf(stderr, "%s \r", buf);
1003 if (is_last_report && verbose >= 0){
1004 int64_t raw= audio_size + video_size + extra_size;
1005 fprintf(stderr, "\n");
1006 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1010 100.0*(total_size - raw)/raw
1015 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1016 static int output_packet(AVInputStream *ist, int ist_index,
1017 AVOutputStream **ost_table, int nb_ostreams,
1018 const AVPacket *pkt)
1020 AVFormatContext *os;
1021 AVOutputStream *ost;
1025 int data_size, got_picture;
1027 void *buffer_to_free;
1028 static unsigned int samples_size= 0;
1029 static short *samples= NULL;
1030 AVSubtitle subtitle, *subtitle_to_free;
1034 ist->pts= ist->next_pts; // needed for last packet if vsync=0
1035 } else if (pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1036 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1038 // assert(ist->pts == ist->next_pts);
1052 /* decode the packet if needed */
1053 data_buf = NULL; /* fail safe */
1055 subtitle_to_free = NULL;
1056 if (ist->decoding_needed) {
1057 switch(ist->st->codec->codec_type) {
1058 case CODEC_TYPE_AUDIO:{
1060 samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE));
1061 data_size= samples_size;
1062 /* XXX: could avoid copy if PCM 16 bits with same
1063 endianness as CPU */
1064 ret = avcodec_decode_audio2(ist->st->codec, samples, &data_size,
1070 /* Some bug in mpeg audio decoder gives */
1071 /* data_size < 0, it seems they are overflows */
1072 if (data_size <= 0) {
1073 /* no audio frame */
1076 data_buf = (uint8_t *)samples;
1077 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1078 (ist->st->codec->sample_rate * ist->st->codec->channels);
1080 case CODEC_TYPE_VIDEO:
1081 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1082 /* XXX: allocate picture correctly */
1083 avcodec_get_frame_defaults(&picture);
1085 ret = avcodec_decode_video(ist->st->codec,
1086 &picture, &got_picture, ptr, len);
1087 ist->st->quality= picture.quality;
1091 /* no picture yet */
1092 goto discard_packet;
1094 if (ist->st->codec->time_base.num != 0) {
1095 ist->next_pts += ((int64_t)AV_TIME_BASE *
1096 ist->st->codec->time_base.num) /
1097 ist->st->codec->time_base.den;
1101 case CODEC_TYPE_SUBTITLE:
1102 ret = avcodec_decode_subtitle(ist->st->codec,
1103 &subtitle, &got_subtitle, ptr, len);
1106 if (!got_subtitle) {
1107 goto discard_packet;
1109 subtitle_to_free = &subtitle;
1116 switch(ist->st->codec->codec_type) {
1117 case CODEC_TYPE_AUDIO:
1118 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1119 (ist->st->codec->sample_rate * ist->st->codec->channels);
1121 case CODEC_TYPE_VIDEO:
1122 if (ist->st->codec->time_base.num != 0) {
1123 ist->next_pts += ((int64_t)AV_TIME_BASE *
1124 ist->st->codec->time_base.num) /
1125 ist->st->codec->time_base.den;
1135 buffer_to_free = NULL;
1136 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1137 pre_process_video_frame(ist, (AVPicture *)&picture,
1141 // preprocess audio (volume)
1142 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1143 if (audio_volume != 256) {
1146 for(i=0;i<(data_size / sizeof(short));i++) {
1147 int v = ((*volp) * audio_volume + 128) >> 8;
1148 if (v < -32768) v = -32768;
1149 if (v > 32767) v = 32767;
1155 /* frame rate emulation */
1156 if (ist->st->codec->rate_emu) {
1157 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
1158 int64_t now = av_gettime() - ist->start;
1166 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1167 is the one of the next displayed one */
1168 /* XXX: add mpeg4 too ? */
1169 if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
1170 if (ist->st->codec->pict_type != B_TYPE) {
1172 tmp = ist->last_ip_pts;
1173 ist->last_ip_pts = ist->frac_pts.val;
1174 ist->frac_pts.val = tmp;
1178 /* if output time reached then transcode raw format,
1179 encode packets and output them */
1180 if (start_time == 0 || ist->pts >= start_time)
1181 for(i=0;i<nb_ostreams;i++) {
1185 if (ost->source_index == ist_index) {
1186 os = output_files[ost->file_index];
1189 printf("%d: got pts=%0.3f %0.3f\n", i,
1190 (double)pkt->pts / AV_TIME_BASE,
1191 ((double)ist->pts / AV_TIME_BASE) -
1192 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1194 /* set the input output pts pairs */
1195 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1197 if (ost->encoding_needed) {
1198 switch(ost->st->codec->codec_type) {
1199 case CODEC_TYPE_AUDIO:
1200 do_audio_out(os, ost, ist, data_buf, data_size);
1202 case CODEC_TYPE_VIDEO:
1203 do_video_out(os, ost, ist, &picture, &frame_size);
1204 video_size += frame_size;
1205 if (vstats_filename && frame_size)
1206 do_video_stats(os, ost, frame_size);
1208 case CODEC_TYPE_SUBTITLE:
1209 do_subtitle_out(os, ost, ist, &subtitle,
1216 AVFrame avframe; //FIXME/XXX remove this
1218 av_init_packet(&opkt);
1220 if (!ost->frame_number && !(pkt->flags & PKT_FLAG_KEY))
1223 /* no reencoding needed : output the packet directly */
1224 /* force the input stream PTS */
1226 avcodec_get_frame_defaults(&avframe);
1227 ost->st->codec->coded_frame= &avframe;
1228 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1230 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1231 audio_size += data_size;
1232 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1233 video_size += data_size;
1237 opkt.stream_index= ost->index;
1238 if(pkt->pts != AV_NOPTS_VALUE)
1239 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base);
1241 opkt.pts= AV_NOPTS_VALUE;
1243 if (pkt->dts == AV_NOPTS_VALUE)
1244 opkt.dts = av_rescale_q(ist->next_pts, AV_TIME_BASE_Q, ost->st->time_base);
1246 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1248 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1249 opkt.flags= pkt->flags;
1251 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1252 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1253 opkt.destruct= av_destruct_packet;
1255 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][pkt->stream_index]);
1256 ost->st->codec->frame_number++;
1257 ost->frame_number++;
1258 av_free_packet(&opkt);
1262 av_free(buffer_to_free);
1263 /* XXX: allocate the subtitles in the codec ? */
1264 if (subtitle_to_free) {
1265 if (subtitle_to_free->rects != NULL) {
1266 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1267 av_free(subtitle_to_free->rects[i].bitmap);
1268 av_free(subtitle_to_free->rects[i].rgba_palette);
1270 av_freep(&subtitle_to_free->rects);
1272 subtitle_to_free->num_rects = 0;
1273 subtitle_to_free = NULL;
1280 for(i=0;i<nb_ostreams;i++) {
1282 if (ost->source_index == ist_index) {
1283 AVCodecContext *enc= ost->st->codec;
1284 os = output_files[ost->file_index];
1286 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1288 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1291 if (ost->encoding_needed) {
1295 av_init_packet(&pkt);
1296 pkt.stream_index= ost->index;
1298 switch(ost->st->codec->codec_type) {
1299 case CODEC_TYPE_AUDIO:
1300 fifo_bytes = av_fifo_size(&ost->fifo);
1302 /* encode any samples remaining in fifo */
1303 if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1304 int fs_tmp = enc->frame_size;
1305 enc->frame_size = fifo_bytes / (2 * enc->channels);
1306 if(av_fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes) == 0) {
1307 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1309 enc->frame_size = fs_tmp;
1312 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1315 pkt.flags |= PKT_FLAG_KEY;
1317 case CODEC_TYPE_VIDEO:
1318 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1320 if(enc->coded_frame && enc->coded_frame->key_frame)
1321 pkt.flags |= PKT_FLAG_KEY;
1322 if (ost->logfile && enc->stats_out) {
1323 fprintf(ost->logfile, "%s", enc->stats_out);
1332 pkt.data= bit_buffer;
1334 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1335 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1336 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1348 static void print_sdp(AVFormatContext **avc, int n)
1352 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1353 printf("SDP:\n%s\n", sdp);
1356 static int stream_index_from_inputs(AVFormatContext **input_files,
1358 AVInputFile *file_table,
1359 AVInputStream **ist_table,
1360 enum CodecType type,
1364 for(z=0; z<nb_input_files; z++) {
1365 AVFormatContext *ic = input_files[z];
1366 for(p=0; p<ic->nb_programs; p++) {
1367 AVProgram *program = ic->programs[p];
1368 if(program->id != programid)
1370 for(q=0; q<program->nb_stream_indexes; q++) {
1371 int sidx = program->stream_index[q];
1372 int ris = file_table[z].ist_index + sidx;
1373 if(ist_table[ris]->discard && ic->streams[sidx]->codec->codec_type == type)
1383 * The following code is the main loop of the file converter
1385 static int av_encode(AVFormatContext **output_files,
1386 int nb_output_files,
1387 AVFormatContext **input_files,
1389 AVStreamMap *stream_maps, int nb_stream_maps)
1391 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1392 AVFormatContext *is, *os;
1393 AVCodecContext *codec, *icodec;
1394 AVOutputStream *ost, **ost_table = NULL;
1395 AVInputStream *ist, **ist_table = NULL;
1396 AVInputFile *file_table;
1400 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1404 /* input stream init */
1406 for(i=0;i<nb_input_files;i++) {
1407 is = input_files[i];
1408 file_table[i].ist_index = j;
1409 file_table[i].nb_streams = is->nb_streams;
1410 j += is->nb_streams;
1414 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1418 for(i=0;i<nb_istreams;i++) {
1419 ist = av_mallocz(sizeof(AVInputStream));
1425 for(i=0;i<nb_input_files;i++) {
1426 is = input_files[i];
1427 for(k=0;k<is->nb_streams;k++) {
1428 ist = ist_table[j++];
1429 ist->st = is->streams[k];
1430 ist->file_index = i;
1432 ist->discard = 1; /* the stream is discarded by default
1435 if (ist->st->codec->rate_emu) {
1436 ist->start = av_gettime();
1442 /* output stream init */
1444 for(i=0;i<nb_output_files;i++) {
1445 os = output_files[i];
1446 if (!os->nb_streams) {
1447 fprintf(stderr, "Output file does not contain any stream\n");
1450 nb_ostreams += os->nb_streams;
1452 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1453 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1457 /* Sanity check the mapping args -- do the input files & streams exist? */
1458 for(i=0;i<nb_stream_maps;i++) {
1459 int fi = stream_maps[i].file_index;
1460 int si = stream_maps[i].stream_index;
1462 if (fi < 0 || fi > nb_input_files - 1 ||
1463 si < 0 || si > file_table[fi].nb_streams - 1) {
1464 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1467 fi = stream_maps[i].sync_file_index;
1468 si = stream_maps[i].sync_stream_index;
1469 if (fi < 0 || fi > nb_input_files - 1 ||
1470 si < 0 || si > file_table[fi].nb_streams - 1) {
1471 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1476 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1479 for(i=0;i<nb_ostreams;i++) {
1480 ost = av_mallocz(sizeof(AVOutputStream));
1487 for(k=0;k<nb_output_files;k++) {
1488 os = output_files[k];
1489 for(i=0;i<os->nb_streams;i++) {
1491 ost = ost_table[n++];
1492 ost->file_index = k;
1494 ost->st = os->streams[i];
1495 if (nb_stream_maps > 0) {
1496 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1497 stream_maps[n-1].stream_index;
1499 /* Sanity check that the stream types match */
1500 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1501 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1502 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1503 ost->file_index, ost->index);
1510 j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid);
1512 ost->source_index = j;
1516 /* get corresponding input stream index : we select the first one with the right type */
1518 for(j=0;j<nb_istreams;j++) {
1521 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1522 ost->source_index = j;
1530 if(! opt_programid) {
1531 /* try again and reuse existing stream */
1532 for(j=0;j<nb_istreams;j++) {
1534 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1535 ost->source_index = j;
1541 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1542 ost->file_index, ost->index);
1547 ist = ist_table[ost->source_index];
1549 ost->sync_ist = (nb_stream_maps > 0) ?
1550 ist_table[file_table[stream_maps[n-1].sync_file_index].ist_index +
1551 stream_maps[n-1].sync_stream_index] : ist;
1555 /* for each output stream, we compute the right encoding parameters */
1556 for(i=0;i<nb_ostreams;i++) {
1558 os = output_files[ost->file_index];
1559 ist = ist_table[ost->source_index];
1561 codec = ost->st->codec;
1562 icodec = ist->st->codec;
1564 if (!ost->st->language[0])
1565 av_strlcpy(ost->st->language, ist->st->language,
1566 sizeof(ost->st->language));
1568 if (ost->st->stream_copy) {
1569 /* if stream_copy is selected, no need to decode or encode */
1570 codec->codec_id = icodec->codec_id;
1571 codec->codec_type = icodec->codec_type;
1573 if(!codec->codec_tag){
1574 if( !os->oformat->codec_tag
1575 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) > 0
1576 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1577 codec->codec_tag = icodec->codec_tag;
1580 codec->bit_rate = icodec->bit_rate;
1581 codec->extradata= icodec->extradata;
1582 codec->extradata_size= icodec->extradata_size;
1583 if(av_q2d(icodec->time_base) > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000)
1584 codec->time_base = icodec->time_base;
1586 codec->time_base = ist->st->time_base;
1587 switch(codec->codec_type) {
1588 case CODEC_TYPE_AUDIO:
1589 codec->sample_rate = icodec->sample_rate;
1590 codec->channels = icodec->channels;
1591 codec->frame_size = icodec->frame_size;
1592 codec->block_align= icodec->block_align;
1593 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1594 codec->block_align= 0;
1596 case CODEC_TYPE_VIDEO:
1598 fprintf(stderr,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");
1601 codec->pix_fmt = icodec->pix_fmt;
1602 codec->width = icodec->width;
1603 codec->height = icodec->height;
1604 codec->has_b_frames = icodec->has_b_frames;
1606 case CODEC_TYPE_SUBTITLE:
1612 switch(codec->codec_type) {
1613 case CODEC_TYPE_AUDIO:
1614 if (av_fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1617 if (codec->channels == icodec->channels &&
1618 codec->sample_rate == icodec->sample_rate) {
1619 ost->audio_resample = 0;
1621 if (codec->channels != icodec->channels &&
1622 (icodec->codec_id == CODEC_ID_AC3 ||
1623 icodec->codec_id == CODEC_ID_DTS)) {
1624 /* Special case for 5:1 AC3 and DTS input */
1625 /* and mono or stereo output */
1626 /* Request specific number of channels */
1627 icodec->channels = codec->channels;
1628 if (codec->sample_rate == icodec->sample_rate)
1629 ost->audio_resample = 0;
1631 ost->audio_resample = 1;
1634 ost->audio_resample = 1;
1637 if(audio_sync_method>1)
1638 ost->audio_resample = 1;
1640 if(ost->audio_resample){
1641 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1642 codec->sample_rate, icodec->sample_rate);
1644 printf("Can't resample. Aborting.\n");
1648 ist->decoding_needed = 1;
1649 ost->encoding_needed = 1;
1651 case CODEC_TYPE_VIDEO:
1652 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1653 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1654 ost->video_resample = ((codec->width != icodec->width -
1655 (frame_leftBand + frame_rightBand) +
1656 (frame_padleft + frame_padright)) ||
1657 (codec->height != icodec->height -
1658 (frame_topBand + frame_bottomBand) +
1659 (frame_padtop + frame_padbottom)) ||
1660 (codec->pix_fmt != icodec->pix_fmt));
1661 if (ost->video_crop) {
1662 ost->topBand = frame_topBand;
1663 ost->leftBand = frame_leftBand;
1665 if (ost->video_pad) {
1666 ost->padtop = frame_padtop;
1667 ost->padleft = frame_padleft;
1668 ost->padbottom = frame_padbottom;
1669 ost->padright = frame_padright;
1670 if (!ost->video_resample) {
1671 avcodec_get_frame_defaults(&ost->pict_tmp);
1672 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1673 codec->width, codec->height ) )
1677 if (ost->video_resample) {
1678 avcodec_get_frame_defaults(&ost->pict_tmp);
1679 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1680 codec->width, codec->height ) ) {
1681 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1684 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1685 ost->img_resample_ctx = sws_getContext(
1686 icodec->width - (frame_leftBand + frame_rightBand),
1687 icodec->height - (frame_topBand + frame_bottomBand),
1689 codec->width - (frame_padleft + frame_padright),
1690 codec->height - (frame_padtop + frame_padbottom),
1692 sws_flags, NULL, NULL, NULL);
1693 if (ost->img_resample_ctx == NULL) {
1694 fprintf(stderr, "Cannot get resampling context\n");
1697 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1699 ost->encoding_needed = 1;
1700 ist->decoding_needed = 1;
1702 case CODEC_TYPE_SUBTITLE:
1703 ost->encoding_needed = 1;
1704 ist->decoding_needed = 1;
1711 if (ost->encoding_needed &&
1712 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1713 char logfilename[1024];
1718 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1720 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1721 if (codec->flags & CODEC_FLAG_PASS1) {
1722 f = fopen(logfilename, "w");
1724 perror(logfilename);
1729 /* read the log file */
1730 f = fopen(logfilename, "r");
1732 perror(logfilename);
1735 fseek(f, 0, SEEK_END);
1737 fseek(f, 0, SEEK_SET);
1738 logbuffer = av_malloc(size + 1);
1740 fprintf(stderr, "Could not allocate log buffer\n");
1743 size = fread(logbuffer, 1, size, f);
1745 logbuffer[size] = '\0';
1746 codec->stats_in = logbuffer;
1750 if(codec->codec_type == CODEC_TYPE_VIDEO){
1751 int size= codec->width * codec->height;
1752 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1757 bit_buffer = av_malloc(bit_buffer_size);
1761 /* dump the file output parameters - cannot be done before in case
1763 for(i=0;i<nb_output_files;i++) {
1764 dump_format(output_files[i], i, output_files[i]->filename, 1);
1767 /* dump the stream mapping */
1769 fprintf(stderr, "Stream mapping:\n");
1770 for(i=0;i<nb_ostreams;i++) {
1772 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1773 ist_table[ost->source_index]->file_index,
1774 ist_table[ost->source_index]->index,
1777 if (ost->sync_ist != ist_table[ost->source_index])
1778 fprintf(stderr, " [sync #%d.%d]",
1779 ost->sync_ist->file_index,
1780 ost->sync_ist->index);
1781 fprintf(stderr, "\n");
1785 /* open each encoder */
1786 for(i=0;i<nb_ostreams;i++) {
1788 if (ost->encoding_needed) {
1790 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1792 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1793 ost->file_index, ost->index);
1796 if (avcodec_open(ost->st->codec, codec) < 0) {
1797 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1798 ost->file_index, ost->index);
1801 extra_size += ost->st->codec->extradata_size;
1805 /* open each decoder */
1806 for(i=0;i<nb_istreams;i++) {
1808 if (ist->decoding_needed) {
1810 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1812 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1813 ist->st->codec->codec_id, ist->file_index, ist->index);
1816 if (avcodec_open(ist->st->codec, codec) < 0) {
1817 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1818 ist->file_index, ist->index);
1821 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1822 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1827 for(i=0;i<nb_istreams;i++) {
1829 is = input_files[ist->file_index];
1832 if( input_files_ts_offset[ist->file_index] != -is->start_time
1833 && !(is->start_time == AV_NOPTS_VALUE && input_files_ts_offset[ist->file_index]==0))
1834 ist->next_pts= AV_NOPTS_VALUE;
1838 /* set meta data information from input file if required */
1839 for (i=0;i<nb_meta_data_maps;i++) {
1840 AVFormatContext *out_file;
1841 AVFormatContext *in_file;
1843 int out_file_index = meta_data_maps[i].out_file;
1844 int in_file_index = meta_data_maps[i].in_file;
1845 if ( out_file_index < 0 || out_file_index >= nb_output_files ) {
1846 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1847 ret = AVERROR(EINVAL);
1850 if ( in_file_index < 0 || in_file_index >= nb_input_files ) {
1851 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1852 ret = AVERROR(EINVAL);
1856 out_file = output_files[out_file_index];
1857 in_file = input_files[in_file_index];
1859 strcpy(out_file->title, in_file->title);
1860 strcpy(out_file->author, in_file->author);
1861 strcpy(out_file->copyright, in_file->copyright);
1862 strcpy(out_file->comment, in_file->comment);
1863 strcpy(out_file->album, in_file->album);
1864 out_file->year = in_file->year;
1865 out_file->track = in_file->track;
1866 strcpy(out_file->genre, in_file->genre);
1869 /* open files and write file headers */
1870 for(i=0;i<nb_output_files;i++) {
1871 os = output_files[i];
1872 if (av_write_header(os) < 0) {
1873 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1874 ret = AVERROR(EINVAL);
1877 if (strcmp(output_files[i]->oformat->name, "rtp")) {
1882 print_sdp(output_files, nb_output_files);
1885 if ( !using_stdin && verbose >= 0) {
1886 fprintf(stderr, "Press [q] to stop encoding\n");
1887 url_set_interrupt_cb(decode_interrupt_cb);
1892 timer_start = av_gettime();
1894 for(; received_sigterm == 0;) {
1895 int file_index, ist_index;
1903 /* if 'q' pressed, exits */
1907 /* read_key() returns 0 on EOF */
1913 /* select the stream that we must read now by looking at the
1914 smallest output pts */
1916 for(i=0;i<nb_ostreams;i++) {
1919 os = output_files[ost->file_index];
1920 ist = ist_table[ost->source_index];
1921 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
1922 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
1924 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
1925 ipts = (double)ist->pts;
1926 if (!file_table[ist->file_index].eof_reached){
1927 if(ipts < ipts_min) {
1929 if(input_sync ) file_index = ist->file_index;
1931 if(opts < opts_min) {
1933 if(!input_sync) file_index = ist->file_index;
1936 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
1941 /* if none, if is finished */
1942 if (file_index < 0) {
1946 /* finish if recording time exhausted */
1947 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
1950 /* finish if limit size exhausted */
1951 if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
1954 /* read a frame from it and output it in the fifo */
1955 is = input_files[file_index];
1956 if (av_read_frame(is, &pkt) < 0) {
1957 file_table[file_index].eof_reached = 1;
1965 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
1967 /* the following test is needed in case new streams appear
1968 dynamically in stream : we ignore them */
1969 if (pkt.stream_index >= file_table[file_index].nb_streams)
1970 goto discard_packet;
1971 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1972 ist = ist_table[ist_index];
1974 goto discard_packet;
1976 if (pkt.dts != AV_NOPTS_VALUE)
1977 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
1978 if (pkt.pts != AV_NOPTS_VALUE)
1979 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
1981 // fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files_ts_offset[ist->file_index], ist->st->codec->codec_type);
1982 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
1983 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
1984 int64_t delta= pkt_dts - ist->next_pts;
1985 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
1986 input_files_ts_offset[ist->file_index]-= delta;
1988 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
1989 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
1990 if(pkt.pts != AV_NOPTS_VALUE)
1991 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
1995 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1996 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1999 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2000 ist->file_index, ist->index);
2002 av_free_packet(&pkt);
2007 av_free_packet(&pkt);
2009 /* dump report by using the output first video and audio streams */
2010 print_report(output_files, ost_table, nb_ostreams, 0);
2013 /* at the end of stream, we must flush the decoder buffers */
2014 for(i=0;i<nb_istreams;i++) {
2016 if (ist->decoding_needed) {
2017 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2023 /* write the trailer if needed and close file */
2024 for(i=0;i<nb_output_files;i++) {
2025 os = output_files[i];
2026 av_write_trailer(os);
2029 /* dump report by using the first video and audio streams */
2030 print_report(output_files, ost_table, nb_ostreams, 1);
2032 /* close each encoder */
2033 for(i=0;i<nb_ostreams;i++) {
2035 if (ost->encoding_needed) {
2036 av_freep(&ost->st->codec->stats_in);
2037 avcodec_close(ost->st->codec);
2041 /* close each decoder */
2042 for(i=0;i<nb_istreams;i++) {
2044 if (ist->decoding_needed) {
2045 avcodec_close(ist->st->codec);
2053 av_freep(&bit_buffer);
2054 av_free(file_table);
2057 for(i=0;i<nb_istreams;i++) {
2064 for(i=0;i<nb_ostreams;i++) {
2068 fclose(ost->logfile);
2069 ost->logfile = NULL;
2071 av_fifo_free(&ost->fifo); /* works even if fifo is not
2072 initialized but set to zero */
2073 av_free(ost->pict_tmp.data[0]);
2074 if (ost->video_resample)
2075 sws_freeContext(ost->img_resample_ctx);
2076 if (ost->audio_resample)
2077 audio_resample_close(ost->resample);
2085 ret = AVERROR(ENOMEM);
2090 int file_read(const char *filename)
2093 unsigned char buffer[1024];
2096 if (url_open(&h, filename, O_RDONLY) < 0) {
2097 printf("could not open '%s'\n", filename);
2101 len = url_read(h, buffer, sizeof(buffer));
2104 for(i=0;i<len;i++) putchar(buffer[i]);
2111 static void opt_format(const char *arg)
2113 /* compatibility stuff for pgmyuv */
2114 if (!strcmp(arg, "pgmyuv")) {
2115 pgmyuv_compatibility_hack=1;
2116 // opt_image_format(arg);
2118 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2121 file_iformat = av_find_input_format(arg);
2122 file_oformat = guess_format(arg, NULL, NULL);
2123 if (!file_iformat && !file_oformat) {
2124 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2129 #if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
2130 extern int ffm_nopts;
2133 static int opt_default(const char *opt, const char *arg){
2135 const AVOption *o= NULL;
2136 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
2138 for(type=0; type<CODEC_TYPE_NB; type++){
2139 const AVOption *o2 = av_find_opt(avctx_opts[0], opt, NULL, opt_types[type], opt_types[type]);
2141 o = av_set_string(avctx_opts[type], opt, arg);
2144 o = av_set_string(avformat_opts, opt, arg);
2146 o = av_set_string(sws_opts, opt, arg);
2149 o = av_set_string(avctx_opts[CODEC_TYPE_AUDIO], opt+1, arg);
2150 else if(opt[0] == 'v')
2151 o = av_set_string(avctx_opts[CODEC_TYPE_VIDEO], opt+1, arg);
2152 else if(opt[0] == 's')
2153 o = av_set_string(avctx_opts[CODEC_TYPE_SUBTITLE], opt+1, arg);
2158 // 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));
2160 //FIXME we should always use avctx_opts, ... for storing options so there wont be any need to keep track of whats set over this
2161 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
2162 opt_names[opt_name_count++]= o->name;
2164 #if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
2165 /* disable generate of real time pts in ffm (need to be supressed anyway) */
2166 if(avctx_opts[0]->flags & CODEC_FLAG_BITEXACT)
2170 if(avctx_opts[0]->debug)
2171 av_log_level = AV_LOG_DEBUG;
2175 static void opt_video_rc_eq(char *arg)
2180 static void opt_video_rc_override_string(char *arg)
2182 video_rc_override_string = arg;
2185 static void opt_me_threshold(const char *arg)
2187 me_threshold = atoi(arg);
2190 static void opt_verbose(const char *arg)
2192 verbose = atoi(arg);
2193 av_log_level = atoi(arg);
2196 static void opt_frame_rate(const char *arg)
2198 if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2199 fprintf(stderr, "Incorrect frame rate\n");
2204 static void opt_bitrate(const char *opt, const char *arg)
2206 int codec_type = opt[0]=='a' ? CODEC_TYPE_AUDIO : CODEC_TYPE_VIDEO;
2208 opt_default(opt, arg);
2210 if (av_get_int(avctx_opts[codec_type], "b", NULL) < 1000)
2211 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2214 static void opt_frame_crop_top(const char *arg)
2216 frame_topBand = atoi(arg);
2217 if (frame_topBand < 0) {
2218 fprintf(stderr, "Incorrect top crop size\n");
2221 if ((frame_topBand % 2) != 0) {
2222 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2225 if ((frame_topBand) >= frame_height){
2226 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2229 frame_height -= frame_topBand;
2232 static void opt_frame_crop_bottom(const char *arg)
2234 frame_bottomBand = atoi(arg);
2235 if (frame_bottomBand < 0) {
2236 fprintf(stderr, "Incorrect bottom crop size\n");
2239 if ((frame_bottomBand % 2) != 0) {
2240 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2243 if ((frame_bottomBand) >= frame_height){
2244 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2247 frame_height -= frame_bottomBand;
2250 static void opt_frame_crop_left(const char *arg)
2252 frame_leftBand = atoi(arg);
2253 if (frame_leftBand < 0) {
2254 fprintf(stderr, "Incorrect left crop size\n");
2257 if ((frame_leftBand % 2) != 0) {
2258 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2261 if ((frame_leftBand) >= frame_width){
2262 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2265 frame_width -= frame_leftBand;
2268 static void opt_frame_crop_right(const char *arg)
2270 frame_rightBand = atoi(arg);
2271 if (frame_rightBand < 0) {
2272 fprintf(stderr, "Incorrect right crop size\n");
2275 if ((frame_rightBand % 2) != 0) {
2276 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2279 if ((frame_rightBand) >= frame_width){
2280 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2283 frame_width -= frame_rightBand;
2286 static void opt_frame_size(const char *arg)
2288 if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
2289 fprintf(stderr, "Incorrect frame size\n");
2292 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2293 fprintf(stderr, "Frame size must be a multiple of 2\n");
2299 #define SCALEBITS 10
2300 #define ONE_HALF (1 << (SCALEBITS - 1))
2301 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2303 #define RGB_TO_Y(r, g, b) \
2304 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2305 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2307 #define RGB_TO_U(r1, g1, b1, shift)\
2308 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2309 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2311 #define RGB_TO_V(r1, g1, b1, shift)\
2312 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2313 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2315 static void opt_pad_color(const char *arg) {
2316 /* Input is expected to be six hex digits similar to
2317 how colors are expressed in html tags (but without the #) */
2318 int rgb = strtol(arg, NULL, 16);
2322 g = ((rgb >> 8) & 255);
2325 padcolor[0] = RGB_TO_Y(r,g,b);
2326 padcolor[1] = RGB_TO_U(r,g,b,0);
2327 padcolor[2] = RGB_TO_V(r,g,b,0);
2330 static void opt_frame_pad_top(const char *arg)
2332 frame_padtop = atoi(arg);
2333 if (frame_padtop < 0) {
2334 fprintf(stderr, "Incorrect top pad size\n");
2337 if ((frame_padtop % 2) != 0) {
2338 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2343 static void opt_frame_pad_bottom(const char *arg)
2345 frame_padbottom = atoi(arg);
2346 if (frame_padbottom < 0) {
2347 fprintf(stderr, "Incorrect bottom pad size\n");
2350 if ((frame_padbottom % 2) != 0) {
2351 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2357 static void opt_frame_pad_left(const char *arg)
2359 frame_padleft = atoi(arg);
2360 if (frame_padleft < 0) {
2361 fprintf(stderr, "Incorrect left pad size\n");
2364 if ((frame_padleft % 2) != 0) {
2365 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2371 static void opt_frame_pad_right(const char *arg)
2373 frame_padright = atoi(arg);
2374 if (frame_padright < 0) {
2375 fprintf(stderr, "Incorrect right pad size\n");
2378 if ((frame_padright % 2) != 0) {
2379 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2384 void list_pix_fmts(void)
2387 char pix_fmt_str[128];
2388 for (i=-1; i < PIX_FMT_NB; i++) {
2389 avcodec_pix_fmt_string (pix_fmt_str, sizeof(pix_fmt_str), i);
2390 fprintf(stdout, "%s\n", pix_fmt_str);
2394 static void opt_frame_pix_fmt(const char *arg)
2396 if (strcmp(arg, "list"))
2397 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2404 static void opt_frame_aspect_ratio(const char *arg)
2410 p = strchr(arg, ':');
2412 x = strtol(arg, (char **)&arg, 10);
2414 y = strtol(arg+1, (char **)&arg, 10);
2416 ar = (double)x / (double)y;
2418 ar = strtod(arg, (char **)&arg);
2421 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2424 frame_aspect_ratio = ar;
2427 static void opt_qscale(const char *arg)
2429 video_qscale = atof(arg);
2430 if (video_qscale <= 0 ||
2431 video_qscale > 255) {
2432 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2437 static void opt_qdiff(const char *arg)
2439 video_qdiff = atoi(arg);
2440 if (video_qdiff < 0 ||
2442 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2447 static void opt_strict(const char *arg)
2452 static void opt_top_field_first(const char *arg)
2454 top_field_first= atoi(arg);
2457 static void opt_thread_count(const char *arg)
2459 thread_count= atoi(arg);
2460 #if !defined(HAVE_THREADS)
2462 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2466 static void opt_audio_rate(const char *arg)
2468 audio_sample_rate = atoi(arg);
2471 static void opt_audio_channels(const char *arg)
2473 audio_channels = atoi(arg);
2476 static void opt_video_channel(const char *arg)
2478 video_channel = strtol(arg, NULL, 0);
2481 static void opt_video_standard(const char *arg)
2483 video_standard = av_strdup(arg);
2486 static void opt_codec(int *pstream_copy, char **pcodec_name,
2487 int codec_type, const char *arg)
2489 av_freep(pcodec_name);
2490 if (!strcmp(arg, "copy")) {
2493 *pcodec_name = av_strdup(arg);
2497 static void opt_audio_codec(const char *arg)
2499 opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg);
2502 static void opt_audio_tag(const char *arg)
2505 audio_codec_tag= strtol(arg, &tail, 0);
2508 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2511 static void opt_video_tag(const char *arg)
2514 video_codec_tag= strtol(arg, &tail, 0);
2517 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2521 static void add_frame_hooker(const char *arg)
2526 char *args = av_strdup(arg);
2530 argv[0] = strtok(args, " ");
2531 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2534 i = frame_hook_add(argc, argv);
2537 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2543 static void opt_video_codec(const char *arg)
2545 opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg);
2548 static void opt_subtitle_codec(const char *arg)
2550 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
2553 static void opt_map(const char *arg)
2559 m = &stream_maps[nb_stream_maps++];
2561 m->file_index = strtol(arg, (char **)&p, 0);
2565 m->stream_index = strtol(p, (char **)&p, 0);
2568 m->sync_file_index = strtol(p, (char **)&p, 0);
2571 m->sync_stream_index = strtol(p, (char **)&p, 0);
2573 m->sync_file_index = m->file_index;
2574 m->sync_stream_index = m->stream_index;
2578 static void opt_map_meta_data(const char *arg)
2584 m = &meta_data_maps[nb_meta_data_maps++];
2586 m->out_file = strtol(arg, (char **)&p, 0);
2590 m->in_file = strtol(p, (char **)&p, 0);
2593 static int64_t parse_time_or_die(const char *timestr, int is_duration)
2595 int64_t us = parse_date(timestr, is_duration);
2596 if (us == INT64_MIN) {
2597 fprintf(stderr, "Invalid %s specification: %s\n",
2598 is_duration ? "duration" : "date", timestr);
2604 static void opt_recording_time(const char *arg)
2606 recording_time = parse_time_or_die(arg, 1);
2609 static void opt_start_time(const char *arg)
2611 start_time = parse_time_or_die(arg, 1);
2614 static void opt_rec_timestamp(const char *arg)
2616 rec_timestamp = parse_time_or_die(arg, 0) / 1000000;
2619 static void opt_input_ts_offset(const char *arg)
2621 input_ts_offset = parse_time_or_die(arg, 1);
2624 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
2626 char *codec_string = encoder ? "encoder" : "decoder";
2630 return CODEC_ID_NONE;
2632 avcodec_find_encoder_by_name(name) :
2633 avcodec_find_decoder_by_name(name);
2635 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2638 if(codec->type != type) {
2639 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2645 static void opt_input_file(const char *filename)
2647 AVFormatContext *ic;
2648 AVFormatParameters params, *ap = ¶ms;
2649 int err, i, ret, rfps, rfps_base;
2652 if (!strcmp(filename, "-"))
2655 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2656 !strcmp( filename, "/dev/stdin" );
2658 /* get default parameters from command line */
2659 ic = av_alloc_format_context();
2661 memset(ap, 0, sizeof(*ap));
2662 ap->prealloced_context = 1;
2663 ap->sample_rate = audio_sample_rate;
2664 ap->channels = audio_channels;
2665 ap->time_base.den = frame_rate.num;
2666 ap->time_base.num = frame_rate.den;
2667 ap->width = frame_width + frame_padleft + frame_padright;
2668 ap->height = frame_height + frame_padtop + frame_padbottom;
2669 ap->pix_fmt = frame_pix_fmt;
2670 ap->channel = video_channel;
2671 ap->standard = video_standard;
2672 ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0);
2673 ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0);
2674 if(pgmyuv_compatibility_hack)
2675 ap->video_codec_id= CODEC_ID_PGMYUV;
2677 for(i=0; i<opt_name_count; i++){
2678 const AVOption *opt;
2679 double d= av_get_double(avformat_opts, opt_names[i], &opt);
2680 if(!isnan(d) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2681 av_set_double(ic, opt_names[i], d);
2683 /* open the input file with generic libav function */
2684 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2686 print_error(filename, err);
2691 for(i=0; i<ic->nb_programs; i++)
2692 if(ic->programs[i]->id != opt_programid)
2693 ic->programs[i]->discard = AVDISCARD_ALL;
2696 ic->loop_input = loop_input;
2698 /* If not enough info to get the stream parameters, we decode the
2699 first frames to get it. (used in mpeg case for example) */
2700 ret = av_find_stream_info(ic);
2701 if (ret < 0 && verbose >= 0) {
2702 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2706 timestamp = start_time;
2707 /* add the stream start time */
2708 if (ic->start_time != AV_NOPTS_VALUE)
2709 timestamp += ic->start_time;
2711 /* if seeking requested, we execute it */
2712 if (start_time != 0) {
2713 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2715 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2716 filename, (double)timestamp / AV_TIME_BASE);
2718 /* reset seek info */
2722 /* update the current parameters so that they match the one of the input stream */
2723 for(i=0;i<ic->nb_streams;i++) {
2725 AVCodecContext *enc = ic->streams[i]->codec;
2727 avcodec_thread_init(enc, thread_count);
2728 enc->thread_count= thread_count;
2729 switch(enc->codec_type) {
2730 case CODEC_TYPE_AUDIO:
2731 for(j=0; j<opt_name_count; j++){
2732 const AVOption *opt;
2733 double d= av_get_double(avctx_opts[CODEC_TYPE_AUDIO], opt_names[j], &opt);
2734 if(!isnan(d) && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2735 av_set_double(enc, opt_names[j], d);
2737 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2738 audio_channels = enc->channels;
2739 audio_sample_rate = enc->sample_rate;
2741 ic->streams[i]->discard= AVDISCARD_ALL;
2743 case CODEC_TYPE_VIDEO:
2744 for(j=0; j<opt_name_count; j++){
2745 const AVOption *opt;
2746 double d= av_get_double(avctx_opts[CODEC_TYPE_VIDEO], opt_names[j], &opt);
2747 if(!isnan(d) && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2748 av_set_double(enc, opt_names[j], d);
2750 frame_height = enc->height;
2751 frame_width = enc->width;
2752 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2753 frame_pix_fmt = enc->pix_fmt;
2754 rfps = ic->streams[i]->r_frame_rate.num;
2755 rfps_base = ic->streams[i]->r_frame_rate.den;
2756 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2758 enc->debug |= FF_DEBUG_MV;
2760 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2763 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2764 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2766 (float)rfps / rfps_base, rfps, rfps_base);
2768 /* update the current frame rate to match the stream frame rate */
2769 frame_rate.num = rfps;
2770 frame_rate.den = rfps_base;
2772 enc->rate_emu = rate_emu;
2774 ic->streams[i]->discard= AVDISCARD_ALL;
2775 else if(video_discard)
2776 ic->streams[i]->discard= video_discard;
2778 case CODEC_TYPE_DATA:
2780 case CODEC_TYPE_SUBTITLE:
2781 if(subtitle_disable)
2782 ic->streams[i]->discard = AVDISCARD_ALL;
2784 case CODEC_TYPE_UNKNOWN:
2791 input_files[nb_input_files] = ic;
2792 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2793 /* dump the file content */
2795 dump_format(ic, nb_input_files, filename, 0);
2798 file_iformat = NULL;
2799 file_oformat = NULL;
2806 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
2807 int *has_subtitle_ptr)
2809 int has_video, has_audio, has_subtitle, i, j;
2810 AVFormatContext *ic;
2815 for(j=0;j<nb_input_files;j++) {
2816 ic = input_files[j];
2817 for(i=0;i<ic->nb_streams;i++) {
2818 AVCodecContext *enc = ic->streams[i]->codec;
2819 switch(enc->codec_type) {
2820 case CODEC_TYPE_AUDIO:
2823 case CODEC_TYPE_VIDEO:
2826 case CODEC_TYPE_SUBTITLE:
2829 case CODEC_TYPE_DATA:
2830 case CODEC_TYPE_UNKNOWN:
2837 *has_video_ptr = has_video;
2838 *has_audio_ptr = has_audio;
2839 *has_subtitle_ptr = has_subtitle;
2842 static void new_video_stream(AVFormatContext *oc)
2845 AVCodecContext *video_enc;
2848 st = av_new_stream(oc, oc->nb_streams);
2850 fprintf(stderr, "Could not alloc stream\n");
2853 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
2854 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
2855 video_bitstream_filters= NULL;
2858 avcodec_thread_init(st->codec, thread_count);
2860 video_enc = st->codec;
2863 video_enc->codec_tag= video_codec_tag;
2865 if( (video_global_header&1)
2866 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
2867 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2868 avctx_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
2870 if(video_global_header&2){
2871 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
2872 avctx_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
2875 if (video_stream_copy) {
2876 st->stream_copy = 1;
2877 video_enc->codec_type = CODEC_TYPE_VIDEO;
2883 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
2884 if (video_codec_name)
2885 codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
2887 video_enc->codec_id = codec_id;
2888 codec = avcodec_find_encoder(codec_id);
2890 for(i=0; i<opt_name_count; i++){
2891 const AVOption *opt;
2892 double d= av_get_double(avctx_opts[CODEC_TYPE_VIDEO], opt_names[i], &opt);
2893 if(!isnan(d) && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
2894 av_set_double(video_enc, opt_names[i], d);
2897 video_enc->time_base.den = frame_rate.num;
2898 video_enc->time_base.num = frame_rate.den;
2899 if(codec && codec->supported_framerates){
2900 const AVRational *p= codec->supported_framerates;
2901 AVRational req= (AVRational){frame_rate.num, frame_rate.den};
2902 const AVRational *best=NULL;
2903 AVRational best_error= (AVRational){INT_MAX, 1};
2904 for(; p->den!=0; p++){
2905 AVRational error= av_sub_q(req, *p);
2906 if(error.num <0) error.num *= -1;
2907 if(av_cmp_q(error, best_error) < 0){
2912 video_enc->time_base.den= best->num;
2913 video_enc->time_base.num= best->den;
2916 video_enc->width = frame_width + frame_padright + frame_padleft;
2917 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2918 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
2919 video_enc->pix_fmt = frame_pix_fmt;
2921 if(codec && codec->pix_fmts){
2922 const enum PixelFormat *p= codec->pix_fmts;
2924 if(*p == video_enc->pix_fmt)
2928 video_enc->pix_fmt = codec->pix_fmts[0];
2932 video_enc->gop_size = 0;
2933 if (video_qscale || same_quality) {
2934 video_enc->flags |= CODEC_FLAG_QSCALE;
2935 video_enc->global_quality=
2936 st->quality = FF_QP2LAMBDA * video_qscale;
2940 video_enc->intra_matrix = intra_matrix;
2942 video_enc->inter_matrix = inter_matrix;
2944 video_enc->max_qdiff = video_qdiff;
2945 video_enc->rc_eq = video_rc_eq;
2946 video_enc->thread_count = thread_count;
2947 p= video_rc_override_string;
2950 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
2952 fprintf(stderr, "error parsing rc_override\n");
2955 video_enc->rc_override=
2956 av_realloc(video_enc->rc_override,
2957 sizeof(RcOverride)*(i+1));
2958 video_enc->rc_override[i].start_frame= start;
2959 video_enc->rc_override[i].end_frame = end;
2961 video_enc->rc_override[i].qscale= q;
2962 video_enc->rc_override[i].quality_factor= 1.0;
2965 video_enc->rc_override[i].qscale= 0;
2966 video_enc->rc_override[i].quality_factor= -q/100.0;
2971 video_enc->rc_override_count=i;
2972 if (!video_enc->rc_initial_buffer_occupancy)
2973 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
2974 video_enc->me_threshold= me_threshold;
2975 video_enc->intra_dc_precision= intra_dc_precision - 8;
2976 video_enc->strict_std_compliance = strict;
2979 video_enc->flags|= CODEC_FLAG_PSNR;
2984 video_enc->flags |= CODEC_FLAG_PASS1;
2986 video_enc->flags |= CODEC_FLAG_PASS2;
2991 /* reset some key parameters */
2993 av_freep(&video_codec_name);
2994 video_stream_copy = 0;
2997 static void new_audio_stream(AVFormatContext *oc)
3000 AVCodecContext *audio_enc;
3003 st = av_new_stream(oc, oc->nb_streams);
3005 fprintf(stderr, "Could not alloc stream\n");
3008 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
3010 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
3011 audio_bitstream_filters= NULL;
3014 avcodec_thread_init(st->codec, thread_count);
3016 audio_enc = st->codec;
3017 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3018 audio_enc->strict_std_compliance = strict;
3021 audio_enc->codec_tag= audio_codec_tag;
3023 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3024 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3025 avctx_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3027 if (audio_stream_copy) {
3028 st->stream_copy = 1;
3029 audio_enc->channels = audio_channels;
3031 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3033 for(i=0; i<opt_name_count; i++){
3034 const AVOption *opt;
3035 double d= av_get_double(avctx_opts[CODEC_TYPE_AUDIO], opt_names[i], &opt);
3036 if(!isnan(d) && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3037 av_set_double(audio_enc, opt_names[i], d);
3040 if (audio_codec_name)
3041 codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
3042 audio_enc->codec_id = codec_id;
3044 if (audio_qscale > QSCALE_NONE) {
3045 audio_enc->flags |= CODEC_FLAG_QSCALE;
3046 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3048 audio_enc->thread_count = thread_count;
3049 audio_enc->channels = audio_channels;
3051 audio_enc->sample_rate = audio_sample_rate;
3052 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3053 if (audio_language) {
3054 av_strlcpy(st->language, audio_language, sizeof(st->language));
3055 av_free(audio_language);
3056 audio_language = NULL;
3059 /* reset some key parameters */
3061 av_freep(&audio_codec_name);
3062 audio_stream_copy = 0;
3065 static void new_subtitle_stream(AVFormatContext *oc)
3068 AVCodecContext *subtitle_enc;
3071 st = av_new_stream(oc, oc->nb_streams);
3073 fprintf(stderr, "Could not alloc stream\n");
3076 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
3078 subtitle_enc = st->codec;
3079 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3080 if (subtitle_stream_copy) {
3081 st->stream_copy = 1;
3083 for(i=0; i<opt_name_count; i++){
3084 const AVOption *opt;
3085 double d= av_get_double(avctx_opts[CODEC_TYPE_SUBTITLE], opt_names[i], &opt);
3086 if(!isnan(d) && (opt->flags&AV_OPT_FLAG_SUBTITLE_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3087 av_set_double(subtitle_enc, opt_names[i], d);
3089 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1);
3092 if (subtitle_language) {
3093 av_strlcpy(st->language, subtitle_language, sizeof(st->language));
3094 av_free(subtitle_language);
3095 subtitle_language = NULL;
3098 subtitle_disable = 0;
3099 av_freep(&subtitle_codec_name);
3100 subtitle_stream_copy = 0;
3103 static void opt_new_audio_stream(void)
3105 AVFormatContext *oc;
3106 if (nb_output_files <= 0) {
3107 fprintf(stderr, "At least one output file must be specified\n");
3110 oc = output_files[nb_output_files - 1];
3111 new_audio_stream(oc);
3114 static void opt_new_video_stream(void)
3116 AVFormatContext *oc;
3117 if (nb_output_files <= 0) {
3118 fprintf(stderr, "At least one output file must be specified\n");
3121 oc = output_files[nb_output_files - 1];
3122 new_video_stream(oc);
3125 static void opt_new_subtitle_stream(void)
3127 AVFormatContext *oc;
3128 if (nb_output_files <= 0) {
3129 fprintf(stderr, "At least one output file must be specified\n");
3132 oc = output_files[nb_output_files - 1];
3133 new_subtitle_stream(oc);
3136 static void opt_output_file(const char *filename)
3138 AVFormatContext *oc;
3139 int use_video, use_audio, use_subtitle;
3140 int input_has_video, input_has_audio, input_has_subtitle, i;
3141 AVFormatParameters params, *ap = ¶ms;
3143 if (!strcmp(filename, "-"))
3146 oc = av_alloc_format_context();
3148 if (!file_oformat) {
3149 file_oformat = guess_format(NULL, filename, NULL);
3150 if (!file_oformat) {
3151 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3157 oc->oformat = file_oformat;
3158 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3160 if (!strcmp(file_oformat->name, "ffm") &&
3161 av_strstart(filename, "http:", NULL)) {
3162 /* special case for files sent to ffserver: we get the stream
3163 parameters from ffserver */
3164 if (read_ffserver_streams(oc, filename) < 0) {
3165 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
3169 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3170 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3171 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3173 /* disable if no corresponding type found and at least one
3175 if (nb_input_files > 0) {
3176 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3177 &input_has_subtitle);
3178 if (!input_has_video)
3180 if (!input_has_audio)
3182 if (!input_has_subtitle)
3186 /* manual disable */
3187 if (audio_disable) {
3190 if (video_disable) {
3193 if (subtitle_disable) {
3198 new_video_stream(oc);
3202 new_audio_stream(oc);
3206 new_subtitle_stream(oc);
3209 oc->timestamp = rec_timestamp;
3212 av_strlcpy(oc->title, str_title, sizeof(oc->title));
3214 av_strlcpy(oc->author, str_author, sizeof(oc->author));
3216 av_strlcpy(oc->copyright, str_copyright, sizeof(oc->copyright));
3218 av_strlcpy(oc->comment, str_comment, sizeof(oc->comment));
3220 av_strlcpy(oc->album, str_album, sizeof(oc->album));
3223 output_files[nb_output_files++] = oc;
3225 /* check filename in case of an image number is expected */
3226 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3227 if (!av_filename_number_test(oc->filename)) {
3228 print_error(oc->filename, AVERROR_NUMEXPECTED);
3233 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3234 /* test if it already exists to avoid loosing precious files */
3235 if (!file_overwrite &&
3236 (strchr(filename, ':') == NULL ||
3237 av_strstart(filename, "file:", NULL))) {
3238 if (url_exist(filename)) {
3241 if ( !using_stdin ) {
3242 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3245 if (toupper(c) != 'Y') {
3246 fprintf(stderr, "Not overwriting - exiting\n");
3251 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3258 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3259 fprintf(stderr, "Could not open '%s'\n", filename);
3264 memset(ap, 0, sizeof(*ap));
3265 if (av_set_parameters(oc, ap) < 0) {
3266 fprintf(stderr, "%s: Invalid encoding parameters\n",
3271 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3272 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3273 oc->loop_output = loop_output;
3275 for(i=0; i<opt_name_count; i++){
3276 const AVOption *opt;
3277 double d = av_get_double(avformat_opts, opt_names[i], &opt);
3278 if(!isnan(d) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3279 av_set_double(oc, opt_names[i], d);
3282 /* reset some options */
3283 file_oformat = NULL;
3284 file_iformat = NULL;
3287 /* same option as mencoder */
3288 static void opt_pass(const char *pass_str)
3291 pass = atoi(pass_str);
3292 if (pass != 1 && pass != 2) {
3293 fprintf(stderr, "pass number can be only 1 or 2\n");
3299 static int64_t getutime(void)
3301 #ifdef HAVE_GETRUSAGE
3302 struct rusage rusage;
3304 getrusage(RUSAGE_SELF, &rusage);
3305 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3306 #elif defined(HAVE_GETPROCESSTIMES)
3308 FILETIME c, e, k, u;
3309 proc = GetCurrentProcess();
3310 GetProcessTimes(proc, &c, &e, &k, &u);
3311 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3313 return av_gettime();
3317 static void opt_show_formats(void)
3319 AVInputFormat *ifmt;
3320 AVOutputFormat *ofmt;
3323 const char *last_name;
3325 printf("File formats:\n");
3330 const char *name=NULL;
3331 const char *long_name=NULL;
3333 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3334 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3335 strcmp(ofmt->name, last_name)>0){
3337 long_name= ofmt->long_name;
3341 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3342 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3343 strcmp(ifmt->name, last_name)>0){
3345 long_name= ifmt->long_name;
3348 if(name && strcmp(ifmt->name, name)==0)
3360 long_name ? long_name:" ");
3364 printf("Codecs:\n");
3370 const char *type_str;
3373 for(p = first_avcodec; p != NULL; p = p->next) {
3374 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3375 strcmp(p->name, last_name)>0){
3377 decode= encode= cap=0;
3379 if(p2 && strcmp(p->name, p2->name)==0){
3380 if(p->decode) decode=1;
3381 if(p->encode) encode=1;
3382 cap |= p->capabilities;
3387 last_name= p2->name;
3390 case CODEC_TYPE_VIDEO:
3393 case CODEC_TYPE_AUDIO:
3396 case CODEC_TYPE_SUBTITLE:
3405 decode ? "D": (/*p2->decoder ? "d":*/" "),
3408 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3409 cap & CODEC_CAP_DR1 ? "D":" ",
3410 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3412 /* if(p2->decoder && decode==0)
3413 printf(" use %s for decoding", p2->decoder->name);*/
3418 printf("Supported file protocols:\n");
3419 for(up = first_protocol; up != NULL; up = up->next)
3420 printf(" %s:", up->name);
3423 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3426 "Note, the names of encoders and decoders do not always match, so there are\n"
3427 "several cases where the above table shows encoder only or decoder only entries\n"
3428 "even though both encoding and decoding are supported. For example, the h263\n"
3429 "decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
3434 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3437 const char *p = str;
3444 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3451 static void opt_inter_matrix(const char *arg)
3453 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3454 parse_matrix_coeffs(inter_matrix, arg);
3457 static void opt_intra_matrix(const char *arg)
3459 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3460 parse_matrix_coeffs(intra_matrix, arg);
3464 * Trivial log callback.
3465 * Only suitable for show_help and similar since it lacks prefix handling.
3467 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
3469 vfprintf(stdout, fmt, vl);
3472 static void show_help(void)
3474 av_log_set_callback(log_callback_help);
3475 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3476 "Hyper fast Audio and Video encoder\n");
3478 show_help_options(options, "Main options:\n",
3479 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
3480 show_help_options(options, "\nVideo options:\n",
3481 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3483 show_help_options(options, "\nAdvanced Video options:\n",
3484 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3485 OPT_VIDEO | OPT_EXPERT);
3486 show_help_options(options, "\nAudio options:\n",
3487 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3489 show_help_options(options, "\nAdvanced Audio options:\n",
3490 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3491 OPT_AUDIO | OPT_EXPERT);
3492 show_help_options(options, "\nSubtitle options:\n",
3493 OPT_SUBTITLE | OPT_GRAB,
3495 show_help_options(options, "\nAudio/Video grab options:\n",
3498 show_help_options(options, "\nAdvanced options:\n",
3499 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3501 av_opt_show(avctx_opts[0], NULL);
3502 av_opt_show(avformat_opts, NULL);
3503 av_opt_show(sws_opts, NULL);
3506 static void opt_show_help(void)
3512 static void opt_target(const char *arg)
3515 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3517 if(!strncmp(arg, "pal-", 4)) {
3520 } else if(!strncmp(arg, "ntsc-", 5)) {
3523 } else if(!strncmp(arg, "film-", 5)) {
3528 /* Calculate FR via float to avoid int overflow */
3529 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3532 } else if((fr == 29970) || (fr == 23976)) {
3535 /* Try to determine PAL/NTSC by peeking in the input files */
3536 if(nb_input_files) {
3538 for(j = 0; j < nb_input_files; j++) {
3539 for(i = 0; i < input_files[j]->nb_streams; i++) {
3540 AVCodecContext *c = input_files[j]->streams[i]->codec;
3541 if(c->codec_type != CODEC_TYPE_VIDEO)
3543 fr = c->time_base.den * 1000 / c->time_base.num;
3547 } else if((fr == 29970) || (fr == 23976)) {
3557 if(verbose && norm >= 0)
3558 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3562 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3563 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3564 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3568 if(!strcmp(arg, "vcd")) {
3570 opt_video_codec("mpeg1video");
3571 opt_audio_codec("mp2");
3574 opt_frame_size(norm ? "352x240" : "352x288");
3575 opt_frame_rate(frame_rates[norm]);
3576 opt_default("gop", norm ? "18" : "15");
3578 opt_default("b", "1150000");
3579 opt_default("maxrate", "1150000");
3580 opt_default("minrate", "1150000");
3581 opt_default("bufsize", "327680"); // 40*1024*8;
3583 opt_default("ab", "224000");
3584 audio_sample_rate = 44100;
3587 opt_default("packetsize", "2324");
3588 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3590 /* We have to offset the PTS, so that it is consistent with the SCR.
3591 SCR starts at 36000, but the first two packs contain only padding
3592 and the first pack from the other stream, respectively, may also have
3593 been written before.
3594 So the real data starts at SCR 36000+3*1200. */
3595 mux_preload= (36000+3*1200) / 90000.0; //0.44
3596 } else if(!strcmp(arg, "svcd")) {
3598 opt_video_codec("mpeg2video");
3599 opt_audio_codec("mp2");
3602 opt_frame_size(norm ? "480x480" : "480x576");
3603 opt_frame_rate(frame_rates[norm]);
3604 opt_default("gop", norm ? "18" : "15");
3606 opt_default("b", "2040000");
3607 opt_default("maxrate", "2516000");
3608 opt_default("minrate", "0"); //1145000;
3609 opt_default("bufsize", "1835008"); //224*1024*8;
3610 opt_default("flags", "+SCAN_OFFSET");
3613 opt_default("ab", "224000");
3614 audio_sample_rate = 44100;
3616 opt_default("packetsize", "2324");
3618 } else if(!strcmp(arg, "dvd")) {
3620 opt_video_codec("mpeg2video");
3621 opt_audio_codec("ac3");
3624 opt_frame_size(norm ? "720x480" : "720x576");
3625 opt_frame_rate(frame_rates[norm]);
3626 opt_default("gop", norm ? "18" : "15");
3628 opt_default("b", "6000000");
3629 opt_default("maxrate", "9000000");
3630 opt_default("minrate", "0"); //1500000;
3631 opt_default("bufsize", "1835008"); //224*1024*8;
3633 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3634 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3636 opt_default("ab", "448000");
3637 audio_sample_rate = 48000;
3639 } else if(!strncmp(arg, "dv", 2)) {
3643 opt_frame_size(norm ? "720x480" : "720x576");
3644 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3645 (norm ? "yuv411p" : "yuv420p"));
3646 opt_frame_rate(frame_rates[norm]);
3648 audio_sample_rate = 48000;
3652 fprintf(stderr, "Unknown target: %s\n", arg);
3657 static void opt_vstats_file (const char *arg)
3659 av_free (vstats_filename);
3660 vstats_filename=av_strdup (arg);
3663 static void opt_vstats (void)
3666 time_t today2 = time(NULL);
3667 struct tm *today = localtime(&today2);
3669 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3671 opt_vstats_file(filename);
3674 static void opt_bsf(const char *opt, const char *arg)
3676 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3677 AVBitStreamFilterContext **bsfp;
3680 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3684 bsfp= *opt == 'v' ? &video_bitstream_filters : &audio_bitstream_filters;
3686 bsfp= &(*bsfp)->next;
3691 static void opt_show_license(void)
3697 static void opt_show_version(void)
3699 show_version(program_name);
3703 const OptionDef options[] = {
3705 { "L", 0, {(void*)opt_show_license}, "show license" },
3706 { "h", 0, {(void*)opt_show_help}, "show help" },
3707 { "version", 0, {(void*)opt_show_version}, "show version" },
3708 { "formats", 0, {(void*)opt_show_formats}, "show available formats, codecs, protocols, ..." },
3709 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3710 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3711 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3712 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3713 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3714 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3715 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3716 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3717 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3718 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3719 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3720 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3721 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3722 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3723 { "album", HAS_ARG | OPT_STRING, {(void*)&str_album}, "set the album", "string" },
3724 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3725 "add timings for benchmarking" },
3726 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3727 "dump each input packet" },
3728 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3729 "when dumping packets, also dump the payload" },
3730 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3731 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3732 { "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)", "" },
3733 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3734 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3735 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3736 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3737 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3738 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "" },
3739 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3740 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3741 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3742 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "" },
3743 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3746 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "" },
3747 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "" },
3748 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3749 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3750 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3751 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3752 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3753 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format, 'list' as argument shows all the pixel formats supported", "format" },
3754 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3755 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3756 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3757 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3758 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3759 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3760 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3761 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3762 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3763 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3764 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3765 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3766 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3767 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantizer scale (VBR)", "q" },
3768 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3769 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3770 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3771 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
3772 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3773 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3774 "use same video quality as source (implies VBR)" },
3775 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3776 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3777 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3778 "deinterlace pictures" },
3779 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3780 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
3781 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
3783 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3785 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3786 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3787 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3788 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3789 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3790 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3791 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3794 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "" },
3795 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3796 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3797 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3798 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3799 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3800 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3801 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3802 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3803 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3804 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3806 /* subtitle options */
3807 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
3808 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3809 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
3810 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3813 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3814 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3815 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3818 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
3819 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
3821 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream filter" },
3822 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream filter" },
3824 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
3828 static int av_exit()
3833 for(i=0;i<nb_output_files;i++) {
3834 /* maybe av_close_output_file ??? */
3835 AVFormatContext *s = output_files[i];
3837 if (!(s->oformat->flags & AVFMT_NOFILE))
3839 for(j=0;j<s->nb_streams;j++) {
3840 av_free(s->streams[j]->codec);
3841 av_free(s->streams[j]);
3845 for(i=0;i<nb_input_files;i++)
3846 av_close_input_file(input_files[i]);
3850 av_free(intra_matrix);
3851 av_free(inter_matrix);
3854 fclose(vstats_file);
3855 av_free(vstats_filename);
3859 av_free(video_codec_name);
3860 av_free(audio_codec_name);
3861 av_free(subtitle_codec_name);
3863 av_free(video_standard);
3865 #ifdef CONFIG_POWERPC_PERF
3866 extern void powerpc_display_perf_report(void);
3867 powerpc_display_perf_report();
3868 #endif /* CONFIG_POWERPC_PERF */
3870 if (received_sigterm) {
3872 "Received signal %d: terminating.\n",
3873 (int) received_sigterm);
3877 exit(0); /* not all OS-es handle main() return value */
3881 int main(int argc, char **argv)
3888 for(i=0; i<CODEC_TYPE_NB; i++){
3889 avctx_opts[i]= avcodec_alloc_context2(i);
3891 avformat_opts = av_alloc_format_context();
3892 sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
3894 show_banner(program_name, program_birth_year);
3901 parse_options(argc, argv, options, opt_output_file);
3903 /* file converter / grab */
3904 if (nb_output_files <= 0) {
3905 fprintf(stderr, "Must supply at least one output file\n");
3909 if (nb_input_files == 0) {
3910 fprintf(stderr, "Must supply at least one input file\n");
3915 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3916 stream_maps, nb_stream_maps);
3917 ti = getutime() - ti;
3919 printf("bench: utime=%0.3fs\n", ti / 1000000.0);