3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 #define HAVE_AV_CONFIG_H
26 #include "framehook.h"
35 #include <sys/ioctl.h>
38 #include <sys/resource.h>
41 #include <sys/types.h>
42 #include <sys/select.h>
45 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
54 #if !defined(INFINITY) && defined(HUGE_VAL)
55 #define INFINITY HUGE_VAL
58 /* select an input stream for an output stream */
59 typedef struct AVStreamMap {
63 int sync_stream_index;
66 /** select an input file for an output file */
67 typedef struct AVMetaDataMap {
72 extern const OptionDef options[];
74 static void show_help(void);
75 static void show_license(void);
76 static int opt_default(const char *opt, const char *arg);
80 static AVFormatContext *input_files[MAX_FILES];
81 static int64_t input_files_ts_offset[MAX_FILES];
82 static int nb_input_files = 0;
84 static AVFormatContext *output_files[MAX_FILES];
85 static int nb_output_files = 0;
87 static AVStreamMap stream_maps[MAX_FILES];
88 static int nb_stream_maps;
90 static AVMetaDataMap meta_data_maps[MAX_FILES];
91 static int nb_meta_data_maps;
93 static AVInputFormat *file_iformat;
94 static AVOutputFormat *file_oformat;
95 static int frame_width = 0;
96 static int frame_height = 0;
97 static float frame_aspect_ratio = 0;
98 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
99 static int frame_padtop = 0;
100 static int frame_padbottom = 0;
101 static int frame_padleft = 0;
102 static int frame_padright = 0;
103 static int padcolor[3] = {16,128,128}; /* default to black */
104 static int frame_topBand = 0;
105 static int frame_bottomBand = 0;
106 static int frame_leftBand = 0;
107 static int frame_rightBand = 0;
108 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
109 static int frame_rate = 25;
110 static int frame_rate_base = 1;
111 static float video_qscale = 0;
112 static int video_qdiff = 3;
113 static uint16_t *intra_matrix = NULL;
114 static uint16_t *inter_matrix = NULL;
115 #if 0 //experimental, (can be removed)
116 static float video_rc_qsquish=1.0;
117 static float video_rc_qmod_amp=0;
118 static int video_rc_qmod_freq=0;
120 static char *video_rc_override_string=NULL;
121 static char *video_rc_eq="tex^qComp";
122 static int me_method = ME_EPZS;
123 static int video_disable = 0;
124 static int video_discard = 0;
125 static int video_codec_id = CODEC_ID_NONE;
126 static int video_codec_tag = 0;
127 static int same_quality = 0;
128 static int do_deinterlace = 0;
129 static int strict = 0;
130 static int top_field_first = -1;
131 static int me_threshold = 0;
132 static int intra_dc_precision = 8;
133 static int loop_input = 0;
134 static int loop_output = AVFMT_NOOUTPUTLOOP;
135 static int qp_hist = 0;
137 static int intra_only = 0;
138 static int audio_sample_rate = 44100;
139 #define QSCALE_NONE -99999
140 static float audio_qscale = QSCALE_NONE;
141 static int audio_disable = 0;
142 static int audio_channels = 1;
143 static int audio_codec_id = CODEC_ID_NONE;
144 static int audio_codec_tag = 0;
145 static char *audio_language = NULL;
147 static int subtitle_codec_id = CODEC_ID_NONE;
148 static char *subtitle_language = NULL;
150 static float mux_preload= 0.5;
151 static float mux_max_delay= 0.7;
153 static int64_t recording_time = 0;
154 static int64_t start_time = 0;
155 static int64_t rec_timestamp = 0;
156 static int64_t input_ts_offset = 0;
157 static int file_overwrite = 0;
158 static char *str_title = NULL;
159 static char *str_author = NULL;
160 static char *str_copyright = NULL;
161 static char *str_comment = NULL;
162 static char *str_album = NULL;
163 static int do_benchmark = 0;
164 static int do_hex_dump = 0;
165 static int do_pkt_dump = 0;
166 static int do_psnr = 0;
167 static int do_vstats = 0;
168 static int do_pass = 0;
169 static char *pass_logfilename = NULL;
170 static int audio_stream_copy = 0;
171 static int video_stream_copy = 0;
172 static int subtitle_stream_copy = 0;
173 static int video_sync_method= 1;
174 static int audio_sync_method= 0;
175 static int copy_ts= 0;
176 static int opt_shortest = 0; //
177 static int video_global_header = 0;
179 static int rate_emu = 0;
181 static int video_channel = 0;
182 static char *video_standard = "ntsc";
184 static int audio_volume = 256;
186 static int using_stdin = 0;
187 static int using_vhook = 0;
188 static int verbose = 1;
189 static int thread_count= 1;
190 static int q_pressed = 0;
191 static int64_t video_size = 0;
192 static int64_t audio_size = 0;
193 static int64_t extra_size = 0;
194 static int nb_frames_dup = 0;
195 static int nb_frames_drop = 0;
196 static int input_sync;
197 static int limit_filesize = 0; //
199 static int pgmyuv_compatibility_hack=0;
200 static int dts_delta_threshold = 10;
202 static int sws_flags = SWS_BICUBIC;
204 const char **opt_names=NULL;
205 int opt_name_count=0;
206 AVCodecContext *avctx_opts[CODEC_TYPE_NB];
207 AVFormatContext *avformat_opts;
208 static int64_t timer_start = 0;
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 float t = (av_gettime()-timer_start) / 1000000.0;
931 frame_number = ost->frame_number;
932 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
933 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
934 enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
936 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
937 if(qp_hist && enc->coded_frame){
939 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
940 if(qp>=0 && qp<sizeof(qp_histogram)/sizeof(int))
943 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
945 if (enc->flags&CODEC_FLAG_PSNR){
947 double error, error_sum=0;
948 double scale, scale_sum=0;
949 char type[3]= {'Y','U','V'};
950 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
953 error= enc->error[j];
954 scale= enc->width*enc->height*255.0*255.0*frame_number;
956 error= enc->coded_frame->error[j];
957 scale= enc->width*enc->height*255.0*255.0;
962 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
964 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
968 /* compute min output value */
969 pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
970 if ((pts < ti1) && (pts > 0))
976 if (verbose || is_last_report) {
977 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
979 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
980 "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
981 (double)total_size / 1024, ti1, bitrate);
984 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
985 nb_frames_dup, nb_frames_drop);
988 fprintf(stderr, "%s \r", buf);
993 if (is_last_report && verbose >= 0){
994 int64_t raw= audio_size + video_size + extra_size;
995 fprintf(stderr, "\n");
996 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1000 100.0*(total_size - raw)/raw
1005 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1006 static int output_packet(AVInputStream *ist, int ist_index,
1007 AVOutputStream **ost_table, int nb_ostreams,
1008 const AVPacket *pkt)
1010 AVFormatContext *os;
1011 AVOutputStream *ost;
1015 int data_size, got_picture;
1017 void *buffer_to_free;
1018 static unsigned int samples_size= 0;
1019 static short *samples= NULL;
1020 AVSubtitle subtitle, *subtitle_to_free;
1024 ist->pts= ist->next_pts; // needed for last packet if vsync=0
1025 } else if (pkt->dts != AV_NOPTS_VALUE) { //FIXME seems redundant, as libavformat does this too
1026 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1028 // assert(ist->pts == ist->next_pts);
1042 /* decode the packet if needed */
1043 data_buf = NULL; /* fail safe */
1045 subtitle_to_free = NULL;
1046 if (ist->decoding_needed) {
1047 switch(ist->st->codec->codec_type) {
1048 case CODEC_TYPE_AUDIO:{
1050 samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE));
1051 data_size= samples_size;
1052 /* XXX: could avoid copy if PCM 16 bits with same
1053 endianness as CPU */
1054 ret = avcodec_decode_audio2(ist->st->codec, samples, &data_size,
1060 /* Some bug in mpeg audio decoder gives */
1061 /* data_size < 0, it seems they are overflows */
1062 if (data_size <= 0) {
1063 /* no audio frame */
1066 data_buf = (uint8_t *)samples;
1067 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1068 (ist->st->codec->sample_rate * ist->st->codec->channels);
1070 case CODEC_TYPE_VIDEO:
1071 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1072 /* XXX: allocate picture correctly */
1073 avcodec_get_frame_defaults(&picture);
1075 ret = avcodec_decode_video(ist->st->codec,
1076 &picture, &got_picture, ptr, len);
1077 ist->st->quality= picture.quality;
1081 /* no picture yet */
1082 goto discard_packet;
1084 if (ist->st->codec->time_base.num != 0) {
1085 ist->next_pts += ((int64_t)AV_TIME_BASE *
1086 ist->st->codec->time_base.num) /
1087 ist->st->codec->time_base.den;
1091 case CODEC_TYPE_SUBTITLE:
1092 ret = avcodec_decode_subtitle(ist->st->codec,
1093 &subtitle, &got_subtitle, ptr, len);
1096 if (!got_subtitle) {
1097 goto discard_packet;
1099 subtitle_to_free = &subtitle;
1106 switch(ist->st->codec->codec_type) {
1107 case CODEC_TYPE_AUDIO:
1108 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1109 (ist->st->codec->sample_rate * ist->st->codec->channels);
1111 case CODEC_TYPE_VIDEO:
1112 if (ist->st->codec->time_base.num != 0) {
1113 ist->next_pts += ((int64_t)AV_TIME_BASE *
1114 ist->st->codec->time_base.num) /
1115 ist->st->codec->time_base.den;
1125 buffer_to_free = NULL;
1126 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1127 pre_process_video_frame(ist, (AVPicture *)&picture,
1131 // preprocess audio (volume)
1132 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1133 if (audio_volume != 256) {
1136 for(i=0;i<(data_size / sizeof(short));i++) {
1137 int v = ((*volp) * audio_volume + 128) >> 8;
1138 if (v < -32768) v = -32768;
1139 if (v > 32767) v = 32767;
1145 /* frame rate emulation */
1146 if (ist->st->codec->rate_emu) {
1147 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
1148 int64_t now = av_gettime() - ist->start;
1156 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1157 is the one of the next displayed one */
1158 /* XXX: add mpeg4 too ? */
1159 if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
1160 if (ist->st->codec->pict_type != B_TYPE) {
1162 tmp = ist->last_ip_pts;
1163 ist->last_ip_pts = ist->frac_pts.val;
1164 ist->frac_pts.val = tmp;
1168 /* if output time reached then transcode raw format,
1169 encode packets and output them */
1170 if (start_time == 0 || ist->pts >= start_time)
1171 for(i=0;i<nb_ostreams;i++) {
1175 if (ost->source_index == ist_index) {
1176 os = output_files[ost->file_index];
1179 printf("%d: got pts=%0.3f %0.3f\n", i,
1180 (double)pkt->pts / AV_TIME_BASE,
1181 ((double)ist->pts / AV_TIME_BASE) -
1182 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1184 /* set the input output pts pairs */
1185 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1187 if (ost->encoding_needed) {
1188 switch(ost->st->codec->codec_type) {
1189 case CODEC_TYPE_AUDIO:
1190 do_audio_out(os, ost, ist, data_buf, data_size);
1192 case CODEC_TYPE_VIDEO:
1193 do_video_out(os, ost, ist, &picture, &frame_size);
1194 video_size += frame_size;
1195 if (do_vstats && frame_size)
1196 do_video_stats(os, ost, frame_size);
1198 case CODEC_TYPE_SUBTITLE:
1199 do_subtitle_out(os, ost, ist, &subtitle,
1206 AVFrame avframe; //FIXME/XXX remove this
1208 av_init_packet(&opkt);
1210 /* no reencoding needed : output the packet directly */
1211 /* force the input stream PTS */
1213 avcodec_get_frame_defaults(&avframe);
1214 ost->st->codec->coded_frame= &avframe;
1215 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1217 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1218 audio_size += data_size;
1219 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1220 video_size += data_size;
1224 opkt.stream_index= ost->index;
1225 if(pkt->pts != AV_NOPTS_VALUE)
1226 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);
1228 opkt.pts= AV_NOPTS_VALUE;
1232 if (pkt->dts == AV_NOPTS_VALUE)
1233 dts = ist->next_pts;
1235 dts= av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1236 opkt.dts= av_rescale_q(dts + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ost->st->time_base);
1238 opkt.flags= pkt->flags;
1240 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1241 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1242 opkt.destruct= av_destruct_packet;
1244 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][pkt->stream_index]);
1245 ost->st->codec->frame_number++;
1246 ost->frame_number++;
1247 av_free_packet(&opkt);
1251 av_free(buffer_to_free);
1252 /* XXX: allocate the subtitles in the codec ? */
1253 if (subtitle_to_free) {
1254 if (subtitle_to_free->rects != NULL) {
1255 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1256 av_free(subtitle_to_free->rects[i].bitmap);
1257 av_free(subtitle_to_free->rects[i].rgba_palette);
1259 av_freep(&subtitle_to_free->rects);
1261 subtitle_to_free->num_rects = 0;
1262 subtitle_to_free = NULL;
1269 for(i=0;i<nb_ostreams;i++) {
1271 if (ost->source_index == ist_index) {
1272 AVCodecContext *enc= ost->st->codec;
1273 os = output_files[ost->file_index];
1275 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1277 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1280 if (ost->encoding_needed) {
1284 av_init_packet(&pkt);
1285 pkt.stream_index= ost->index;
1287 switch(ost->st->codec->codec_type) {
1288 case CODEC_TYPE_AUDIO:
1289 fifo_bytes = av_fifo_size(&ost->fifo);
1291 /* encode any samples remaining in fifo */
1292 if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1293 int fs_tmp = enc->frame_size;
1294 enc->frame_size = fifo_bytes / (2 * enc->channels);
1295 if(av_fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes) == 0) {
1296 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1298 enc->frame_size = fs_tmp;
1301 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1304 pkt.flags |= PKT_FLAG_KEY;
1306 case CODEC_TYPE_VIDEO:
1307 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1309 if(enc->coded_frame && enc->coded_frame->key_frame)
1310 pkt.flags |= PKT_FLAG_KEY;
1311 if (ost->logfile && enc->stats_out) {
1312 fprintf(ost->logfile, "%s", enc->stats_out);
1321 pkt.data= bit_buffer;
1323 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1324 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1325 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1339 * The following code is the main loop of the file converter
1341 static int av_encode(AVFormatContext **output_files,
1342 int nb_output_files,
1343 AVFormatContext **input_files,
1345 AVStreamMap *stream_maps, int nb_stream_maps)
1347 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1348 AVFormatContext *is, *os;
1349 AVCodecContext *codec, *icodec;
1350 AVOutputStream *ost, **ost_table = NULL;
1351 AVInputStream *ist, **ist_table = NULL;
1352 AVInputFile *file_table;
1355 file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
1359 /* input stream init */
1361 for(i=0;i<nb_input_files;i++) {
1362 is = input_files[i];
1363 file_table[i].ist_index = j;
1364 file_table[i].nb_streams = is->nb_streams;
1365 j += is->nb_streams;
1369 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1373 for(i=0;i<nb_istreams;i++) {
1374 ist = av_mallocz(sizeof(AVInputStream));
1380 for(i=0;i<nb_input_files;i++) {
1381 is = input_files[i];
1382 for(k=0;k<is->nb_streams;k++) {
1383 ist = ist_table[j++];
1384 ist->st = is->streams[k];
1385 ist->file_index = i;
1387 ist->discard = 1; /* the stream is discarded by default
1390 if (ist->st->codec->rate_emu) {
1391 ist->start = av_gettime();
1397 /* output stream init */
1399 for(i=0;i<nb_output_files;i++) {
1400 os = output_files[i];
1401 if (!os->nb_streams) {
1402 fprintf(stderr, "Output file does not contain any stream\n");
1405 nb_ostreams += os->nb_streams;
1407 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1408 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1412 /* Sanity check the mapping args -- do the input files & streams exist? */
1413 for(i=0;i<nb_stream_maps;i++) {
1414 int fi = stream_maps[i].file_index;
1415 int si = stream_maps[i].stream_index;
1417 if (fi < 0 || fi > nb_input_files - 1 ||
1418 si < 0 || si > file_table[fi].nb_streams - 1) {
1419 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1422 fi = stream_maps[i].sync_file_index;
1423 si = stream_maps[i].sync_stream_index;
1424 if (fi < 0 || fi > nb_input_files - 1 ||
1425 si < 0 || si > file_table[fi].nb_streams - 1) {
1426 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1431 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1434 for(i=0;i<nb_ostreams;i++) {
1435 ost = av_mallocz(sizeof(AVOutputStream));
1442 for(k=0;k<nb_output_files;k++) {
1443 os = output_files[k];
1444 for(i=0;i<os->nb_streams;i++) {
1446 ost = ost_table[n++];
1447 ost->file_index = k;
1449 ost->st = os->streams[i];
1450 if (nb_stream_maps > 0) {
1451 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1452 stream_maps[n-1].stream_index;
1454 /* Sanity check that the stream types match */
1455 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1456 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1457 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1458 ost->file_index, ost->index);
1463 /* get corresponding input stream index : we select the first one with the right type */
1465 for(j=0;j<nb_istreams;j++) {
1468 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1469 ost->source_index = j;
1476 /* try again and reuse existing stream */
1477 for(j=0;j<nb_istreams;j++) {
1479 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1480 ost->source_index = j;
1485 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1486 ost->file_index, ost->index);
1491 ist = ist_table[ost->source_index];
1493 ost->sync_ist = (nb_stream_maps > 0) ?
1494 ist_table[file_table[stream_maps[n-1].sync_file_index].ist_index +
1495 stream_maps[n-1].sync_stream_index] : ist;
1499 /* for each output stream, we compute the right encoding parameters */
1500 for(i=0;i<nb_ostreams;i++) {
1502 ist = ist_table[ost->source_index];
1504 codec = ost->st->codec;
1505 icodec = ist->st->codec;
1507 if (ost->st->stream_copy) {
1508 /* if stream_copy is selected, no need to decode or encode */
1509 codec->codec_id = icodec->codec_id;
1510 codec->codec_type = icodec->codec_type;
1511 if(!codec->codec_tag) codec->codec_tag = icodec->codec_tag;
1512 codec->bit_rate = icodec->bit_rate;
1513 codec->extradata= icodec->extradata;
1514 codec->extradata_size= icodec->extradata_size;
1515 if(av_q2d(icodec->time_base) > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000)
1516 codec->time_base = icodec->time_base;
1518 codec->time_base = ist->st->time_base;
1519 switch(codec->codec_type) {
1520 case CODEC_TYPE_AUDIO:
1521 codec->sample_rate = icodec->sample_rate;
1522 codec->channels = icodec->channels;
1523 codec->frame_size = icodec->frame_size;
1524 codec->block_align= icodec->block_align;
1526 case CODEC_TYPE_VIDEO:
1528 fprintf(stderr,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");
1531 codec->pix_fmt = icodec->pix_fmt;
1532 codec->width = icodec->width;
1533 codec->height = icodec->height;
1534 codec->has_b_frames = icodec->has_b_frames;
1536 case CODEC_TYPE_SUBTITLE:
1542 switch(codec->codec_type) {
1543 case CODEC_TYPE_AUDIO:
1544 if (av_fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
1547 if (codec->channels == icodec->channels &&
1548 codec->sample_rate == icodec->sample_rate) {
1549 ost->audio_resample = 0;
1551 if (codec->channels != icodec->channels &&
1552 (icodec->codec_id == CODEC_ID_AC3 ||
1553 icodec->codec_id == CODEC_ID_DTS)) {
1554 /* Special case for 5:1 AC3 and DTS input */
1555 /* and mono or stereo output */
1556 /* Request specific number of channels */
1557 icodec->channels = codec->channels;
1558 if (codec->sample_rate == icodec->sample_rate)
1559 ost->audio_resample = 0;
1561 ost->audio_resample = 1;
1564 ost->audio_resample = 1;
1567 if(audio_sync_method>1)
1568 ost->audio_resample = 1;
1570 if(ost->audio_resample){
1571 ost->resample = audio_resample_init(codec->channels, icodec->channels,
1572 codec->sample_rate, icodec->sample_rate);
1574 printf("Can't resample. Aborting.\n");
1578 ist->decoding_needed = 1;
1579 ost->encoding_needed = 1;
1581 case CODEC_TYPE_VIDEO:
1582 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1583 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1584 ost->video_resample = ((codec->width != icodec->width -
1585 (frame_leftBand + frame_rightBand) +
1586 (frame_padleft + frame_padright)) ||
1587 (codec->height != icodec->height -
1588 (frame_topBand + frame_bottomBand) +
1589 (frame_padtop + frame_padbottom)) ||
1590 (codec->pix_fmt != icodec->pix_fmt));
1591 if (ost->video_crop) {
1592 ost->topBand = frame_topBand;
1593 ost->leftBand = frame_leftBand;
1595 if (ost->video_pad) {
1596 ost->padtop = frame_padtop;
1597 ost->padleft = frame_padleft;
1598 ost->padbottom = frame_padbottom;
1599 ost->padright = frame_padright;
1600 if (!ost->video_resample) {
1601 avcodec_get_frame_defaults(&ost->pict_tmp);
1602 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1603 codec->width, codec->height ) )
1607 if (ost->video_resample) {
1608 avcodec_get_frame_defaults(&ost->pict_tmp);
1609 if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1610 codec->width, codec->height ) )
1613 ost->img_resample_ctx = sws_getContext(
1614 icodec->width - (frame_leftBand + frame_rightBand),
1615 icodec->height - (frame_topBand + frame_bottomBand),
1617 codec->width - (frame_padleft + frame_padright),
1618 codec->height - (frame_padtop + frame_padbottom),
1620 sws_flags, NULL, NULL, NULL);
1621 if (ost->img_resample_ctx == NULL) {
1622 fprintf(stderr, "Cannot get resampling context\n");
1625 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1627 ost->encoding_needed = 1;
1628 ist->decoding_needed = 1;
1630 case CODEC_TYPE_SUBTITLE:
1631 ost->encoding_needed = 1;
1632 ist->decoding_needed = 1;
1639 if (ost->encoding_needed &&
1640 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1641 char logfilename[1024];
1646 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1648 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1649 if (codec->flags & CODEC_FLAG_PASS1) {
1650 f = fopen(logfilename, "w");
1652 perror(logfilename);
1657 /* read the log file */
1658 f = fopen(logfilename, "r");
1660 perror(logfilename);
1663 fseek(f, 0, SEEK_END);
1665 fseek(f, 0, SEEK_SET);
1666 logbuffer = av_malloc(size + 1);
1668 fprintf(stderr, "Could not allocate log buffer\n");
1671 size = fread(logbuffer, 1, size, f);
1673 logbuffer[size] = '\0';
1674 codec->stats_in = logbuffer;
1678 if(codec->codec_type == CODEC_TYPE_VIDEO){
1679 int size= codec->width * codec->height;
1680 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1685 bit_buffer = av_malloc(bit_buffer_size);
1689 /* dump the file output parameters - cannot be done before in case
1691 for(i=0;i<nb_output_files;i++) {
1692 dump_format(output_files[i], i, output_files[i]->filename, 1);
1695 /* dump the stream mapping */
1697 fprintf(stderr, "Stream mapping:\n");
1698 for(i=0;i<nb_ostreams;i++) {
1700 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1701 ist_table[ost->source_index]->file_index,
1702 ist_table[ost->source_index]->index,
1705 if (ost->sync_ist != ist_table[ost->source_index])
1706 fprintf(stderr, " [sync #%d.%d]",
1707 ost->sync_ist->file_index,
1708 ost->sync_ist->index);
1709 fprintf(stderr, "\n");
1713 /* open each encoder */
1714 for(i=0;i<nb_ostreams;i++) {
1716 if (ost->encoding_needed) {
1718 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1720 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1721 ost->file_index, ost->index);
1724 if (avcodec_open(ost->st->codec, codec) < 0) {
1725 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1726 ost->file_index, ost->index);
1729 extra_size += ost->st->codec->extradata_size;
1733 /* open each decoder */
1734 for(i=0;i<nb_istreams;i++) {
1736 if (ist->decoding_needed) {
1738 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1740 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1741 ist->st->codec->codec_id, ist->file_index, ist->index);
1744 if (avcodec_open(ist->st->codec, codec) < 0) {
1745 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1746 ist->file_index, ist->index);
1749 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1750 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1755 for(i=0;i<nb_istreams;i++) {
1757 is = input_files[ist->file_index];
1759 ist->next_pts = av_rescale_q(ist->st->start_time, ist->st->time_base, AV_TIME_BASE_Q);
1760 if(ist->st->start_time == AV_NOPTS_VALUE)
1762 if(input_files_ts_offset[ist->file_index])
1763 ist->next_pts= AV_NOPTS_VALUE;
1767 /* set meta data information from input file if required */
1768 for (i=0;i<nb_meta_data_maps;i++) {
1769 AVFormatContext *out_file;
1770 AVFormatContext *in_file;
1772 int out_file_index = meta_data_maps[i].out_file;
1773 int in_file_index = meta_data_maps[i].in_file;
1774 if ( out_file_index < 0 || out_file_index >= nb_output_files ) {
1775 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1776 ret = AVERROR(EINVAL);
1779 if ( in_file_index < 0 || in_file_index >= nb_input_files ) {
1780 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1781 ret = AVERROR(EINVAL);
1785 out_file = output_files[out_file_index];
1786 in_file = input_files[in_file_index];
1788 strcpy(out_file->title, in_file->title);
1789 strcpy(out_file->author, in_file->author);
1790 strcpy(out_file->copyright, in_file->copyright);
1791 strcpy(out_file->comment, in_file->comment);
1792 strcpy(out_file->album, in_file->album);
1793 out_file->year = in_file->year;
1794 out_file->track = in_file->track;
1795 strcpy(out_file->genre, in_file->genre);
1798 /* open files and write file headers */
1799 for(i=0;i<nb_output_files;i++) {
1800 os = output_files[i];
1801 if (av_write_header(os) < 0) {
1802 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1803 ret = AVERROR(EINVAL);
1808 if ( !using_stdin && verbose >= 0) {
1809 fprintf(stderr, "Press [q] to stop encoding\n");
1810 url_set_interrupt_cb(decode_interrupt_cb);
1815 timer_start = av_gettime();
1817 for(; received_sigterm == 0;) {
1818 int file_index, ist_index;
1826 /* if 'q' pressed, exits */
1830 /* read_key() returns 0 on EOF */
1836 /* select the stream that we must read now by looking at the
1837 smallest output pts */
1839 for(i=0;i<nb_ostreams;i++) {
1842 os = output_files[ost->file_index];
1843 ist = ist_table[ost->source_index];
1844 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
1845 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
1847 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
1848 ipts = (double)ist->pts;
1849 if (!file_table[ist->file_index].eof_reached){
1850 if(ipts < ipts_min) {
1852 if(input_sync ) file_index = ist->file_index;
1854 if(opts < opts_min) {
1856 if(!input_sync) file_index = ist->file_index;
1859 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
1864 /* if none, if is finished */
1865 if (file_index < 0) {
1869 /* finish if recording time exhausted */
1870 if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
1873 /* finish if limit size exhausted */
1874 if (limit_filesize != 0 && (limit_filesize * 1024) < url_ftell(&output_files[0]->pb))
1877 /* read a frame from it and output it in the fifo */
1878 is = input_files[file_index];
1879 if (av_read_frame(is, &pkt) < 0) {
1880 file_table[file_index].eof_reached = 1;
1881 if (opt_shortest) break; else continue; //
1885 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
1887 /* the following test is needed in case new streams appear
1888 dynamically in stream : we ignore them */
1889 if (pkt.stream_index >= file_table[file_index].nb_streams)
1890 goto discard_packet;
1891 ist_index = file_table[file_index].ist_index + pkt.stream_index;
1892 ist = ist_table[ist_index];
1894 goto discard_packet;
1896 // 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);
1897 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
1898 int64_t delta= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q) - ist->next_pts;
1899 if(FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE && !copy_ts){
1900 input_files_ts_offset[ist->file_index]-= delta;
1902 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
1903 for(i=0; i<file_table[file_index].nb_streams; i++){
1904 int index= file_table[file_index].ist_index + i;
1905 ist_table[index]->next_pts += delta;
1906 ist_table[index]->is_start=1;
1911 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1912 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1915 fprintf(stderr, "Error while decoding stream #%d.%d\n",
1916 ist->file_index, ist->index);
1918 av_free_packet(&pkt);
1923 av_free_packet(&pkt);
1925 /* dump report by using the output first video and audio streams */
1926 print_report(output_files, ost_table, nb_ostreams, 0);
1929 /* at the end of stream, we must flush the decoder buffers */
1930 for(i=0;i<nb_istreams;i++) {
1932 if (ist->decoding_needed) {
1933 output_packet(ist, i, ost_table, nb_ostreams, NULL);
1939 /* write the trailer if needed and close file */
1940 for(i=0;i<nb_output_files;i++) {
1941 os = output_files[i];
1942 av_write_trailer(os);
1945 /* dump report by using the first video and audio streams */
1946 print_report(output_files, ost_table, nb_ostreams, 1);
1948 /* close each encoder */
1949 for(i=0;i<nb_ostreams;i++) {
1951 if (ost->encoding_needed) {
1952 av_freep(&ost->st->codec->stats_in);
1953 avcodec_close(ost->st->codec);
1957 /* close each decoder */
1958 for(i=0;i<nb_istreams;i++) {
1960 if (ist->decoding_needed) {
1961 avcodec_close(ist->st->codec);
1969 av_freep(&bit_buffer);
1970 av_free(file_table);
1973 for(i=0;i<nb_istreams;i++) {
1980 for(i=0;i<nb_ostreams;i++) {
1984 fclose(ost->logfile);
1985 ost->logfile = NULL;
1987 av_fifo_free(&ost->fifo); /* works even if fifo is not
1988 initialized but set to zero */
1989 av_free(ost->pict_tmp.data[0]);
1990 if (ost->video_resample)
1991 sws_freeContext(ost->img_resample_ctx);
1992 if (ost->audio_resample)
1993 audio_resample_close(ost->resample);
2001 ret = AVERROR(ENOMEM);
2006 int file_read(const char *filename)
2009 unsigned char buffer[1024];
2012 if (url_open(&h, filename, O_RDONLY) < 0) {
2013 printf("could not open '%s'\n", filename);
2017 len = url_read(h, buffer, sizeof(buffer));
2020 for(i=0;i<len;i++) putchar(buffer[i]);
2027 static void opt_format(const char *arg)
2029 /* compatibility stuff for pgmyuv */
2030 if (!strcmp(arg, "pgmyuv")) {
2031 pgmyuv_compatibility_hack=1;
2032 // opt_image_format(arg);
2034 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2037 file_iformat = av_find_input_format(arg);
2038 file_oformat = guess_format(arg, NULL, NULL);
2039 if (!file_iformat && !file_oformat) {
2040 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2045 static void opt_video_rc_eq(char *arg)
2050 static void opt_video_rc_override_string(char *arg)
2052 video_rc_override_string = arg;
2055 static void opt_me_threshold(const char *arg)
2057 me_threshold = atoi(arg);
2060 static void opt_verbose(const char *arg)
2062 verbose = atoi(arg);
2063 av_log_level = atoi(arg);
2066 static void opt_frame_rate(const char *arg)
2068 if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
2069 fprintf(stderr, "Incorrect frame rate\n");
2074 static void opt_frame_crop_top(const char *arg)
2076 frame_topBand = atoi(arg);
2077 if (frame_topBand < 0) {
2078 fprintf(stderr, "Incorrect top crop size\n");
2081 if ((frame_topBand % 2) != 0) {
2082 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2085 if ((frame_topBand) >= frame_height){
2086 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2089 frame_height -= frame_topBand;
2092 static void opt_frame_crop_bottom(const char *arg)
2094 frame_bottomBand = atoi(arg);
2095 if (frame_bottomBand < 0) {
2096 fprintf(stderr, "Incorrect bottom crop size\n");
2099 if ((frame_bottomBand % 2) != 0) {
2100 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2103 if ((frame_bottomBand) >= frame_height){
2104 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2107 frame_height -= frame_bottomBand;
2110 static void opt_frame_crop_left(const char *arg)
2112 frame_leftBand = atoi(arg);
2113 if (frame_leftBand < 0) {
2114 fprintf(stderr, "Incorrect left crop size\n");
2117 if ((frame_leftBand % 2) != 0) {
2118 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2121 if ((frame_leftBand) >= frame_width){
2122 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2125 frame_width -= frame_leftBand;
2128 static void opt_frame_crop_right(const char *arg)
2130 frame_rightBand = atoi(arg);
2131 if (frame_rightBand < 0) {
2132 fprintf(stderr, "Incorrect right crop size\n");
2135 if ((frame_rightBand % 2) != 0) {
2136 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2139 if ((frame_rightBand) >= frame_width){
2140 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2143 frame_width -= frame_rightBand;
2146 static void opt_frame_size(const char *arg)
2148 if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
2149 fprintf(stderr, "Incorrect frame size\n");
2152 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2153 fprintf(stderr, "Frame size must be a multiple of 2\n");
2159 #define SCALEBITS 10
2160 #define ONE_HALF (1 << (SCALEBITS - 1))
2161 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2163 #define RGB_TO_Y(r, g, b) \
2164 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2165 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2167 #define RGB_TO_U(r1, g1, b1, shift)\
2168 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2169 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2171 #define RGB_TO_V(r1, g1, b1, shift)\
2172 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2173 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2175 static void opt_pad_color(const char *arg) {
2176 /* Input is expected to be six hex digits similar to
2177 how colors are expressed in html tags (but without the #) */
2178 int rgb = strtol(arg, NULL, 16);
2182 g = ((rgb >> 8) & 255);
2185 padcolor[0] = RGB_TO_Y(r,g,b);
2186 padcolor[1] = RGB_TO_U(r,g,b,0);
2187 padcolor[2] = RGB_TO_V(r,g,b,0);
2190 static void opt_frame_pad_top(const char *arg)
2192 frame_padtop = atoi(arg);
2193 if (frame_padtop < 0) {
2194 fprintf(stderr, "Incorrect top pad size\n");
2197 if ((frame_padtop % 2) != 0) {
2198 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2203 static void opt_frame_pad_bottom(const char *arg)
2205 frame_padbottom = atoi(arg);
2206 if (frame_padbottom < 0) {
2207 fprintf(stderr, "Incorrect bottom pad size\n");
2210 if ((frame_padbottom % 2) != 0) {
2211 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2217 static void opt_frame_pad_left(const char *arg)
2219 frame_padleft = atoi(arg);
2220 if (frame_padleft < 0) {
2221 fprintf(stderr, "Incorrect left pad size\n");
2224 if ((frame_padleft % 2) != 0) {
2225 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2231 static void opt_frame_pad_right(const char *arg)
2233 frame_padright = atoi(arg);
2234 if (frame_padright < 0) {
2235 fprintf(stderr, "Incorrect right pad size\n");
2238 if ((frame_padright % 2) != 0) {
2239 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2245 static void opt_frame_pix_fmt(const char *arg)
2247 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2250 static void opt_frame_aspect_ratio(const char *arg)
2256 p = strchr(arg, ':');
2258 x = strtol(arg, (char **)&arg, 10);
2260 y = strtol(arg+1, (char **)&arg, 10);
2262 ar = (double)x / (double)y;
2264 ar = strtod(arg, (char **)&arg);
2267 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2270 frame_aspect_ratio = ar;
2273 static void opt_qscale(const char *arg)
2275 video_qscale = atof(arg);
2276 if (video_qscale <= 0 ||
2277 video_qscale > 255) {
2278 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2283 static void opt_qdiff(const char *arg)
2285 video_qdiff = atoi(arg);
2286 if (video_qdiff < 0 ||
2288 fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
2293 static void opt_strict(const char *arg)
2298 static void opt_top_field_first(const char *arg)
2300 top_field_first= atoi(arg);
2303 static void opt_thread_count(const char *arg)
2305 thread_count= atoi(arg);
2306 #if !defined(HAVE_THREADS)
2308 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2312 static void opt_audio_rate(const char *arg)
2314 audio_sample_rate = atoi(arg);
2317 static void opt_audio_channels(const char *arg)
2319 audio_channels = atoi(arg);
2322 static void opt_video_channel(const char *arg)
2324 video_channel = strtol(arg, NULL, 0);
2327 static void opt_video_standard(const char *arg)
2329 video_standard = av_strdup(arg);
2332 static void opt_codec(int *pstream_copy, int *pcodec_id,
2333 int codec_type, const char *arg)
2337 if (!strcmp(arg, "copy")) {
2342 if (!strcmp(p->name, arg) && p->type == codec_type)
2347 fprintf(stderr, "Unknown codec '%s'\n", arg);
2355 static void opt_audio_codec(const char *arg)
2357 opt_codec(&audio_stream_copy, &audio_codec_id, CODEC_TYPE_AUDIO, arg);
2360 static void opt_audio_tag(const char *arg)
2363 audio_codec_tag= strtol(arg, &tail, 0);
2366 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2369 static void opt_video_tag(const char *arg)
2372 video_codec_tag= strtol(arg, &tail, 0);
2375 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2378 static void add_frame_hooker(const char *arg)
2383 char *args = av_strdup(arg);
2387 argv[0] = strtok(args, " ");
2388 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2391 i = frame_hook_add(argc, argv);
2394 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2399 const char *motion_str[] = {
2412 static void opt_motion_estimation(const char *arg)
2418 fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
2421 if (!strcmp(*p, arg))
2425 me_method = (p - motion_str) + 1;
2428 static void opt_video_codec(const char *arg)
2430 opt_codec(&video_stream_copy, &video_codec_id, CODEC_TYPE_VIDEO, arg);
2433 static void opt_subtitle_codec(const char *arg)
2435 opt_codec(&subtitle_stream_copy, &subtitle_codec_id, CODEC_TYPE_SUBTITLE, arg);
2438 static void opt_map(const char *arg)
2444 m = &stream_maps[nb_stream_maps++];
2446 m->file_index = strtol(arg, (char **)&p, 0);
2450 m->stream_index = strtol(p, (char **)&p, 0);
2453 m->sync_file_index = strtol(p, (char **)&p, 0);
2456 m->sync_stream_index = strtol(p, (char **)&p, 0);
2458 m->sync_file_index = m->file_index;
2459 m->sync_stream_index = m->stream_index;
2463 static void opt_map_meta_data(const char *arg)
2469 m = &meta_data_maps[nb_meta_data_maps++];
2471 m->out_file = strtol(arg, (char **)&p, 0);
2475 m->in_file = strtol(p, (char **)&p, 0);
2478 static void opt_recording_time(const char *arg)
2480 recording_time = parse_date(arg, 1);
2483 static void opt_start_time(const char *arg)
2485 start_time = parse_date(arg, 1);
2488 static void opt_rec_timestamp(const char *arg)
2490 rec_timestamp = parse_date(arg, 0) / 1000000;
2493 static void opt_input_ts_offset(const char *arg)
2495 input_ts_offset = parse_date(arg, 1);
2498 static void opt_input_file(const char *filename)
2500 AVFormatContext *ic;
2501 AVFormatParameters params, *ap = ¶ms;
2502 int err, i, ret, rfps, rfps_base;
2505 if (!strcmp(filename, "-"))
2508 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2509 !strcmp( filename, "/dev/stdin" );
2511 /* get default parameters from command line */
2512 ic = av_alloc_format_context();
2514 memset(ap, 0, sizeof(*ap));
2515 ap->prealloced_context = 1;
2516 ap->sample_rate = audio_sample_rate;
2517 ap->channels = audio_channels;
2518 ap->time_base.den = frame_rate;
2519 ap->time_base.num = frame_rate_base;
2520 ap->width = frame_width + frame_padleft + frame_padright;
2521 ap->height = frame_height + frame_padtop + frame_padbottom;
2522 ap->pix_fmt = frame_pix_fmt;
2523 ap->channel = video_channel;
2524 ap->standard = video_standard;
2525 ap->video_codec_id = video_codec_id;
2526 ap->audio_codec_id = audio_codec_id;
2527 if(pgmyuv_compatibility_hack)
2528 ap->video_codec_id= CODEC_ID_PGMYUV;
2530 for(i=0; i<opt_name_count; i++){
2531 const AVOption *opt;
2532 double d= av_get_double(avformat_opts, opt_names[i], &opt);
2533 if(d==d && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2534 av_set_double(ic, opt_names[i], d);
2536 /* open the input file with generic libav function */
2537 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2539 print_error(filename, err);
2543 ic->loop_input = loop_input;
2545 /* If not enough info to get the stream parameters, we decode the
2546 first frames to get it. (used in mpeg case for example) */
2547 ret = av_find_stream_info(ic);
2548 if (ret < 0 && verbose >= 0) {
2549 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2553 timestamp = start_time;
2554 /* add the stream start time */
2555 if (ic->start_time != AV_NOPTS_VALUE)
2556 timestamp += ic->start_time;
2558 /* if seeking requested, we execute it */
2559 if (start_time != 0) {
2560 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2562 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2563 filename, (double)timestamp / AV_TIME_BASE);
2565 /* reset seek info */
2569 /* update the current parameters so that they match the one of the input stream */
2570 for(i=0;i<ic->nb_streams;i++) {
2572 AVCodecContext *enc = ic->streams[i]->codec;
2574 avcodec_thread_init(enc, thread_count);
2575 enc->thread_count= thread_count;
2576 switch(enc->codec_type) {
2577 case CODEC_TYPE_AUDIO:
2578 for(j=0; j<opt_name_count; j++){
2579 const AVOption *opt;
2580 double d= av_get_double(avctx_opts[CODEC_TYPE_AUDIO], opt_names[j], &opt);
2581 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2582 av_set_double(enc, opt_names[j], d);
2584 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2585 audio_channels = enc->channels;
2586 audio_sample_rate = enc->sample_rate;
2588 ic->streams[i]->discard= AVDISCARD_ALL;
2590 case CODEC_TYPE_VIDEO:
2591 for(j=0; j<opt_name_count; j++){
2592 const AVOption *opt;
2593 double d= av_get_double(avctx_opts[CODEC_TYPE_VIDEO], opt_names[j], &opt);
2594 if(d==d && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
2595 av_set_double(enc, opt_names[j], d);
2597 frame_height = enc->height;
2598 frame_width = enc->width;
2599 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2600 frame_pix_fmt = enc->pix_fmt;
2601 rfps = ic->streams[i]->r_frame_rate.num;
2602 rfps_base = ic->streams[i]->r_frame_rate.den;
2603 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2605 enc->debug |= FF_DEBUG_MV;
2607 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2610 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2611 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2613 (float)rfps / rfps_base, rfps, rfps_base);
2615 /* update the current frame rate to match the stream frame rate */
2617 frame_rate_base = rfps_base;
2619 enc->rate_emu = rate_emu;
2621 ic->streams[i]->discard= AVDISCARD_ALL;
2622 else if(video_discard)
2623 ic->streams[i]->discard= video_discard;
2625 case CODEC_TYPE_DATA:
2627 case CODEC_TYPE_SUBTITLE:
2629 case CODEC_TYPE_UNKNOWN:
2636 input_files[nb_input_files] = ic;
2637 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2638 /* dump the file content */
2640 dump_format(ic, nb_input_files, filename, 0);
2643 file_iformat = NULL;
2644 file_oformat = NULL;
2651 static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
2653 int has_video, has_audio, i, j;
2654 AVFormatContext *ic;
2658 for(j=0;j<nb_input_files;j++) {
2659 ic = input_files[j];
2660 for(i=0;i<ic->nb_streams;i++) {
2661 AVCodecContext *enc = ic->streams[i]->codec;
2662 switch(enc->codec_type) {
2663 case CODEC_TYPE_AUDIO:
2666 case CODEC_TYPE_VIDEO:
2669 case CODEC_TYPE_DATA:
2670 case CODEC_TYPE_UNKNOWN:
2671 case CODEC_TYPE_SUBTITLE:
2678 *has_video_ptr = has_video;
2679 *has_audio_ptr = has_audio;
2682 static void new_video_stream(AVFormatContext *oc)
2685 AVCodecContext *video_enc;
2688 st = av_new_stream(oc, oc->nb_streams);
2690 fprintf(stderr, "Could not alloc stream\n");
2693 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
2694 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
2695 video_bitstream_filters= NULL;
2698 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;
2856 avcodec_thread_init(st->codec, thread_count);
2858 audio_enc = st->codec;
2859 audio_enc->codec_type = CODEC_TYPE_AUDIO;
2860 audio_enc->strict_std_compliance = strict;
2863 audio_enc->codec_tag= audio_codec_tag;
2865 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
2866 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2867 avctx_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
2869 if (audio_stream_copy) {
2870 st->stream_copy = 1;
2871 audio_enc->channels = audio_channels;
2873 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
2875 for(i=0; i<opt_name_count; i++){
2876 const AVOption *opt;
2877 double d= av_get_double(avctx_opts[CODEC_TYPE_AUDIO], opt_names[i], &opt);
2878 if(d==d && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
2879 av_set_double(audio_enc, opt_names[i], d);
2882 if (audio_codec_id != CODEC_ID_NONE)
2883 codec_id = audio_codec_id;
2884 audio_enc->codec_id = codec_id;
2886 if (audio_qscale > QSCALE_NONE) {
2887 audio_enc->flags |= CODEC_FLAG_QSCALE;
2888 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
2890 audio_enc->thread_count = thread_count;
2891 audio_enc->channels = audio_channels;
2893 audio_enc->sample_rate = audio_sample_rate;
2894 audio_enc->time_base= (AVRational){1, audio_sample_rate};
2895 if (audio_language) {
2896 pstrcpy(st->language, sizeof(st->language), audio_language);
2897 av_free(audio_language);
2898 audio_language = NULL;
2901 /* reset some key parameters */
2903 audio_codec_id = CODEC_ID_NONE;
2904 audio_stream_copy = 0;
2907 static void opt_new_subtitle_stream(void)
2909 AVFormatContext *oc;
2911 AVCodecContext *subtitle_enc;
2914 if (nb_output_files <= 0) {
2915 fprintf(stderr, "At least one output file must be specified\n");
2918 oc = output_files[nb_output_files - 1];
2920 st = av_new_stream(oc, oc->nb_streams);
2922 fprintf(stderr, "Could not alloc stream\n");
2925 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
2927 subtitle_enc = st->codec;
2928 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
2929 if (subtitle_stream_copy) {
2930 st->stream_copy = 1;
2932 for(i=0; i<opt_name_count; i++){
2933 const AVOption *opt;
2934 double d= av_get_double(avctx_opts[CODEC_TYPE_SUBTITLE], opt_names[i], &opt);
2935 if(d==d && (opt->flags&AV_OPT_FLAG_SUBTITLE_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
2936 av_set_double(subtitle_enc, opt_names[i], d);
2938 subtitle_enc->codec_id = subtitle_codec_id;
2941 if (subtitle_language) {
2942 pstrcpy(st->language, sizeof(st->language), subtitle_language);
2943 av_free(subtitle_language);
2944 subtitle_language = NULL;
2947 subtitle_codec_id = CODEC_ID_NONE;
2948 subtitle_stream_copy = 0;
2951 static void opt_new_audio_stream(void)
2953 AVFormatContext *oc;
2954 if (nb_output_files <= 0) {
2955 fprintf(stderr, "At least one output file must be specified\n");
2958 oc = output_files[nb_output_files - 1];
2959 new_audio_stream(oc);
2962 static void opt_new_video_stream(void)
2964 AVFormatContext *oc;
2965 if (nb_output_files <= 0) {
2966 fprintf(stderr, "At least one output file must be specified\n");
2969 oc = output_files[nb_output_files - 1];
2970 new_video_stream(oc);
2973 static void opt_output_file(const char *filename)
2975 AVFormatContext *oc;
2976 int use_video, use_audio, input_has_video, input_has_audio, i;
2977 AVFormatParameters params, *ap = ¶ms;
2979 if (!strcmp(filename, "-"))
2982 oc = av_alloc_format_context();
2984 if (!file_oformat) {
2985 file_oformat = guess_format(NULL, filename, NULL);
2986 if (!file_oformat) {
2987 fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
2993 oc->oformat = file_oformat;
2994 pstrcpy(oc->filename, sizeof(oc->filename), filename);
2996 if (!strcmp(file_oformat->name, "ffm") &&
2997 strstart(filename, "http:", NULL)) {
2998 /* special case for files sent to ffserver: we get the stream
2999 parameters from ffserver */
3000 if (read_ffserver_streams(oc, filename) < 0) {
3001 fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
3005 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_id != CODEC_ID_NONE;
3006 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_id != CODEC_ID_NONE;
3008 /* disable if no corresponding type found and at least one
3010 if (nb_input_files > 0) {
3011 check_audio_video_inputs(&input_has_video, &input_has_audio);
3012 if (!input_has_video)
3014 if (!input_has_audio)
3018 /* manual disable */
3019 if (audio_disable) {
3022 if (video_disable) {
3027 new_video_stream(oc);
3031 new_audio_stream(oc);
3034 oc->timestamp = rec_timestamp;
3037 pstrcpy(oc->title, sizeof(oc->title), str_title);
3039 pstrcpy(oc->author, sizeof(oc->author), str_author);
3041 pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
3043 pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
3045 pstrcpy(oc->album, sizeof(oc->album), str_album);
3048 output_files[nb_output_files++] = oc;
3050 /* check filename in case of an image number is expected */
3051 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3052 if (!av_filename_number_test(oc->filename)) {
3053 print_error(oc->filename, AVERROR_NUMEXPECTED);
3058 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3059 /* test if it already exists to avoid loosing precious files */
3060 if (!file_overwrite &&
3061 (strchr(filename, ':') == NULL ||
3062 strstart(filename, "file:", NULL))) {
3063 if (url_exist(filename)) {
3066 if ( !using_stdin ) {
3067 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3070 if (toupper(c) != 'Y') {
3071 fprintf(stderr, "Not overwriting - exiting\n");
3076 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3083 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3084 fprintf(stderr, "Could not open '%s'\n", filename);
3089 memset(ap, 0, sizeof(*ap));
3090 if (av_set_parameters(oc, ap) < 0) {
3091 fprintf(stderr, "%s: Invalid encoding parameters\n",
3096 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3097 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3098 oc->loop_output = loop_output;
3100 for(i=0; i<opt_name_count; i++){
3101 const AVOption *opt;
3102 double d = av_get_double(avformat_opts, opt_names[i], &opt);
3103 if(d==d && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM))
3104 av_set_double(oc, opt_names[i], d);
3107 /* reset some options */
3108 file_oformat = NULL;
3109 file_iformat = NULL;
3112 /* same option as mencoder */
3113 static void opt_pass(const char *pass_str)
3116 pass = atoi(pass_str);
3117 if (pass != 1 && pass != 2) {
3118 fprintf(stderr, "pass number can be only 1 or 2\n");
3124 #if defined(__MINGW32__) || defined(CONFIG_OS2)
3125 static int64_t getutime(void)
3127 return av_gettime();
3130 static int64_t getutime(void)
3132 struct rusage rusage;
3134 getrusage(RUSAGE_SELF, &rusage);
3135 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3139 #if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
3140 extern int ffm_nopts;
3143 static void show_formats(void)
3145 AVInputFormat *ifmt;
3146 AVOutputFormat *ofmt;
3149 const char **pp, *last_name;
3151 printf("File formats:\n");
3156 const char *name=NULL;
3157 const char *long_name=NULL;
3159 for(ofmt = first_oformat; ofmt != NULL; ofmt = ofmt->next) {
3160 if((name == NULL || strcmp(ofmt->name, name)<0) &&
3161 strcmp(ofmt->name, last_name)>0){
3163 long_name= ofmt->long_name;
3167 for(ifmt = first_iformat; ifmt != NULL; ifmt = ifmt->next) {
3168 if((name == NULL || strcmp(ifmt->name, name)<0) &&
3169 strcmp(ifmt->name, last_name)>0){
3171 long_name= ifmt->long_name;
3174 if(name && strcmp(ifmt->name, name)==0)
3186 long_name ? long_name:" ");
3190 printf("Codecs:\n");
3196 const char *type_str;
3199 for(p = first_avcodec; p != NULL; p = p->next) {
3200 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
3201 strcmp(p->name, last_name)>0){
3203 decode= encode= cap=0;
3205 if(p2 && strcmp(p->name, p2->name)==0){
3206 if(p->decode) decode=1;
3207 if(p->encode) encode=1;
3208 cap |= p->capabilities;
3213 last_name= p2->name;
3216 case CODEC_TYPE_VIDEO:
3219 case CODEC_TYPE_AUDIO:
3222 case CODEC_TYPE_SUBTITLE:
3231 decode ? "D": (/*p2->decoder ? "d":*/" "),
3234 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
3235 cap & CODEC_CAP_DR1 ? "D":" ",
3236 cap & CODEC_CAP_TRUNCATED ? "T":" ",
3238 /* if(p2->decoder && decode==0)
3239 printf(" use %s for decoding", p2->decoder->name);*/
3244 printf("Supported file protocols:\n");
3245 for(up = first_protocol; up != NULL; up = up->next)
3246 printf(" %s:", up->name);
3249 printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3250 printf("Motion estimation methods:\n");
3254 if ((pp - motion_str + 1) == ME_ZERO)
3255 printf("(fastest)");
3256 else if ((pp - motion_str + 1) == ME_FULL)
3257 printf("(slowest)");
3258 else if ((pp - motion_str + 1) == ME_EPZS)
3259 printf("(default)");
3264 "Note, the names of encoders and decoders dont always match, so there are\n"
3265 "several cases where the above table shows encoder only or decoder only entries\n"
3266 "even though both encoding and decoding are supported for example, the h263\n"
3267 "decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
3272 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3275 const char *p = str;
3282 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3289 static void opt_inter_matrix(const char *arg)
3291 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3292 parse_matrix_coeffs(inter_matrix, arg);
3295 static void opt_intra_matrix(const char *arg)
3297 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3298 parse_matrix_coeffs(intra_matrix, arg);
3301 static void opt_target(const char *arg)
3304 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3306 if(!strncmp(arg, "pal-", 4)) {
3309 } else if(!strncmp(arg, "ntsc-", 5)) {
3312 } else if(!strncmp(arg, "film-", 5)) {
3317 /* Calculate FR via float to avoid int overflow */
3318 fr = (int)(frame_rate * 1000.0 / frame_rate_base);
3321 } else if((fr == 29970) || (fr == 23976)) {
3324 /* Try to determine PAL/NTSC by peeking in the input files */
3325 if(nb_input_files) {
3327 for(j = 0; j < nb_input_files; j++) {
3328 for(i = 0; i < input_files[j]->nb_streams; i++) {
3329 AVCodecContext *c = input_files[j]->streams[i]->codec;
3330 if(c->codec_type != CODEC_TYPE_VIDEO)
3332 fr = c->time_base.den * 1000 / c->time_base.num;
3336 } else if((fr == 29970) || (fr == 23976)) {
3346 if(verbose && norm >= 0)
3347 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3351 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3352 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3353 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3357 if(!strcmp(arg, "vcd")) {
3359 opt_video_codec("mpeg1video");
3360 opt_audio_codec("mp2");
3363 opt_frame_size(norm ? "352x240" : "352x288");
3364 opt_frame_rate(frame_rates[norm]);
3365 opt_default("gop", norm ? "18" : "15");
3367 opt_default("b", "1150000");
3368 opt_default("maxrate", "1150000");
3369 opt_default("minrate", "1150000");
3370 opt_default("bufsize", "327680"); // 40*1024*8;
3372 opt_default("ab", "224000");
3373 audio_sample_rate = 44100;
3376 opt_default("packetsize", "2324");
3377 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3379 /* We have to offset the PTS, so that it is consistent with the SCR.
3380 SCR starts at 36000, but the first two packs contain only padding
3381 and the first pack from the other stream, respectively, may also have
3382 been written before.
3383 So the real data starts at SCR 36000+3*1200. */
3384 mux_preload= (36000+3*1200) / 90000.0; //0.44
3385 } else if(!strcmp(arg, "svcd")) {
3387 opt_video_codec("mpeg2video");
3388 opt_audio_codec("mp2");
3391 opt_frame_size(norm ? "480x480" : "480x576");
3392 opt_frame_rate(frame_rates[norm]);
3393 opt_default("gop", norm ? "18" : "15");
3395 opt_default("b", "2040000");
3396 opt_default("maxrate", "2516000");
3397 opt_default("minrate", "0"); //1145000;
3398 opt_default("bufsize", "1835008"); //224*1024*8;
3399 opt_default("flags", "+SCAN_OFFSET");
3402 opt_default("ab", "224000");
3403 audio_sample_rate = 44100;
3405 opt_default("packetsize", "2324");
3407 } else if(!strcmp(arg, "dvd")) {
3409 opt_video_codec("mpeg2video");
3410 opt_audio_codec("ac3");
3413 opt_frame_size(norm ? "720x480" : "720x576");
3414 opt_frame_rate(frame_rates[norm]);
3415 opt_default("gop", norm ? "18" : "15");
3417 opt_default("b", "6000000");
3418 opt_default("maxrate", "9000000");
3419 opt_default("minrate", "0"); //1500000;
3420 opt_default("bufsize", "1835008"); //224*1024*8;
3422 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3423 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3425 opt_default("ab", "448000");
3426 audio_sample_rate = 48000;
3428 } else if(!strncmp(arg, "dv", 2)) {
3432 opt_frame_size(norm ? "720x480" : "720x576");
3433 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3434 (norm ? "yuv411p" : "yuv420p"));
3435 opt_frame_rate(frame_rates[norm]);
3437 audio_sample_rate = 48000;
3441 fprintf(stderr, "Unknown target: %s\n", arg);
3446 static void opt_video_bsf(const char *arg)
3448 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3449 AVBitStreamFilterContext **bsfp;
3452 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3456 bsfp= &video_bitstream_filters;
3458 bsfp= &(*bsfp)->next;
3463 //FIXME avoid audio - video code duplication
3464 static void opt_audio_bsf(const char *arg)
3466 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3467 AVBitStreamFilterContext **bsfp;
3470 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3474 bsfp= &audio_bitstream_filters;
3476 bsfp= &(*bsfp)->next;
3481 static void show_version(void)
3483 /* TODO: add function interface to avutil and avformat */
3484 fprintf(stderr, "ffmpeg " FFMPEG_VERSION "\n"
3488 LIBAVUTIL_BUILD, avcodec_build(), LIBAVFORMAT_BUILD);
3492 static int opt_default(const char *opt, const char *arg){
3494 const AVOption *o= NULL;
3495 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
3497 for(type=0; type<CODEC_TYPE_NB; type++){
3498 const AVOption *o2 = av_find_opt(avctx_opts[0], opt, NULL, opt_types[type], opt_types[type]);
3500 o = av_set_string(avctx_opts[type], opt, arg);
3503 o = av_set_string(avformat_opts, opt, arg);
3506 o = av_set_string(avctx_opts[CODEC_TYPE_AUDIO], opt+1, arg);
3507 else if(opt[0] == 'v')
3508 o = av_set_string(avctx_opts[CODEC_TYPE_VIDEO], opt+1, arg);
3509 else if(opt[0] == 's')
3510 o = av_set_string(avctx_opts[CODEC_TYPE_SUBTITLE], opt+1, arg);
3515 // 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));
3517 //FIXME we should always use avctx_opts, ... for storing options so there wont be any need to keep track of whats set over this
3518 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
3519 opt_names[opt_name_count++]= o->name;
3521 #if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
3522 /* disable generate of real time pts in ffm (need to be supressed anyway) */
3523 if(avctx_opts[0]->flags & CODEC_FLAG_BITEXACT)
3527 if(avctx_opts[0]->debug)
3528 av_log_level = AV_LOG_DEBUG;
3532 const OptionDef options[] = {
3534 { "L", 0, {(void*)show_license}, "show license" },
3535 { "h", 0, {(void*)show_help}, "show help" },
3536 { "version", 0, {(void*)show_version}, "show version" },
3537 { "formats", 0, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3538 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3539 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3540 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3541 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3542 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3543 { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
3544 { "fs", HAS_ARG | OPT_INT, {(void*)&limit_filesize}, "set the limit file size", "limit_size" }, //
3545 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3546 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3547 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3548 { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3549 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3550 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3551 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3552 { "album", HAS_ARG | OPT_STRING, {(void*)&str_album}, "set the album", "string" },
3553 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3554 "add timings for benchmarking" },
3555 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3556 "dump each input packet" },
3557 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3558 "when dumping packets, also dump the payload" },
3559 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3560 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3561 { "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)", "" },
3562 { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
3563 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3564 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3565 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3566 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3567 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3568 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3569 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3570 { "dts_delta_threshold", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "" },
3573 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3574 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3575 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3576 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3577 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3578 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
3579 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3580 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3581 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3582 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3583 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3584 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3585 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3586 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3587 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3588 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3589 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3590 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3591 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3592 { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantizer scale (VBR)", "q" },
3593 { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
3594 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3595 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3596 { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
3598 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "" },
3599 { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3600 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3601 "use same video quality as source (implies VBR)" },
3602 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3603 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3604 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3605 "deinterlace pictures" },
3606 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3607 { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
3608 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3609 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3610 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3611 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3612 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3613 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3614 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3615 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3618 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3619 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3620 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3621 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3622 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3623 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3624 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3625 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3626 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3627 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3629 /* subtitle options */
3630 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3631 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
3632 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3635 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3636 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3637 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3640 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
3641 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
3643 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_audio_bsf}, "", "bitstream filter" },
3644 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_video_bsf}, "", "bitstream filter" },
3646 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
3650 static void show_banner(void)
3652 fprintf(stderr, "FFmpeg version " FFMPEG_VERSION ", Copyright (c) 2000-2007 Fabrice Bellard, et al.\n");
3653 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
3654 fprintf(stderr, " libavutil version: " AV_STRINGIFY(LIBAVUTIL_VERSION) "\n");
3655 fprintf(stderr, " libavcodec version: " AV_STRINGIFY(LIBAVCODEC_VERSION) "\n");
3656 fprintf(stderr, " libavformat version: " AV_STRINGIFY(LIBAVFORMAT_VERSION) "\n");
3657 fprintf(stderr, " built on " __DATE__ " " __TIME__);
3659 fprintf(stderr, ", gcc: " __VERSION__ "\n");
3661 fprintf(stderr, ", using a non-gcc compiler\n");
3665 static void show_license(void)
3670 "FFmpeg is free software; you can redistribute it and/or modify\n"
3671 "it under the terms of the GNU General Public License as published by\n"
3672 "the Free Software Foundation; either version 2 of the License, or\n"
3673 "(at your option) any later version.\n"
3675 "FFmpeg is distributed in the hope that it will be useful,\n"
3676 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3677 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
3678 "GNU General Public License for more details.\n"
3680 "You should have received a copy of the GNU General Public License\n"
3681 "along with FFmpeg; if not, write to the Free Software\n"
3682 "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
3686 "FFmpeg is free software; you can redistribute it and/or\n"
3687 "modify it under the terms of the GNU Lesser General Public\n"
3688 "License as published by the Free Software Foundation; either\n"
3689 "version 2.1 of the License, or (at your option) any later version.\n"
3691 "FFmpeg is distributed in the hope that it will be useful,\n"
3692 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
3693 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
3694 "Lesser General Public License for more details.\n"
3696 "You should have received a copy of the GNU Lesser General Public\n"
3697 "License along with FFmpeg; if not, write to the Free Software\n"
3698 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
3704 static void show_help(void)
3707 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3708 "Hyper fast Audio and Video encoder\n");
3710 show_help_options(options, "Main options:\n",
3711 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
3712 show_help_options(options, "\nVideo options:\n",
3713 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3715 show_help_options(options, "\nAdvanced Video options:\n",
3716 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3717 OPT_VIDEO | OPT_EXPERT);
3718 show_help_options(options, "\nAudio options:\n",
3719 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3721 show_help_options(options, "\nAdvanced Audio options:\n",
3722 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3723 OPT_AUDIO | OPT_EXPERT);
3724 show_help_options(options, "\nSubtitle options:\n",
3725 OPT_SUBTITLE | OPT_GRAB,
3727 show_help_options(options, "\nAudio/Video grab options:\n",
3730 show_help_options(options, "\nAdvanced options:\n",
3731 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3733 av_opt_show(avctx_opts[0], NULL);
3734 av_opt_show(avformat_opts, NULL);
3739 void parse_arg_file(const char *filename)
3741 opt_output_file(filename);
3744 int main(int argc, char **argv)
3751 for(i=0; i<CODEC_TYPE_NB; i++){
3752 avctx_opts[i]= avcodec_alloc_context2(i);
3754 avformat_opts = av_alloc_format_context();
3762 parse_options(argc, argv, options);
3764 /* file converter / grab */
3765 if (nb_output_files <= 0) {
3766 fprintf(stderr, "Must supply at least one output file\n");
3770 if (nb_input_files == 0) {
3771 fprintf(stderr, "Must supply at least one input file\n");
3776 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3777 stream_maps, nb_stream_maps);
3778 ti = getutime() - ti;
3780 printf("bench: utime=%0.3fs\n", ti / 1000000.0);
3784 for(i=0;i<nb_output_files;i++) {
3785 /* maybe av_close_output_file ??? */
3786 AVFormatContext *s = output_files[i];
3788 if (!(s->oformat->flags & AVFMT_NOFILE))
3790 for(j=0;j<s->nb_streams;j++) {
3791 av_free(s->streams[j]->codec);
3792 av_free(s->streams[j]);
3796 for(i=0;i<nb_input_files;i++)
3797 av_close_input_file(input_files[i]);
3801 av_free(intra_matrix);
3802 av_free(inter_matrix);
3805 #ifdef CONFIG_POWERPC_PERF
3806 extern void powerpc_display_perf_report(void);
3807 powerpc_display_perf_report();
3808 #endif /* CONFIG_POWERPC_PERF */
3810 if (received_sigterm) {
3812 "Received signal %d: terminating.\n",
3813 (int) received_sigterm);
3817 exit(0); /* not all OS-es handle main() return value */