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;
2569 avcodec_thread_init(enc, thread_count);
2570 enc->thread_count= thread_count;
2571 switch(enc->codec_type) {
2572 case CODEC_TYPE_AUDIO:
2573 for(j=0; j<opt_name_count; j++){
2574 const AVOption *opt;
2575 double d= av_get_double(avctx_opts[CODEC_TYPE_AUDIO], opt_names[j], &opt);
2576 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2577 av_set_double(enc, opt_names[j], d);
2579 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2580 audio_channels = enc->channels;
2581 audio_sample_rate = enc->sample_rate;
2583 ic->streams[i]->discard= AVDISCARD_ALL;
2585 case CODEC_TYPE_VIDEO:
2586 for(j=0; j<opt_name_count; j++){
2587 const AVOption *opt;
2588 double d= av_get_double(avctx_opts[CODEC_TYPE_VIDEO], opt_names[j], &opt);
2589 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2590 av_set_double(enc, opt_names[j], d);
2592 frame_height = enc->height;
2593 frame_width = enc->width;
2594 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2595 frame_pix_fmt = enc->pix_fmt;
2596 rfps = ic->streams[i]->r_frame_rate.num;
2597 rfps_base = ic->streams[i]->r_frame_rate.den;
2598 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2600 enc->debug |= FF_DEBUG_MV;
2602 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2605 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2606 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2608 (float)rfps / rfps_base, rfps, rfps_base);
2610 /* update the current frame rate to match the stream frame rate */
2612 frame_rate_base = rfps_base;
2614 enc->rate_emu = rate_emu;
2616 ic->streams[i]->discard= AVDISCARD_ALL;
2617 else if(video_discard)
2618 ic->streams[i]->discard= video_discard;
2620 case CODEC_TYPE_DATA:
2622 case CODEC_TYPE_SUBTITLE:
2624 case CODEC_TYPE_UNKNOWN:
2631 input_files[nb_input_files] = ic;
2632 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2633 /* dump the file content */
2635 dump_format(ic, nb_input_files, filename, 0);
2638 file_iformat = NULL;
2639 file_oformat = NULL;
2646 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
2648 int has_video, has_audio, i, j;
2649 AVFormatContext *ic;
2653 for(j=0;j<nb_input_files;j++) {
2654 ic = input_files[j];
2655 for(i=0;i<ic->nb_streams;i++) {
2656 AVCodecContext *enc = ic->streams[i]->codec;
2657 switch(enc->codec_type) {
2658 case CODEC_TYPE_AUDIO:
2661 case CODEC_TYPE_VIDEO:
2664 case CODEC_TYPE_DATA:
2665 case CODEC_TYPE_UNKNOWN:
2666 case CODEC_TYPE_SUBTITLE:
2673 *has_video_ptr = has_video;
2674 *has_audio_ptr = has_audio;
2677 static void new_video_stream(AVFormatContext *oc)
2680 AVCodecContext *video_enc;
2683 st = av_new_stream(oc, oc->nb_streams);
2685 fprintf(stderr, "Could not alloc stream\n");
2688 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
2689 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
2690 video_bitstream_filters= NULL;
2693 avcodec_thread_init(st->codec, thread_count);
2695 video_enc = st->codec;
2698 video_enc->codec_tag= video_codec_tag;
2700 if( (video_global_header&1)
2701 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
2702 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2703 avctx_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
2705 if(video_global_header&2){
2706 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
2707 avctx_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
2710 if (video_stream_copy) {
2711 st->stream_copy = 1;
2712 video_enc->codec_type = CODEC_TYPE_VIDEO;
2718 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
2719 if (video_codec_id != CODEC_ID_NONE)
2720 codec_id = video_codec_id;
2722 video_enc->codec_id = codec_id;
2723 codec = avcodec_find_encoder(codec_id);
2725 for(i=0; i<opt_name_count; i++){
2726 const AVOption *opt;
2727 double d= av_get_double(avctx_opts[CODEC_TYPE_VIDEO], opt_names[i], &opt);
2728 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
2729 av_set_double(video_enc, opt_names[i], d);
2732 video_enc->time_base.den = frame_rate;
2733 video_enc->time_base.num = frame_rate_base;
2734 if(codec && codec->supported_framerates){
2735 const AVRational *p= codec->supported_framerates;
2736 AVRational req= (AVRational){frame_rate, frame_rate_base};
2737 const AVRational *best=NULL;
2738 AVRational best_error= (AVRational){INT_MAX, 1};
2739 for(; p->den!=0; p++){
2740 AVRational error= av_sub_q(req, *p);
2741 if(error.num <0) error.num *= -1;
2742 if(av_cmp_q(error, best_error) < 0){
2747 video_enc->time_base.den= best->num;
2748 video_enc->time_base.num= best->den;
2751 video_enc->width = frame_width + frame_padright + frame_padleft;
2752 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2753 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
2754 video_enc->pix_fmt = frame_pix_fmt;
2756 if(codec && codec->pix_fmts){
2757 const enum PixelFormat *p= codec->pix_fmts;
2759 if(*p == video_enc->pix_fmt)
2763 video_enc->pix_fmt = codec->pix_fmts[0];
2767 video_enc->gop_size = 0;
2768 if (video_qscale || same_quality) {
2769 video_enc->flags |= CODEC_FLAG_QSCALE;
2770 video_enc->global_quality=
2771 st->quality = FF_QP2LAMBDA * video_qscale;
2775 video_enc->intra_matrix = intra_matrix;
2777 video_enc->inter_matrix = inter_matrix;
2779 video_enc->max_qdiff = video_qdiff;
2780 video_enc->rc_eq = video_rc_eq;
2781 video_enc->thread_count = thread_count;
2782 p= video_rc_override_string;
2785 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
2787 fprintf(stderr, "error parsing rc_override\n");
2790 video_enc->rc_override=
2791 av_realloc(video_enc->rc_override,
2792 sizeof(RcOverride)*(i+1));
2793 video_enc->rc_override[i].start_frame= start;
2794 video_enc->rc_override[i].end_frame = end;
2796 video_enc->rc_override[i].qscale= q;
2797 video_enc->rc_override[i].quality_factor= 1.0;
2800 video_enc->rc_override[i].qscale= 0;
2801 video_enc->rc_override[i].quality_factor= -q/100.0;
2806 video_enc->rc_override_count=i;
2807 if (!video_enc->rc_initial_buffer_occupancy)
2808 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
2809 video_enc->me_threshold= me_threshold;
2810 video_enc->intra_dc_precision= intra_dc_precision - 8;
2811 video_enc->strict_std_compliance = strict;
2814 video_enc->flags|= CODEC_FLAG_PSNR;
2816 video_enc->me_method = me_method;
2821 video_enc->flags |= CODEC_FLAG_PASS1;
2823 video_enc->flags |= CODEC_FLAG_PASS2;
2828 /* reset some key parameters */
2830 video_codec_id = CODEC_ID_NONE;
2831 video_stream_copy = 0;
2834 static void new_audio_stream(AVFormatContext *oc)
2837 AVCodecContext *audio_enc;
2840 st = av_new_stream(oc, oc->nb_streams);
2842 fprintf(stderr, "Could not alloc stream\n");
2845 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
2847 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
2848 audio_bitstream_filters= NULL;
2851 avcodec_thread_init(st->codec, thread_count);
2853 audio_enc = st->codec;
2854 audio_enc->codec_type = CODEC_TYPE_AUDIO;
2855 audio_enc->strict_std_compliance = strict;
2858 audio_enc->codec_tag= audio_codec_tag;
2860 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
2861 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2862 avctx_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
2864 if (audio_stream_copy) {
2865 st->stream_copy = 1;
2866 audio_enc->channels = audio_channels;
2868 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
2870 for(i=0; i<opt_name_count; i++){
2871 const AVOption *opt;
2872 double d= av_get_double(avctx_opts[CODEC_TYPE_AUDIO], opt_names[i], &opt);
2873 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
2874 av_set_double(audio_enc, opt_names[i], d);
2877 if (audio_codec_id != CODEC_ID_NONE)
2878 codec_id = audio_codec_id;
2879 audio_enc->codec_id = codec_id;
2881 if (audio_qscale > QSCALE_NONE) {
2882 audio_enc->flags |= CODEC_FLAG_QSCALE;
2883 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
2885 audio_enc->thread_count = thread_count;
2886 audio_enc->channels = audio_channels;
2888 audio_enc->sample_rate = audio_sample_rate;
2889 audio_enc->time_base= (AVRational){1, audio_sample_rate};
2890 if (audio_language) {
2891 pstrcpy(st->language, sizeof(st->language), audio_language);
2892 av_free(audio_language);
2893 audio_language = NULL;
2896 /* reset some key parameters */
2898 audio_codec_id = CODEC_ID_NONE;
2899 audio_stream_copy = 0;
2902 static void opt_new_subtitle_stream(void)
2904 AVFormatContext *oc;
2906 AVCodecContext *subtitle_enc;
2909 if (nb_output_files <= 0) {
2910 fprintf(stderr, "At least one output file must be specified\n");
2913 oc = output_files[nb_output_files - 1];
2915 st = av_new_stream(oc, oc->nb_streams);
2917 fprintf(stderr, "Could not alloc stream\n");
2920 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
2922 subtitle_enc = st->codec;
2923 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
2924 if (subtitle_stream_copy) {
2925 st->stream_copy = 1;
2927 for(i=0; i<opt_name_count; i++){
2928 const AVOption *opt;
2929 double d= av_get_double(avctx_opts[CODEC_TYPE_SUBTITLE], opt_names[i], &opt);
2930 if(d==d && (opt->flags&AV_OPT_FLAG_SUBTITLE_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
2931 av_set_double(subtitle_enc, opt_names[i], d);
2933 subtitle_enc->codec_id = subtitle_codec_id;
2936 if (subtitle_language) {
2937 pstrcpy(st->language, sizeof(st->language), subtitle_language);
2938 av_free(subtitle_language);
2939 subtitle_language = NULL;
2942 subtitle_codec_id = CODEC_ID_NONE;
2943 subtitle_stream_copy = 0;
2946 static void opt_new_audio_stream(void)
2948 AVFormatContext *oc;
2949 if (nb_output_files <= 0) {
2950 fprintf(stderr, "At least one output file must be specified\n");
2953 oc = output_files[nb_output_files - 1];
2954 new_audio_stream(oc);
2957 static void opt_new_video_stream(void)
2959 AVFormatContext *oc;
2960 if (nb_output_files <= 0) {
2961 fprintf(stderr, "At least one output file must be specified\n");
2964 oc = output_files[nb_output_files - 1];
2965 new_video_stream(oc);
2968 static void opt_output_file(const char *filename)
2970 AVFormatContext *oc;
2971 int use_video, use_audio, input_has_video, input_has_audio, i;
2972 AVFormatParameters params, *ap = ¶ms;
2974 if (!strcmp(filename, "-"))
2977 oc = av_alloc_format_context();
2979 if (!file_oformat) {
2980 file_oformat = guess_format(NULL, filename, NULL);
2981 if (!file_oformat) {
2982 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
2988 oc->oformat = file_oformat;
2989 pstrcpy(oc->filename, sizeof(oc->filename), filename);
2991 if (!strcmp(file_oformat->name, "ffm") &&
2992 strstart(filename, "http:", NULL)) {
2993 /* special case for files sent to ffserver: we get the stream
2994 parameters from ffserver */
2995 if (read_ffserver_streams(oc, filename) < 0) {
2996 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
3000 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_id != CODEC_ID_NONE;
3001 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_id != CODEC_ID_NONE;
3003 /* disable if no corresponding type found and at least one
3005 if (nb_input_files > 0) {
3006 check_audio_video_inputs(&input_has_video, &input_has_audio);
3007 if (!input_has_video)
3009 if (!input_has_audio)
3013 /* manual disable */
3014 if (audio_disable) {
3017 if (video_disable) {
3022 new_video_stream(oc);
3026 new_audio_stream(oc);
3029 oc->timestamp = rec_timestamp;
3032 pstrcpy(oc->title, sizeof(oc->title), str_title);
3034 pstrcpy(oc->author, sizeof(oc->author), str_author);
3036 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3038 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3040 pstrcpy(oc->album, sizeof(oc->album), str_album);
3043 output_files[nb_output_files++] = oc;
3045 /* check filename in case of an image number is expected */
3046 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3047 if (!av_filename_number_test(oc->filename)) {
3048 print_error(oc->filename, AVERROR_NUMEXPECTED);
3053 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3054 /* test if it already exists to avoid loosing precious files */
3055 if (!file_overwrite &&
3056 (strchr(filename, ':') == NULL ||
3057 strstart(filename, "file:", NULL))) {
3058 if (url_exist(filename)) {
3061 if ( !using_stdin ) {
3062 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3065 if (toupper(c) != 'Y') {
3066 fprintf(stderr, "Not overwriting - exiting\n");
3071 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3078 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3079 fprintf(stderr, "Could not open '%s'\n", filename);
3084 memset(ap, 0, sizeof(*ap));
3085 if (av_set_parameters(oc, ap) < 0) {
3086 fprintf(stderr, "%s: Invalid encoding parameters\n",
3091 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3092 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3093 oc->loop_output = loop_output;
3095 for(i=0; i<opt_name_count; i++){
3096 const AVOption *opt;
3097 double d = av_get_double(avformat_opts, opt_names[i], &opt);
3098 if(d==d && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3099 av_set_double(oc, opt_names[i], d);
3102 /* reset some options */
3103 file_oformat = NULL;
3104 file_iformat = NULL;
3107 /* same option as mencoder */
3108 static void opt_pass(const char *pass_str)
3111 pass = atoi(pass_str);
3112 if (pass != 1 && pass != 2) {
3113 fprintf(stderr, "pass number can be only 1 or 2\n");
3119 #if defined(__MINGW32__) || defined(CONFIG_OS2)
3120 static int64_t getutime(void)
3122 return av_gettime();
3125 static int64_t getutime(void)
3127 struct rusage rusage;
3129 getrusage(RUSAGE_SELF, &rusage);
3130 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3134 #if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
3135 extern int ffm_nopts;
3138 static void show_formats(void)
3140 AVInputFormat *ifmt;
3141 AVOutputFormat *ofmt;
3144 const char **pp, *last_name;
3146 printf("File formats:\n");
3151 const char *name=NULL;
3152 const char *long_name=NULL;
3154 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3155 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3156 strcmp(ofmt->name, last_name)>0){
3158 long_name= ofmt->long_name;
3162 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3163 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3164 strcmp(ifmt->name, last_name)>0){
3166 long_name= ifmt->long_name;
3169 if(name && strcmp(ifmt->name, name)==0)
3181 long_name ? long_name:" ");
3185 printf("Codecs:\n");
3191 const char *type_str;
3194 for(p = first_avcodec; p != NULL; p = p->next) {
3195 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3196 strcmp(p->name, last_name)>0){
3198 decode= encode= cap=0;
3200 if(p2 && strcmp(p->name, p2->name)==0){
3201 if(p->decode) decode=1;
3202 if(p->encode) encode=1;
3203 cap |= p->capabilities;
3208 last_name= p2->name;
3211 case CODEC_TYPE_VIDEO:
3214 case CODEC_TYPE_AUDIO:
3217 case CODEC_TYPE_SUBTITLE:
3226 decode ? "D": (/*p2->decoder ? "d":*/" "),
3229 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3230 cap & CODEC_CAP_DR1 ? "D":" ",
3231 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3233 /* if(p2->decoder && decode==0)
3234 printf(" use %s for decoding", p2->decoder->name);*/
3239 printf("Supported file protocols:\n");
3240 for(up = first_protocol; up != NULL; up = up->next)
3241 printf(" %s:", up->name);
3244 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3245 printf("Motion estimation methods:\n");
3249 if ((pp - motion_str + 1) == ME_ZERO)
3250 printf("(fastest)");
3251 else if ((pp - motion_str + 1) == ME_FULL)
3252 printf("(slowest)");
3253 else if ((pp - motion_str + 1) == ME_EPZS)
3254 printf("(default)");
3259 "Note, the names of encoders and decoders dont always match, so there are\n"
3260 "several cases where the above table shows encoder only or decoder only entries\n"
3261 "even though both encoding and decoding are supported for example, the h263\n"
3262 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3267 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3270 const char *p = str;
3277 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3284 static void opt_inter_matrix(const char *arg)
3286 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3287 parse_matrix_coeffs(inter_matrix, arg);
3290 static void opt_intra_matrix(const char *arg)
3292 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3293 parse_matrix_coeffs(intra_matrix, arg);
3296 static void opt_target(const char *arg)
3299 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3301 if(!strncmp(arg, "pal-", 4)) {
3304 } else if(!strncmp(arg, "ntsc-", 5)) {
3307 } else if(!strncmp(arg, "film-", 5)) {
3312 /* Calculate FR via float to avoid int overflow */
3313 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3316 } else if((fr == 29970) || (fr == 23976)) {
3319 /* Try to determine PAL/NTSC by peeking in the input files */
3320 if(nb_input_files) {
3322 for(j = 0; j < nb_input_files; j++) {
3323 for(i = 0; i < input_files[j]->nb_streams; i++) {
3324 AVCodecContext *c = input_files[j]->streams[i]->codec;
3325 if(c->codec_type != CODEC_TYPE_VIDEO)
3327 fr = c->time_base.den * 1000 / c->time_base.num;
3331 } else if((fr == 29970) || (fr == 23976)) {
3341 if(verbose && norm >= 0)
3342 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3346 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3347 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3348 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3352 if(!strcmp(arg, "vcd")) {
3354 opt_video_codec("mpeg1video");
3355 opt_audio_codec("mp2");
3358 opt_frame_size(norm ? "352x240" : "352x288");
3359 opt_frame_rate(frame_rates[norm]);
3360 opt_default("gop", norm ? "18" : "15");
3362 opt_default("b", "1150000");
3363 opt_default("maxrate", "1150000");
3364 opt_default("minrate", "1150000");
3365 opt_default("bufsize", "327680"); // 40*1024*8;
3367 opt_default("ab", "224000");
3368 audio_sample_rate = 44100;
3371 opt_default("packetsize", "2324");
3372 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3374 /* We have to offset the PTS, so that it is consistent with the SCR.
3375 SCR starts at 36000, but the first two packs contain only padding
3376 and the first pack from the other stream, respectively, may also have
3377 been written before.
3378 So the real data starts at SCR 36000+3*1200. */
3379 mux_preload= (36000+3*1200) / 90000.0; //0.44
3380 } else if(!strcmp(arg, "svcd")) {
3382 opt_video_codec("mpeg2video");
3383 opt_audio_codec("mp2");
3386 opt_frame_size(norm ? "480x480" : "480x576");
3387 opt_frame_rate(frame_rates[norm]);
3388 opt_default("gop", norm ? "18" : "15");
3390 opt_default("b", "2040000");
3391 opt_default("maxrate", "2516000");
3392 opt_default("minrate", "0"); //1145000;
3393 opt_default("bufsize", "1835008"); //224*1024*8;
3394 opt_default("flags", "+SCAN_OFFSET");
3397 opt_default("ab", "224000");
3398 audio_sample_rate = 44100;
3400 opt_default("packetsize", "2324");
3402 } else if(!strcmp(arg, "dvd")) {
3404 opt_video_codec("mpeg2video");
3405 opt_audio_codec("ac3");
3408 opt_frame_size(norm ? "720x480" : "720x576");
3409 opt_frame_rate(frame_rates[norm]);
3410 opt_default("gop", norm ? "18" : "15");
3412 opt_default("b", "6000000");
3413 opt_default("maxrate", "9000000");
3414 opt_default("minrate", "0"); //1500000;
3415 opt_default("bufsize", "1835008"); //224*1024*8;
3417 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3418 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3420 opt_default("ab", "448000");
3421 audio_sample_rate = 48000;
3423 } else if(!strncmp(arg, "dv", 2)) {
3427 opt_frame_size(norm ? "720x480" : "720x576");
3428 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3429 (norm ? "yuv411p" : "yuv420p"));
3430 opt_frame_rate(frame_rates[norm]);
3432 audio_sample_rate = 48000;
3436 fprintf(stderr, "Unknown target: %s\n", arg);
3441 static void opt_video_bsf(const char *arg)
3443 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3444 AVBitStreamFilterContext **bsfp;
3447 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3451 bsfp= &video_bitstream_filters;
3453 bsfp= &(*bsfp)->next;
3458 //FIXME avoid audio - video code duplication
3459 static void opt_audio_bsf(const char *arg)
3461 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3462 AVBitStreamFilterContext **bsfp;
3465 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3469 bsfp= &audio_bitstream_filters;
3471 bsfp= &(*bsfp)->next;
3476 static void show_version(void)
3478 /* TODO: add function interface to avutil and avformat */
3479 fprintf(stderr, "ffmpeg " FFMPEG_VERSION "\n"
3483 LIBAVUTIL_BUILD, avcodec_build(), LIBAVFORMAT_BUILD);
3487 static int opt_default(const char *opt, const char *arg){
3489 const AVOption *o= NULL;
3490 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
3492 for(type=0; type<CODEC_TYPE_NB; type++){
3493 const AVOption *o2 = av_find_opt(avctx_opts[0], opt, NULL, opt_types[type], opt_types[type]);
3495 o = av_set_string(avctx_opts[type], opt, arg);
3498 o = av_set_string(avformat_opts, opt, arg);
3501 o = av_set_string(avctx_opts[CODEC_TYPE_AUDIO], opt+1, arg);
3502 else if(opt[0] == 'v')
3503 o = av_set_string(avctx_opts[CODEC_TYPE_VIDEO], opt+1, arg);
3504 else if(opt[0] == 's')
3505 o = av_set_string(avctx_opts[CODEC_TYPE_SUBTITLE], opt+1, arg);
3510 // 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));
3512 //FIXME we should always use avctx_opts, ... for storing options so there wont be any need to keep track of whats set over this
3513 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
3514 opt_names[opt_name_count++]= o->name;
3516 #if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
3517 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3518 if(avctx_opts[0]->flags & CODEC_FLAG_BITEXACT)
3522 if(avctx_opts[0]->debug)
3523 av_log_level = AV_LOG_DEBUG;
3527 const OptionDef options[] = {
3529 { "L", 0, {(void*)show_license}, "show license" },
3530 { "h", 0, {(void*)show_help}, "show help" },
3531 { "version", 0, {(void*)show_version}, "show version" },
3532 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3533 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3534 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3535 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3536 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3537 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3538 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3539 { "fs", HAS_ARG | OPT_INT, {(void*)&limit_filesize}, "set the limit file size", "limit_size" }, //
3540 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3541 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3542 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3543 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3544 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3545 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3546 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3547 { "album", HAS_ARG | OPT_STRING, {(void*)&str_album}, "set the album", "string" },
3548 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3549 "add timings for benchmarking" },
3550 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3551 "dump each input packet" },
3552 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3553 "when dumping packets, also dump the payload" },
3554 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3555 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3556 { "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)", "" },
3557 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3558 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3559 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3560 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3561 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3562 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3563 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3564 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3565 { "dts_delta_threshold", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "" },
3568 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3569 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3570 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3571 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3572 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3573 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3574 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3575 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3576 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3577 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3578 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3579 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3580 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3581 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3582 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3583 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3584 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3585 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3586 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3587 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantizer scale (VBR)", "q" },
3588 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3589 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3590 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3591 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
3593 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
3594 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3595 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3596 "use same video quality as source (implies VBR)" },
3597 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3598 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3599 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3600 "deinterlace pictures" },
3601 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3602 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
3603 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3604 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3605 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3606 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3607 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3608 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3609 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3610 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3613 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3614 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3615 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3616 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3617 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3618 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3619 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3620 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3621 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3622 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3624 /* subtitle options */
3625 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3626 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
3627 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3630 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3631 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3632 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3635 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
3636 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
3638 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_audio_bsf}, "", "bitstream filter" },
3639 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_video_bsf}, "", "bitstream filter" },
3641 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
3645 static void show_banner(void)
3647 fprintf(stderr, "FFmpeg version " FFMPEG_VERSION ", Copyright (c) 2000-2007 Fabrice Bellard, et al.\n");
3648 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
3649 fprintf(stderr, " libavutil version: " AV_STRINGIFY(LIBAVUTIL_VERSION) "\n");
3650 fprintf(stderr, " libavcodec version: " AV_STRINGIFY(LIBAVCODEC_VERSION) "\n");
3651 fprintf(stderr, " libavformat version: " AV_STRINGIFY(LIBAVFORMAT_VERSION) "\n");
3652 fprintf(stderr, " built on " __DATE__ " " __TIME__);
3654 fprintf(stderr, ", gcc: " __VERSION__ "\n");
3656 fprintf(stderr, ", using a non-gcc compiler\n");
3660 static void show_license(void)
3665 "FFmpeg is free software; you can redistribute it and/or modify\n"
3666 "it under the terms of the GNU General Public License as published by\n"
3667 "the Free Software Foundation; either version 2 of the License, or\n"
3668 "(at your option) any later version.\n"
3670 "FFmpeg is distributed in the hope that it will be useful,\n"
3671 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3672 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
3673 "GNU General Public License for more details.\n"
3675 "You should have received a copy of the GNU General Public License\n"
3676 "along with FFmpeg; if not, write to the Free Software\n"
3677 "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
3681 "FFmpeg is free software; you can redistribute it and/or\n"
3682 "modify it under the terms of the GNU Lesser General Public\n"
3683 "License as published by the Free Software Foundation; either\n"
3684 "version 2.1 of the License, or (at your option) any later version.\n"
3686 "FFmpeg is distributed in the hope that it will be useful,\n"
3687 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3688 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
3689 "Lesser General Public License for more details.\n"
3691 "You should have received a copy of the GNU Lesser General Public\n"
3692 "License along with FFmpeg; if not, write to the Free Software\n"
3693 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
3699 static void show_help(void)
3702 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3703 "Hyper fast Audio and Video encoder\n");
3705 show_help_options(options, "Main options:\n",
3706 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
3707 show_help_options(options, "\nVideo options:\n",
3708 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3710 show_help_options(options, "\nAdvanced Video options:\n",
3711 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3712 OPT_VIDEO | OPT_EXPERT);
3713 show_help_options(options, "\nAudio options:\n",
3714 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3716 show_help_options(options, "\nAdvanced Audio options:\n",
3717 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3718 OPT_AUDIO | OPT_EXPERT);
3719 show_help_options(options, "\nSubtitle options:\n",
3720 OPT_SUBTITLE | OPT_GRAB,
3722 show_help_options(options, "\nAudio/Video grab options:\n",
3725 show_help_options(options, "\nAdvanced options:\n",
3726 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3728 av_opt_show(avctx_opts[0], NULL);
3729 av_opt_show(avformat_opts, NULL);
3734 void parse_arg_file(const char *filename)
3736 opt_output_file(filename);
3739 int main(int argc, char **argv)
3746 for(i=0; i<CODEC_TYPE_NB; i++){
3747 avctx_opts[i]= avcodec_alloc_context2(i);
3749 avformat_opts = av_alloc_format_context();
3757 parse_options(argc, argv, options);
3759 /* file converter / grab */
3760 if (nb_output_files <= 0) {
3761 fprintf(stderr, "Must supply at least one output file\n");
3765 if (nb_input_files == 0) {
3766 fprintf(stderr, "Must supply at least one input file\n");
3771 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3772 stream_maps, nb_stream_maps);
3773 ti = getutime() - ti;
3775 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3779 for(i=0;i<nb_output_files;i++) {
3780 /* maybe av_close_output_file ??? */
3781 AVFormatContext *s = output_files[i];
3783 if (!(s->oformat->flags & AVFMT_NOFILE))
3785 for(j=0;j<s->nb_streams;j++) {
3786 av_free(s->streams[j]->codec);
3787 av_free(s->streams[j]);
3791 for(i=0;i<nb_input_files;i++)
3792 av_close_input_file(input_files[i]);
3796 av_free(intra_matrix);
3797 av_free(inter_matrix);
3800 #ifdef CONFIG_POWERPC_PERF
3801 extern void powerpc_display_perf_report(void);
3802 powerpc_display_perf_report();
3803 #endif /* CONFIG_POWERPC_PERF */
3805 if (received_sigterm) {
3807 "Received signal %d: terminating.\n",
3808 (int) received_sigterm);
3812 exit(0); /* not all OS-es handle main() return value */