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
21 #define HAVE_AV_CONFIG_H
26 #include "framehook.h"
35 #include <sys/ioctl.h>
38 #include <sys/resource.h>
41 #include <sys/types.h>
42 #include <sys/select.h>
45 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
54 #if !defined(INFINITY) && defined(HUGE_VAL)
55 #define INFINITY HUGE_VAL
58 /* select an input stream for an output stream */
59 typedef struct AVStreamMap {
63 int sync_stream_index;
66 /** select an input file for an output file */
67 typedef struct AVMetaDataMap {
72 extern const OptionDef options[];
74 static void show_help(void);
75 static void show_license(void);
76 static int opt_default(const char *opt, const char *arg);
80 static AVFormatContext *input_files[MAX_FILES];
81 static int64_t input_files_ts_offset[MAX_FILES];
82 static int nb_input_files = 0;
84 static AVFormatContext *output_files[MAX_FILES];
85 static int nb_output_files = 0;
87 static AVStreamMap stream_maps[MAX_FILES];
88 static int nb_stream_maps;
90 static AVMetaDataMap meta_data_maps[MAX_FILES];
91 static int nb_meta_data_maps;
93 static AVInputFormat *file_iformat;
94 static AVOutputFormat *file_oformat;
95 static int frame_width = 0;
96 static int frame_height = 0;
97 static float frame_aspect_ratio = 0;
98 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
99 static int frame_padtop = 0;
100 static int frame_padbottom = 0;
101 static int frame_padleft = 0;
102 static int frame_padright = 0;
103 static int padcolor[3] = {16,128,128}; /* default to black */
104 static int frame_topBand = 0;
105 static int frame_bottomBand = 0;
106 static int frame_leftBand = 0;
107 static int frame_rightBand = 0;
108 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
109 static int frame_rate = 25;
110 static int frame_rate_base = 1;
111 static float video_qscale = 0;
112 static int video_qdiff = 3;
113 static uint16_t *intra_matrix = NULL;
114 static uint16_t *inter_matrix = NULL;
115 #if 0 //experimental, (can be removed)
116 static float video_rc_qsquish=1.0;
117 static float video_rc_qmod_amp=0;
118 static int video_rc_qmod_freq=0;
120 static char *video_rc_override_string=NULL;
121 static char *video_rc_eq="tex^qComp";
122 static int me_method = ME_EPZS;
123 static int video_disable = 0;
124 static int video_discard = 0;
125 static int video_codec_id = CODEC_ID_NONE;
126 static int video_codec_tag = 0;
127 static int same_quality = 0;
128 static int do_deinterlace = 0;
129 static int strict = 0;
130 static int top_field_first = -1;
131 static int me_threshold = 0;
132 static int intra_dc_precision = 8;
133 static int loop_input = 0;
134 static int loop_output = AVFMT_NOOUTPUTLOOP;
135 static int qp_hist = 0;
137 static int intra_only = 0;
138 static int audio_sample_rate = 44100;
139 #define QSCALE_NONE -99999
140 static float audio_qscale = QSCALE_NONE;
141 static int audio_disable = 0;
142 static int audio_channels = 1;
143 static int audio_codec_id = CODEC_ID_NONE;
144 static int audio_codec_tag = 0;
145 static char *audio_language = NULL;
147 static int subtitle_codec_id = CODEC_ID_NONE;
148 static char *subtitle_language = NULL;
150 static float mux_preload= 0.5;
151 static float mux_max_delay= 0.7;
153 static int64_t recording_time = 0;
154 static int64_t start_time = 0;
155 static int64_t rec_timestamp = 0;
156 static int64_t input_ts_offset = 0;
157 static int file_overwrite = 0;
158 static char *str_title = NULL;
159 static char *str_author = NULL;
160 static char *str_copyright = NULL;
161 static char *str_comment = NULL;
162 static char *str_album = NULL;
163 static int do_benchmark = 0;
164 static int do_hex_dump = 0;
165 static int do_pkt_dump = 0;
166 static int do_psnr = 0;
167 static int do_vstats = 0;
168 static int do_pass = 0;
169 static char *pass_logfilename = NULL;
170 static int audio_stream_copy = 0;
171 static int video_stream_copy = 0;
172 static int subtitle_stream_copy = 0;
173 static int video_sync_method= 1;
174 static int audio_sync_method= 0;
175 static int copy_ts= 0;
176 static int opt_shortest = 0; //
177 static int video_global_header = 0;
179 static int rate_emu = 0;
181 static int video_channel = 0;
182 static char *video_standard = "ntsc";
184 static int audio_volume = 256;
186 static int using_stdin = 0;
187 static int using_vhook = 0;
188 static int verbose = 1;
189 static int thread_count= 1;
190 static int q_pressed = 0;
191 static int64_t video_size = 0;
192 static int64_t audio_size = 0;
193 static int64_t extra_size = 0;
194 static int nb_frames_dup = 0;
195 static int nb_frames_drop = 0;
196 static int input_sync;
197 static int limit_filesize = 0; //
199 static int pgmyuv_compatibility_hack=0;
200 static int dts_delta_threshold = 10;
202 static int sws_flags = SWS_BICUBIC;
204 const char **opt_names=NULL;
205 int opt_name_count=0;
206 AVCodecContext *avctx_opts[CODEC_TYPE_NB];
207 AVFormatContext *avformat_opts;
209 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
210 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
211 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
213 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
215 struct AVInputStream;
217 typedef struct AVOutputStream {
218 int file_index; /* file index */
219 int index; /* stream index in the output file */
220 int source_index; /* AVInputStream index */
221 AVStream *st; /* stream in the output file */
222 int encoding_needed; /* true if encoding needed for this stream */
224 /* input pts and corresponding output pts
226 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
227 struct AVInputStream *sync_ist; /* input stream to sync against */
228 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
231 AVFrame pict_tmp; /* temporary image for resampling */
232 struct SwsContext *img_resample_ctx; /* for image resampling */
236 int topBand; /* cropping area sizes */
240 int padtop; /* padding area sizes */
247 ReSampleContext *resample; /* for audio resampling */
248 AVFifoBuffer fifo; /* for compression: one audio fifo per codec */
252 typedef struct AVInputStream {
256 int discard; /* true if stream data should be discarded */
257 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
258 int64_t sample_index; /* current sample */
260 int64_t start; /* time when read started */
261 unsigned long frame; /* current frame */
262 int64_t next_pts; /* synthetic pts for cases where pkt.pts
264 int64_t pts; /* current pts */
265 int is_start; /* is 1 at the start and after a discontinuity */
268 typedef struct AVInputFile {
269 int eof_reached; /* true if eof reached */
270 int ist_index; /* index of first stream in ist_table */
271 int buffer_size; /* current total buffer size */
272 int nb_streams; /* nb streams we are aware of */
277 /* init terminal so that we can grab keys */
278 static struct termios oldtty;
281 static void term_exit(void)
284 tcsetattr (0, TCSANOW, &oldtty);
288 static volatile sig_atomic_t received_sigterm = 0;
291 sigterm_handler(int sig)
293 received_sigterm = sig;
297 static void term_init(void)
305 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
306 |INLCR|IGNCR|ICRNL|IXON);
307 tty.c_oflag |= OPOST;
308 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
309 tty.c_cflag &= ~(CSIZE|PARENB);
314 tcsetattr (0, TCSANOW, &tty);
315 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
318 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
319 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
321 register a function to be called at normal program termination
324 #ifdef CONFIG_BEOS_NETSERVER
325 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
329 /* read a key without blocking */
330 static int read_key(void)
338 #ifndef CONFIG_BEOS_NETSERVER
346 n = select(1, &rfds, NULL, NULL, &tv);
359 static int decode_interrupt_cb(void)
361 return q_pressed || (q_pressed = read_key() == 'q');
364 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
369 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
372 /* copy stream format */
373 s->nb_streams = ic->nb_streams;
374 for(i=0;i<ic->nb_streams;i++) {
377 // FIXME: a more elegant solution is needed
378 st = av_mallocz(sizeof(AVStream));
379 memcpy(st, ic->streams[i], sizeof(AVStream));
380 st->codec = avcodec_alloc_context();
381 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
385 av_close_input_file(ic);
390 get_sync_ipts(const AVOutputStream *ost)
392 const AVInputStream *ist = ost->sync_ist;
393 return (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/AV_TIME_BASE;
396 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
398 AVPacket new_pkt= *pkt;
399 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
400 &new_pkt.data, &new_pkt.size,
401 pkt->data, pkt->size,
402 pkt->flags & PKT_FLAG_KEY);
405 new_pkt.destruct= av_destruct_packet;
412 av_interleaved_write_frame(s, pkt);
415 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
417 static void do_audio_out(AVFormatContext *s,
420 unsigned char *buf, int size)
423 static uint8_t *audio_buf = NULL;
424 static uint8_t *audio_out = NULL;
425 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
427 int size_out, frame_bytes, ret;
428 AVCodecContext *enc= ost->st->codec;
430 /* SC: dynamic allocation of buffers */
432 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
434 audio_out = av_malloc(audio_out_size);
435 if (!audio_buf || !audio_out)
436 return; /* Should signal an error ! */
438 if(audio_sync_method){
439 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
440 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2);
441 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
442 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
444 //FIXME resample delay
445 if(fabs(delta) > 50){
448 byte_delta= FFMAX(byte_delta, -size);
452 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
457 static uint8_t *input_tmp= NULL;
458 input_tmp= av_realloc(input_tmp, byte_delta + size);
460 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
463 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
465 memset(input_tmp, 0, byte_delta);
466 memcpy(input_tmp + byte_delta, buf, size);
470 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
472 }else if(audio_sync_method>1){
473 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
474 assert(ost->audio_resample);
476 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
477 // 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));
478 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
482 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
483 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
485 if (ost->audio_resample) {
487 size_out = audio_resample(ost->resample,
488 (short *)buftmp, (short *)buf,
489 size / (ist->st->codec->channels * 2));
490 size_out = size_out * enc->channels * 2;
496 /* now encode as many frames as possible */
497 if (enc->frame_size > 1) {
498 /* output resampled raw samples */
499 av_fifo_write(&ost->fifo, buftmp, size_out);
501 frame_bytes = enc->frame_size * 2 * enc->channels;
503 while (av_fifo_read(&ost->fifo, audio_buf, frame_bytes) == 0) {
505 av_init_packet(&pkt);
507 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
510 pkt.stream_index= ost->index;
513 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
514 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
515 pkt.flags |= PKT_FLAG_KEY;
516 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
518 ost->sync_opts += enc->frame_size;
522 av_init_packet(&pkt);
524 ost->sync_opts += size_out / (2 * enc->channels);
526 /* output a pcm frame */
527 /* XXX: change encoding codec API to avoid this ? */
528 switch(enc->codec->id) {
529 case CODEC_ID_PCM_S32LE:
530 case CODEC_ID_PCM_S32BE:
531 case CODEC_ID_PCM_U32LE:
532 case CODEC_ID_PCM_U32BE:
533 size_out = size_out << 1;
535 case CODEC_ID_PCM_S24LE:
536 case CODEC_ID_PCM_S24BE:
537 case CODEC_ID_PCM_U24LE:
538 case CODEC_ID_PCM_U24BE:
539 case CODEC_ID_PCM_S24DAUD:
540 size_out = size_out / 2 * 3;
542 case CODEC_ID_PCM_S16LE:
543 case CODEC_ID_PCM_S16BE:
544 case CODEC_ID_PCM_U16LE:
545 case CODEC_ID_PCM_U16BE:
548 size_out = size_out >> 1;
551 ret = avcodec_encode_audio(enc, audio_out, size_out,
554 pkt.stream_index= ost->index;
557 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
558 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
559 pkt.flags |= PKT_FLAG_KEY;
560 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
564 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
568 AVPicture picture_tmp;
571 dec = ist->st->codec;
573 /* deinterlace : must be done before any resize */
574 if (do_deinterlace || using_vhook) {
577 /* create temporary picture */
578 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
579 buf = av_malloc(size);
583 picture2 = &picture_tmp;
584 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
587 if(avpicture_deinterlace(picture2, picture,
588 dec->pix_fmt, dec->width, dec->height) < 0) {
589 /* if error, do not deinterlace */
595 av_picture_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
601 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
603 if (picture != picture2)
604 *picture = *picture2;
608 /* we begin to correct av delay at this threshold */
609 #define AV_DELAY_MAX 0.100
611 static void do_subtitle_out(AVFormatContext *s,
617 static uint8_t *subtitle_out = NULL;
618 int subtitle_out_max_size = 65536;
619 int subtitle_out_size, nb, i;
623 if (pts == AV_NOPTS_VALUE) {
624 fprintf(stderr, "Subtitle packets must have a pts\n");
628 enc = ost->st->codec;
631 subtitle_out = av_malloc(subtitle_out_max_size);
634 /* Note: DVB subtitle need one packet to draw them and one other
635 packet to clear them */
636 /* XXX: signal it in the codec context ? */
637 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
642 for(i = 0; i < nb; i++) {
643 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
644 subtitle_out_max_size, sub);
646 av_init_packet(&pkt);
647 pkt.stream_index = ost->index;
648 pkt.data = subtitle_out;
649 pkt.size = subtitle_out_size;
650 pkt.pts = av_rescale_q(av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q) + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
651 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
652 /* XXX: the pts correction is handled here. Maybe handling
653 it in the codec would be better */
655 pkt.pts += 90 * sub->start_display_time;
657 pkt.pts += 90 * sub->end_display_time;
659 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
663 static int bit_buffer_size= 1024*256;
664 static uint8_t *bit_buffer= NULL;
666 static void do_video_out(AVFormatContext *s,
672 int nb_frames, i, ret;
673 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
674 AVFrame picture_crop_temp, picture_pad_temp;
675 AVCodecContext *enc, *dec;
677 avcodec_get_frame_defaults(&picture_crop_temp);
678 avcodec_get_frame_defaults(&picture_pad_temp);
680 enc = ost->st->codec;
681 dec = ist->st->codec;
683 /* by default, we output a single frame */
688 if(video_sync_method){
690 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
691 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
694 else if (vdelta > 1.1)
695 nb_frames = lrintf(vdelta);
696 //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);
700 fprintf(stderr, "*** drop!\n");
701 }else if (nb_frames > 1) {
702 nb_frames_dup += nb_frames;
704 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
707 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
709 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
713 if (ost->video_crop) {
714 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
715 av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
718 formatted_picture = &picture_crop_temp;
720 formatted_picture = in_picture;
723 final_picture = formatted_picture;
724 padding_src = formatted_picture;
725 resampling_dst = &ost->pict_tmp;
726 if (ost->video_pad) {
727 final_picture = &ost->pict_tmp;
728 if (ost->video_resample) {
729 if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
730 av_log(NULL, AV_LOG_ERROR, "error padding picture\n");
733 resampling_dst = &picture_pad_temp;
737 if (ost->video_resample) {
739 final_picture = &ost->pict_tmp;
740 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
741 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
744 if (ost->video_pad) {
745 av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
746 enc->height, enc->width, enc->pix_fmt,
747 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
750 /* duplicates frame if needed */
751 for(i=0;i<nb_frames;i++) {
753 av_init_packet(&pkt);
754 pkt.stream_index= ost->index;
756 if (s->oformat->flags & AVFMT_RAWPICTURE) {
757 /* raw pictures are written as AVPicture structure to
758 avoid any copies. We support temorarily the older
760 AVFrame* old_frame = enc->coded_frame;
761 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
762 pkt.data= (uint8_t *)final_picture;
763 pkt.size= sizeof(AVPicture);
764 if(dec->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
765 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
766 if(dec->coded_frame && dec->coded_frame->key_frame)
767 pkt.flags |= PKT_FLAG_KEY;
769 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
770 enc->coded_frame = old_frame;
774 big_picture= *final_picture;
775 /* better than nothing: use input picture interlaced
777 big_picture.interlaced_frame = in_picture->interlaced_frame;
778 if(avctx_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
779 if(top_field_first == -1)
780 big_picture.top_field_first = in_picture->top_field_first;
782 big_picture.top_field_first = top_field_first;
785 /* handles sameq here. This is not correct because it may
786 not be a global option */
788 big_picture.quality = ist->st->quality;
790 big_picture.quality = ost->st->quality;
792 big_picture.pict_type = 0;
793 // big_picture.pts = AV_NOPTS_VALUE;
794 big_picture.pts= ost->sync_opts;
795 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
796 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
797 ret = avcodec_encode_video(enc,
798 bit_buffer, bit_buffer_size,
801 fprintf(stderr, "Video encoding failed\n");
804 //enc->frame_number = enc->real_pict_num;
806 pkt.data= bit_buffer;
808 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
809 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
810 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
811 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
812 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
814 if(enc->coded_frame && enc->coded_frame->key_frame)
815 pkt.flags |= PKT_FLAG_KEY;
816 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
818 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
819 // enc->frame_number-1, enc->real_pict_num, ret,
821 /* if two pass, output log */
822 if (ost->logfile && enc->stats_out) {
823 fprintf(ost->logfile, "%s", enc->stats_out);
832 static double psnr(double d){
833 if(d==0) return INFINITY;
834 return -10.0*log(d)/log(10.0);
837 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
840 static FILE *fvstats=NULL;
847 double ti1, bitrate, avg_bitrate;
851 today = localtime(&today2);
852 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour,
855 fvstats = fopen(filename,"w");
863 enc = ost->st->codec;
864 if (enc->codec_type == CODEC_TYPE_VIDEO) {
865 frame_number = ost->frame_number;
866 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
867 if (enc->flags&CODEC_FLAG_PSNR)
868 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
870 fprintf(fvstats,"f_size= %6d ", frame_size);
871 /* compute pts value */
872 ti1 = ost->sync_opts * av_q2d(enc->time_base);
876 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
877 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
878 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
879 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
880 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
884 static void print_report(AVFormatContext **output_files,
885 AVOutputStream **ost_table, int nb_ostreams,
890 AVFormatContext *oc, *os;
893 int frame_number, vid, i;
894 double bitrate, ti1, pts;
895 static int64_t last_time = -1;
896 static int qp_histogram[52];
898 if (!is_last_report) {
900 /* display the report every 0.5 seconds */
901 cur_time = av_gettime();
902 if (last_time == -1) {
903 last_time = cur_time;
906 if ((cur_time - last_time) < 500000)
908 last_time = cur_time;
912 oc = output_files[0];
914 total_size = url_ftell(&oc->pb);
919 for(i=0;i<nb_ostreams;i++) {
921 os = output_files[ost->file_index];
922 enc = ost->st->codec;
923 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
924 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
925 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
927 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
928 frame_number = ost->frame_number;
929 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d q=%3.1f ",
930 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
932 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
933 if(qp_hist && enc->coded_frame){
935 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
936 if(qp>=0 && qp<sizeof(qp_histogram)/sizeof(int))
939 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
941 if (enc->flags&CODEC_FLAG_PSNR){
943 double error, error_sum=0;
944 double scale, scale_sum=0;
945 char type[3]= {'Y','U','V'};
946 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
949 error= enc->error[j];
950 scale= enc->width*enc->height*255.0*255.0*frame_number;
952 error= enc->coded_frame->error[j];
953 scale= enc->width*enc->height*255.0*255.0;
958 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
960 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
964 /* compute min output value */
965 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
966 if ((pts < ti1) && (pts > 0))
972 if (verbose || is_last_report) {
973 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
975 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
976 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
977 (double)total_size / 1024, ti1, bitrate);
980 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
981 nb_frames_dup, nb_frames_drop);
984 fprintf(stderr, "%s \r", buf);
989 if (is_last_report && verbose >= 0){
990 int64_t raw= audio_size + video_size + extra_size;
991 fprintf(stderr, "\n");
992 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
996 100.0*(total_size - raw)/raw
1001 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1002 static int output_packet(AVInputStream *ist, int ist_index,
1003 AVOutputStream **ost_table, int nb_ostreams,
1004 const AVPacket *pkt)
1006 AVFormatContext *os;
1007 AVOutputStream *ost;
1011 int data_size, got_picture;
1013 void *buffer_to_free;
1014 static unsigned int samples_size= 0;
1015 static short *samples= NULL;
1016 AVSubtitle subtitle, *subtitle_to_free;
1020 ist->pts= ist->next_pts; // needed for last packet if vsync=0
1021 } else if (pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1022 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1024 // assert(ist->pts == ist->next_pts);
1038 /* decode the packet if needed */
1039 data_buf = NULL; /* fail safe */
1041 subtitle_to_free = NULL;
1042 if (ist->decoding_needed) {
1043 switch(ist->st->codec->codec_type) {
1044 case CODEC_TYPE_AUDIO:{
1046 samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE));
1047 data_size= samples_size;
1048 /* XXX: could avoid copy if PCM 16 bits with same
1049 endianness as CPU */
1050 ret = avcodec_decode_audio2(ist->st->codec, samples, &data_size,
1056 /* Some bug in mpeg audio decoder gives */
1057 /* data_size < 0, it seems they are overflows */
1058 if (data_size <= 0) {
1059 /* no audio frame */
1062 data_buf = (uint8_t *)samples;
1063 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1064 (ist->st->codec->sample_rate * ist->st->codec->channels);
1066 case CODEC_TYPE_VIDEO:
1067 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1068 /* XXX: allocate picture correctly */
1069 avcodec_get_frame_defaults(&picture);
1071 ret = avcodec_decode_video(ist->st->codec,
1072 &picture, &got_picture, ptr, len);
1073 ist->st->quality= picture.quality;
1077 /* no picture yet */
1078 goto discard_packet;
1080 if (ist->st->codec->time_base.num != 0) {
1081 ist->next_pts += ((int64_t)AV_TIME_BASE *
1082 ist->st->codec->time_base.num) /
1083 ist->st->codec->time_base.den;
1087 case CODEC_TYPE_SUBTITLE:
1088 ret = avcodec_decode_subtitle(ist->st->codec,
1089 &subtitle, &got_subtitle, ptr, len);
1092 if (!got_subtitle) {
1093 goto discard_packet;
1095 subtitle_to_free = &subtitle;
1102 switch(ist->st->codec->codec_type) {
1103 case CODEC_TYPE_AUDIO:
1104 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1105 (ist->st->codec->sample_rate * ist->st->codec->channels);
1107 case CODEC_TYPE_VIDEO:
1108 if (ist->st->codec->time_base.num != 0) {
1109 ist->next_pts += ((int64_t)AV_TIME_BASE *
1110 ist->st->codec->time_base.num) /
1111 ist->st->codec->time_base.den;
1121 buffer_to_free = NULL;
1122 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1123 pre_process_video_frame(ist, (AVPicture *)&picture,
1127 // preprocess audio (volume)
1128 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1129 if (audio_volume != 256) {
1132 for(i=0;i<(data_size / sizeof(short));i++) {
1133 int v = ((*volp) * audio_volume + 128) >> 8;
1134 if (v < -32768) v = -32768;
1135 if (v > 32767) v = 32767;
1141 /* frame rate emulation */
1142 if (ist->st->codec->rate_emu) {
1143 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
1144 int64_t now = av_gettime() - ist->start;
1152 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1153 is the one of the next displayed one */
1154 /* XXX: add mpeg4 too ? */
1155 if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
1156 if (ist->st->codec->pict_type != B_TYPE) {
1158 tmp = ist->last_ip_pts;
1159 ist->last_ip_pts = ist->frac_pts.val;
1160 ist->frac_pts.val = tmp;
1164 /* if output time reached then transcode raw format,
1165 encode packets and output them */
1166 if (start_time == 0 || ist->pts >= start_time)
1167 for(i=0;i<nb_ostreams;i++) {
1171 if (ost->source_index == ist_index) {
1172 os = output_files[ost->file_index];
1175 printf("%d: got pts=%0.3f %0.3f\n", i,
1176 (double)pkt->pts / AV_TIME_BASE,
1177 ((double)ist->pts / AV_TIME_BASE) -
1178 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1180 /* set the input output pts pairs */
1181 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1183 if (ost->encoding_needed) {
1184 switch(ost->st->codec->codec_type) {
1185 case CODEC_TYPE_AUDIO:
1186 do_audio_out(os, ost, ist, data_buf, data_size);
1188 case CODEC_TYPE_VIDEO:
1189 do_video_out(os, ost, ist, &picture, &frame_size);
1190 video_size += frame_size;
1191 if (do_vstats && frame_size)
1192 do_video_stats(os, ost, frame_size);
1194 case CODEC_TYPE_SUBTITLE:
1195 do_subtitle_out(os, ost, ist, &subtitle,
1202 AVFrame avframe; //FIXME/XXX remove this
1204 av_init_packet(&opkt);
1206 /* no reencoding needed : output the packet directly */
1207 /* force the input stream PTS */
1209 avcodec_get_frame_defaults(&avframe);
1210 ost->st->codec->coded_frame= &avframe;
1211 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1213 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1214 audio_size += data_size;
1215 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1216 video_size += data_size;
1220 opkt.stream_index= ost->index;
1221 if(pkt->pts != AV_NOPTS_VALUE)
1222 opkt.pts= av_rescale_q(av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q) + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
1224 opkt.pts= AV_NOPTS_VALUE;
1228 if (pkt->dts == AV_NOPTS_VALUE)
1229 dts = ist->next_pts;
1231 dts= av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1232 opkt.dts= av_rescale_q(dts + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
1234 opkt.flags= pkt->flags;
1236 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1237 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1238 opkt.destruct= av_destruct_packet;
1240 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][pkt->stream_index]);
1241 ost->st->codec->frame_number++;
1242 ost->frame_number++;
1243 av_free_packet(&opkt);
1247 av_free(buffer_to_free);
1248 /* XXX: allocate the subtitles in the codec ? */
1249 if (subtitle_to_free) {
1250 if (subtitle_to_free->rects != NULL) {
1251 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1252 av_free(subtitle_to_free->rects[i].bitmap);
1253 av_free(subtitle_to_free->rects[i].rgba_palette);
1255 av_freep(&subtitle_to_free->rects);
1257 subtitle_to_free->num_rects = 0;
1258 subtitle_to_free = NULL;
1265 for(i=0;i<nb_ostreams;i++) {
1267 if (ost->source_index == ist_index) {
1268 AVCodecContext *enc= ost->st->codec;
1269 os = output_files[ost->file_index];
1271 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1273 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1276 if (ost->encoding_needed) {
1280 av_init_packet(&pkt);
1281 pkt.stream_index= ost->index;
1283 switch(ost->st->codec->codec_type) {
1284 case CODEC_TYPE_AUDIO:
1285 fifo_bytes = av_fifo_size(&ost->fifo);
1287 /* encode any samples remaining in fifo */
1288 if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1289 int fs_tmp = enc->frame_size;
1290 enc->frame_size = fifo_bytes / (2 * enc->channels);
1291 if(av_fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes) == 0) {
1292 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1294 enc->frame_size = fs_tmp;
1297 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1300 pkt.flags |= PKT_FLAG_KEY;
1302 case CODEC_TYPE_VIDEO:
1303 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1305 if(enc->coded_frame && enc->coded_frame->key_frame)
1306 pkt.flags |= PKT_FLAG_KEY;
1307 if (ost->logfile && enc->stats_out) {
1308 fprintf(ost->logfile, "%s", enc->stats_out);
1317 pkt.data= bit_buffer;
1319 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1320 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1321 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1335 * The following code is the main loop of the file converter
1337 static int av_encode(AVFormatContext **output_files,
1338 int nb_output_files,
1339 AVFormatContext **input_files,
1341 AVStreamMap *stream_maps, int nb_stream_maps)
1343 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1344 AVFormatContext *is, *os;
1345 AVCodecContext *codec, *icodec;
1346 AVOutputStream *ost, **ost_table = NULL;
1347 AVInputStream *ist, **ist_table = NULL;
1348 AVInputFile *file_table;
1351 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1355 /* input stream init */
1357 for(i=0;i<nb_input_files;i++) {
1358 is = input_files[i];
1359 file_table[i].ist_index = j;
1360 file_table[i].nb_streams = is->nb_streams;
1361 j += is->nb_streams;
1365 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1369 for(i=0;i<nb_istreams;i++) {
1370 ist = av_mallocz(sizeof(AVInputStream));
1376 for(i=0;i<nb_input_files;i++) {
1377 is = input_files[i];
1378 for(k=0;k<is->nb_streams;k++) {
1379 ist = ist_table[j++];
1380 ist->st = is->streams[k];
1381 ist->file_index = i;
1383 ist->discard = 1; /* the stream is discarded by default
1386 if (ist->st->codec->rate_emu) {
1387 ist->start = av_gettime();
1393 /* output stream init */
1395 for(i=0;i<nb_output_files;i++) {
1396 os = output_files[i];
1397 if (!os->nb_streams) {
1398 fprintf(stderr, "Output file does not contain any stream\n");
1401 nb_ostreams += os->nb_streams;
1403 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1404 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1408 /* Sanity check the mapping args -- do the input files & streams exist? */
1409 for(i=0;i<nb_stream_maps;i++) {
1410 int fi = stream_maps[i].file_index;
1411 int si = stream_maps[i].stream_index;
1413 if (fi < 0 || fi > nb_input_files - 1 ||
1414 si < 0 || si > file_table[fi].nb_streams - 1) {
1415 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1418 fi = stream_maps[i].sync_file_index;
1419 si = stream_maps[i].sync_stream_index;
1420 if (fi < 0 || fi > nb_input_files - 1 ||
1421 si < 0 || si > file_table[fi].nb_streams - 1) {
1422 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1427 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1430 for(i=0;i<nb_ostreams;i++) {
1431 ost = av_mallocz(sizeof(AVOutputStream));
1438 for(k=0;k<nb_output_files;k++) {
1439 os = output_files[k];
1440 for(i=0;i<os->nb_streams;i++) {
1442 ost = ost_table[n++];
1443 ost->file_index = k;
1445 ost->st = os->streams[i];
1446 if (nb_stream_maps > 0) {
1447 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1448 stream_maps[n-1].stream_index;
1450 /* Sanity check that the stream types match */
1451 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1452 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1453 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1454 ost->file_index, ost->index);
1459 /* get corresponding input stream index : we select the first one with the right type */
1461 for(j=0;j<nb_istreams;j++) {
1464 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1465 ost->source_index = j;
1472 /* try again and reuse existing stream */
1473 for(j=0;j<nb_istreams;j++) {
1475 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1476 ost->source_index = j;
1481 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1482 ost->file_index, ost->index);
1487 ist = ist_table[ost->source_index];
1489 ost->sync_ist = (nb_stream_maps > 0) ?
1490 ist_table[file_table[stream_maps[n-1].sync_file_index].ist_index +
1491 stream_maps[n-1].sync_stream_index] : ist;
1495 /* for each output stream, we compute the right encoding parameters */
1496 for(i=0;i<nb_ostreams;i++) {
1498 ist = ist_table[ost->source_index];
1500 codec = ost->st->codec;
1501 icodec = ist->st->codec;
1503 if (ost->st->stream_copy) {
1504 /* if stream_copy is selected, no need to decode or encode */
1505 codec->codec_id = icodec->codec_id;
1506 codec->codec_type = icodec->codec_type;
1507 if(!codec->codec_tag) codec->codec_tag = icodec->codec_tag;
1508 codec->bit_rate = icodec->bit_rate;
1509 codec->extradata= icodec->extradata;
1510 codec->extradata_size= icodec->extradata_size;
1511 if(av_q2d(icodec->time_base) > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000)
1512 codec->time_base = icodec->time_base;
1514 codec->time_base = ist->st->time_base;
1515 switch(codec->codec_type) {
1516 case CODEC_TYPE_AUDIO:
1517 codec->sample_rate = icodec->sample_rate;
1518 codec->channels = icodec->channels;
1519 codec->frame_size = icodec->frame_size;
1520 codec->block_align= icodec->block_align;
1522 case CODEC_TYPE_VIDEO:
1524 fprintf(stderr,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");
1527 codec->pix_fmt = icodec->pix_fmt;
1528 codec->width = icodec->width;
1529 codec->height = icodec->height;
1530 codec->has_b_frames = icodec->has_b_frames;
1532 case CODEC_TYPE_SUBTITLE:
1538 switch(codec->codec_type) {
1539 case CODEC_TYPE_AUDIO:
1540 if (av_fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1543 if (codec->channels == icodec->channels &&
1544 codec->sample_rate == icodec->sample_rate) {
1545 ost->audio_resample = 0;
1547 if (codec->channels != icodec->channels &&
1548 (icodec->codec_id == CODEC_ID_AC3 ||
1549 icodec->codec_id == CODEC_ID_DTS)) {
1550 /* Special case for 5:1 AC3 and DTS input */
1551 /* and mono or stereo output */
1552 /* Request specific number of channels */
1553 icodec->channels = codec->channels;
1554 if (codec->sample_rate == icodec->sample_rate)
1555 ost->audio_resample = 0;
1557 ost->audio_resample = 1;
1560 ost->audio_resample = 1;
1563 if(audio_sync_method>1)
1564 ost->audio_resample = 1;
1566 if(ost->audio_resample){
1567 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1568 codec->sample_rate, icodec->sample_rate);
1570 printf("Can't resample. Aborting.\n");
1574 ist->decoding_needed = 1;
1575 ost->encoding_needed = 1;
1577 case CODEC_TYPE_VIDEO:
1578 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1579 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1580 ost->video_resample = ((codec->width != icodec->width -
1581 (frame_leftBand + frame_rightBand) +
1582 (frame_padleft + frame_padright)) ||
1583 (codec->height != icodec->height -
1584 (frame_topBand + frame_bottomBand) +
1585 (frame_padtop + frame_padbottom)) ||
1586 (codec->pix_fmt != icodec->pix_fmt));
1587 if (ost->video_crop) {
1588 ost->topBand = frame_topBand;
1589 ost->leftBand = frame_leftBand;
1591 if (ost->video_pad) {
1592 ost->padtop = frame_padtop;
1593 ost->padleft = frame_padleft;
1594 ost->padbottom = frame_padbottom;
1595 ost->padright = frame_padright;
1596 if (!ost->video_resample) {
1597 avcodec_get_frame_defaults(&ost->pict_tmp);
1598 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1599 codec->width, codec->height ) )
1603 if (ost->video_resample) {
1604 avcodec_get_frame_defaults(&ost->pict_tmp);
1605 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1606 codec->width, codec->height ) )
1609 ost->img_resample_ctx = sws_getContext(
1610 icodec->width - (frame_leftBand + frame_rightBand),
1611 icodec->height - (frame_topBand + frame_bottomBand),
1613 codec->width - (frame_padleft + frame_padright),
1614 codec->height - (frame_padtop + frame_padbottom),
1616 sws_flags, NULL, NULL, NULL);
1617 if (ost->img_resample_ctx == NULL) {
1618 fprintf(stderr, "Cannot get resampling context\n");
1621 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1623 ost->encoding_needed = 1;
1624 ist->decoding_needed = 1;
1626 case CODEC_TYPE_SUBTITLE:
1627 ost->encoding_needed = 1;
1628 ist->decoding_needed = 1;
1635 if (ost->encoding_needed &&
1636 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1637 char logfilename[1024];
1642 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1644 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1645 if (codec->flags & CODEC_FLAG_PASS1) {
1646 f = fopen(logfilename, "w");
1648 perror(logfilename);
1653 /* read the log file */
1654 f = fopen(logfilename, "r");
1656 perror(logfilename);
1659 fseek(f, 0, SEEK_END);
1661 fseek(f, 0, SEEK_SET);
1662 logbuffer = av_malloc(size + 1);
1664 fprintf(stderr, "Could not allocate log buffer\n");
1667 size = fread(logbuffer, 1, size, f);
1669 logbuffer[size] = '\0';
1670 codec->stats_in = logbuffer;
1674 if(codec->codec_type == CODEC_TYPE_VIDEO){
1675 int size= codec->width * codec->height;
1676 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1681 bit_buffer = av_malloc(bit_buffer_size);
1685 /* dump the file output parameters - cannot be done before in case
1687 for(i=0;i<nb_output_files;i++) {
1688 dump_format(output_files[i], i, output_files[i]->filename, 1);
1691 /* dump the stream mapping */
1693 fprintf(stderr, "Stream mapping:\n");
1694 for(i=0;i<nb_ostreams;i++) {
1696 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1697 ist_table[ost->source_index]->file_index,
1698 ist_table[ost->source_index]->index,
1701 if (ost->sync_ist != ist_table[ost->source_index])
1702 fprintf(stderr, " [sync #%d.%d]",
1703 ost->sync_ist->file_index,
1704 ost->sync_ist->index);
1705 fprintf(stderr, "\n");
1709 /* open each encoder */
1710 for(i=0;i<nb_ostreams;i++) {
1712 if (ost->encoding_needed) {
1714 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1716 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1717 ost->file_index, ost->index);
1720 if (avcodec_open(ost->st->codec, codec) < 0) {
1721 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1722 ost->file_index, ost->index);
1725 extra_size += ost->st->codec->extradata_size;
1729 /* open each decoder */
1730 for(i=0;i<nb_istreams;i++) {
1732 if (ist->decoding_needed) {
1734 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1736 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1737 ist->st->codec->codec_id, ist->file_index, ist->index);
1740 if (avcodec_open(ist->st->codec, codec) < 0) {
1741 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1742 ist->file_index, ist->index);
1745 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1746 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1751 for(i=0;i<nb_istreams;i++) {
1753 is = input_files[ist->file_index];
1755 ist->next_pts = av_rescale_q(ist->st->start_time, ist->st->time_base, AV_TIME_BASE_Q);
1756 if(ist->st->start_time == AV_NOPTS_VALUE)
1758 if(input_files_ts_offset[ist->file_index])
1759 ist->next_pts= AV_NOPTS_VALUE;
1763 /* set meta data information from input file if required */
1764 for (i=0;i<nb_meta_data_maps;i++) {
1765 AVFormatContext *out_file;
1766 AVFormatContext *in_file;
1768 int out_file_index = meta_data_maps[i].out_file;
1769 int in_file_index = meta_data_maps[i].in_file;
1770 if ( out_file_index < 0 || out_file_index >= nb_output_files ) {
1771 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1772 ret = AVERROR(EINVAL);
1775 if ( in_file_index < 0 || in_file_index >= nb_input_files ) {
1776 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1777 ret = AVERROR(EINVAL);
1781 out_file = output_files[out_file_index];
1782 in_file = input_files[in_file_index];
1784 strcpy(out_file->title, in_file->title);
1785 strcpy(out_file->author, in_file->author);
1786 strcpy(out_file->copyright, in_file->copyright);
1787 strcpy(out_file->comment, in_file->comment);
1788 strcpy(out_file->album, in_file->album);
1789 out_file->year = in_file->year;
1790 out_file->track = in_file->track;
1791 strcpy(out_file->genre, in_file->genre);
1794 /* open files and write file headers */
1795 for(i=0;i<nb_output_files;i++) {
1796 os = output_files[i];
1797 if (av_write_header(os) < 0) {
1798 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1799 ret = AVERROR(EINVAL);
1804 if ( !using_stdin && verbose >= 0) {
1805 fprintf(stderr, "Press [q] to stop encoding\n");
1806 url_set_interrupt_cb(decode_interrupt_cb);
1812 for(; received_sigterm == 0;) {
1813 int file_index, ist_index;
1821 /* if 'q' pressed, exits */
1825 /* read_key() returns 0 on EOF */
1831 /* select the stream that we must read now by looking at the
1832 smallest output pts */
1834 for(i=0;i<nb_ostreams;i++) {
1837 os = output_files[ost->file_index];
1838 ist = ist_table[ost->source_index];
1839 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
1840 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
1842 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
1843 ipts = (double)ist->pts;
1844 if (!file_table[ist->file_index].eof_reached){
1845 if(ipts < ipts_min) {
1847 if(input_sync ) file_index = ist->file_index;
1849 if(opts < opts_min) {
1851 if(!input_sync) file_index = ist->file_index;
1854 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
1859 /* if none, if is finished */
1860 if (file_index < 0) {
1864 /* finish if recording time exhausted */
1865 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
1868 /* finish if limit size exhausted */
1869 if (limit_filesize != 0 && (limit_filesize * 1024) < url_ftell(&output_files[0]->pb))
1872 /* read a frame from it and output it in the fifo */
1873 is = input_files[file_index];
1874 if (av_read_frame(is, &pkt) < 0) {
1875 file_table[file_index].eof_reached = 1;
1876 if (opt_shortest) break; else continue; //
1880 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
1882 /* the following test is needed in case new streams appear
1883 dynamically in stream : we ignore them */
1884 if (pkt.stream_index >= file_table[file_index].nb_streams)
1885 goto discard_packet;
1886 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1887 ist = ist_table[ist_index];
1889 goto discard_packet;
1891 // 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);
1892 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
1893 int64_t delta= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q) - ist->next_pts;
1894 if(FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE && !copy_ts){
1895 input_files_ts_offset[ist->file_index]-= delta;
1897 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
1898 for(i=0; i<file_table[file_index].nb_streams; i++){
1899 int index= file_table[file_index].ist_index + i;
1900 ist_table[index]->next_pts += delta;
1901 ist_table[index]->is_start=1;
1906 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1907 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1910 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1911 ist->file_index, ist->index);
1913 av_free_packet(&pkt);
1918 av_free_packet(&pkt);
1920 /* dump report by using the output first video and audio streams */
1921 print_report(output_files, ost_table, nb_ostreams, 0);
1924 /* at the end of stream, we must flush the decoder buffers */
1925 for(i=0;i<nb_istreams;i++) {
1927 if (ist->decoding_needed) {
1928 output_packet(ist, i, ost_table, nb_ostreams, NULL);
1934 /* write the trailer if needed and close file */
1935 for(i=0;i<nb_output_files;i++) {
1936 os = output_files[i];
1937 av_write_trailer(os);
1940 /* dump report by using the first video and audio streams */
1941 print_report(output_files, ost_table, nb_ostreams, 1);
1943 /* close each encoder */
1944 for(i=0;i<nb_ostreams;i++) {
1946 if (ost->encoding_needed) {
1947 av_freep(&ost->st->codec->stats_in);
1948 avcodec_close(ost->st->codec);
1952 /* close each decoder */
1953 for(i=0;i<nb_istreams;i++) {
1955 if (ist->decoding_needed) {
1956 avcodec_close(ist->st->codec);
1964 av_freep(&bit_buffer);
1965 av_free(file_table);
1968 for(i=0;i<nb_istreams;i++) {
1975 for(i=0;i<nb_ostreams;i++) {
1979 fclose(ost->logfile);
1980 ost->logfile = NULL;
1982 av_fifo_free(&ost->fifo); /* works even if fifo is not
1983 initialized but set to zero */
1984 av_free(ost->pict_tmp.data[0]);
1985 if (ost->video_resample)
1986 sws_freeContext(ost->img_resample_ctx);
1987 if (ost->audio_resample)
1988 audio_resample_close(ost->resample);
1996 ret = AVERROR(ENOMEM);
2001 int file_read(const char *filename)
2004 unsigned char buffer[1024];
2007 if (url_open(&h, filename, O_RDONLY) < 0) {
2008 printf("could not open '%s'\n", filename);
2012 len = url_read(h, buffer, sizeof(buffer));
2015 for(i=0;i<len;i++) putchar(buffer[i]);
2022 static void opt_format(const char *arg)
2024 /* compatibility stuff for pgmyuv */
2025 if (!strcmp(arg, "pgmyuv")) {
2026 pgmyuv_compatibility_hack=1;
2027 // opt_image_format(arg);
2029 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2032 file_iformat = av_find_input_format(arg);
2033 file_oformat = guess_format(arg, NULL, NULL);
2034 if (!file_iformat && !file_oformat) {
2035 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2040 static void opt_video_rc_eq(char *arg)
2045 static void opt_video_rc_override_string(char *arg)
2047 video_rc_override_string = arg;
2050 static void opt_me_threshold(const char *arg)
2052 me_threshold = atoi(arg);
2055 static void opt_verbose(const char *arg)
2057 verbose = atoi(arg);
2058 av_log_level = atoi(arg);
2061 static void opt_frame_rate(const char *arg)
2063 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
2064 fprintf(stderr, "Incorrect frame rate\n");
2069 static void opt_frame_crop_top(const char *arg)
2071 frame_topBand = atoi(arg);
2072 if (frame_topBand < 0) {
2073 fprintf(stderr, "Incorrect top crop size\n");
2076 if ((frame_topBand % 2) != 0) {
2077 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2080 if ((frame_topBand) >= frame_height){
2081 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2084 frame_height -= frame_topBand;
2087 static void opt_frame_crop_bottom(const char *arg)
2089 frame_bottomBand = atoi(arg);
2090 if (frame_bottomBand < 0) {
2091 fprintf(stderr, "Incorrect bottom crop size\n");
2094 if ((frame_bottomBand % 2) != 0) {
2095 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2098 if ((frame_bottomBand) >= frame_height){
2099 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2102 frame_height -= frame_bottomBand;
2105 static void opt_frame_crop_left(const char *arg)
2107 frame_leftBand = atoi(arg);
2108 if (frame_leftBand < 0) {
2109 fprintf(stderr, "Incorrect left crop size\n");
2112 if ((frame_leftBand % 2) != 0) {
2113 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2116 if ((frame_leftBand) >= frame_width){
2117 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2120 frame_width -= frame_leftBand;
2123 static void opt_frame_crop_right(const char *arg)
2125 frame_rightBand = atoi(arg);
2126 if (frame_rightBand < 0) {
2127 fprintf(stderr, "Incorrect right crop size\n");
2130 if ((frame_rightBand % 2) != 0) {
2131 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2134 if ((frame_rightBand) >= frame_width){
2135 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2138 frame_width -= frame_rightBand;
2141 static void opt_frame_size(const char *arg)
2143 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2144 fprintf(stderr, "Incorrect frame size\n");
2147 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2148 fprintf(stderr, "Frame size must be a multiple of 2\n");
2154 #define SCALEBITS 10
2155 #define ONE_HALF (1 << (SCALEBITS - 1))
2156 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2158 #define RGB_TO_Y(r, g, b) \
2159 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2160 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2162 #define RGB_TO_U(r1, g1, b1, shift)\
2163 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2164 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2166 #define RGB_TO_V(r1, g1, b1, shift)\
2167 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2168 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2170 static void opt_pad_color(const char *arg) {
2171 /* Input is expected to be six hex digits similar to
2172 how colors are expressed in html tags (but without the #) */
2173 int rgb = strtol(arg, NULL, 16);
2177 g = ((rgb >> 8) & 255);
2180 padcolor[0] = RGB_TO_Y(r,g,b);
2181 padcolor[1] = RGB_TO_U(r,g,b,0);
2182 padcolor[2] = RGB_TO_V(r,g,b,0);
2185 static void opt_frame_pad_top(const char *arg)
2187 frame_padtop = atoi(arg);
2188 if (frame_padtop < 0) {
2189 fprintf(stderr, "Incorrect top pad size\n");
2192 if ((frame_padtop % 2) != 0) {
2193 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2198 static void opt_frame_pad_bottom(const char *arg)
2200 frame_padbottom = atoi(arg);
2201 if (frame_padbottom < 0) {
2202 fprintf(stderr, "Incorrect bottom pad size\n");
2205 if ((frame_padbottom % 2) != 0) {
2206 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2212 static void opt_frame_pad_left(const char *arg)
2214 frame_padleft = atoi(arg);
2215 if (frame_padleft < 0) {
2216 fprintf(stderr, "Incorrect left pad size\n");
2219 if ((frame_padleft % 2) != 0) {
2220 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2226 static void opt_frame_pad_right(const char *arg)
2228 frame_padright = atoi(arg);
2229 if (frame_padright < 0) {
2230 fprintf(stderr, "Incorrect right pad size\n");
2233 if ((frame_padright % 2) != 0) {
2234 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2240 static void opt_frame_pix_fmt(const char *arg)
2242 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2245 static void opt_frame_aspect_ratio(const char *arg)
2251 p = strchr(arg, ':');
2253 x = strtol(arg, (char **)&arg, 10);
2255 y = strtol(arg+1, (char **)&arg, 10);
2257 ar = (double)x / (double)y;
2259 ar = strtod(arg, (char **)&arg);
2262 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2265 frame_aspect_ratio = ar;
2268 static void opt_qscale(const char *arg)
2270 video_qscale = atof(arg);
2271 if (video_qscale <= 0 ||
2272 video_qscale > 255) {
2273 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2278 static void opt_qdiff(const char *arg)
2280 video_qdiff = atoi(arg);
2281 if (video_qdiff < 0 ||
2283 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2288 static void opt_strict(const char *arg)
2293 static void opt_top_field_first(const char *arg)
2295 top_field_first= atoi(arg);
2298 static void opt_thread_count(const char *arg)
2300 thread_count= atoi(arg);
2301 #if !defined(HAVE_THREADS)
2303 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2307 static void opt_audio_rate(const char *arg)
2309 audio_sample_rate = atoi(arg);
2312 static void opt_audio_channels(const char *arg)
2314 audio_channels = atoi(arg);
2317 static void opt_video_channel(const char *arg)
2319 video_channel = strtol(arg, NULL, 0);
2322 static void opt_video_standard(const char *arg)
2324 video_standard = av_strdup(arg);
2327 static void opt_codec(int *pstream_copy, int *pcodec_id,
2328 int codec_type, const char *arg)
2332 if (!strcmp(arg, "copy")) {
2337 if (!strcmp(p->name, arg) && p->type == codec_type)
2342 fprintf(stderr, "Unknown codec '%s'\n", arg);
2350 static void opt_audio_codec(const char *arg)
2352 opt_codec(&audio_stream_copy, &audio_codec_id, CODEC_TYPE_AUDIO, arg);
2355 static void opt_audio_tag(const char *arg)
2358 audio_codec_tag= strtol(arg, &tail, 0);
2361 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2364 static void opt_video_tag(const char *arg)
2367 video_codec_tag= strtol(arg, &tail, 0);
2370 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2373 static void add_frame_hooker(const char *arg)
2378 char *args = av_strdup(arg);
2382 argv[0] = strtok(args, " ");
2383 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2386 i = frame_hook_add(argc, argv);
2389 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2394 const char *motion_str[] = {
2407 static void opt_motion_estimation(const char *arg)
2413 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2416 if (!strcmp(*p, arg))
2420 me_method = (p - motion_str) + 1;
2423 static void opt_video_codec(const char *arg)
2425 opt_codec(&video_stream_copy, &video_codec_id, CODEC_TYPE_VIDEO, arg);
2428 static void opt_subtitle_codec(const char *arg)
2430 opt_codec(&subtitle_stream_copy, &subtitle_codec_id, CODEC_TYPE_SUBTITLE, arg);
2433 static void opt_map(const char *arg)
2439 m = &stream_maps[nb_stream_maps++];
2441 m->file_index = strtol(arg, (char **)&p, 0);
2445 m->stream_index = strtol(p, (char **)&p, 0);
2448 m->sync_file_index = strtol(p, (char **)&p, 0);
2451 m->sync_stream_index = strtol(p, (char **)&p, 0);
2453 m->sync_file_index = m->file_index;
2454 m->sync_stream_index = m->stream_index;
2458 static void opt_map_meta_data(const char *arg)
2464 m = &meta_data_maps[nb_meta_data_maps++];
2466 m->out_file = strtol(arg, (char **)&p, 0);
2470 m->in_file = strtol(p, (char **)&p, 0);
2473 static void opt_recording_time(const char *arg)
2475 recording_time = parse_date(arg, 1);
2478 static void opt_start_time(const char *arg)
2480 start_time = parse_date(arg, 1);
2483 static void opt_rec_timestamp(const char *arg)
2485 rec_timestamp = parse_date(arg, 0) / 1000000;
2488 static void opt_input_ts_offset(const char *arg)
2490 input_ts_offset = parse_date(arg, 1);
2493 static void opt_input_file(const char *filename)
2495 AVFormatContext *ic;
2496 AVFormatParameters params, *ap = ¶ms;
2497 int err, i, ret, rfps, rfps_base;
2500 if (!strcmp(filename, "-"))
2503 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2504 !strcmp( filename, "/dev/stdin" );
2506 /* get default parameters from command line */
2507 ic = av_alloc_format_context();
2509 memset(ap, 0, sizeof(*ap));
2510 ap->prealloced_context = 1;
2511 ap->sample_rate = audio_sample_rate;
2512 ap->channels = audio_channels;
2513 ap->time_base.den = frame_rate;
2514 ap->time_base.num = frame_rate_base;
2515 ap->width = frame_width + frame_padleft + frame_padright;
2516 ap->height = frame_height + frame_padtop + frame_padbottom;
2517 ap->pix_fmt = frame_pix_fmt;
2518 ap->channel = video_channel;
2519 ap->standard = video_standard;
2520 ap->video_codec_id = video_codec_id;
2521 ap->audio_codec_id = audio_codec_id;
2522 if(pgmyuv_compatibility_hack)
2523 ap->video_codec_id= CODEC_ID_PGMYUV;
2525 for(i=0; i<opt_name_count; i++){
2526 const AVOption *opt;
2527 double d= av_get_double(avformat_opts, opt_names[i], &opt);
2528 if(d==d && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2529 av_set_double(ic, opt_names[i], d);
2531 /* open the input file with generic libav function */
2532 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2534 print_error(filename, err);
2538 ic->loop_input = loop_input;
2540 /* If not enough info to get the stream parameters, we decode the
2541 first frames to get it. (used in mpeg case for example) */
2542 ret = av_find_stream_info(ic);
2543 if (ret < 0 && verbose >= 0) {
2544 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2548 timestamp = start_time;
2549 /* add the stream start time */
2550 if (ic->start_time != AV_NOPTS_VALUE)
2551 timestamp += ic->start_time;
2553 /* if seeking requested, we execute it */
2554 if (start_time != 0) {
2555 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2557 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2558 filename, (double)timestamp / AV_TIME_BASE);
2560 /* reset seek info */
2564 /* update the current parameters so that they match the one of the input stream */
2565 for(i=0;i<ic->nb_streams;i++) {
2567 AVCodecContext *enc = ic->streams[i]->codec;
2568 #if defined(HAVE_THREADS)
2570 avcodec_thread_init(enc, thread_count);
2572 enc->thread_count= thread_count;
2573 switch(enc->codec_type) {
2574 case CODEC_TYPE_AUDIO:
2575 for(j=0; j<opt_name_count; j++){
2576 const AVOption *opt;
2577 double d= av_get_double(avctx_opts[CODEC_TYPE_AUDIO], opt_names[j], &opt);
2578 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2579 av_set_double(enc, opt_names[j], d);
2581 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2582 audio_channels = enc->channels;
2583 audio_sample_rate = enc->sample_rate;
2585 ic->streams[i]->discard= AVDISCARD_ALL;
2587 case CODEC_TYPE_VIDEO:
2588 for(j=0; j<opt_name_count; j++){
2589 const AVOption *opt;
2590 double d= av_get_double(avctx_opts[CODEC_TYPE_VIDEO], opt_names[j], &opt);
2591 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2592 av_set_double(enc, opt_names[j], d);
2594 frame_height = enc->height;
2595 frame_width = enc->width;
2596 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2597 frame_pix_fmt = enc->pix_fmt;
2598 rfps = ic->streams[i]->r_frame_rate.num;
2599 rfps_base = ic->streams[i]->r_frame_rate.den;
2600 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2602 enc->debug |= FF_DEBUG_MV;
2604 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2607 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2608 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2610 (float)rfps / rfps_base, rfps, rfps_base);
2612 /* update the current frame rate to match the stream frame rate */
2614 frame_rate_base = rfps_base;
2616 enc->rate_emu = rate_emu;
2618 ic->streams[i]->discard= AVDISCARD_ALL;
2619 else if(video_discard)
2620 ic->streams[i]->discard= video_discard;
2622 case CODEC_TYPE_DATA:
2624 case CODEC_TYPE_SUBTITLE:
2626 case CODEC_TYPE_UNKNOWN:
2633 input_files[nb_input_files] = ic;
2634 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2635 /* dump the file content */
2637 dump_format(ic, nb_input_files, filename, 0);
2640 file_iformat = NULL;
2641 file_oformat = NULL;
2648 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
2650 int has_video, has_audio, i, j;
2651 AVFormatContext *ic;
2655 for(j=0;j<nb_input_files;j++) {
2656 ic = input_files[j];
2657 for(i=0;i<ic->nb_streams;i++) {
2658 AVCodecContext *enc = ic->streams[i]->codec;
2659 switch(enc->codec_type) {
2660 case CODEC_TYPE_AUDIO:
2663 case CODEC_TYPE_VIDEO:
2666 case CODEC_TYPE_DATA:
2667 case CODEC_TYPE_UNKNOWN:
2668 case CODEC_TYPE_SUBTITLE:
2675 *has_video_ptr = has_video;
2676 *has_audio_ptr = has_audio;
2679 static void new_video_stream(AVFormatContext *oc)
2682 AVCodecContext *video_enc;
2685 st = av_new_stream(oc, oc->nb_streams);
2687 fprintf(stderr, "Could not alloc stream\n");
2690 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
2691 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
2692 video_bitstream_filters= NULL;
2694 #if defined(HAVE_THREADS)
2696 avcodec_thread_init(st->codec, thread_count);
2699 video_enc = st->codec;
2702 video_enc->codec_tag= video_codec_tag;
2704 if( (video_global_header&1)
2705 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
2706 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2707 avctx_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
2709 if(video_global_header&2){
2710 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
2711 avctx_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
2714 if (video_stream_copy) {
2715 st->stream_copy = 1;
2716 video_enc->codec_type = CODEC_TYPE_VIDEO;
2722 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
2723 if (video_codec_id != CODEC_ID_NONE)
2724 codec_id = video_codec_id;
2726 video_enc->codec_id = codec_id;
2727 codec = avcodec_find_encoder(codec_id);
2729 for(i=0; i<opt_name_count; i++){
2730 const AVOption *opt;
2731 double d= av_get_double(avctx_opts[CODEC_TYPE_VIDEO], opt_names[i], &opt);
2732 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
2733 av_set_double(video_enc, opt_names[i], d);
2736 video_enc->time_base.den = frame_rate;
2737 video_enc->time_base.num = frame_rate_base;
2738 if(codec && codec->supported_framerates){
2739 const AVRational *p= codec->supported_framerates;
2740 AVRational req= (AVRational){frame_rate, frame_rate_base};
2741 const AVRational *best=NULL;
2742 AVRational best_error= (AVRational){INT_MAX, 1};
2743 for(; p->den!=0; p++){
2744 AVRational error= av_sub_q(req, *p);
2745 if(error.num <0) error.num *= -1;
2746 if(av_cmp_q(error, best_error) < 0){
2751 video_enc->time_base.den= best->num;
2752 video_enc->time_base.num= best->den;
2755 video_enc->width = frame_width + frame_padright + frame_padleft;
2756 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2757 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
2758 video_enc->pix_fmt = frame_pix_fmt;
2760 if(codec && codec->pix_fmts){
2761 const enum PixelFormat *p= codec->pix_fmts;
2763 if(*p == video_enc->pix_fmt)
2767 video_enc->pix_fmt = codec->pix_fmts[0];
2771 video_enc->gop_size = 0;
2772 if (video_qscale || same_quality) {
2773 video_enc->flags |= CODEC_FLAG_QSCALE;
2774 video_enc->global_quality=
2775 st->quality = FF_QP2LAMBDA * video_qscale;
2779 video_enc->intra_matrix = intra_matrix;
2781 video_enc->inter_matrix = inter_matrix;
2783 video_enc->max_qdiff = video_qdiff;
2784 video_enc->rc_eq = video_rc_eq;
2785 video_enc->thread_count = thread_count;
2786 p= video_rc_override_string;
2789 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
2791 fprintf(stderr, "error parsing rc_override\n");
2794 video_enc->rc_override=
2795 av_realloc(video_enc->rc_override,
2796 sizeof(RcOverride)*(i+1));
2797 video_enc->rc_override[i].start_frame= start;
2798 video_enc->rc_override[i].end_frame = end;
2800 video_enc->rc_override[i].qscale= q;
2801 video_enc->rc_override[i].quality_factor= 1.0;
2804 video_enc->rc_override[i].qscale= 0;
2805 video_enc->rc_override[i].quality_factor= -q/100.0;
2810 video_enc->rc_override_count=i;
2811 if (!video_enc->rc_initial_buffer_occupancy)
2812 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
2813 video_enc->me_threshold= me_threshold;
2814 video_enc->intra_dc_precision= intra_dc_precision - 8;
2815 video_enc->strict_std_compliance = strict;
2818 video_enc->flags|= CODEC_FLAG_PSNR;
2820 video_enc->me_method = me_method;
2825 video_enc->flags |= CODEC_FLAG_PASS1;
2827 video_enc->flags |= CODEC_FLAG_PASS2;
2832 /* reset some key parameters */
2834 video_codec_id = CODEC_ID_NONE;
2835 video_stream_copy = 0;
2838 static void new_audio_stream(AVFormatContext *oc)
2841 AVCodecContext *audio_enc;
2844 st = av_new_stream(oc, oc->nb_streams);
2846 fprintf(stderr, "Could not alloc stream\n");
2849 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
2851 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
2852 audio_bitstream_filters= NULL;
2854 #if defined(HAVE_THREADS)
2856 avcodec_thread_init(st->codec, thread_count);
2859 audio_enc = st->codec;
2860 audio_enc->codec_type = CODEC_TYPE_AUDIO;
2861 audio_enc->strict_std_compliance = strict;
2864 audio_enc->codec_tag= audio_codec_tag;
2866 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
2867 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2868 avctx_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
2870 if (audio_stream_copy) {
2871 st->stream_copy = 1;
2872 audio_enc->channels = audio_channels;
2874 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
2876 for(i=0; i<opt_name_count; i++){
2877 const AVOption *opt;
2878 double d= av_get_double(avctx_opts[CODEC_TYPE_AUDIO], opt_names[i], &opt);
2879 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
2880 av_set_double(audio_enc, opt_names[i], d);
2883 if (audio_codec_id != CODEC_ID_NONE)
2884 codec_id = audio_codec_id;
2885 audio_enc->codec_id = codec_id;
2887 if (audio_qscale > QSCALE_NONE) {
2888 audio_enc->flags |= CODEC_FLAG_QSCALE;
2889 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
2891 audio_enc->thread_count = thread_count;
2892 audio_enc->channels = audio_channels;
2894 audio_enc->sample_rate = audio_sample_rate;
2895 audio_enc->time_base= (AVRational){1, audio_sample_rate};
2896 if (audio_language) {
2897 pstrcpy(st->language, sizeof(st->language), audio_language);
2898 av_free(audio_language);
2899 audio_language = NULL;
2902 /* reset some key parameters */
2904 audio_codec_id = CODEC_ID_NONE;
2905 audio_stream_copy = 0;
2908 static void opt_new_subtitle_stream(void)
2910 AVFormatContext *oc;
2912 AVCodecContext *subtitle_enc;
2915 if (nb_output_files <= 0) {
2916 fprintf(stderr, "At least one output file must be specified\n");
2919 oc = output_files[nb_output_files - 1];
2921 st = av_new_stream(oc, oc->nb_streams);
2923 fprintf(stderr, "Could not alloc stream\n");
2926 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
2928 subtitle_enc = st->codec;
2929 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
2930 if (subtitle_stream_copy) {
2931 st->stream_copy = 1;
2933 for(i=0; i<opt_name_count; i++){
2934 const AVOption *opt;
2935 double d= av_get_double(avctx_opts[CODEC_TYPE_SUBTITLE], opt_names[i], &opt);
2936 if(d==d && (opt->flags&AV_OPT_FLAG_SUBTITLE_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
2937 av_set_double(subtitle_enc, opt_names[i], d);
2939 subtitle_enc->codec_id = subtitle_codec_id;
2942 if (subtitle_language) {
2943 pstrcpy(st->language, sizeof(st->language), subtitle_language);
2944 av_free(subtitle_language);
2945 subtitle_language = NULL;
2948 subtitle_codec_id = CODEC_ID_NONE;
2949 subtitle_stream_copy = 0;
2952 static void opt_new_audio_stream(void)
2954 AVFormatContext *oc;
2955 if (nb_output_files <= 0) {
2956 fprintf(stderr, "At least one output file must be specified\n");
2959 oc = output_files[nb_output_files - 1];
2960 new_audio_stream(oc);
2963 static void opt_new_video_stream(void)
2965 AVFormatContext *oc;
2966 if (nb_output_files <= 0) {
2967 fprintf(stderr, "At least one output file must be specified\n");
2970 oc = output_files[nb_output_files - 1];
2971 new_video_stream(oc);
2974 static void opt_output_file(const char *filename)
2976 AVFormatContext *oc;
2977 int use_video, use_audio, input_has_video, input_has_audio, i;
2978 AVFormatParameters params, *ap = ¶ms;
2980 if (!strcmp(filename, "-"))
2983 oc = av_alloc_format_context();
2985 if (!file_oformat) {
2986 file_oformat = guess_format(NULL, filename, NULL);
2987 if (!file_oformat) {
2988 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
2994 oc->oformat = file_oformat;
2995 pstrcpy(oc->filename, sizeof(oc->filename), filename);
2997 if (!strcmp(file_oformat->name, "ffm") &&
2998 strstart(filename, "http:", NULL)) {
2999 /* special case for files sent to ffserver: we get the stream
3000 parameters from ffserver */
3001 if (read_ffserver_streams(oc, filename) < 0) {
3002 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
3006 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_id != CODEC_ID_NONE;
3007 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_id != CODEC_ID_NONE;
3009 /* disable if no corresponding type found and at least one
3011 if (nb_input_files > 0) {
3012 check_audio_video_inputs(&input_has_video, &input_has_audio);
3013 if (!input_has_video)
3015 if (!input_has_audio)
3019 /* manual disable */
3020 if (audio_disable) {
3023 if (video_disable) {
3028 new_video_stream(oc);
3032 new_audio_stream(oc);
3035 oc->timestamp = rec_timestamp;
3038 pstrcpy(oc->title, sizeof(oc->title), str_title);
3040 pstrcpy(oc->author, sizeof(oc->author), str_author);
3042 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3044 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3046 pstrcpy(oc->album, sizeof(oc->album), str_album);
3049 output_files[nb_output_files++] = oc;
3051 /* check filename in case of an image number is expected */
3052 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3053 if (!av_filename_number_test(oc->filename)) {
3054 print_error(oc->filename, AVERROR_NUMEXPECTED);
3059 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3060 /* test if it already exists to avoid loosing precious files */
3061 if (!file_overwrite &&
3062 (strchr(filename, ':') == NULL ||
3063 strstart(filename, "file:", NULL))) {
3064 if (url_exist(filename)) {
3067 if ( !using_stdin ) {
3068 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3071 if (toupper(c) != 'Y') {
3072 fprintf(stderr, "Not overwriting - exiting\n");
3077 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3084 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3085 fprintf(stderr, "Could not open '%s'\n", filename);
3090 memset(ap, 0, sizeof(*ap));
3091 if (av_set_parameters(oc, ap) < 0) {
3092 fprintf(stderr, "%s: Invalid encoding parameters\n",
3097 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3098 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3099 oc->loop_output = loop_output;
3101 for(i=0; i<opt_name_count; i++){
3102 const AVOption *opt;
3103 double d = av_get_double(avformat_opts, opt_names[i], &opt);
3104 if(d==d && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3105 av_set_double(oc, opt_names[i], d);
3108 /* reset some options */
3109 file_oformat = NULL;
3110 file_iformat = NULL;
3113 /* same option as mencoder */
3114 static void opt_pass(const char *pass_str)
3117 pass = atoi(pass_str);
3118 if (pass != 1 && pass != 2) {
3119 fprintf(stderr, "pass number can be only 1 or 2\n");
3125 #if defined(__MINGW32__) || defined(CONFIG_OS2)
3126 static int64_t getutime(void)
3128 return av_gettime();
3131 static int64_t getutime(void)
3133 struct rusage rusage;
3135 getrusage(RUSAGE_SELF, &rusage);
3136 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3140 #if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
3141 extern int ffm_nopts;
3144 static void show_formats(void)
3146 AVInputFormat *ifmt;
3147 AVOutputFormat *ofmt;
3150 const char **pp, *last_name;
3152 printf("File formats:\n");
3157 const char *name=NULL;
3158 const char *long_name=NULL;
3160 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3161 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3162 strcmp(ofmt->name, last_name)>0){
3164 long_name= ofmt->long_name;
3168 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3169 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3170 strcmp(ifmt->name, last_name)>0){
3172 long_name= ifmt->long_name;
3175 if(name && strcmp(ifmt->name, name)==0)
3187 long_name ? long_name:" ");
3191 printf("Codecs:\n");
3197 const char *type_str;
3200 for(p = first_avcodec; p != NULL; p = p->next) {
3201 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3202 strcmp(p->name, last_name)>0){
3204 decode= encode= cap=0;
3206 if(p2 && strcmp(p->name, p2->name)==0){
3207 if(p->decode) decode=1;
3208 if(p->encode) encode=1;
3209 cap |= p->capabilities;
3214 last_name= p2->name;
3217 case CODEC_TYPE_VIDEO:
3220 case CODEC_TYPE_AUDIO:
3223 case CODEC_TYPE_SUBTITLE:
3232 decode ? "D": (/*p2->decoder ? "d":*/" "),
3235 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3236 cap & CODEC_CAP_DR1 ? "D":" ",
3237 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3239 /* if(p2->decoder && decode==0)
3240 printf(" use %s for decoding", p2->decoder->name);*/
3245 printf("Supported file protocols:\n");
3246 for(up = first_protocol; up != NULL; up = up->next)
3247 printf(" %s:", up->name);
3250 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3251 printf("Motion estimation methods:\n");
3255 if ((pp - motion_str + 1) == ME_ZERO)
3256 printf("(fastest)");
3257 else if ((pp - motion_str + 1) == ME_FULL)
3258 printf("(slowest)");
3259 else if ((pp - motion_str + 1) == ME_EPZS)
3260 printf("(default)");
3265 "Note, the names of encoders and decoders dont always match, so there are\n"
3266 "several cases where the above table shows encoder only or decoder only entries\n"
3267 "even though both encoding and decoding are supported for example, the h263\n"
3268 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3273 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3276 const char *p = str;
3283 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3290 static void opt_inter_matrix(const char *arg)
3292 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3293 parse_matrix_coeffs(inter_matrix, arg);
3296 static void opt_intra_matrix(const char *arg)
3298 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3299 parse_matrix_coeffs(intra_matrix, arg);
3302 static void opt_target(const char *arg)
3305 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3307 if(!strncmp(arg, "pal-", 4)) {
3310 } else if(!strncmp(arg, "ntsc-", 5)) {
3313 } else if(!strncmp(arg, "film-", 5)) {
3318 /* Calculate FR via float to avoid int overflow */
3319 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3322 } else if((fr == 29970) || (fr == 23976)) {
3325 /* Try to determine PAL/NTSC by peeking in the input files */
3326 if(nb_input_files) {
3328 for(j = 0; j < nb_input_files; j++) {
3329 for(i = 0; i < input_files[j]->nb_streams; i++) {
3330 AVCodecContext *c = input_files[j]->streams[i]->codec;
3331 if(c->codec_type != CODEC_TYPE_VIDEO)
3333 fr = c->time_base.den * 1000 / c->time_base.num;
3337 } else if((fr == 29970) || (fr == 23976)) {
3347 if(verbose && norm >= 0)
3348 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3352 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3353 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3354 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3358 if(!strcmp(arg, "vcd")) {
3360 opt_video_codec("mpeg1video");
3361 opt_audio_codec("mp2");
3364 opt_frame_size(norm ? "352x240" : "352x288");
3365 opt_frame_rate(frame_rates[norm]);
3366 opt_default("gop", norm ? "18" : "15");
3368 opt_default("b", "1150000");
3369 opt_default("maxrate", "1150000");
3370 opt_default("minrate", "1150000");
3371 opt_default("bufsize", "327680"); // 40*1024*8;
3373 opt_default("ab", "224000");
3374 audio_sample_rate = 44100;
3377 opt_default("packetsize", "2324");
3378 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3380 /* We have to offset the PTS, so that it is consistent with the SCR.
3381 SCR starts at 36000, but the first two packs contain only padding
3382 and the first pack from the other stream, respectively, may also have
3383 been written before.
3384 So the real data starts at SCR 36000+3*1200. */
3385 mux_preload= (36000+3*1200) / 90000.0; //0.44
3386 } else if(!strcmp(arg, "svcd")) {
3388 opt_video_codec("mpeg2video");
3389 opt_audio_codec("mp2");
3392 opt_frame_size(norm ? "480x480" : "480x576");
3393 opt_frame_rate(frame_rates[norm]);
3394 opt_default("gop", norm ? "18" : "15");
3396 opt_default("b", "2040000");
3397 opt_default("maxrate", "2516000");
3398 opt_default("minrate", "0"); //1145000;
3399 opt_default("bufsize", "1835008"); //224*1024*8;
3400 opt_default("flags", "+SCAN_OFFSET");
3403 opt_default("ab", "224000");
3404 audio_sample_rate = 44100;
3406 opt_default("packetsize", "2324");
3408 } else if(!strcmp(arg, "dvd")) {
3410 opt_video_codec("mpeg2video");
3411 opt_audio_codec("ac3");
3414 opt_frame_size(norm ? "720x480" : "720x576");
3415 opt_frame_rate(frame_rates[norm]);
3416 opt_default("gop", norm ? "18" : "15");
3418 opt_default("b", "6000000");
3419 opt_default("maxrate", "9000000");
3420 opt_default("minrate", "0"); //1500000;
3421 opt_default("bufsize", "1835008"); //224*1024*8;
3423 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3424 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3426 opt_default("ab", "448000");
3427 audio_sample_rate = 48000;
3429 } else if(!strncmp(arg, "dv", 2)) {
3433 opt_frame_size(norm ? "720x480" : "720x576");
3434 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3435 (norm ? "yuv411p" : "yuv420p"));
3436 opt_frame_rate(frame_rates[norm]);
3438 audio_sample_rate = 48000;
3442 fprintf(stderr, "Unknown target: %s\n", arg);
3447 static void opt_video_bsf(const char *arg)
3449 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3450 AVBitStreamFilterContext **bsfp;
3453 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3457 bsfp= &video_bitstream_filters;
3459 bsfp= &(*bsfp)->next;
3464 //FIXME avoid audio - video code duplication
3465 static void opt_audio_bsf(const char *arg)
3467 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3468 AVBitStreamFilterContext **bsfp;
3471 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3475 bsfp= &audio_bitstream_filters;
3477 bsfp= &(*bsfp)->next;
3482 static void show_version(void)
3484 /* TODO: add function interface to avutil and avformat */
3485 fprintf(stderr, "ffmpeg " FFMPEG_VERSION "\n"
3489 LIBAVUTIL_BUILD, avcodec_build(), LIBAVFORMAT_BUILD);
3493 static int opt_default(const char *opt, const char *arg){
3495 const AVOption *o= NULL;
3496 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
3498 for(type=0; type<CODEC_TYPE_NB; type++){
3499 const AVOption *o2 = av_find_opt(avctx_opts[0], opt, NULL, opt_types[type], opt_types[type]);
3501 o = av_set_string(avctx_opts[type], opt, arg);
3504 o = av_set_string(avformat_opts, opt, arg);
3507 o = av_set_string(avctx_opts[CODEC_TYPE_AUDIO], opt+1, arg);
3508 else if(opt[0] == 'v')
3509 o = av_set_string(avctx_opts[CODEC_TYPE_VIDEO], opt+1, arg);
3510 else if(opt[0] == 's')
3511 o = av_set_string(avctx_opts[CODEC_TYPE_SUBTITLE], opt+1, arg);
3516 // 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));
3518 //FIXME we should always use avctx_opts, ... for storing options so there wont be any need to keep track of whats set over this
3519 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
3520 opt_names[opt_name_count++]= o->name;
3522 #if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
3523 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3524 if(avctx_opts[0]->flags & CODEC_FLAG_BITEXACT)
3528 if(avctx_opts[0]->debug)
3529 av_log_level = AV_LOG_DEBUG;
3533 const OptionDef options[] = {
3535 { "L", 0, {(void*)show_license}, "show license" },
3536 { "h", 0, {(void*)show_help}, "show help" },
3537 { "version", 0, {(void*)show_version}, "show version" },
3538 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3539 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3540 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3541 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3542 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3543 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3544 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3545 { "fs", HAS_ARG | OPT_INT, {(void*)&limit_filesize}, "set the limit file size", "limit_size" }, //
3546 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3547 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3548 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3549 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3550 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3551 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3552 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3553 { "album", HAS_ARG | OPT_STRING, {(void*)&str_album}, "set the album", "string" },
3554 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3555 "add timings for benchmarking" },
3556 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3557 "dump each input packet" },
3558 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3559 "when dumping packets, also dump the payload" },
3560 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3561 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3562 { "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)", "" },
3563 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3564 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3565 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3566 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3567 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3568 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3569 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3570 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3571 { "dts_delta_threshold", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "" },
3574 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3575 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3576 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3577 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3578 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3579 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3580 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3581 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3582 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3583 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3584 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3585 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3586 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3587 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3588 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3589 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3590 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3591 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3592 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3593 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantizer scale (VBR)", "q" },
3594 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3595 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3596 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3597 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
3599 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
3600 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3601 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3602 "use same video quality as source (implies VBR)" },
3603 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3604 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3605 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3606 "deinterlace pictures" },
3607 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3608 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
3609 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3610 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3611 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3612 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3613 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3614 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3615 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3616 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3619 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3620 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3621 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3622 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3623 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3624 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3625 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3626 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3627 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3628 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3630 /* subtitle options */
3631 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3632 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
3633 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3636 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3637 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3638 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3641 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
3642 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
3644 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_audio_bsf}, "", "bitstream filter" },
3645 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_video_bsf}, "", "bitstream filter" },
3647 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
3651 static void show_banner(void)
3653 fprintf(stderr, "FFmpeg version " FFMPEG_VERSION ", Copyright (c) 2000-2007 Fabrice Bellard, et al.\n");
3654 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
3655 fprintf(stderr, " libavutil version: " AV_STRINGIFY(LIBAVUTIL_VERSION) "\n");
3656 fprintf(stderr, " libavcodec version: " AV_STRINGIFY(LIBAVCODEC_VERSION) "\n");
3657 fprintf(stderr, " libavformat version: " AV_STRINGIFY(LIBAVFORMAT_VERSION) "\n");
3658 fprintf(stderr, " built on " __DATE__ " " __TIME__);
3660 fprintf(stderr, ", gcc: " __VERSION__ "\n");
3662 fprintf(stderr, ", using a non-gcc compiler\n");
3666 static void show_license(void)
3671 "FFmpeg is free software; you can redistribute it and/or modify\n"
3672 "it under the terms of the GNU General Public License as published by\n"
3673 "the Free Software Foundation; either version 2 of the License, or\n"
3674 "(at your option) any later version.\n"
3676 "FFmpeg is distributed in the hope that it will be useful,\n"
3677 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3678 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
3679 "GNU General Public License for more details.\n"
3681 "You should have received a copy of the GNU General Public License\n"
3682 "along with FFmpeg; if not, write to the Free Software\n"
3683 "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
3687 "FFmpeg is free software; you can redistribute it and/or\n"
3688 "modify it under the terms of the GNU Lesser General Public\n"
3689 "License as published by the Free Software Foundation; either\n"
3690 "version 2.1 of the License, or (at your option) any later version.\n"
3692 "FFmpeg is distributed in the hope that it will be useful,\n"
3693 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3694 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
3695 "Lesser General Public License for more details.\n"
3697 "You should have received a copy of the GNU Lesser General Public\n"
3698 "License along with FFmpeg; if not, write to the Free Software\n"
3699 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
3705 static void show_help(void)
3708 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3709 "Hyper fast Audio and Video encoder\n");
3711 show_help_options(options, "Main options:\n",
3712 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
3713 show_help_options(options, "\nVideo options:\n",
3714 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3716 show_help_options(options, "\nAdvanced Video options:\n",
3717 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3718 OPT_VIDEO | OPT_EXPERT);
3719 show_help_options(options, "\nAudio options:\n",
3720 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3722 show_help_options(options, "\nAdvanced Audio options:\n",
3723 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3724 OPT_AUDIO | OPT_EXPERT);
3725 show_help_options(options, "\nSubtitle options:\n",
3726 OPT_SUBTITLE | OPT_GRAB,
3728 show_help_options(options, "\nAudio/Video grab options:\n",
3731 show_help_options(options, "\nAdvanced options:\n",
3732 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3734 av_opt_show(avctx_opts[0], NULL);
3735 av_opt_show(avformat_opts, NULL);
3740 void parse_arg_file(const char *filename)
3742 opt_output_file(filename);
3745 int main(int argc, char **argv)
3752 for(i=0; i<CODEC_TYPE_NB; i++){
3753 avctx_opts[i]= avcodec_alloc_context2(i);
3755 avformat_opts = av_alloc_format_context();
3763 parse_options(argc, argv, options);
3765 /* file converter / grab */
3766 if (nb_output_files <= 0) {
3767 fprintf(stderr, "Must supply at least one output file\n");
3771 if (nb_input_files == 0) {
3772 fprintf(stderr, "Must supply at least one input file\n");
3777 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3778 stream_maps, nb_stream_maps);
3779 ti = getutime() - ti;
3781 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3785 for(i=0;i<nb_output_files;i++) {
3786 /* maybe av_close_output_file ??? */
3787 AVFormatContext *s = output_files[i];
3789 if (!(s->oformat->flags & AVFMT_NOFILE))
3791 for(j=0;j<s->nb_streams;j++) {
3792 av_free(s->streams[j]->codec);
3793 av_free(s->streams[j]);
3797 for(i=0;i<nb_input_files;i++)
3798 av_close_input_file(input_files[i]);
3802 av_free(intra_matrix);
3803 av_free(inter_matrix);
3806 #ifdef CONFIG_POWERPC_PERF
3807 extern void powerpc_display_perf_report(void);
3808 powerpc_display_perf_report();
3809 #endif /* CONFIG_POWERPC_PERF */
3811 if (received_sigterm) {
3813 "Received signal %d: terminating.\n",
3814 (int) received_sigterm);
3818 exit(0); /* not all OS-es handle main() return value */