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"
36 #include <sys/ioctl.h>
39 #include <sys/resource.h>
42 #include <sys/types.h>
43 #include <sys/select.h>
46 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
55 #if !defined(INFINITY) && defined(HUGE_VAL)
56 #define INFINITY HUGE_VAL
59 /* select an input stream for an output stream */
60 typedef struct AVStreamMap {
64 int sync_stream_index;
67 /** select an input file for an output file */
68 typedef struct AVMetaDataMap {
73 extern const OptionDef options[];
75 static void show_help(void);
76 static void show_license(void);
77 static int opt_default(const char *opt, const char *arg);
81 static AVFormatContext *input_files[MAX_FILES];
82 static int64_t input_files_ts_offset[MAX_FILES];
83 static int nb_input_files = 0;
85 static AVFormatContext *output_files[MAX_FILES];
86 static int nb_output_files = 0;
88 static AVStreamMap stream_maps[MAX_FILES];
89 static int nb_stream_maps;
91 static AVMetaDataMap meta_data_maps[MAX_FILES];
92 static int nb_meta_data_maps;
94 static AVInputFormat *file_iformat;
95 static AVOutputFormat *file_oformat;
96 static int frame_width = 0;
97 static int frame_height = 0;
98 static float frame_aspect_ratio = 0;
99 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
100 static int frame_padtop = 0;
101 static int frame_padbottom = 0;
102 static int frame_padleft = 0;
103 static int frame_padright = 0;
104 static int padcolor[3] = {16,128,128}; /* default to black */
105 static int frame_topBand = 0;
106 static int frame_bottomBand = 0;
107 static int frame_leftBand = 0;
108 static int frame_rightBand = 0;
109 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
110 static int frame_rate = 25;
111 static int frame_rate_base = 1;
112 static float video_qscale = 0;
113 static int video_qdiff = 3;
114 static uint16_t *intra_matrix = NULL;
115 static uint16_t *inter_matrix = NULL;
116 #if 0 //experimental, (can be removed)
117 static float video_rc_qsquish=1.0;
118 static float video_rc_qmod_amp=0;
119 static int video_rc_qmod_freq=0;
121 static char *video_rc_override_string=NULL;
122 static char *video_rc_eq="tex^qComp";
123 static int me_method = ME_EPZS;
124 static int video_disable = 0;
125 static int video_discard = 0;
126 static int video_codec_id = CODEC_ID_NONE;
127 static int video_codec_tag = 0;
128 static int same_quality = 0;
129 static int do_deinterlace = 0;
130 static int strict = 0;
131 static int top_field_first = -1;
132 static int me_threshold = 0;
133 static int intra_dc_precision = 8;
134 static int loop_input = 0;
135 static int loop_output = AVFMT_NOOUTPUTLOOP;
136 static int qp_hist = 0;
138 static int intra_only = 0;
139 static int audio_sample_rate = 44100;
140 #define QSCALE_NONE -99999
141 static float audio_qscale = QSCALE_NONE;
142 static int audio_disable = 0;
143 static int audio_channels = 1;
144 static int audio_codec_id = CODEC_ID_NONE;
145 static int audio_codec_tag = 0;
146 static char *audio_language = NULL;
148 static int subtitle_codec_id = CODEC_ID_NONE;
149 static char *subtitle_language = NULL;
151 static float mux_preload= 0.5;
152 static float mux_max_delay= 0.7;
154 static int64_t recording_time = 0;
155 static int64_t start_time = 0;
156 static int64_t rec_timestamp = 0;
157 static int64_t input_ts_offset = 0;
158 static int file_overwrite = 0;
159 static char *str_title = NULL;
160 static char *str_author = NULL;
161 static char *str_copyright = NULL;
162 static char *str_comment = NULL;
163 static char *str_album = NULL;
164 static int do_benchmark = 0;
165 static int do_hex_dump = 0;
166 static int do_pkt_dump = 0;
167 static int do_psnr = 0;
168 static int do_vstats = 0;
169 static int do_pass = 0;
170 static char *pass_logfilename = NULL;
171 static int audio_stream_copy = 0;
172 static int video_stream_copy = 0;
173 static int subtitle_stream_copy = 0;
174 static int video_sync_method= 1;
175 static int audio_sync_method= 0;
176 static int copy_ts= 0;
177 static int opt_shortest = 0; //
178 static int video_global_header = 0;
180 static int rate_emu = 0;
182 static int video_channel = 0;
183 static char *video_standard = "ntsc";
185 static int audio_volume = 256;
187 static int using_stdin = 0;
188 static int using_vhook = 0;
189 static int verbose = 1;
190 static int thread_count= 1;
191 static int q_pressed = 0;
192 static int64_t video_size = 0;
193 static int64_t audio_size = 0;
194 static int64_t extra_size = 0;
195 static int nb_frames_dup = 0;
196 static int nb_frames_drop = 0;
197 static int input_sync;
198 static int limit_filesize = 0; //
200 static int pgmyuv_compatibility_hack=0;
201 static int dts_delta_threshold = 10;
203 static int sws_flags = SWS_BICUBIC;
205 const char **opt_names=NULL;
206 int opt_name_count=0;
207 AVCodecContext *avctx_opts[CODEC_TYPE_NB];
208 AVFormatContext *avformat_opts;
210 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
211 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
212 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
214 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
216 struct AVInputStream;
218 typedef struct AVOutputStream {
219 int file_index; /* file index */
220 int index; /* stream index in the output file */
221 int source_index; /* AVInputStream index */
222 AVStream *st; /* stream in the output file */
223 int encoding_needed; /* true if encoding needed for this stream */
225 /* input pts and corresponding output pts
227 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
228 struct AVInputStream *sync_ist; /* input stream to sync against */
229 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
232 AVFrame pict_tmp; /* temporary image for resampling */
233 struct SwsContext *img_resample_ctx; /* for image resampling */
237 int topBand; /* cropping area sizes */
241 int padtop; /* padding area sizes */
248 ReSampleContext *resample; /* for audio resampling */
249 AVFifoBuffer fifo; /* for compression: one audio fifo per codec */
253 typedef struct AVInputStream {
257 int discard; /* true if stream data should be discarded */
258 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
259 int64_t sample_index; /* current sample */
261 int64_t start; /* time when read started */
262 unsigned long frame; /* current frame */
263 int64_t next_pts; /* synthetic pts for cases where pkt.pts
265 int64_t pts; /* current pts */
266 int is_start; /* is 1 at the start and after a discontinuity */
269 typedef struct AVInputFile {
270 int eof_reached; /* true if eof reached */
271 int ist_index; /* index of first stream in ist_table */
272 int buffer_size; /* current total buffer size */
273 int nb_streams; /* nb streams we are aware of */
278 /* init terminal so that we can grab keys */
279 static struct termios oldtty;
282 static void term_exit(void)
285 tcsetattr (0, TCSANOW, &oldtty);
289 static volatile sig_atomic_t received_sigterm = 0;
292 sigterm_handler(int sig)
294 received_sigterm = sig;
298 static void term_init(void)
306 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
307 |INLCR|IGNCR|ICRNL|IXON);
308 tty.c_oflag |= OPOST;
309 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
310 tty.c_cflag &= ~(CSIZE|PARENB);
315 tcsetattr (0, TCSANOW, &tty);
316 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
319 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
320 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
322 register a function to be called at normal program termination
325 #ifdef CONFIG_BEOS_NETSERVER
326 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
330 /* read a key without blocking */
331 static int read_key(void)
339 #ifndef CONFIG_BEOS_NETSERVER
347 n = select(1, &rfds, NULL, NULL, &tv);
360 static int decode_interrupt_cb(void)
362 return q_pressed || (q_pressed = read_key() == 'q');
365 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
370 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
373 /* copy stream format */
374 s->nb_streams = ic->nb_streams;
375 for(i=0;i<ic->nb_streams;i++) {
378 // FIXME: a more elegant solution is needed
379 st = av_mallocz(sizeof(AVStream));
380 memcpy(st, ic->streams[i], sizeof(AVStream));
381 st->codec = avcodec_alloc_context();
382 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
386 av_close_input_file(ic);
391 get_sync_ipts(const AVOutputStream *ost)
393 const AVInputStream *ist = ost->sync_ist;
394 return (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/AV_TIME_BASE;
397 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
399 AVPacket new_pkt= *pkt;
400 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
401 &new_pkt.data, &new_pkt.size,
402 pkt->data, pkt->size,
403 pkt->flags & PKT_FLAG_KEY);
406 new_pkt.destruct= av_destruct_packet;
413 av_interleaved_write_frame(s, pkt);
416 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
418 static void do_audio_out(AVFormatContext *s,
421 unsigned char *buf, int size)
424 static uint8_t *audio_buf = NULL;
425 static uint8_t *audio_out = NULL;
426 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
428 int size_out, frame_bytes, ret;
429 AVCodecContext *enc= ost->st->codec;
431 /* SC: dynamic allocation of buffers */
433 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
435 audio_out = av_malloc(audio_out_size);
436 if (!audio_buf || !audio_out)
437 return; /* Should signal an error ! */
439 if(audio_sync_method){
440 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
441 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2);
442 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
443 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
445 //FIXME resample delay
446 if(fabs(delta) > 50){
449 byte_delta= FFMAX(byte_delta, -size);
453 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
458 static uint8_t *input_tmp= NULL;
459 input_tmp= av_realloc(input_tmp, byte_delta + size);
461 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
464 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
466 memset(input_tmp, 0, byte_delta);
467 memcpy(input_tmp + byte_delta, buf, size);
471 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
473 }else if(audio_sync_method>1){
474 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
475 assert(ost->audio_resample);
477 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
478 // 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));
479 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
483 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
484 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
486 if (ost->audio_resample) {
488 size_out = audio_resample(ost->resample,
489 (short *)buftmp, (short *)buf,
490 size / (ist->st->codec->channels * 2));
491 size_out = size_out * enc->channels * 2;
497 /* now encode as many frames as possible */
498 if (enc->frame_size > 1) {
499 /* output resampled raw samples */
500 av_fifo_write(&ost->fifo, buftmp, size_out);
502 frame_bytes = enc->frame_size * 2 * enc->channels;
504 while (av_fifo_read(&ost->fifo, audio_buf, frame_bytes) == 0) {
506 av_init_packet(&pkt);
508 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
511 pkt.stream_index= ost->index;
514 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
515 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
516 pkt.flags |= PKT_FLAG_KEY;
517 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
519 ost->sync_opts += enc->frame_size;
523 av_init_packet(&pkt);
525 ost->sync_opts += size_out / (2 * enc->channels);
527 /* output a pcm frame */
528 /* XXX: change encoding codec API to avoid this ? */
529 switch(enc->codec->id) {
530 case CODEC_ID_PCM_S32LE:
531 case CODEC_ID_PCM_S32BE:
532 case CODEC_ID_PCM_U32LE:
533 case CODEC_ID_PCM_U32BE:
534 size_out = size_out << 1;
536 case CODEC_ID_PCM_S24LE:
537 case CODEC_ID_PCM_S24BE:
538 case CODEC_ID_PCM_U24LE:
539 case CODEC_ID_PCM_U24BE:
540 case CODEC_ID_PCM_S24DAUD:
541 size_out = size_out / 2 * 3;
543 case CODEC_ID_PCM_S16LE:
544 case CODEC_ID_PCM_S16BE:
545 case CODEC_ID_PCM_U16LE:
546 case CODEC_ID_PCM_U16BE:
549 size_out = size_out >> 1;
552 ret = avcodec_encode_audio(enc, audio_out, size_out,
555 pkt.stream_index= ost->index;
558 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
559 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
560 pkt.flags |= PKT_FLAG_KEY;
561 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
565 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
569 AVPicture picture_tmp;
572 dec = ist->st->codec;
574 /* deinterlace : must be done before any resize */
575 if (do_deinterlace || using_vhook) {
578 /* create temporary picture */
579 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
580 buf = av_malloc(size);
584 picture2 = &picture_tmp;
585 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
588 if(avpicture_deinterlace(picture2, picture,
589 dec->pix_fmt, dec->width, dec->height) < 0) {
590 /* if error, do not deinterlace */
596 av_picture_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
602 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
604 if (picture != picture2)
605 *picture = *picture2;
609 /* we begin to correct av delay at this threshold */
610 #define AV_DELAY_MAX 0.100
612 static void do_subtitle_out(AVFormatContext *s,
618 static uint8_t *subtitle_out = NULL;
619 int subtitle_out_max_size = 65536;
620 int subtitle_out_size, nb, i;
624 if (pts == AV_NOPTS_VALUE) {
625 fprintf(stderr, "Subtitle packets must have a pts\n");
629 enc = ost->st->codec;
632 subtitle_out = av_malloc(subtitle_out_max_size);
635 /* Note: DVB subtitle need one packet to draw them and one other
636 packet to clear them */
637 /* XXX: signal it in the codec context ? */
638 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
643 for(i = 0; i < nb; i++) {
644 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
645 subtitle_out_max_size, sub);
647 av_init_packet(&pkt);
648 pkt.stream_index = ost->index;
649 pkt.data = subtitle_out;
650 pkt.size = subtitle_out_size;
651 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);
652 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
653 /* XXX: the pts correction is handled here. Maybe handling
654 it in the codec would be better */
656 pkt.pts += 90 * sub->start_display_time;
658 pkt.pts += 90 * sub->end_display_time;
660 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
664 static int bit_buffer_size= 1024*256;
665 static uint8_t *bit_buffer= NULL;
667 static void do_video_out(AVFormatContext *s,
673 int nb_frames, i, ret;
674 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
675 AVFrame picture_crop_temp, picture_pad_temp;
676 AVCodecContext *enc, *dec;
678 avcodec_get_frame_defaults(&picture_crop_temp);
679 avcodec_get_frame_defaults(&picture_pad_temp);
681 enc = ost->st->codec;
682 dec = ist->st->codec;
684 /* by default, we output a single frame */
689 if(video_sync_method){
691 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
692 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
695 else if (vdelta > 1.1)
696 nb_frames = lrintf(vdelta);
697 //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);
701 fprintf(stderr, "*** drop!\n");
702 }else if (nb_frames > 1) {
703 nb_frames_dup += nb_frames;
705 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
708 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
710 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
714 if (ost->video_crop) {
715 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
716 av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
719 formatted_picture = &picture_crop_temp;
721 formatted_picture = in_picture;
724 final_picture = formatted_picture;
725 padding_src = formatted_picture;
726 resampling_dst = &ost->pict_tmp;
727 if (ost->video_pad) {
728 final_picture = &ost->pict_tmp;
729 if (ost->video_resample) {
730 if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
731 av_log(NULL, AV_LOG_ERROR, "error padding picture\n");
734 resampling_dst = &picture_pad_temp;
738 if (ost->video_resample) {
740 final_picture = &ost->pict_tmp;
741 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
742 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
745 if (ost->video_pad) {
746 av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
747 enc->height, enc->width, enc->pix_fmt,
748 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
751 /* duplicates frame if needed */
752 for(i=0;i<nb_frames;i++) {
754 av_init_packet(&pkt);
755 pkt.stream_index= ost->index;
757 if (s->oformat->flags & AVFMT_RAWPICTURE) {
758 /* raw pictures are written as AVPicture structure to
759 avoid any copies. We support temorarily the older
761 AVFrame* old_frame = enc->coded_frame;
762 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
763 pkt.data= (uint8_t *)final_picture;
764 pkt.size= sizeof(AVPicture);
765 if(dec->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
766 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
767 if(dec->coded_frame && dec->coded_frame->key_frame)
768 pkt.flags |= PKT_FLAG_KEY;
770 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
771 enc->coded_frame = old_frame;
775 big_picture= *final_picture;
776 /* better than nothing: use input picture interlaced
778 big_picture.interlaced_frame = in_picture->interlaced_frame;
779 if(avctx_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
780 if(top_field_first == -1)
781 big_picture.top_field_first = in_picture->top_field_first;
783 big_picture.top_field_first = top_field_first;
786 /* handles sameq here. This is not correct because it may
787 not be a global option */
789 big_picture.quality = ist->st->quality;
791 big_picture.quality = ost->st->quality;
793 big_picture.pict_type = 0;
794 // big_picture.pts = AV_NOPTS_VALUE;
795 big_picture.pts= ost->sync_opts;
796 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
797 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
798 ret = avcodec_encode_video(enc,
799 bit_buffer, bit_buffer_size,
802 fprintf(stderr, "Video encoding failed\n");
805 //enc->frame_number = enc->real_pict_num;
807 pkt.data= bit_buffer;
809 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
810 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
811 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
812 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
813 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
815 if(enc->coded_frame && enc->coded_frame->key_frame)
816 pkt.flags |= PKT_FLAG_KEY;
817 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
819 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
820 // enc->frame_number-1, enc->real_pict_num, ret,
822 /* if two pass, output log */
823 if (ost->logfile && enc->stats_out) {
824 fprintf(ost->logfile, "%s", enc->stats_out);
833 static double psnr(double d){
834 if(d==0) return INFINITY;
835 return -10.0*log(d)/log(10.0);
838 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
841 static FILE *fvstats=NULL;
848 double ti1, bitrate, avg_bitrate;
852 today = localtime(&today2);
853 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour,
856 fvstats = fopen(filename,"w");
864 enc = ost->st->codec;
865 if (enc->codec_type == CODEC_TYPE_VIDEO) {
866 frame_number = ost->frame_number;
867 fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
868 if (enc->flags&CODEC_FLAG_PSNR)
869 fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
871 fprintf(fvstats,"f_size= %6d ", frame_size);
872 /* compute pts value */
873 ti1 = ost->sync_opts * av_q2d(enc->time_base);
877 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
878 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
879 fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
880 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
881 fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
885 static void print_report(AVFormatContext **output_files,
886 AVOutputStream **ost_table, int nb_ostreams,
891 AVFormatContext *oc, *os;
894 int frame_number, vid, i;
895 double bitrate, ti1, pts;
896 static int64_t last_time = -1;
897 static int qp_histogram[52];
899 if (!is_last_report) {
901 /* display the report every 0.5 seconds */
902 cur_time = av_gettime();
903 if (last_time == -1) {
904 last_time = cur_time;
907 if ((cur_time - last_time) < 500000)
909 last_time = cur_time;
913 oc = output_files[0];
915 total_size = url_ftell(&oc->pb);
920 for(i=0;i<nb_ostreams;i++) {
922 os = output_files[ost->file_index];
923 enc = ost->st->codec;
924 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
925 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
926 enc->coded_frame->quality/(float)FF_QP2LAMBDA);
928 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
929 frame_number = ost->frame_number;
930 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d q=%3.1f ",
931 frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
933 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
934 if(qp_hist && enc->coded_frame){
936 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
937 if(qp>=0 && qp<sizeof(qp_histogram)/sizeof(int))
940 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
942 if (enc->flags&CODEC_FLAG_PSNR){
944 double error, error_sum=0;
945 double scale, scale_sum=0;
946 char type[3]= {'Y','U','V'};
947 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
950 error= enc->error[j];
951 scale= enc->width*enc->height*255.0*255.0*frame_number;
953 error= enc->coded_frame->error[j];
954 scale= enc->width*enc->height*255.0*255.0;
959 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
961 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
965 /* compute min output value */
966 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
967 if ((pts < ti1) && (pts > 0))
973 if (verbose || is_last_report) {
974 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
976 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
977 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
978 (double)total_size / 1024, ti1, bitrate);
981 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
982 nb_frames_dup, nb_frames_drop);
985 fprintf(stderr, "%s \r", buf);
990 if (is_last_report && verbose >= 0){
991 int64_t raw= audio_size + video_size + extra_size;
992 fprintf(stderr, "\n");
993 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
997 100.0*(total_size - raw)/raw
1002 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1003 static int output_packet(AVInputStream *ist, int ist_index,
1004 AVOutputStream **ost_table, int nb_ostreams,
1005 const AVPacket *pkt)
1007 AVFormatContext *os;
1008 AVOutputStream *ost;
1012 int data_size, got_picture;
1014 void *buffer_to_free;
1015 static unsigned int samples_size= 0;
1016 static short *samples= NULL;
1017 AVSubtitle subtitle, *subtitle_to_free;
1021 ist->pts= ist->next_pts; // needed for last packet if vsync=0
1022 } else if (pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1023 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1025 // assert(ist->pts == ist->next_pts);
1039 /* decode the packet if needed */
1040 data_buf = NULL; /* fail safe */
1042 subtitle_to_free = NULL;
1043 if (ist->decoding_needed) {
1044 switch(ist->st->codec->codec_type) {
1045 case CODEC_TYPE_AUDIO:{
1047 samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE));
1048 data_size= samples_size;
1049 /* XXX: could avoid copy if PCM 16 bits with same
1050 endianness as CPU */
1051 ret = avcodec_decode_audio2(ist->st->codec, samples, &data_size,
1057 /* Some bug in mpeg audio decoder gives */
1058 /* data_size < 0, it seems they are overflows */
1059 if (data_size <= 0) {
1060 /* no audio frame */
1063 data_buf = (uint8_t *)samples;
1064 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1065 (ist->st->codec->sample_rate * ist->st->codec->channels);
1067 case CODEC_TYPE_VIDEO:
1068 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1069 /* XXX: allocate picture correctly */
1070 avcodec_get_frame_defaults(&picture);
1072 ret = avcodec_decode_video(ist->st->codec,
1073 &picture, &got_picture, ptr, len);
1074 ist->st->quality= picture.quality;
1078 /* no picture yet */
1079 goto discard_packet;
1081 if (ist->st->codec->time_base.num != 0) {
1082 ist->next_pts += ((int64_t)AV_TIME_BASE *
1083 ist->st->codec->time_base.num) /
1084 ist->st->codec->time_base.den;
1088 case CODEC_TYPE_SUBTITLE:
1089 ret = avcodec_decode_subtitle(ist->st->codec,
1090 &subtitle, &got_subtitle, ptr, len);
1093 if (!got_subtitle) {
1094 goto discard_packet;
1096 subtitle_to_free = &subtitle;
1103 switch(ist->st->codec->codec_type) {
1104 case CODEC_TYPE_AUDIO:
1105 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1106 (ist->st->codec->sample_rate * ist->st->codec->channels);
1108 case CODEC_TYPE_VIDEO:
1109 if (ist->st->codec->time_base.num != 0) {
1110 ist->next_pts += ((int64_t)AV_TIME_BASE *
1111 ist->st->codec->time_base.num) /
1112 ist->st->codec->time_base.den;
1122 buffer_to_free = NULL;
1123 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1124 pre_process_video_frame(ist, (AVPicture *)&picture,
1128 // preprocess audio (volume)
1129 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1130 if (audio_volume != 256) {
1133 for(i=0;i<(data_size / sizeof(short));i++) {
1134 int v = ((*volp) * audio_volume + 128) >> 8;
1135 if (v < -32768) v = -32768;
1136 if (v > 32767) v = 32767;
1142 /* frame rate emulation */
1143 if (ist->st->codec->rate_emu) {
1144 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
1145 int64_t now = av_gettime() - ist->start;
1153 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1154 is the one of the next displayed one */
1155 /* XXX: add mpeg4 too ? */
1156 if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
1157 if (ist->st->codec->pict_type != B_TYPE) {
1159 tmp = ist->last_ip_pts;
1160 ist->last_ip_pts = ist->frac_pts.val;
1161 ist->frac_pts.val = tmp;
1165 /* if output time reached then transcode raw format,
1166 encode packets and output them */
1167 if (start_time == 0 || ist->pts >= start_time)
1168 for(i=0;i<nb_ostreams;i++) {
1172 if (ost->source_index == ist_index) {
1173 os = output_files[ost->file_index];
1176 printf("%d: got pts=%0.3f %0.3f\n", i,
1177 (double)pkt->pts / AV_TIME_BASE,
1178 ((double)ist->pts / AV_TIME_BASE) -
1179 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1181 /* set the input output pts pairs */
1182 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1184 if (ost->encoding_needed) {
1185 switch(ost->st->codec->codec_type) {
1186 case CODEC_TYPE_AUDIO:
1187 do_audio_out(os, ost, ist, data_buf, data_size);
1189 case CODEC_TYPE_VIDEO:
1190 do_video_out(os, ost, ist, &picture, &frame_size);
1191 video_size += frame_size;
1192 if (do_vstats && frame_size)
1193 do_video_stats(os, ost, frame_size);
1195 case CODEC_TYPE_SUBTITLE:
1196 do_subtitle_out(os, ost, ist, &subtitle,
1203 AVFrame avframe; //FIXME/XXX remove this
1205 av_init_packet(&opkt);
1207 /* no reencoding needed : output the packet directly */
1208 /* force the input stream PTS */
1210 avcodec_get_frame_defaults(&avframe);
1211 ost->st->codec->coded_frame= &avframe;
1212 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1214 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1215 audio_size += data_size;
1216 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1217 video_size += data_size;
1221 opkt.stream_index= ost->index;
1222 if(pkt->pts != AV_NOPTS_VALUE)
1223 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);
1225 opkt.pts= AV_NOPTS_VALUE;
1229 if (pkt->dts == AV_NOPTS_VALUE)
1230 dts = ist->next_pts;
1232 dts= av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1233 opkt.dts= av_rescale_q(dts + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
1235 opkt.flags= pkt->flags;
1237 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1238 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1239 opkt.destruct= av_destruct_packet;
1241 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][pkt->stream_index]);
1242 ost->st->codec->frame_number++;
1243 ost->frame_number++;
1244 av_free_packet(&opkt);
1248 av_free(buffer_to_free);
1249 /* XXX: allocate the subtitles in the codec ? */
1250 if (subtitle_to_free) {
1251 if (subtitle_to_free->rects != NULL) {
1252 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1253 av_free(subtitle_to_free->rects[i].bitmap);
1254 av_free(subtitle_to_free->rects[i].rgba_palette);
1256 av_freep(&subtitle_to_free->rects);
1258 subtitle_to_free->num_rects = 0;
1259 subtitle_to_free = NULL;
1266 for(i=0;i<nb_ostreams;i++) {
1268 if (ost->source_index == ist_index) {
1269 AVCodecContext *enc= ost->st->codec;
1270 os = output_files[ost->file_index];
1272 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1274 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1277 if (ost->encoding_needed) {
1281 av_init_packet(&pkt);
1282 pkt.stream_index= ost->index;
1284 switch(ost->st->codec->codec_type) {
1285 case CODEC_TYPE_AUDIO:
1286 fifo_bytes = av_fifo_size(&ost->fifo);
1288 /* encode any samples remaining in fifo */
1289 if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1290 int fs_tmp = enc->frame_size;
1291 enc->frame_size = fifo_bytes / (2 * enc->channels);
1292 if(av_fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes) == 0) {
1293 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1295 enc->frame_size = fs_tmp;
1298 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1301 pkt.flags |= PKT_FLAG_KEY;
1303 case CODEC_TYPE_VIDEO:
1304 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1306 if(enc->coded_frame && enc->coded_frame->key_frame)
1307 pkt.flags |= PKT_FLAG_KEY;
1308 if (ost->logfile && enc->stats_out) {
1309 fprintf(ost->logfile, "%s", enc->stats_out);
1318 pkt.data= bit_buffer;
1320 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1321 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1322 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1336 * The following code is the main loop of the file converter
1338 static int av_encode(AVFormatContext **output_files,
1339 int nb_output_files,
1340 AVFormatContext **input_files,
1342 AVStreamMap *stream_maps, int nb_stream_maps)
1344 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1345 AVFormatContext *is, *os;
1346 AVCodecContext *codec, *icodec;
1347 AVOutputStream *ost, **ost_table = NULL;
1348 AVInputStream *ist, **ist_table = NULL;
1349 AVInputFile *file_table;
1352 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1356 /* input stream init */
1358 for(i=0;i<nb_input_files;i++) {
1359 is = input_files[i];
1360 file_table[i].ist_index = j;
1361 file_table[i].nb_streams = is->nb_streams;
1362 j += is->nb_streams;
1366 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1370 for(i=0;i<nb_istreams;i++) {
1371 ist = av_mallocz(sizeof(AVInputStream));
1377 for(i=0;i<nb_input_files;i++) {
1378 is = input_files[i];
1379 for(k=0;k<is->nb_streams;k++) {
1380 ist = ist_table[j++];
1381 ist->st = is->streams[k];
1382 ist->file_index = i;
1384 ist->discard = 1; /* the stream is discarded by default
1387 if (ist->st->codec->rate_emu) {
1388 ist->start = av_gettime();
1394 /* output stream init */
1396 for(i=0;i<nb_output_files;i++) {
1397 os = output_files[i];
1398 if (!os->nb_streams) {
1399 fprintf(stderr, "Output file does not contain any stream\n");
1402 nb_ostreams += os->nb_streams;
1404 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1405 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1409 /* Sanity check the mapping args -- do the input files & streams exist? */
1410 for(i=0;i<nb_stream_maps;i++) {
1411 int fi = stream_maps[i].file_index;
1412 int si = stream_maps[i].stream_index;
1414 if (fi < 0 || fi > nb_input_files - 1 ||
1415 si < 0 || si > file_table[fi].nb_streams - 1) {
1416 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1419 fi = stream_maps[i].sync_file_index;
1420 si = stream_maps[i].sync_stream_index;
1421 if (fi < 0 || fi > nb_input_files - 1 ||
1422 si < 0 || si > file_table[fi].nb_streams - 1) {
1423 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1428 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1431 for(i=0;i<nb_ostreams;i++) {
1432 ost = av_mallocz(sizeof(AVOutputStream));
1439 for(k=0;k<nb_output_files;k++) {
1440 os = output_files[k];
1441 for(i=0;i<os->nb_streams;i++) {
1443 ost = ost_table[n++];
1444 ost->file_index = k;
1446 ost->st = os->streams[i];
1447 if (nb_stream_maps > 0) {
1448 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1449 stream_maps[n-1].stream_index;
1451 /* Sanity check that the stream types match */
1452 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1453 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1454 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1455 ost->file_index, ost->index);
1460 /* get corresponding input stream index : we select the first one with the right type */
1462 for(j=0;j<nb_istreams;j++) {
1465 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1466 ost->source_index = j;
1473 /* try again and reuse existing stream */
1474 for(j=0;j<nb_istreams;j++) {
1476 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1477 ost->source_index = j;
1482 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1483 ost->file_index, ost->index);
1488 ist = ist_table[ost->source_index];
1490 ost->sync_ist = (nb_stream_maps > 0) ?
1491 ist_table[file_table[stream_maps[n-1].sync_file_index].ist_index +
1492 stream_maps[n-1].sync_stream_index] : ist;
1496 /* for each output stream, we compute the right encoding parameters */
1497 for(i=0;i<nb_ostreams;i++) {
1499 ist = ist_table[ost->source_index];
1501 codec = ost->st->codec;
1502 icodec = ist->st->codec;
1504 if (ost->st->stream_copy) {
1505 /* if stream_copy is selected, no need to decode or encode */
1506 codec->codec_id = icodec->codec_id;
1507 codec->codec_type = icodec->codec_type;
1508 if(!codec->codec_tag) codec->codec_tag = icodec->codec_tag;
1509 codec->bit_rate = icodec->bit_rate;
1510 codec->extradata= icodec->extradata;
1511 codec->extradata_size= icodec->extradata_size;
1512 if(av_q2d(icodec->time_base) > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000)
1513 codec->time_base = icodec->time_base;
1515 codec->time_base = ist->st->time_base;
1516 switch(codec->codec_type) {
1517 case CODEC_TYPE_AUDIO:
1518 codec->sample_rate = icodec->sample_rate;
1519 codec->channels = icodec->channels;
1520 codec->frame_size = icodec->frame_size;
1521 codec->block_align= icodec->block_align;
1523 case CODEC_TYPE_VIDEO:
1525 fprintf(stderr,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");
1528 codec->pix_fmt = icodec->pix_fmt;
1529 codec->width = icodec->width;
1530 codec->height = icodec->height;
1531 codec->has_b_frames = icodec->has_b_frames;
1533 case CODEC_TYPE_SUBTITLE:
1539 switch(codec->codec_type) {
1540 case CODEC_TYPE_AUDIO:
1541 if (av_fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1544 if (codec->channels == icodec->channels &&
1545 codec->sample_rate == icodec->sample_rate) {
1546 ost->audio_resample = 0;
1548 if (codec->channels != icodec->channels &&
1549 (icodec->codec_id == CODEC_ID_AC3 ||
1550 icodec->codec_id == CODEC_ID_DTS)) {
1551 /* Special case for 5:1 AC3 and DTS input */
1552 /* and mono or stereo output */
1553 /* Request specific number of channels */
1554 icodec->channels = codec->channels;
1555 if (codec->sample_rate == icodec->sample_rate)
1556 ost->audio_resample = 0;
1558 ost->audio_resample = 1;
1561 ost->audio_resample = 1;
1564 if(audio_sync_method>1)
1565 ost->audio_resample = 1;
1567 if(ost->audio_resample){
1568 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1569 codec->sample_rate, icodec->sample_rate);
1571 printf("Can't resample. Aborting.\n");
1575 ist->decoding_needed = 1;
1576 ost->encoding_needed = 1;
1578 case CODEC_TYPE_VIDEO:
1579 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1580 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1581 ost->video_resample = ((codec->width != icodec->width -
1582 (frame_leftBand + frame_rightBand) +
1583 (frame_padleft + frame_padright)) ||
1584 (codec->height != icodec->height -
1585 (frame_topBand + frame_bottomBand) +
1586 (frame_padtop + frame_padbottom)) ||
1587 (codec->pix_fmt != icodec->pix_fmt));
1588 if (ost->video_crop) {
1589 ost->topBand = frame_topBand;
1590 ost->leftBand = frame_leftBand;
1592 if (ost->video_pad) {
1593 ost->padtop = frame_padtop;
1594 ost->padleft = frame_padleft;
1595 ost->padbottom = frame_padbottom;
1596 ost->padright = frame_padright;
1597 if (!ost->video_resample) {
1598 avcodec_get_frame_defaults(&ost->pict_tmp);
1599 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1600 codec->width, codec->height ) )
1604 if (ost->video_resample) {
1605 avcodec_get_frame_defaults(&ost->pict_tmp);
1606 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1607 codec->width, codec->height ) )
1610 ost->img_resample_ctx = sws_getContext(
1611 icodec->width - (frame_leftBand + frame_rightBand),
1612 icodec->height - (frame_topBand + frame_bottomBand),
1614 codec->width - (frame_padleft + frame_padright),
1615 codec->height - (frame_padtop + frame_padbottom),
1617 sws_flags, NULL, NULL, NULL);
1618 if (ost->img_resample_ctx == NULL) {
1619 fprintf(stderr, "Cannot get resampling context\n");
1622 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1624 ost->encoding_needed = 1;
1625 ist->decoding_needed = 1;
1627 case CODEC_TYPE_SUBTITLE:
1628 ost->encoding_needed = 1;
1629 ist->decoding_needed = 1;
1636 if (ost->encoding_needed &&
1637 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1638 char logfilename[1024];
1643 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1645 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1646 if (codec->flags & CODEC_FLAG_PASS1) {
1647 f = fopen(logfilename, "w");
1649 perror(logfilename);
1654 /* read the log file */
1655 f = fopen(logfilename, "r");
1657 perror(logfilename);
1660 fseek(f, 0, SEEK_END);
1662 fseek(f, 0, SEEK_SET);
1663 logbuffer = av_malloc(size + 1);
1665 fprintf(stderr, "Could not allocate log buffer\n");
1668 size = fread(logbuffer, 1, size, f);
1670 logbuffer[size] = '\0';
1671 codec->stats_in = logbuffer;
1675 if(codec->codec_type == CODEC_TYPE_VIDEO){
1676 int size= codec->width * codec->height;
1677 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1682 bit_buffer = av_malloc(bit_buffer_size);
1686 /* dump the file output parameters - cannot be done before in case
1688 for(i=0;i<nb_output_files;i++) {
1689 dump_format(output_files[i], i, output_files[i]->filename, 1);
1692 /* dump the stream mapping */
1694 fprintf(stderr, "Stream mapping:\n");
1695 for(i=0;i<nb_ostreams;i++) {
1697 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1698 ist_table[ost->source_index]->file_index,
1699 ist_table[ost->source_index]->index,
1702 if (ost->sync_ist != ist_table[ost->source_index])
1703 fprintf(stderr, " [sync #%d.%d]",
1704 ost->sync_ist->file_index,
1705 ost->sync_ist->index);
1706 fprintf(stderr, "\n");
1710 /* open each encoder */
1711 for(i=0;i<nb_ostreams;i++) {
1713 if (ost->encoding_needed) {
1715 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1717 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1718 ost->file_index, ost->index);
1721 if (avcodec_open(ost->st->codec, codec) < 0) {
1722 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1723 ost->file_index, ost->index);
1726 extra_size += ost->st->codec->extradata_size;
1730 /* open each decoder */
1731 for(i=0;i<nb_istreams;i++) {
1733 if (ist->decoding_needed) {
1735 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1737 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1738 ist->st->codec->codec_id, ist->file_index, ist->index);
1741 if (avcodec_open(ist->st->codec, codec) < 0) {
1742 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1743 ist->file_index, ist->index);
1746 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1747 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1752 for(i=0;i<nb_istreams;i++) {
1754 is = input_files[ist->file_index];
1756 ist->next_pts = av_rescale_q(ist->st->start_time, ist->st->time_base, AV_TIME_BASE_Q);
1757 if(ist->st->start_time == AV_NOPTS_VALUE)
1759 if(input_files_ts_offset[ist->file_index])
1760 ist->next_pts= AV_NOPTS_VALUE;
1764 /* set meta data information from input file if required */
1765 for (i=0;i<nb_meta_data_maps;i++) {
1766 AVFormatContext *out_file;
1767 AVFormatContext *in_file;
1769 int out_file_index = meta_data_maps[i].out_file;
1770 int in_file_index = meta_data_maps[i].in_file;
1771 if ( out_file_index < 0 || out_file_index >= nb_output_files ) {
1772 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1773 ret = AVERROR(EINVAL);
1776 if ( in_file_index < 0 || in_file_index >= nb_input_files ) {
1777 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1778 ret = AVERROR(EINVAL);
1782 out_file = output_files[out_file_index];
1783 in_file = input_files[in_file_index];
1785 strcpy(out_file->title, in_file->title);
1786 strcpy(out_file->author, in_file->author);
1787 strcpy(out_file->copyright, in_file->copyright);
1788 strcpy(out_file->comment, in_file->comment);
1789 strcpy(out_file->album, in_file->album);
1790 out_file->year = in_file->year;
1791 out_file->track = in_file->track;
1792 strcpy(out_file->genre, in_file->genre);
1795 /* open files and write file headers */
1796 for(i=0;i<nb_output_files;i++) {
1797 os = output_files[i];
1798 if (av_write_header(os) < 0) {
1799 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1800 ret = AVERROR(EINVAL);
1805 if ( !using_stdin && verbose >= 0) {
1806 fprintf(stderr, "Press [q] to stop encoding\n");
1807 url_set_interrupt_cb(decode_interrupt_cb);
1813 for(; received_sigterm == 0;) {
1814 int file_index, ist_index;
1822 /* if 'q' pressed, exits */
1826 /* read_key() returns 0 on EOF */
1832 /* select the stream that we must read now by looking at the
1833 smallest output pts */
1835 for(i=0;i<nb_ostreams;i++) {
1838 os = output_files[ost->file_index];
1839 ist = ist_table[ost->source_index];
1840 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
1841 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
1843 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
1844 ipts = (double)ist->pts;
1845 if (!file_table[ist->file_index].eof_reached){
1846 if(ipts < ipts_min) {
1848 if(input_sync ) file_index = ist->file_index;
1850 if(opts < opts_min) {
1852 if(!input_sync) file_index = ist->file_index;
1855 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
1860 /* if none, if is finished */
1861 if (file_index < 0) {
1865 /* finish if recording time exhausted */
1866 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
1869 /* finish if limit size exhausted */
1870 if (limit_filesize != 0 && (limit_filesize * 1024) < url_ftell(&output_files[0]->pb))
1873 /* read a frame from it and output it in the fifo */
1874 is = input_files[file_index];
1875 if (av_read_frame(is, &pkt) < 0) {
1876 file_table[file_index].eof_reached = 1;
1877 if (opt_shortest) break; else continue; //
1881 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
1883 /* the following test is needed in case new streams appear
1884 dynamically in stream : we ignore them */
1885 if (pkt.stream_index >= file_table[file_index].nb_streams)
1886 goto discard_packet;
1887 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1888 ist = ist_table[ist_index];
1890 goto discard_packet;
1892 // 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);
1893 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
1894 int64_t delta= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q) - ist->next_pts;
1895 if(FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE && !copy_ts){
1896 input_files_ts_offset[ist->file_index]-= delta;
1898 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
1899 for(i=0; i<file_table[file_index].nb_streams; i++){
1900 int index= file_table[file_index].ist_index + i;
1901 ist_table[index]->next_pts += delta;
1902 ist_table[index]->is_start=1;
1907 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1908 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1911 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1912 ist->file_index, ist->index);
1914 av_free_packet(&pkt);
1919 av_free_packet(&pkt);
1921 /* dump report by using the output first video and audio streams */
1922 print_report(output_files, ost_table, nb_ostreams, 0);
1925 /* at the end of stream, we must flush the decoder buffers */
1926 for(i=0;i<nb_istreams;i++) {
1928 if (ist->decoding_needed) {
1929 output_packet(ist, i, ost_table, nb_ostreams, NULL);
1935 /* write the trailer if needed and close file */
1936 for(i=0;i<nb_output_files;i++) {
1937 os = output_files[i];
1938 av_write_trailer(os);
1941 /* dump report by using the first video and audio streams */
1942 print_report(output_files, ost_table, nb_ostreams, 1);
1944 /* close each encoder */
1945 for(i=0;i<nb_ostreams;i++) {
1947 if (ost->encoding_needed) {
1948 av_freep(&ost->st->codec->stats_in);
1949 avcodec_close(ost->st->codec);
1953 /* close each decoder */
1954 for(i=0;i<nb_istreams;i++) {
1956 if (ist->decoding_needed) {
1957 avcodec_close(ist->st->codec);
1965 av_freep(&bit_buffer);
1966 av_free(file_table);
1969 for(i=0;i<nb_istreams;i++) {
1976 for(i=0;i<nb_ostreams;i++) {
1980 fclose(ost->logfile);
1981 ost->logfile = NULL;
1983 av_fifo_free(&ost->fifo); /* works even if fifo is not
1984 initialized but set to zero */
1985 av_free(ost->pict_tmp.data[0]);
1986 if (ost->video_resample)
1987 sws_freeContext(ost->img_resample_ctx);
1988 if (ost->audio_resample)
1989 audio_resample_close(ost->resample);
1997 ret = AVERROR(ENOMEM);
2002 int file_read(const char *filename)
2005 unsigned char buffer[1024];
2008 if (url_open(&h, filename, O_RDONLY) < 0) {
2009 printf("could not open '%s'\n", filename);
2013 len = url_read(h, buffer, sizeof(buffer));
2016 for(i=0;i<len;i++) putchar(buffer[i]);
2023 static void opt_format(const char *arg)
2025 /* compatibility stuff for pgmyuv */
2026 if (!strcmp(arg, "pgmyuv")) {
2027 pgmyuv_compatibility_hack=1;
2028 // opt_image_format(arg);
2030 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2033 file_iformat = av_find_input_format(arg);
2034 file_oformat = guess_format(arg, NULL, NULL);
2035 if (!file_iformat && !file_oformat) {
2036 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2041 static void opt_video_rc_eq(char *arg)
2046 static void opt_video_rc_override_string(char *arg)
2048 video_rc_override_string = arg;
2051 static void opt_me_threshold(const char *arg)
2053 me_threshold = atoi(arg);
2056 static void opt_verbose(const char *arg)
2058 verbose = atoi(arg);
2059 av_log_level = atoi(arg);
2062 static void opt_frame_rate(const char *arg)
2064 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
2065 fprintf(stderr, "Incorrect frame rate\n");
2070 static void opt_frame_crop_top(const char *arg)
2072 frame_topBand = atoi(arg);
2073 if (frame_topBand < 0) {
2074 fprintf(stderr, "Incorrect top crop size\n");
2077 if ((frame_topBand % 2) != 0) {
2078 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2081 if ((frame_topBand) >= frame_height){
2082 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2085 frame_height -= frame_topBand;
2088 static void opt_frame_crop_bottom(const char *arg)
2090 frame_bottomBand = atoi(arg);
2091 if (frame_bottomBand < 0) {
2092 fprintf(stderr, "Incorrect bottom crop size\n");
2095 if ((frame_bottomBand % 2) != 0) {
2096 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2099 if ((frame_bottomBand) >= frame_height){
2100 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2103 frame_height -= frame_bottomBand;
2106 static void opt_frame_crop_left(const char *arg)
2108 frame_leftBand = atoi(arg);
2109 if (frame_leftBand < 0) {
2110 fprintf(stderr, "Incorrect left crop size\n");
2113 if ((frame_leftBand % 2) != 0) {
2114 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2117 if ((frame_leftBand) >= frame_width){
2118 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2121 frame_width -= frame_leftBand;
2124 static void opt_frame_crop_right(const char *arg)
2126 frame_rightBand = atoi(arg);
2127 if (frame_rightBand < 0) {
2128 fprintf(stderr, "Incorrect right crop size\n");
2131 if ((frame_rightBand % 2) != 0) {
2132 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2135 if ((frame_rightBand) >= frame_width){
2136 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2139 frame_width -= frame_rightBand;
2142 static void opt_frame_size(const char *arg)
2144 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2145 fprintf(stderr, "Incorrect frame size\n");
2148 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2149 fprintf(stderr, "Frame size must be a multiple of 2\n");
2155 #define SCALEBITS 10
2156 #define ONE_HALF (1 << (SCALEBITS - 1))
2157 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2159 #define RGB_TO_Y(r, g, b) \
2160 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2161 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2163 #define RGB_TO_U(r1, g1, b1, shift)\
2164 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2165 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2167 #define RGB_TO_V(r1, g1, b1, shift)\
2168 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2169 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2171 static void opt_pad_color(const char *arg) {
2172 /* Input is expected to be six hex digits similar to
2173 how colors are expressed in html tags (but without the #) */
2174 int rgb = strtol(arg, NULL, 16);
2178 g = ((rgb >> 8) & 255);
2181 padcolor[0] = RGB_TO_Y(r,g,b);
2182 padcolor[1] = RGB_TO_U(r,g,b,0);
2183 padcolor[2] = RGB_TO_V(r,g,b,0);
2186 static void opt_frame_pad_top(const char *arg)
2188 frame_padtop = atoi(arg);
2189 if (frame_padtop < 0) {
2190 fprintf(stderr, "Incorrect top pad size\n");
2193 if ((frame_padtop % 2) != 0) {
2194 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2199 static void opt_frame_pad_bottom(const char *arg)
2201 frame_padbottom = atoi(arg);
2202 if (frame_padbottom < 0) {
2203 fprintf(stderr, "Incorrect bottom pad size\n");
2206 if ((frame_padbottom % 2) != 0) {
2207 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2213 static void opt_frame_pad_left(const char *arg)
2215 frame_padleft = atoi(arg);
2216 if (frame_padleft < 0) {
2217 fprintf(stderr, "Incorrect left pad size\n");
2220 if ((frame_padleft % 2) != 0) {
2221 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2227 static void opt_frame_pad_right(const char *arg)
2229 frame_padright = atoi(arg);
2230 if (frame_padright < 0) {
2231 fprintf(stderr, "Incorrect right pad size\n");
2234 if ((frame_padright % 2) != 0) {
2235 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2241 static void opt_frame_pix_fmt(const char *arg)
2243 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2246 static void opt_frame_aspect_ratio(const char *arg)
2252 p = strchr(arg, ':');
2254 x = strtol(arg, (char **)&arg, 10);
2256 y = strtol(arg+1, (char **)&arg, 10);
2258 ar = (double)x / (double)y;
2260 ar = strtod(arg, (char **)&arg);
2263 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2266 frame_aspect_ratio = ar;
2269 static void opt_qscale(const char *arg)
2271 video_qscale = atof(arg);
2272 if (video_qscale <= 0 ||
2273 video_qscale > 255) {
2274 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2279 static void opt_qdiff(const char *arg)
2281 video_qdiff = atoi(arg);
2282 if (video_qdiff < 0 ||
2284 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2289 static void opt_strict(const char *arg)
2294 static void opt_top_field_first(const char *arg)
2296 top_field_first= atoi(arg);
2299 static void opt_thread_count(const char *arg)
2301 thread_count= atoi(arg);
2302 #if !defined(HAVE_THREADS)
2304 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2308 static void opt_audio_rate(const char *arg)
2310 audio_sample_rate = atoi(arg);
2313 static void opt_audio_channels(const char *arg)
2315 audio_channels = atoi(arg);
2318 static void opt_video_channel(const char *arg)
2320 video_channel = strtol(arg, NULL, 0);
2323 static void opt_video_standard(const char *arg)
2325 video_standard = av_strdup(arg);
2328 static void opt_codec(int *pstream_copy, int *pcodec_id,
2329 int codec_type, const char *arg)
2333 if (!strcmp(arg, "copy")) {
2338 if (!strcmp(p->name, arg) && p->type == codec_type)
2343 fprintf(stderr, "Unknown codec '%s'\n", arg);
2351 static void opt_audio_codec(const char *arg)
2353 opt_codec(&audio_stream_copy, &audio_codec_id, CODEC_TYPE_AUDIO, arg);
2356 static void opt_audio_tag(const char *arg)
2359 audio_codec_tag= strtol(arg, &tail, 0);
2362 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2365 static void opt_video_tag(const char *arg)
2368 video_codec_tag= strtol(arg, &tail, 0);
2371 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2374 static void add_frame_hooker(const char *arg)
2379 char *args = av_strdup(arg);
2383 argv[0] = strtok(args, " ");
2384 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2387 i = frame_hook_add(argc, argv);
2390 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2395 const char *motion_str[] = {
2408 static void opt_motion_estimation(const char *arg)
2414 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2417 if (!strcmp(*p, arg))
2421 me_method = (p - motion_str) + 1;
2424 static void opt_video_codec(const char *arg)
2426 opt_codec(&video_stream_copy, &video_codec_id, CODEC_TYPE_VIDEO, arg);
2429 static void opt_subtitle_codec(const char *arg)
2431 opt_codec(&subtitle_stream_copy, &subtitle_codec_id, CODEC_TYPE_SUBTITLE, arg);
2434 static void opt_map(const char *arg)
2440 m = &stream_maps[nb_stream_maps++];
2442 m->file_index = strtol(arg, (char **)&p, 0);
2446 m->stream_index = strtol(p, (char **)&p, 0);
2449 m->sync_file_index = strtol(p, (char **)&p, 0);
2452 m->sync_stream_index = strtol(p, (char **)&p, 0);
2454 m->sync_file_index = m->file_index;
2455 m->sync_stream_index = m->stream_index;
2459 static void opt_map_meta_data(const char *arg)
2465 m = &meta_data_maps[nb_meta_data_maps++];
2467 m->out_file = strtol(arg, (char **)&p, 0);
2471 m->in_file = strtol(p, (char **)&p, 0);
2474 static void opt_recording_time(const char *arg)
2476 recording_time = parse_date(arg, 1);
2479 static void opt_start_time(const char *arg)
2481 start_time = parse_date(arg, 1);
2484 static void opt_rec_timestamp(const char *arg)
2486 rec_timestamp = parse_date(arg, 0) / 1000000;
2489 static void opt_input_ts_offset(const char *arg)
2491 input_ts_offset = parse_date(arg, 1);
2494 static void opt_input_file(const char *filename)
2496 AVFormatContext *ic;
2497 AVFormatParameters params, *ap = ¶ms;
2498 int err, i, ret, rfps, rfps_base;
2501 if (!strcmp(filename, "-"))
2504 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2505 !strcmp( filename, "/dev/stdin" );
2507 /* get default parameters from command line */
2508 ic = av_alloc_format_context();
2510 memset(ap, 0, sizeof(*ap));
2511 ap->prealloced_context = 1;
2512 ap->sample_rate = audio_sample_rate;
2513 ap->channels = audio_channels;
2514 ap->time_base.den = frame_rate;
2515 ap->time_base.num = frame_rate_base;
2516 ap->width = frame_width + frame_padleft + frame_padright;
2517 ap->height = frame_height + frame_padtop + frame_padbottom;
2518 ap->pix_fmt = frame_pix_fmt;
2519 ap->channel = video_channel;
2520 ap->standard = video_standard;
2521 ap->video_codec_id = video_codec_id;
2522 ap->audio_codec_id = audio_codec_id;
2523 if(pgmyuv_compatibility_hack)
2524 ap->video_codec_id= CODEC_ID_PGMYUV;
2526 for(i=0; i<opt_name_count; i++){
2527 const AVOption *opt;
2528 double d= av_get_double(avformat_opts, opt_names[i], &opt);
2529 if(d==d && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2530 av_set_double(ic, opt_names[i], d);
2532 /* open the input file with generic libav function */
2533 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2535 print_error(filename, err);
2539 ic->loop_input = loop_input;
2541 /* If not enough info to get the stream parameters, we decode the
2542 first frames to get it. (used in mpeg case for example) */
2543 ret = av_find_stream_info(ic);
2544 if (ret < 0 && verbose >= 0) {
2545 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2549 timestamp = start_time;
2550 /* add the stream start time */
2551 if (ic->start_time != AV_NOPTS_VALUE)
2552 timestamp += ic->start_time;
2554 /* if seeking requested, we execute it */
2555 if (start_time != 0) {
2556 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2558 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2559 filename, (double)timestamp / AV_TIME_BASE);
2561 /* reset seek info */
2565 /* update the current parameters so that they match the one of the input stream */
2566 for(i=0;i<ic->nb_streams;i++) {
2568 AVCodecContext *enc = ic->streams[i]->codec;
2569 #if defined(HAVE_THREADS)
2571 avcodec_thread_init(enc, thread_count);
2573 enc->thread_count= thread_count;
2574 switch(enc->codec_type) {
2575 case CODEC_TYPE_AUDIO:
2576 for(j=0; j<opt_name_count; j++){
2577 const AVOption *opt;
2578 double d= av_get_double(avctx_opts[CODEC_TYPE_AUDIO], opt_names[j], &opt);
2579 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2580 av_set_double(enc, opt_names[j], d);
2582 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2583 audio_channels = enc->channels;
2584 audio_sample_rate = enc->sample_rate;
2586 ic->streams[i]->discard= AVDISCARD_ALL;
2588 case CODEC_TYPE_VIDEO:
2589 for(j=0; j<opt_name_count; j++){
2590 const AVOption *opt;
2591 double d= av_get_double(avctx_opts[CODEC_TYPE_VIDEO], opt_names[j], &opt);
2592 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2593 av_set_double(enc, opt_names[j], d);
2595 frame_height = enc->height;
2596 frame_width = enc->width;
2597 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2598 frame_pix_fmt = enc->pix_fmt;
2599 rfps = ic->streams[i]->r_frame_rate.num;
2600 rfps_base = ic->streams[i]->r_frame_rate.den;
2601 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2603 enc->debug |= FF_DEBUG_MV;
2605 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2608 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2609 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2611 (float)rfps / rfps_base, rfps, rfps_base);
2613 /* update the current frame rate to match the stream frame rate */
2615 frame_rate_base = rfps_base;
2617 enc->rate_emu = rate_emu;
2619 ic->streams[i]->discard= AVDISCARD_ALL;
2620 else if(video_discard)
2621 ic->streams[i]->discard= video_discard;
2623 case CODEC_TYPE_DATA:
2625 case CODEC_TYPE_SUBTITLE:
2627 case CODEC_TYPE_UNKNOWN:
2634 input_files[nb_input_files] = ic;
2635 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2636 /* dump the file content */
2638 dump_format(ic, nb_input_files, filename, 0);
2641 file_iformat = NULL;
2642 file_oformat = NULL;
2649 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
2651 int has_video, has_audio, i, j;
2652 AVFormatContext *ic;
2656 for(j=0;j<nb_input_files;j++) {
2657 ic = input_files[j];
2658 for(i=0;i<ic->nb_streams;i++) {
2659 AVCodecContext *enc = ic->streams[i]->codec;
2660 switch(enc->codec_type) {
2661 case CODEC_TYPE_AUDIO:
2664 case CODEC_TYPE_VIDEO:
2667 case CODEC_TYPE_DATA:
2668 case CODEC_TYPE_UNKNOWN:
2669 case CODEC_TYPE_SUBTITLE:
2676 *has_video_ptr = has_video;
2677 *has_audio_ptr = has_audio;
2680 static void new_video_stream(AVFormatContext *oc)
2683 AVCodecContext *video_enc;
2686 st = av_new_stream(oc, oc->nb_streams);
2688 fprintf(stderr, "Could not alloc stream\n");
2691 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
2692 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
2693 video_bitstream_filters= NULL;
2695 #if defined(HAVE_THREADS)
2697 avcodec_thread_init(st->codec, thread_count);
2700 video_enc = st->codec;
2703 video_enc->codec_tag= video_codec_tag;
2705 if( (video_global_header&1)
2706 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
2707 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2708 avctx_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
2710 if(video_global_header&2){
2711 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
2712 avctx_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
2715 if (video_stream_copy) {
2716 st->stream_copy = 1;
2717 video_enc->codec_type = CODEC_TYPE_VIDEO;
2723 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
2724 if (video_codec_id != CODEC_ID_NONE)
2725 codec_id = video_codec_id;
2727 video_enc->codec_id = codec_id;
2728 codec = avcodec_find_encoder(codec_id);
2730 for(i=0; i<opt_name_count; i++){
2731 const AVOption *opt;
2732 double d= av_get_double(avctx_opts[CODEC_TYPE_VIDEO], opt_names[i], &opt);
2733 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
2734 av_set_double(video_enc, opt_names[i], d);
2737 video_enc->time_base.den = frame_rate;
2738 video_enc->time_base.num = frame_rate_base;
2739 if(codec && codec->supported_framerates){
2740 const AVRational *p= codec->supported_framerates;
2741 AVRational req= (AVRational){frame_rate, frame_rate_base};
2742 const AVRational *best=NULL;
2743 AVRational best_error= (AVRational){INT_MAX, 1};
2744 for(; p->den!=0; p++){
2745 AVRational error= av_sub_q(req, *p);
2746 if(error.num <0) error.num *= -1;
2747 if(av_cmp_q(error, best_error) < 0){
2752 video_enc->time_base.den= best->num;
2753 video_enc->time_base.num= best->den;
2756 video_enc->width = frame_width + frame_padright + frame_padleft;
2757 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2758 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
2759 video_enc->pix_fmt = frame_pix_fmt;
2761 if(codec && codec->pix_fmts){
2762 const enum PixelFormat *p= codec->pix_fmts;
2764 if(*p == video_enc->pix_fmt)
2768 video_enc->pix_fmt = codec->pix_fmts[0];
2772 video_enc->gop_size = 0;
2773 if (video_qscale || same_quality) {
2774 video_enc->flags |= CODEC_FLAG_QSCALE;
2775 video_enc->global_quality=
2776 st->quality = FF_QP2LAMBDA * video_qscale;
2780 video_enc->intra_matrix = intra_matrix;
2782 video_enc->inter_matrix = inter_matrix;
2784 video_enc->max_qdiff = video_qdiff;
2785 video_enc->rc_eq = video_rc_eq;
2786 video_enc->thread_count = thread_count;
2787 p= video_rc_override_string;
2790 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
2792 fprintf(stderr, "error parsing rc_override\n");
2795 video_enc->rc_override=
2796 av_realloc(video_enc->rc_override,
2797 sizeof(RcOverride)*(i+1));
2798 video_enc->rc_override[i].start_frame= start;
2799 video_enc->rc_override[i].end_frame = end;
2801 video_enc->rc_override[i].qscale= q;
2802 video_enc->rc_override[i].quality_factor= 1.0;
2805 video_enc->rc_override[i].qscale= 0;
2806 video_enc->rc_override[i].quality_factor= -q/100.0;
2811 video_enc->rc_override_count=i;
2812 if (!video_enc->rc_initial_buffer_occupancy)
2813 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
2814 video_enc->me_threshold= me_threshold;
2815 video_enc->intra_dc_precision= intra_dc_precision - 8;
2816 video_enc->strict_std_compliance = strict;
2819 video_enc->flags|= CODEC_FLAG_PSNR;
2821 video_enc->me_method = me_method;
2826 video_enc->flags |= CODEC_FLAG_PASS1;
2828 video_enc->flags |= CODEC_FLAG_PASS2;
2833 /* reset some key parameters */
2835 video_codec_id = CODEC_ID_NONE;
2836 video_stream_copy = 0;
2839 static void new_audio_stream(AVFormatContext *oc)
2842 AVCodecContext *audio_enc;
2845 st = av_new_stream(oc, oc->nb_streams);
2847 fprintf(stderr, "Could not alloc stream\n");
2850 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
2852 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
2853 audio_bitstream_filters= NULL;
2855 #if defined(HAVE_THREADS)
2857 avcodec_thread_init(st->codec, thread_count);
2860 audio_enc = st->codec;
2861 audio_enc->codec_type = CODEC_TYPE_AUDIO;
2862 audio_enc->strict_std_compliance = strict;
2865 audio_enc->codec_tag= audio_codec_tag;
2867 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
2868 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2869 avctx_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
2871 if (audio_stream_copy) {
2872 st->stream_copy = 1;
2873 audio_enc->channels = audio_channels;
2875 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
2877 for(i=0; i<opt_name_count; i++){
2878 const AVOption *opt;
2879 double d= av_get_double(avctx_opts[CODEC_TYPE_AUDIO], opt_names[i], &opt);
2880 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
2881 av_set_double(audio_enc, opt_names[i], d);
2884 if (audio_codec_id != CODEC_ID_NONE)
2885 codec_id = audio_codec_id;
2886 audio_enc->codec_id = codec_id;
2888 if (audio_qscale > QSCALE_NONE) {
2889 audio_enc->flags |= CODEC_FLAG_QSCALE;
2890 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
2892 audio_enc->thread_count = thread_count;
2893 audio_enc->channels = audio_channels;
2895 audio_enc->sample_rate = audio_sample_rate;
2896 audio_enc->time_base= (AVRational){1, audio_sample_rate};
2897 if (audio_language) {
2898 pstrcpy(st->language, sizeof(st->language), audio_language);
2899 av_free(audio_language);
2900 audio_language = NULL;
2903 /* reset some key parameters */
2905 audio_codec_id = CODEC_ID_NONE;
2906 audio_stream_copy = 0;
2909 static void opt_new_subtitle_stream(void)
2911 AVFormatContext *oc;
2913 AVCodecContext *subtitle_enc;
2916 if (nb_output_files <= 0) {
2917 fprintf(stderr, "At least one output file must be specified\n");
2920 oc = output_files[nb_output_files - 1];
2922 st = av_new_stream(oc, oc->nb_streams);
2924 fprintf(stderr, "Could not alloc stream\n");
2927 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
2929 subtitle_enc = st->codec;
2930 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
2931 if (subtitle_stream_copy) {
2932 st->stream_copy = 1;
2934 for(i=0; i<opt_name_count; i++){
2935 const AVOption *opt;
2936 double d= av_get_double(avctx_opts[CODEC_TYPE_SUBTITLE], opt_names[i], &opt);
2937 if(d==d && (opt->flags&AV_OPT_FLAG_SUBTITLE_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
2938 av_set_double(subtitle_enc, opt_names[i], d);
2940 subtitle_enc->codec_id = subtitle_codec_id;
2943 if (subtitle_language) {
2944 pstrcpy(st->language, sizeof(st->language), subtitle_language);
2945 av_free(subtitle_language);
2946 subtitle_language = NULL;
2949 subtitle_codec_id = CODEC_ID_NONE;
2950 subtitle_stream_copy = 0;
2953 static void opt_new_audio_stream(void)
2955 AVFormatContext *oc;
2956 if (nb_output_files <= 0) {
2957 fprintf(stderr, "At least one output file must be specified\n");
2960 oc = output_files[nb_output_files - 1];
2961 new_audio_stream(oc);
2964 static void opt_new_video_stream(void)
2966 AVFormatContext *oc;
2967 if (nb_output_files <= 0) {
2968 fprintf(stderr, "At least one output file must be specified\n");
2971 oc = output_files[nb_output_files - 1];
2972 new_video_stream(oc);
2975 static void opt_output_file(const char *filename)
2977 AVFormatContext *oc;
2978 int use_video, use_audio, input_has_video, input_has_audio, i;
2979 AVFormatParameters params, *ap = ¶ms;
2981 if (!strcmp(filename, "-"))
2984 oc = av_alloc_format_context();
2986 if (!file_oformat) {
2987 file_oformat = guess_format(NULL, filename, NULL);
2988 if (!file_oformat) {
2989 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
2995 oc->oformat = file_oformat;
2996 pstrcpy(oc->filename, sizeof(oc->filename), filename);
2998 if (!strcmp(file_oformat->name, "ffm") &&
2999 strstart(filename, "http:", NULL)) {
3000 /* special case for files sent to ffserver: we get the stream
3001 parameters from ffserver */
3002 if (read_ffserver_streams(oc, filename) < 0) {
3003 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
3007 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_id != CODEC_ID_NONE;
3008 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_id != CODEC_ID_NONE;
3010 /* disable if no corresponding type found and at least one
3012 if (nb_input_files > 0) {
3013 check_audio_video_inputs(&input_has_video, &input_has_audio);
3014 if (!input_has_video)
3016 if (!input_has_audio)
3020 /* manual disable */
3021 if (audio_disable) {
3024 if (video_disable) {
3029 new_video_stream(oc);
3033 new_audio_stream(oc);
3036 oc->timestamp = rec_timestamp;
3039 pstrcpy(oc->title, sizeof(oc->title), str_title);
3041 pstrcpy(oc->author, sizeof(oc->author), str_author);
3043 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3045 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3047 pstrcpy(oc->album, sizeof(oc->album), str_album);
3050 output_files[nb_output_files++] = oc;
3052 /* check filename in case of an image number is expected */
3053 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3054 if (!av_filename_number_test(oc->filename)) {
3055 print_error(oc->filename, AVERROR_NUMEXPECTED);
3060 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3061 /* test if it already exists to avoid loosing precious files */
3062 if (!file_overwrite &&
3063 (strchr(filename, ':') == NULL ||
3064 strstart(filename, "file:", NULL))) {
3065 if (url_exist(filename)) {
3068 if ( !using_stdin ) {
3069 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3072 if (toupper(c) != 'Y') {
3073 fprintf(stderr, "Not overwriting - exiting\n");
3078 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3085 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3086 fprintf(stderr, "Could not open '%s'\n", filename);
3091 memset(ap, 0, sizeof(*ap));
3092 if (av_set_parameters(oc, ap) < 0) {
3093 fprintf(stderr, "%s: Invalid encoding parameters\n",
3098 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3099 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3100 oc->loop_output = loop_output;
3102 for(i=0; i<opt_name_count; i++){
3103 const AVOption *opt;
3104 double d = av_get_double(avformat_opts, opt_names[i], &opt);
3105 if(d==d && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3106 av_set_double(oc, opt_names[i], d);
3109 /* reset some options */
3110 file_oformat = NULL;
3111 file_iformat = NULL;
3114 /* same option as mencoder */
3115 static void opt_pass(const char *pass_str)
3118 pass = atoi(pass_str);
3119 if (pass != 1 && pass != 2) {
3120 fprintf(stderr, "pass number can be only 1 or 2\n");
3126 #if defined(__MINGW32__) || defined(CONFIG_OS2)
3127 static int64_t getutime(void)
3129 return av_gettime();
3132 static int64_t getutime(void)
3134 struct rusage rusage;
3136 getrusage(RUSAGE_SELF, &rusage);
3137 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3141 #if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
3142 extern int ffm_nopts;
3145 static void show_formats(void)
3147 AVInputFormat *ifmt;
3148 AVOutputFormat *ofmt;
3151 const char **pp, *last_name;
3153 printf("File formats:\n");
3158 const char *name=NULL;
3159 const char *long_name=NULL;
3161 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3162 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3163 strcmp(ofmt->name, last_name)>0){
3165 long_name= ofmt->long_name;
3169 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3170 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3171 strcmp(ifmt->name, last_name)>0){
3173 long_name= ifmt->long_name;
3176 if(name && strcmp(ifmt->name, name)==0)
3188 long_name ? long_name:" ");
3192 printf("Codecs:\n");
3198 const char *type_str;
3201 for(p = first_avcodec; p != NULL; p = p->next) {
3202 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3203 strcmp(p->name, last_name)>0){
3205 decode= encode= cap=0;
3207 if(p2 && strcmp(p->name, p2->name)==0){
3208 if(p->decode) decode=1;
3209 if(p->encode) encode=1;
3210 cap |= p->capabilities;
3215 last_name= p2->name;
3218 case CODEC_TYPE_VIDEO:
3221 case CODEC_TYPE_AUDIO:
3224 case CODEC_TYPE_SUBTITLE:
3233 decode ? "D": (/*p2->decoder ? "d":*/" "),
3236 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3237 cap & CODEC_CAP_DR1 ? "D":" ",
3238 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3240 /* if(p2->decoder && decode==0)
3241 printf(" use %s for decoding", p2->decoder->name);*/
3246 printf("Supported file protocols:\n");
3247 for(up = first_protocol; up != NULL; up = up->next)
3248 printf(" %s:", up->name);
3251 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3252 printf("Motion estimation methods:\n");
3256 if ((pp - motion_str + 1) == ME_ZERO)
3257 printf("(fastest)");
3258 else if ((pp - motion_str + 1) == ME_FULL)
3259 printf("(slowest)");
3260 else if ((pp - motion_str + 1) == ME_EPZS)
3261 printf("(default)");
3266 "Note, the names of encoders and decoders dont always match, so there are\n"
3267 "several cases where the above table shows encoder only or decoder only entries\n"
3268 "even though both encoding and decoding are supported for example, the h263\n"
3269 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3274 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3277 const char *p = str;
3284 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3291 static void opt_inter_matrix(const char *arg)
3293 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3294 parse_matrix_coeffs(inter_matrix, arg);
3297 static void opt_intra_matrix(const char *arg)
3299 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3300 parse_matrix_coeffs(intra_matrix, arg);
3303 static void opt_target(const char *arg)
3306 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3308 if(!strncmp(arg, "pal-", 4)) {
3311 } else if(!strncmp(arg, "ntsc-", 5)) {
3314 } else if(!strncmp(arg, "film-", 5)) {
3319 /* Calculate FR via float to avoid int overflow */
3320 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3323 } else if((fr == 29970) || (fr == 23976)) {
3326 /* Try to determine PAL/NTSC by peeking in the input files */
3327 if(nb_input_files) {
3329 for(j = 0; j < nb_input_files; j++) {
3330 for(i = 0; i < input_files[j]->nb_streams; i++) {
3331 AVCodecContext *c = input_files[j]->streams[i]->codec;
3332 if(c->codec_type != CODEC_TYPE_VIDEO)
3334 fr = c->time_base.den * 1000 / c->time_base.num;
3338 } else if((fr == 29970) || (fr == 23976)) {
3348 if(verbose && norm >= 0)
3349 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3353 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3354 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3355 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3359 if(!strcmp(arg, "vcd")) {
3361 opt_video_codec("mpeg1video");
3362 opt_audio_codec("mp2");
3365 opt_frame_size(norm ? "352x240" : "352x288");
3366 opt_frame_rate(frame_rates[norm]);
3367 opt_default("gop", norm ? "18" : "15");
3369 opt_default("b", "1150000");
3370 opt_default("maxrate", "1150000");
3371 opt_default("minrate", "1150000");
3372 opt_default("bufsize", "327680"); // 40*1024*8;
3374 opt_default("ab", "224000");
3375 audio_sample_rate = 44100;
3378 opt_default("packetsize", "2324");
3379 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3381 /* We have to offset the PTS, so that it is consistent with the SCR.
3382 SCR starts at 36000, but the first two packs contain only padding
3383 and the first pack from the other stream, respectively, may also have
3384 been written before.
3385 So the real data starts at SCR 36000+3*1200. */
3386 mux_preload= (36000+3*1200) / 90000.0; //0.44
3387 } else if(!strcmp(arg, "svcd")) {
3389 opt_video_codec("mpeg2video");
3390 opt_audio_codec("mp2");
3393 opt_frame_size(norm ? "480x480" : "480x576");
3394 opt_frame_rate(frame_rates[norm]);
3395 opt_default("gop", norm ? "18" : "15");
3397 opt_default("b", "2040000");
3398 opt_default("maxrate", "2516000");
3399 opt_default("minrate", "0"); //1145000;
3400 opt_default("bufsize", "1835008"); //224*1024*8;
3401 opt_default("flags", "+SCAN_OFFSET");
3404 opt_default("ab", "224000");
3405 audio_sample_rate = 44100;
3407 opt_default("packetsize", "2324");
3409 } else if(!strcmp(arg, "dvd")) {
3411 opt_video_codec("mpeg2video");
3412 opt_audio_codec("ac3");
3415 opt_frame_size(norm ? "720x480" : "720x576");
3416 opt_frame_rate(frame_rates[norm]);
3417 opt_default("gop", norm ? "18" : "15");
3419 opt_default("b", "6000000");
3420 opt_default("maxrate", "9000000");
3421 opt_default("minrate", "0"); //1500000;
3422 opt_default("bufsize", "1835008"); //224*1024*8;
3424 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3425 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3427 opt_default("ab", "448000");
3428 audio_sample_rate = 48000;
3430 } else if(!strncmp(arg, "dv", 2)) {
3434 opt_frame_size(norm ? "720x480" : "720x576");
3435 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3436 (norm ? "yuv411p" : "yuv420p"));
3437 opt_frame_rate(frame_rates[norm]);
3439 audio_sample_rate = 48000;
3443 fprintf(stderr, "Unknown target: %s\n", arg);
3448 static void opt_video_bsf(const char *arg)
3450 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3451 AVBitStreamFilterContext **bsfp;
3454 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3458 bsfp= &video_bitstream_filters;
3460 bsfp= &(*bsfp)->next;
3465 //FIXME avoid audio - video code duplication
3466 static void opt_audio_bsf(const char *arg)
3468 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3469 AVBitStreamFilterContext **bsfp;
3472 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3476 bsfp= &audio_bitstream_filters;
3478 bsfp= &(*bsfp)->next;
3483 static void show_version(void)
3485 /* TODO: add function interface to avutil and avformat */
3486 fprintf(stderr, "ffmpeg " FFMPEG_VERSION "\n"
3490 LIBAVUTIL_BUILD, avcodec_build(), LIBAVFORMAT_BUILD);
3494 static int opt_default(const char *opt, const char *arg){
3496 const AVOption *o= NULL;
3497 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
3499 for(type=0; type<CODEC_TYPE_NB; type++){
3500 const AVOption *o2 = av_find_opt(avctx_opts[0], opt, NULL, opt_types[type], opt_types[type]);
3502 o = av_set_string(avctx_opts[type], opt, arg);
3505 o = av_set_string(avformat_opts, opt, arg);
3508 o = av_set_string(avctx_opts[CODEC_TYPE_AUDIO], opt+1, arg);
3509 else if(opt[0] == 'v')
3510 o = av_set_string(avctx_opts[CODEC_TYPE_VIDEO], opt+1, arg);
3511 else if(opt[0] == 's')
3512 o = av_set_string(avctx_opts[CODEC_TYPE_SUBTITLE], opt+1, arg);
3517 // 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));
3519 //FIXME we should always use avctx_opts, ... for storing options so there wont be any need to keep track of whats set over this
3520 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
3521 opt_names[opt_name_count++]= o->name;
3523 #if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
3524 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3525 if(avctx_opts[0]->flags & CODEC_FLAG_BITEXACT)
3529 if(avctx_opts[0]->debug)
3530 av_log_level = AV_LOG_DEBUG;
3534 const OptionDef options[] = {
3536 { "L", 0, {(void*)show_license}, "show license" },
3537 { "h", 0, {(void*)show_help}, "show help" },
3538 { "version", 0, {(void*)show_version}, "show version" },
3539 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3540 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3541 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3542 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3543 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3544 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3545 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3546 { "fs", HAS_ARG | OPT_INT, {(void*)&limit_filesize}, "set the limit file size", "limit_size" }, //
3547 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3548 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3549 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3550 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3551 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3552 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3553 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3554 { "album", HAS_ARG | OPT_STRING, {(void*)&str_album}, "set the album", "string" },
3555 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3556 "add timings for benchmarking" },
3557 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3558 "dump each input packet" },
3559 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3560 "when dumping packets, also dump the payload" },
3561 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3562 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3563 { "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)", "" },
3564 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3565 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3566 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3567 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3568 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3569 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3570 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3571 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3572 { "dts_delta_threshold", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "" },
3575 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3576 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3577 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3578 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3579 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3580 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3581 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3582 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3583 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3584 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3585 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3586 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3587 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3588 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3589 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3590 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3591 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3592 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3593 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3594 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantizer scale (VBR)", "q" },
3595 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3596 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3597 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3598 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
3600 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
3601 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3602 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3603 "use same video quality as source (implies VBR)" },
3604 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3605 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3606 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3607 "deinterlace pictures" },
3608 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3609 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
3610 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3611 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3612 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3613 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3614 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3615 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3616 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3617 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3620 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3621 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3622 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3623 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3624 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3625 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3626 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3627 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3628 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3629 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3631 /* subtitle options */
3632 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3633 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
3634 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3637 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3638 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3639 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3642 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
3643 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
3645 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_audio_bsf}, "", "bitstream filter" },
3646 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_video_bsf}, "", "bitstream filter" },
3648 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
3652 static void show_banner(void)
3654 fprintf(stderr, "FFmpeg version " FFMPEG_VERSION ", Copyright (c) 2000-2007 Fabrice Bellard, et al.\n");
3655 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
3656 fprintf(stderr, " libavutil version: " AV_STRINGIFY(LIBAVUTIL_VERSION) "\n");
3657 fprintf(stderr, " libavcodec version: " AV_STRINGIFY(LIBAVCODEC_VERSION) "\n");
3658 fprintf(stderr, " libavformat version: " AV_STRINGIFY(LIBAVFORMAT_VERSION) "\n");
3659 fprintf(stderr, " built on " __DATE__ " " __TIME__);
3661 fprintf(stderr, ", gcc: " __VERSION__ "\n");
3663 fprintf(stderr, ", using a non-gcc compiler\n");
3667 static void show_license(void)
3672 "FFmpeg is free software; you can redistribute it and/or modify\n"
3673 "it under the terms of the GNU General Public License as published by\n"
3674 "the Free Software Foundation; either version 2 of the License, or\n"
3675 "(at your option) any later version.\n"
3677 "FFmpeg is distributed in the hope that it will be useful,\n"
3678 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3679 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
3680 "GNU General Public License for more details.\n"
3682 "You should have received a copy of the GNU General Public License\n"
3683 "along with FFmpeg; if not, write to the Free Software\n"
3684 "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
3688 "FFmpeg is free software; you can redistribute it and/or\n"
3689 "modify it under the terms of the GNU Lesser General Public\n"
3690 "License as published by the Free Software Foundation; either\n"
3691 "version 2.1 of the License, or (at your option) any later version.\n"
3693 "FFmpeg is distributed in the hope that it will be useful,\n"
3694 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3695 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
3696 "Lesser General Public License for more details.\n"
3698 "You should have received a copy of the GNU Lesser General Public\n"
3699 "License along with FFmpeg; if not, write to the Free Software\n"
3700 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
3706 static void show_help(void)
3709 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3710 "Hyper fast Audio and Video encoder\n");
3712 show_help_options(options, "Main options:\n",
3713 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
3714 show_help_options(options, "\nVideo options:\n",
3715 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3717 show_help_options(options, "\nAdvanced Video options:\n",
3718 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3719 OPT_VIDEO | OPT_EXPERT);
3720 show_help_options(options, "\nAudio options:\n",
3721 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3723 show_help_options(options, "\nAdvanced Audio options:\n",
3724 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3725 OPT_AUDIO | OPT_EXPERT);
3726 show_help_options(options, "\nSubtitle options:\n",
3727 OPT_SUBTITLE | OPT_GRAB,
3729 show_help_options(options, "\nAudio/Video grab options:\n",
3732 show_help_options(options, "\nAdvanced options:\n",
3733 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3735 av_opt_show(avctx_opts[0], NULL);
3736 av_opt_show(avformat_opts, NULL);
3741 void parse_arg_file(const char *filename)
3743 opt_output_file(filename);
3746 int main(int argc, char **argv)
3753 for(i=0; i<CODEC_TYPE_NB; i++){
3754 avctx_opts[i]= avcodec_alloc_context2(i);
3756 avformat_opts = av_alloc_format_context();
3764 parse_options(argc, argv, options);
3766 /* file converter / grab */
3767 if (nb_output_files <= 0) {
3768 fprintf(stderr, "Must supply at least one output file\n");
3772 if (nb_input_files == 0) {
3773 fprintf(stderr, "Must supply at least one input file\n");
3778 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3779 stream_maps, nb_stream_maps);
3780 ti = getutime() - ti;
3782 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3786 for(i=0;i<nb_output_files;i++) {
3787 /* maybe av_close_output_file ??? */
3788 AVFormatContext *s = output_files[i];
3790 if (!(s->oformat->flags & AVFMT_NOFILE))
3792 for(j=0;j<s->nb_streams;j++) {
3793 av_free(s->streams[j]->codec);
3794 av_free(s->streams[j]);
3798 for(i=0;i<nb_input_files;i++)
3799 av_close_input_file(input_files[i]);
3803 av_free(intra_matrix);
3804 av_free(inter_matrix);
3807 #ifdef CONFIG_POWERPC_PERF
3808 extern void powerpc_display_perf_report(void);
3809 powerpc_display_perf_report();
3810 #endif /* CONFIG_POWERPC_PERF */
3812 if (received_sigterm) {
3814 "Received signal %d: terminating.\n",
3815 (int) received_sigterm);
3819 exit(0); /* not all OS-es handle main() return value */