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
22 /* needed for usleep() */
23 #define _XOPEN_SOURCE 500
34 #include "libavformat/avformat.h"
35 #include "libavdevice/avdevice.h"
36 #include "libswscale/swscale.h"
37 #include "libavformat/framehook.h"
38 #include "libavcodec/opt.h"
39 #include "libavcodec/audioconvert.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/avstring.h"
42 #include "libavformat/os_support.h"
44 #ifdef HAVE_SYS_RESOURCE_H
45 #include <sys/types.h>
46 #include <sys/resource.h>
47 #elif defined(HAVE_GETPROCESSTIMES)
51 #if defined(HAVE_TERMIOS_H)
53 #include <sys/ioctl.h>
56 #elif defined(HAVE_CONIO_H)
59 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
69 const char program_name[] = "FFmpeg";
70 const int program_birth_year = 2000;
72 /* select an input stream for an output stream */
73 typedef struct AVStreamMap {
77 int sync_stream_index;
80 /** select an input file for an output file */
81 typedef struct AVMetaDataMap {
86 static const OptionDef options[];
90 static AVFormatContext *input_files[MAX_FILES];
91 static int64_t input_files_ts_offset[MAX_FILES];
92 static double input_files_ts_scale[MAX_FILES][MAX_STREAMS];
93 static int nb_input_files = 0;
95 static AVFormatContext *output_files[MAX_FILES];
96 static int nb_output_files = 0;
98 static AVStreamMap stream_maps[MAX_FILES*MAX_STREAMS];
99 static int nb_stream_maps;
101 static AVMetaDataMap meta_data_maps[MAX_FILES];
102 static int nb_meta_data_maps;
104 static AVInputFormat *file_iformat;
105 static AVOutputFormat *file_oformat;
106 static int frame_width = 0;
107 static int frame_height = 0;
108 static float frame_aspect_ratio = 0;
109 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
110 static enum SampleFormat audio_sample_fmt = SAMPLE_FMT_NONE;
111 static int frame_padtop = 0;
112 static int frame_padbottom = 0;
113 static int frame_padleft = 0;
114 static int frame_padright = 0;
115 static int padcolor[3] = {16,128,128}; /* default to black */
116 static int frame_topBand = 0;
117 static int frame_bottomBand = 0;
118 static int frame_leftBand = 0;
119 static int frame_rightBand = 0;
120 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
121 static AVRational frame_rate;
122 static float video_qscale = 0;
123 static uint16_t *intra_matrix = NULL;
124 static uint16_t *inter_matrix = NULL;
125 #if 0 //experimental, (can be removed)
126 static float video_rc_qsquish=1.0;
127 static float video_rc_qmod_amp=0;
128 static int video_rc_qmod_freq=0;
130 static const char *video_rc_override_string=NULL;
131 static int video_disable = 0;
132 static int video_discard = 0;
133 static char *video_codec_name = NULL;
134 static int video_codec_tag = 0;
135 static int same_quality = 0;
136 static int do_deinterlace = 0;
137 static int top_field_first = -1;
138 static int me_threshold = 0;
139 static int intra_dc_precision = 8;
140 static int loop_input = 0;
141 static int loop_output = AVFMT_NOOUTPUTLOOP;
142 static int qp_hist = 0;
144 static int intra_only = 0;
145 static int audio_sample_rate = 44100;
146 #define QSCALE_NONE -99999
147 static float audio_qscale = QSCALE_NONE;
148 static int audio_disable = 0;
149 static int audio_channels = 1;
150 static char *audio_codec_name = NULL;
151 static int audio_codec_tag = 0;
152 static char *audio_language = NULL;
154 static int subtitle_disable = 0;
155 static char *subtitle_codec_name = NULL;
156 static char *subtitle_language = NULL;
158 static float mux_preload= 0.5;
159 static float mux_max_delay= 0.7;
161 static int64_t recording_time = INT64_MAX;
162 static int64_t start_time = 0;
163 static int64_t rec_timestamp = 0;
164 static int64_t input_ts_offset = 0;
165 static int file_overwrite = 0;
166 static char *str_title = NULL;
167 static char *str_author = NULL;
168 static char *str_copyright = NULL;
169 static char *str_comment = NULL;
170 static char *str_genre = NULL;
171 static char *str_album = NULL;
172 static int do_benchmark = 0;
173 static int do_hex_dump = 0;
174 static int do_pkt_dump = 0;
175 static int do_psnr = 0;
176 static int do_pass = 0;
177 static char *pass_logfilename = NULL;
178 static int audio_stream_copy = 0;
179 static int video_stream_copy = 0;
180 static int subtitle_stream_copy = 0;
181 static int video_sync_method= -1;
182 static int audio_sync_method= 0;
183 static float audio_drift_threshold= 0.1;
184 static int copy_ts= 0;
185 static int opt_shortest = 0; //
186 static int video_global_header = 0;
187 static char *vstats_filename;
188 static FILE *vstats_file;
189 static int opt_programid = 0;
191 static int rate_emu = 0;
193 static int video_channel = 0;
194 static char *video_standard;
196 static int audio_volume = 256;
198 static int using_stdin = 0;
199 static int using_vhook = 0;
200 static int verbose = 1;
201 static int thread_count= 1;
202 static int q_pressed = 0;
203 static int64_t video_size = 0;
204 static int64_t audio_size = 0;
205 static int64_t extra_size = 0;
206 static int nb_frames_dup = 0;
207 static int nb_frames_drop = 0;
208 static int input_sync;
209 static uint64_t limit_filesize = 0; //
211 static int pgmyuv_compatibility_hack=0;
212 static float dts_delta_threshold = 10;
214 static unsigned int sws_flags = SWS_BICUBIC;
216 static const char **opt_names;
217 static int opt_name_count;
218 static AVCodecContext *avctx_opts[CODEC_TYPE_NB];
219 static AVFormatContext *avformat_opts;
220 static struct SwsContext *sws_opts;
221 static int64_t timer_start;
223 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
224 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
225 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
226 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
228 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
230 struct AVInputStream;
232 typedef struct AVOutputStream {
233 int file_index; /* file index */
234 int index; /* stream index in the output file */
235 int source_index; /* AVInputStream index */
236 AVStream *st; /* stream in the output file */
237 int encoding_needed; /* true if encoding needed for this stream */
239 /* input pts and corresponding output pts
241 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
242 struct AVInputStream *sync_ist; /* input stream to sync against */
243 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
246 AVFrame pict_tmp; /* temporary image for resampling */
247 struct SwsContext *img_resample_ctx; /* for image resampling */
251 int topBand; /* cropping area sizes */
255 int padtop; /* padding area sizes */
262 ReSampleContext *resample; /* for audio resampling */
264 AVAudioConvert *reformat_ctx;
265 AVFifoBuffer fifo; /* for compression: one audio fifo per codec */
269 typedef struct AVInputStream {
273 int discard; /* true if stream data should be discarded */
274 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
275 int64_t sample_index; /* current sample */
277 int64_t start; /* time when read started */
278 unsigned long frame; /* current frame */
279 int64_t next_pts; /* synthetic pts for cases where pkt.pts
281 int64_t pts; /* current pts */
282 int is_start; /* is 1 at the start and after a discontinuity */
285 typedef struct AVInputFile {
286 int eof_reached; /* true if eof reached */
287 int ist_index; /* index of first stream in ist_table */
288 int buffer_size; /* current total buffer size */
289 int nb_streams; /* nb streams we are aware of */
292 #ifdef HAVE_TERMIOS_H
294 /* init terminal so that we can grab keys */
295 static struct termios oldtty;
298 static void term_exit(void)
300 #ifdef HAVE_TERMIOS_H
301 tcsetattr (0, TCSANOW, &oldtty);
305 static volatile sig_atomic_t received_sigterm = 0;
308 sigterm_handler(int sig)
310 received_sigterm = sig;
314 static void term_init(void)
316 #ifdef HAVE_TERMIOS_H
322 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
323 |INLCR|IGNCR|ICRNL|IXON);
324 tty.c_oflag |= OPOST;
325 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
326 tty.c_cflag &= ~(CSIZE|PARENB);
331 tcsetattr (0, TCSANOW, &tty);
332 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
335 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
336 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
338 register a function to be called at normal program termination
341 #ifdef CONFIG_BEOS_NETSERVER
342 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
346 /* read a key without blocking */
347 static int read_key(void)
349 #if defined(HAVE_TERMIOS_H)
352 #ifndef CONFIG_BEOS_NETSERVER
360 n = select(1, &rfds, NULL, NULL, &tv);
369 #elif defined(HAVE_CONIO_H)
376 static int decode_interrupt_cb(void)
378 return q_pressed || (q_pressed = read_key() == 'q');
381 static int av_exit(int ret)
386 for(i=0;i<nb_output_files;i++) {
387 /* maybe av_close_output_file ??? */
388 AVFormatContext *s = output_files[i];
390 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
392 for(j=0;j<s->nb_streams;j++) {
393 av_free(s->streams[j]->codec);
394 av_free(s->streams[j]);
398 for(i=0;i<nb_input_files;i++)
399 av_close_input_file(input_files[i]);
401 av_free(intra_matrix);
402 av_free(inter_matrix);
406 av_free(vstats_filename);
410 av_free(video_codec_name);
411 av_free(audio_codec_name);
412 av_free(subtitle_codec_name);
414 av_free(video_standard);
416 #ifdef CONFIG_POWERPC_PERF
417 extern void powerpc_display_perf_report(void);
418 powerpc_display_perf_report();
419 #endif /* CONFIG_POWERPC_PERF */
421 if (received_sigterm) {
423 "Received signal %d: terminating.\n",
424 (int) received_sigterm);
428 exit(ret); /* not all OS-es handle main() return value */
432 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
438 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
441 /* copy stream format */
442 s->nb_streams = ic->nb_streams;
443 for(i=0;i<ic->nb_streams;i++) {
446 // FIXME: a more elegant solution is needed
447 st = av_mallocz(sizeof(AVStream));
448 memcpy(st, ic->streams[i], sizeof(AVStream));
449 st->codec = avcodec_alloc_context();
450 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
453 if (st->codec->codec_type == CODEC_TYPE_AUDIO && audio_stream_copy)
455 else if (st->codec->codec_type == CODEC_TYPE_VIDEO && video_stream_copy)
458 if(!st->codec->thread_count)
459 st->codec->thread_count = 1;
460 if(st->codec->thread_count>1)
461 avcodec_thread_init(st->codec, st->codec->thread_count);
463 if(st->codec->flags & CODEC_FLAG_BITEXACT)
468 s->timestamp = av_gettime();
470 av_close_input_file(ic);
475 get_sync_ipts(const AVOutputStream *ost)
477 const AVInputStream *ist = ost->sync_ist;
478 return (double)(ist->pts - start_time)/AV_TIME_BASE;
481 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
485 AVPacket new_pkt= *pkt;
486 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
487 &new_pkt.data, &new_pkt.size,
488 pkt->data, pkt->size,
489 pkt->flags & PKT_FLAG_KEY);
492 new_pkt.destruct= av_destruct_packet;
494 fprintf(stderr, "%s failed for stream %d, codec %s",
495 bsfc->filter->name, pkt->stream_index,
496 avctx->codec ? avctx->codec->name : "copy");
504 ret= av_interleaved_write_frame(s, pkt);
506 print_error("av_interleaved_write_frame()", ret);
511 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
513 static void do_audio_out(AVFormatContext *s,
516 unsigned char *buf, int size)
519 static uint8_t *audio_buf = NULL;
520 static uint8_t *audio_out = NULL;
521 static uint8_t *audio_out2 = NULL;
522 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
524 int size_out, frame_bytes, ret;
525 AVCodecContext *enc= ost->st->codec;
526 AVCodecContext *dec= ist->st->codec;
528 /* SC: dynamic allocation of buffers */
530 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
532 audio_out = av_malloc(audio_out_size);
533 if (!audio_buf || !audio_out)
534 return; /* Should signal an error ! */
536 if (enc->channels != dec->channels)
537 ost->audio_resample = 1;
539 if (ost->audio_resample && !ost->resample) {
540 if (dec->sample_fmt != SAMPLE_FMT_S16) {
541 fprintf(stderr, "Audio resampler only works with 16 bits per sample, patch welcome.\n");
544 ost->resample = audio_resample_init(enc->channels, dec->channels,
545 enc->sample_rate, dec->sample_rate);
546 if (!ost->resample) {
547 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
548 dec->channels, dec->sample_rate,
549 enc->channels, enc->sample_rate);
554 #define MAKE_SFMT_PAIR(a,b) ((a)+SAMPLE_FMT_NB*(b))
555 if (dec->sample_fmt!=enc->sample_fmt &&
556 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
558 audio_out2 = av_malloc(audio_out_size);
561 if (ost->reformat_ctx)
562 av_audio_convert_free(ost->reformat_ctx);
563 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
564 dec->sample_fmt, 1, NULL, 0);
565 if (!ost->reformat_ctx) {
566 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
567 avcodec_get_sample_fmt_name(dec->sample_fmt),
568 avcodec_get_sample_fmt_name(enc->sample_fmt));
571 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
574 if(audio_sync_method){
575 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
576 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2);
577 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
578 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
580 //FIXME resample delay
581 if(fabs(delta) > 50){
582 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
584 byte_delta= FFMAX(byte_delta, -size);
588 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
593 static uint8_t *input_tmp= NULL;
594 input_tmp= av_realloc(input_tmp, byte_delta + size);
596 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
599 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
601 memset(input_tmp, 0, byte_delta);
602 memcpy(input_tmp + byte_delta, buf, size);
606 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
608 }else if(audio_sync_method>1){
609 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
610 assert(ost->audio_resample);
612 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
613 // 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));
614 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
618 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
619 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
621 if (ost->audio_resample) {
623 size_out = audio_resample(ost->resample,
624 (short *)buftmp, (short *)buf,
625 size / (ist->st->codec->channels * 2));
626 size_out = size_out * enc->channels * 2;
632 if (dec->sample_fmt!=enc->sample_fmt) {
633 const void *ibuf[6]= {buftmp};
634 void *obuf[6]= {audio_out2};
635 int istride[6]= {av_get_bits_per_sample_format(dec->sample_fmt)/8};
636 int ostride[6]= {av_get_bits_per_sample_format(enc->sample_fmt)/8};
637 int len= size_out/istride[0];
638 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
639 printf("av_audio_convert() failed\n");
643 /* FIXME: existing code assume that size_out equals framesize*channels*2
644 remove this legacy cruft */
648 /* now encode as many frames as possible */
649 if (enc->frame_size > 1) {
650 /* output resampled raw samples */
651 if (av_fifo_realloc2(&ost->fifo, av_fifo_size(&ost->fifo) + size_out) < 0) {
652 fprintf(stderr, "av_fifo_realloc2() failed\n");
655 av_fifo_generic_write(&ost->fifo, buftmp, size_out, NULL);
657 frame_bytes = enc->frame_size * 2 * enc->channels;
659 while (av_fifo_size(&ost->fifo) >= frame_bytes) {
661 av_init_packet(&pkt);
663 av_fifo_read(&ost->fifo, audio_buf, frame_bytes);
665 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
667 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
670 pkt.stream_index= ost->index;
673 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
674 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
675 pkt.flags |= PKT_FLAG_KEY;
676 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
678 ost->sync_opts += enc->frame_size;
682 av_init_packet(&pkt);
684 ost->sync_opts += size_out / (2 * enc->channels);
686 /* output a pcm frame */
687 /* XXX: change encoding codec API to avoid this ? */
688 switch(enc->codec->id) {
689 case CODEC_ID_PCM_S32LE:
690 case CODEC_ID_PCM_S32BE:
691 case CODEC_ID_PCM_U32LE:
692 case CODEC_ID_PCM_U32BE:
693 case CODEC_ID_PCM_F32BE:
694 size_out = size_out << 1;
696 case CODEC_ID_PCM_S24LE:
697 case CODEC_ID_PCM_S24BE:
698 case CODEC_ID_PCM_U24LE:
699 case CODEC_ID_PCM_U24BE:
700 case CODEC_ID_PCM_S24DAUD:
701 size_out = size_out / 2 * 3;
703 case CODEC_ID_PCM_S16LE:
704 case CODEC_ID_PCM_S16BE:
705 case CODEC_ID_PCM_U16LE:
706 case CODEC_ID_PCM_U16BE:
709 size_out = size_out >> 1;
712 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
713 ret = avcodec_encode_audio(enc, audio_out, size_out,
716 pkt.stream_index= ost->index;
719 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
720 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
721 pkt.flags |= PKT_FLAG_KEY;
722 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
726 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
730 AVPicture picture_tmp;
733 dec = ist->st->codec;
735 /* deinterlace : must be done before any resize */
736 if (do_deinterlace || using_vhook) {
739 /* create temporary picture */
740 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
741 buf = av_malloc(size);
745 picture2 = &picture_tmp;
746 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
749 if(avpicture_deinterlace(picture2, picture,
750 dec->pix_fmt, dec->width, dec->height) < 0) {
751 /* if error, do not deinterlace */
757 av_picture_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
764 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height,
765 1000000 * ist->pts / AV_TIME_BASE);
767 if (picture != picture2)
768 *picture = *picture2;
772 /* we begin to correct av delay at this threshold */
773 #define AV_DELAY_MAX 0.100
775 static void do_subtitle_out(AVFormatContext *s,
781 static uint8_t *subtitle_out = NULL;
782 int subtitle_out_max_size = 65536;
783 int subtitle_out_size, nb, i;
787 if (pts == AV_NOPTS_VALUE) {
788 fprintf(stderr, "Subtitle packets must have a pts\n");
792 enc = ost->st->codec;
795 subtitle_out = av_malloc(subtitle_out_max_size);
798 /* Note: DVB subtitle need one packet to draw them and one other
799 packet to clear them */
800 /* XXX: signal it in the codec context ? */
801 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
806 for(i = 0; i < nb; i++) {
807 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
808 subtitle_out_max_size, sub);
810 av_init_packet(&pkt);
811 pkt.stream_index = ost->index;
812 pkt.data = subtitle_out;
813 pkt.size = subtitle_out_size;
814 pkt.pts = av_rescale_q(pts, ist->st->time_base, ost->st->time_base);
815 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
816 /* XXX: the pts correction is handled here. Maybe handling
817 it in the codec would be better */
819 pkt.pts += 90 * sub->start_display_time;
821 pkt.pts += 90 * sub->end_display_time;
823 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
827 static int bit_buffer_size= 1024*256;
828 static uint8_t *bit_buffer= NULL;
830 static void do_video_out(AVFormatContext *s,
836 int nb_frames, i, ret;
837 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
838 AVFrame picture_crop_temp, picture_pad_temp;
839 AVCodecContext *enc, *dec;
841 avcodec_get_frame_defaults(&picture_crop_temp);
842 avcodec_get_frame_defaults(&picture_pad_temp);
844 enc = ost->st->codec;
845 dec = ist->st->codec;
847 /* by default, we output a single frame */
852 if(video_sync_method>0 || (video_sync_method && av_q2d(enc->time_base) > 0.001)){
854 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
855 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
858 else if (video_sync_method == 2)
859 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
860 else if (vdelta > 1.1)
861 nb_frames = lrintf(vdelta);
862 //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);
866 fprintf(stderr, "*** drop!\n");
867 }else if (nb_frames > 1) {
868 nb_frames_dup += nb_frames;
870 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
873 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
875 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
879 if (ost->video_crop) {
880 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
881 av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
884 formatted_picture = &picture_crop_temp;
886 formatted_picture = in_picture;
889 final_picture = formatted_picture;
890 padding_src = formatted_picture;
891 resampling_dst = &ost->pict_tmp;
892 if (ost->video_pad) {
893 final_picture = &ost->pict_tmp;
894 if (ost->video_resample) {
895 if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
896 av_log(NULL, AV_LOG_ERROR, "error padding picture\n");
899 resampling_dst = &picture_pad_temp;
903 if (ost->video_resample) {
905 final_picture = &ost->pict_tmp;
906 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
907 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
910 if (ost->video_pad) {
911 av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
912 enc->height, enc->width, enc->pix_fmt,
913 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
916 /* duplicates frame if needed */
917 for(i=0;i<nb_frames;i++) {
919 av_init_packet(&pkt);
920 pkt.stream_index= ost->index;
922 if (s->oformat->flags & AVFMT_RAWPICTURE) {
923 /* raw pictures are written as AVPicture structure to
924 avoid any copies. We support temorarily the older
926 AVFrame* old_frame = enc->coded_frame;
927 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
928 pkt.data= (uint8_t *)final_picture;
929 pkt.size= sizeof(AVPicture);
930 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
931 pkt.flags |= PKT_FLAG_KEY;
933 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
934 enc->coded_frame = old_frame;
938 big_picture= *final_picture;
939 /* better than nothing: use input picture interlaced
941 big_picture.interlaced_frame = in_picture->interlaced_frame;
942 if(avctx_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
943 if(top_field_first == -1)
944 big_picture.top_field_first = in_picture->top_field_first;
946 big_picture.top_field_first = top_field_first;
949 /* handles sameq here. This is not correct because it may
950 not be a global option */
952 big_picture.quality = ist->st->quality;
954 big_picture.quality = ost->st->quality;
956 big_picture.pict_type = 0;
957 // big_picture.pts = AV_NOPTS_VALUE;
958 big_picture.pts= ost->sync_opts;
959 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
960 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
961 ret = avcodec_encode_video(enc,
962 bit_buffer, bit_buffer_size,
965 fprintf(stderr, "Video encoding failed\n");
968 //enc->frame_number = enc->real_pict_num;
970 pkt.data= bit_buffer;
972 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
973 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
974 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
975 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
976 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
978 if(enc->coded_frame->key_frame)
979 pkt.flags |= PKT_FLAG_KEY;
980 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
983 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
984 // enc->frame_number-1, enc->real_pict_num, ret,
986 /* if two pass, output log */
987 if (ost->logfile && enc->stats_out) {
988 fprintf(ost->logfile, "%s", enc->stats_out);
997 static double psnr(double d){
998 return -10.0*log(d)/log(10.0);
1001 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1004 AVCodecContext *enc;
1006 double ti1, bitrate, avg_bitrate;
1008 /* this is executed just the first time do_video_stats is called */
1010 vstats_file = fopen(vstats_filename, "w");
1017 enc = ost->st->codec;
1018 if (enc->codec_type == CODEC_TYPE_VIDEO) {
1019 frame_number = ost->frame_number;
1020 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1021 if (enc->flags&CODEC_FLAG_PSNR)
1022 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1024 fprintf(vstats_file,"f_size= %6d ", frame_size);
1025 /* compute pts value */
1026 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1030 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1031 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1032 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1033 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1034 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1038 static void print_report(AVFormatContext **output_files,
1039 AVOutputStream **ost_table, int nb_ostreams,
1043 AVOutputStream *ost;
1044 AVFormatContext *oc, *os;
1046 AVCodecContext *enc;
1047 int frame_number, vid, i;
1048 double bitrate, ti1, pts;
1049 static int64_t last_time = -1;
1050 static int qp_histogram[52];
1052 if (!is_last_report) {
1054 /* display the report every 0.5 seconds */
1055 cur_time = av_gettime();
1056 if (last_time == -1) {
1057 last_time = cur_time;
1060 if ((cur_time - last_time) < 500000)
1062 last_time = cur_time;
1066 oc = output_files[0];
1068 total_size = url_fsize(oc->pb);
1069 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1070 total_size= url_ftell(oc->pb);
1075 for(i=0;i<nb_ostreams;i++) {
1077 os = output_files[ost->file_index];
1078 enc = ost->st->codec;
1079 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1080 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1081 !ost->st->stream_copy ?
1082 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1084 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1085 float t = (av_gettime()-timer_start) / 1000000.0;
1087 frame_number = ost->frame_number;
1088 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1089 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1090 !ost->st->stream_copy ?
1091 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1093 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1096 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1097 if(qp>=0 && qp<sizeof(qp_histogram)/sizeof(int))
1100 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1102 if (enc->flags&CODEC_FLAG_PSNR){
1104 double error, error_sum=0;
1105 double scale, scale_sum=0;
1106 char type[3]= {'Y','U','V'};
1107 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1110 error= enc->error[j];
1111 scale= enc->width*enc->height*255.0*255.0*frame_number;
1113 error= enc->coded_frame->error[j];
1114 scale= enc->width*enc->height*255.0*255.0;
1119 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1121 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1125 /* compute min output value */
1126 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1127 if ((pts < ti1) && (pts > 0))
1133 if (verbose || is_last_report) {
1134 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1136 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1137 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1138 (double)total_size / 1024, ti1, bitrate);
1141 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1142 nb_frames_dup, nb_frames_drop);
1145 fprintf(stderr, "%s \r", buf);
1150 if (is_last_report && verbose >= 0){
1151 int64_t raw= audio_size + video_size + extra_size;
1152 fprintf(stderr, "\n");
1153 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1157 100.0*(total_size - raw)/raw
1162 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1163 static int output_packet(AVInputStream *ist, int ist_index,
1164 AVOutputStream **ost_table, int nb_ostreams,
1165 const AVPacket *pkt)
1167 AVFormatContext *os;
1168 AVOutputStream *ost;
1172 int data_size, got_picture;
1174 void *buffer_to_free;
1175 static unsigned int samples_size= 0;
1176 static short *samples= NULL;
1177 AVSubtitle subtitle, *subtitle_to_free;
1180 if(ist->next_pts == AV_NOPTS_VALUE)
1181 ist->next_pts= ist->pts;
1190 if(pkt->dts != AV_NOPTS_VALUE)
1191 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1196 //while we have more to decode or while the decoder did output something on EOF
1197 while (len > 0 || (!pkt && ist->next_pts != ist->pts)) {
1199 ist->pts= ist->next_pts;
1201 if(len && len != pkt->size && verbose>0)
1202 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1204 /* decode the packet if needed */
1205 data_buf = NULL; /* fail safe */
1207 subtitle_to_free = NULL;
1208 if (ist->decoding_needed) {
1209 switch(ist->st->codec->codec_type) {
1210 case CODEC_TYPE_AUDIO:{
1211 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1212 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1214 samples= av_malloc(samples_size);
1216 data_size= samples_size;
1217 /* XXX: could avoid copy if PCM 16 bits with same
1218 endianness as CPU */
1219 ret = avcodec_decode_audio2(ist->st->codec, samples, &data_size,
1225 /* Some bug in mpeg audio decoder gives */
1226 /* data_size < 0, it seems they are overflows */
1227 if (data_size <= 0) {
1228 /* no audio frame */
1231 data_buf = (uint8_t *)samples;
1232 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1233 (ist->st->codec->sample_rate * ist->st->codec->channels);
1235 case CODEC_TYPE_VIDEO:
1236 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1237 /* XXX: allocate picture correctly */
1238 avcodec_get_frame_defaults(&picture);
1240 ret = avcodec_decode_video(ist->st->codec,
1241 &picture, &got_picture, ptr, len);
1242 ist->st->quality= picture.quality;
1246 /* no picture yet */
1247 goto discard_packet;
1249 if (ist->st->codec->time_base.num != 0) {
1250 ist->next_pts += ((int64_t)AV_TIME_BASE *
1251 ist->st->codec->time_base.num) /
1252 ist->st->codec->time_base.den;
1256 case CODEC_TYPE_SUBTITLE:
1257 ret = avcodec_decode_subtitle(ist->st->codec,
1258 &subtitle, &got_subtitle, ptr, len);
1261 if (!got_subtitle) {
1262 goto discard_packet;
1264 subtitle_to_free = &subtitle;
1271 switch(ist->st->codec->codec_type) {
1272 case CODEC_TYPE_AUDIO:
1273 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1274 ist->st->codec->sample_rate;
1276 case CODEC_TYPE_VIDEO:
1277 if (ist->st->codec->time_base.num != 0) {
1278 ist->next_pts += ((int64_t)AV_TIME_BASE *
1279 ist->st->codec->time_base.num) /
1280 ist->st->codec->time_base.den;
1290 buffer_to_free = NULL;
1291 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1292 pre_process_video_frame(ist, (AVPicture *)&picture,
1296 // preprocess audio (volume)
1297 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1298 if (audio_volume != 256) {
1301 for(i=0;i<(data_size / sizeof(short));i++) {
1302 int v = ((*volp) * audio_volume + 128) >> 8;
1303 if (v < -32768) v = -32768;
1304 if (v > 32767) v = 32767;
1310 /* frame rate emulation */
1311 if (ist->st->codec->rate_emu) {
1312 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
1313 int64_t now = av_gettime() - ist->start;
1321 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1322 is the one of the next displayed one */
1323 /* XXX: add mpeg4 too ? */
1324 if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
1325 if (ist->st->codec->pict_type != B_TYPE) {
1327 tmp = ist->last_ip_pts;
1328 ist->last_ip_pts = ist->frac_pts.val;
1329 ist->frac_pts.val = tmp;
1333 /* if output time reached then transcode raw format,
1334 encode packets and output them */
1335 if (start_time == 0 || ist->pts >= start_time)
1336 for(i=0;i<nb_ostreams;i++) {
1340 if (ost->source_index == ist_index) {
1341 os = output_files[ost->file_index];
1344 printf("%d: got pts=%0.3f %0.3f\n", i,
1345 (double)pkt->pts / AV_TIME_BASE,
1346 ((double)ist->pts / AV_TIME_BASE) -
1347 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1349 /* set the input output pts pairs */
1350 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1352 if (ost->encoding_needed) {
1353 switch(ost->st->codec->codec_type) {
1354 case CODEC_TYPE_AUDIO:
1355 do_audio_out(os, ost, ist, data_buf, data_size);
1357 case CODEC_TYPE_VIDEO:
1358 do_video_out(os, ost, ist, &picture, &frame_size);
1359 if (vstats_filename && frame_size)
1360 do_video_stats(os, ost, frame_size);
1362 case CODEC_TYPE_SUBTITLE:
1363 do_subtitle_out(os, ost, ist, &subtitle,
1370 AVFrame avframe; //FIXME/XXX remove this
1372 av_init_packet(&opkt);
1374 if (!ost->frame_number && !(pkt->flags & PKT_FLAG_KEY))
1377 /* no reencoding needed : output the packet directly */
1378 /* force the input stream PTS */
1380 avcodec_get_frame_defaults(&avframe);
1381 ost->st->codec->coded_frame= &avframe;
1382 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1384 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1385 audio_size += data_size;
1386 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1387 video_size += data_size;
1391 opkt.stream_index= ost->index;
1392 if(pkt->pts != AV_NOPTS_VALUE)
1393 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base);
1395 opkt.pts= AV_NOPTS_VALUE;
1397 if (pkt->dts == AV_NOPTS_VALUE)
1398 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1400 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1402 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1403 opkt.flags= pkt->flags;
1405 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1406 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1407 opkt.destruct= av_destruct_packet;
1409 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][opkt.stream_index]);
1410 ost->st->codec->frame_number++;
1411 ost->frame_number++;
1412 av_free_packet(&opkt);
1416 av_free(buffer_to_free);
1417 /* XXX: allocate the subtitles in the codec ? */
1418 if (subtitle_to_free) {
1419 if (subtitle_to_free->rects != NULL) {
1420 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1421 av_free(subtitle_to_free->rects[i].bitmap);
1422 av_free(subtitle_to_free->rects[i].rgba_palette);
1424 av_freep(&subtitle_to_free->rects);
1426 subtitle_to_free->num_rects = 0;
1427 subtitle_to_free = NULL;
1434 for(i=0;i<nb_ostreams;i++) {
1436 if (ost->source_index == ist_index) {
1437 AVCodecContext *enc= ost->st->codec;
1438 os = output_files[ost->file_index];
1440 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1442 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1445 if (ost->encoding_needed) {
1449 av_init_packet(&pkt);
1450 pkt.stream_index= ost->index;
1452 switch(ost->st->codec->codec_type) {
1453 case CODEC_TYPE_AUDIO:
1454 fifo_bytes = av_fifo_size(&ost->fifo);
1456 /* encode any samples remaining in fifo */
1457 if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1458 int fs_tmp = enc->frame_size;
1459 enc->frame_size = fifo_bytes / (2 * enc->channels);
1460 av_fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes);
1461 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1462 enc->frame_size = fs_tmp;
1465 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1468 pkt.flags |= PKT_FLAG_KEY;
1470 case CODEC_TYPE_VIDEO:
1471 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1473 if(enc->coded_frame && enc->coded_frame->key_frame)
1474 pkt.flags |= PKT_FLAG_KEY;
1475 if (ost->logfile && enc->stats_out) {
1476 fprintf(ost->logfile, "%s", enc->stats_out);
1485 pkt.data= bit_buffer;
1487 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1488 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1489 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1501 static void print_sdp(AVFormatContext **avc, int n)
1505 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1506 printf("SDP:\n%s\n", sdp);
1509 static int stream_index_from_inputs(AVFormatContext **input_files,
1511 AVInputFile *file_table,
1512 AVInputStream **ist_table,
1513 enum CodecType type,
1517 for(z=0; z<nb_input_files; z++) {
1518 AVFormatContext *ic = input_files[z];
1519 for(p=0; p<ic->nb_programs; p++) {
1520 AVProgram *program = ic->programs[p];
1521 if(program->id != programid)
1523 for(q=0; q<program->nb_stream_indexes; q++) {
1524 int sidx = program->stream_index[q];
1525 int ris = file_table[z].ist_index + sidx;
1526 if(ist_table[ris]->discard && ic->streams[sidx]->codec->codec_type == type)
1536 * The following code is the main loop of the file converter
1538 static int av_encode(AVFormatContext **output_files,
1539 int nb_output_files,
1540 AVFormatContext **input_files,
1542 AVStreamMap *stream_maps, int nb_stream_maps)
1544 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1545 AVFormatContext *is, *os;
1546 AVCodecContext *codec, *icodec;
1547 AVOutputStream *ost, **ost_table = NULL;
1548 AVInputStream *ist, **ist_table = NULL;
1549 AVInputFile *file_table;
1553 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1557 /* input stream init */
1559 for(i=0;i<nb_input_files;i++) {
1560 is = input_files[i];
1561 file_table[i].ist_index = j;
1562 file_table[i].nb_streams = is->nb_streams;
1563 j += is->nb_streams;
1567 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1571 for(i=0;i<nb_istreams;i++) {
1572 ist = av_mallocz(sizeof(AVInputStream));
1578 for(i=0;i<nb_input_files;i++) {
1579 is = input_files[i];
1580 for(k=0;k<is->nb_streams;k++) {
1581 ist = ist_table[j++];
1582 ist->st = is->streams[k];
1583 ist->file_index = i;
1585 ist->discard = 1; /* the stream is discarded by default
1588 if (ist->st->codec->rate_emu) {
1589 ist->start = av_gettime();
1595 /* output stream init */
1597 for(i=0;i<nb_output_files;i++) {
1598 os = output_files[i];
1599 if (!os->nb_streams) {
1600 fprintf(stderr, "Output file does not contain any stream\n");
1603 nb_ostreams += os->nb_streams;
1605 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1606 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1610 /* Sanity check the mapping args -- do the input files & streams exist? */
1611 for(i=0;i<nb_stream_maps;i++) {
1612 int fi = stream_maps[i].file_index;
1613 int si = stream_maps[i].stream_index;
1615 if (fi < 0 || fi > nb_input_files - 1 ||
1616 si < 0 || si > file_table[fi].nb_streams - 1) {
1617 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1620 fi = stream_maps[i].sync_file_index;
1621 si = stream_maps[i].sync_stream_index;
1622 if (fi < 0 || fi > nb_input_files - 1 ||
1623 si < 0 || si > file_table[fi].nb_streams - 1) {
1624 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1629 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1632 for(i=0;i<nb_ostreams;i++) {
1633 ost = av_mallocz(sizeof(AVOutputStream));
1640 for(k=0;k<nb_output_files;k++) {
1641 os = output_files[k];
1642 for(i=0;i<os->nb_streams;i++,n++) {
1645 ost->file_index = k;
1647 ost->st = os->streams[i];
1648 if (nb_stream_maps > 0) {
1649 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
1650 stream_maps[n].stream_index;
1652 /* Sanity check that the stream types match */
1653 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1654 int i= ost->file_index;
1655 dump_format(output_files[i], i, output_files[i]->filename, 1);
1656 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1657 stream_maps[n].file_index, stream_maps[n].stream_index,
1658 ost->file_index, ost->index);
1665 j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid);
1667 ost->source_index = j;
1671 /* get corresponding input stream index : we select the first one with the right type */
1673 for(j=0;j<nb_istreams;j++) {
1676 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1677 ost->source_index = j;
1685 if(! opt_programid) {
1686 /* try again and reuse existing stream */
1687 for(j=0;j<nb_istreams;j++) {
1689 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1690 ost->source_index = j;
1696 int i= ost->file_index;
1697 dump_format(output_files[i], i, output_files[i]->filename, 1);
1698 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1699 ost->file_index, ost->index);
1704 ist = ist_table[ost->source_index];
1706 ost->sync_ist = (nb_stream_maps > 0) ?
1707 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
1708 stream_maps[n].sync_stream_index] : ist;
1712 /* for each output stream, we compute the right encoding parameters */
1713 for(i=0;i<nb_ostreams;i++) {
1715 os = output_files[ost->file_index];
1716 ist = ist_table[ost->source_index];
1718 codec = ost->st->codec;
1719 icodec = ist->st->codec;
1721 if (!ost->st->language[0])
1722 av_strlcpy(ost->st->language, ist->st->language,
1723 sizeof(ost->st->language));
1725 ost->st->disposition = ist->st->disposition;
1727 if (ost->st->stream_copy) {
1728 /* if stream_copy is selected, no need to decode or encode */
1729 codec->codec_id = icodec->codec_id;
1730 codec->codec_type = icodec->codec_type;
1732 if(!codec->codec_tag){
1733 if( !os->oformat->codec_tag
1734 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) > 0
1735 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1736 codec->codec_tag = icodec->codec_tag;
1739 codec->bit_rate = icodec->bit_rate;
1740 codec->extradata= icodec->extradata;
1741 codec->extradata_size= icodec->extradata_size;
1742 if(av_q2d(icodec->time_base) > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000)
1743 codec->time_base = icodec->time_base;
1745 codec->time_base = ist->st->time_base;
1746 switch(codec->codec_type) {
1747 case CODEC_TYPE_AUDIO:
1748 if(audio_volume != 256) {
1749 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1752 codec->sample_rate = icodec->sample_rate;
1753 codec->channels = icodec->channels;
1754 codec->frame_size = icodec->frame_size;
1755 codec->block_align= icodec->block_align;
1756 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1757 codec->block_align= 0;
1758 if(codec->codec_id == CODEC_ID_AC3)
1759 codec->block_align= 0;
1761 case CODEC_TYPE_VIDEO:
1763 fprintf(stderr,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");
1766 codec->pix_fmt = icodec->pix_fmt;
1767 codec->width = icodec->width;
1768 codec->height = icodec->height;
1769 codec->has_b_frames = icodec->has_b_frames;
1771 case CODEC_TYPE_SUBTITLE:
1777 switch(codec->codec_type) {
1778 case CODEC_TYPE_AUDIO:
1779 if (av_fifo_init(&ost->fifo, 1024))
1781 ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
1782 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1783 icodec->request_channels = codec->channels;
1784 ist->decoding_needed = 1;
1785 ost->encoding_needed = 1;
1787 case CODEC_TYPE_VIDEO:
1788 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1789 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1790 ost->video_resample = ((codec->width != icodec->width -
1791 (frame_leftBand + frame_rightBand) +
1792 (frame_padleft + frame_padright)) ||
1793 (codec->height != icodec->height -
1794 (frame_topBand + frame_bottomBand) +
1795 (frame_padtop + frame_padbottom)) ||
1796 (codec->pix_fmt != icodec->pix_fmt));
1797 if (ost->video_crop) {
1798 ost->topBand = frame_topBand;
1799 ost->leftBand = frame_leftBand;
1801 if (ost->video_pad) {
1802 ost->padtop = frame_padtop;
1803 ost->padleft = frame_padleft;
1804 ost->padbottom = frame_padbottom;
1805 ost->padright = frame_padright;
1806 if (!ost->video_resample) {
1807 avcodec_get_frame_defaults(&ost->pict_tmp);
1808 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1809 codec->width, codec->height))
1813 if (ost->video_resample) {
1814 avcodec_get_frame_defaults(&ost->pict_tmp);
1815 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1816 codec->width, codec->height)) {
1817 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1820 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1821 ost->img_resample_ctx = sws_getContext(
1822 icodec->width - (frame_leftBand + frame_rightBand),
1823 icodec->height - (frame_topBand + frame_bottomBand),
1825 codec->width - (frame_padleft + frame_padright),
1826 codec->height - (frame_padtop + frame_padbottom),
1828 sws_flags, NULL, NULL, NULL);
1829 if (ost->img_resample_ctx == NULL) {
1830 fprintf(stderr, "Cannot get resampling context\n");
1833 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1835 ost->encoding_needed = 1;
1836 ist->decoding_needed = 1;
1838 case CODEC_TYPE_SUBTITLE:
1839 ost->encoding_needed = 1;
1840 ist->decoding_needed = 1;
1847 if (ost->encoding_needed &&
1848 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1849 char logfilename[1024];
1854 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1856 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1857 if (codec->flags & CODEC_FLAG_PASS1) {
1858 f = fopen(logfilename, "w");
1860 perror(logfilename);
1865 /* read the log file */
1866 f = fopen(logfilename, "r");
1868 perror(logfilename);
1871 fseek(f, 0, SEEK_END);
1873 fseek(f, 0, SEEK_SET);
1874 logbuffer = av_malloc(size + 1);
1876 fprintf(stderr, "Could not allocate log buffer\n");
1879 size = fread(logbuffer, 1, size, f);
1881 logbuffer[size] = '\0';
1882 codec->stats_in = logbuffer;
1886 if(codec->codec_type == CODEC_TYPE_VIDEO){
1887 int size= codec->width * codec->height;
1888 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1893 bit_buffer = av_malloc(bit_buffer_size);
1897 /* dump the file output parameters - cannot be done before in case
1899 for(i=0;i<nb_output_files;i++) {
1900 dump_format(output_files[i], i, output_files[i]->filename, 1);
1903 /* dump the stream mapping */
1905 fprintf(stderr, "Stream mapping:\n");
1906 for(i=0;i<nb_ostreams;i++) {
1908 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1909 ist_table[ost->source_index]->file_index,
1910 ist_table[ost->source_index]->index,
1913 if (ost->sync_ist != ist_table[ost->source_index])
1914 fprintf(stderr, " [sync #%d.%d]",
1915 ost->sync_ist->file_index,
1916 ost->sync_ist->index);
1917 fprintf(stderr, "\n");
1921 /* open each encoder */
1922 for(i=0;i<nb_ostreams;i++) {
1924 if (ost->encoding_needed) {
1926 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1928 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1929 ost->file_index, ost->index);
1932 if (avcodec_open(ost->st->codec, codec) < 0) {
1933 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1934 ost->file_index, ost->index);
1937 extra_size += ost->st->codec->extradata_size;
1941 /* open each decoder */
1942 for(i=0;i<nb_istreams;i++) {
1944 if (ist->decoding_needed) {
1946 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1948 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1949 ist->st->codec->codec_id, ist->file_index, ist->index);
1952 if (avcodec_open(ist->st->codec, codec) < 0) {
1953 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1954 ist->file_index, ist->index);
1957 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1958 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1963 for(i=0;i<nb_istreams;i++) {
1965 is = input_files[ist->file_index];
1967 ist->next_pts = AV_NOPTS_VALUE;
1971 /* set meta data information from input file if required */
1972 for (i=0;i<nb_meta_data_maps;i++) {
1973 AVFormatContext *out_file;
1974 AVFormatContext *in_file;
1976 int out_file_index = meta_data_maps[i].out_file;
1977 int in_file_index = meta_data_maps[i].in_file;
1978 if (out_file_index < 0 || out_file_index >= nb_output_files) {
1979 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1980 ret = AVERROR(EINVAL);
1983 if (in_file_index < 0 || in_file_index >= nb_input_files) {
1984 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1985 ret = AVERROR(EINVAL);
1989 out_file = output_files[out_file_index];
1990 in_file = input_files[in_file_index];
1992 strcpy(out_file->title, in_file->title);
1993 strcpy(out_file->author, in_file->author);
1994 strcpy(out_file->copyright, in_file->copyright);
1995 strcpy(out_file->comment, in_file->comment);
1996 strcpy(out_file->album, in_file->album);
1997 out_file->year = in_file->year;
1998 out_file->track = in_file->track;
1999 strcpy(out_file->genre, in_file->genre);
2002 /* open files and write file headers */
2003 for(i=0;i<nb_output_files;i++) {
2004 os = output_files[i];
2005 if (av_write_header(os) < 0) {
2006 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
2007 ret = AVERROR(EINVAL);
2010 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2015 print_sdp(output_files, nb_output_files);
2018 if (!using_stdin && verbose >= 0) {
2019 fprintf(stderr, "Press [q] to stop encoding\n");
2020 url_set_interrupt_cb(decode_interrupt_cb);
2025 timer_start = av_gettime();
2027 for(; received_sigterm == 0;) {
2028 int file_index, ist_index;
2036 /* if 'q' pressed, exits */
2040 /* read_key() returns 0 on EOF */
2046 /* select the stream that we must read now by looking at the
2047 smallest output pts */
2049 for(i=0;i<nb_ostreams;i++) {
2052 os = output_files[ost->file_index];
2053 ist = ist_table[ost->source_index];
2054 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
2055 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
2057 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2058 ipts = (double)ist->pts;
2059 if (!file_table[ist->file_index].eof_reached){
2060 if(ipts < ipts_min) {
2062 if(input_sync ) file_index = ist->file_index;
2064 if(opts < opts_min) {
2066 if(!input_sync) file_index = ist->file_index;
2069 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2074 /* if none, if is finished */
2075 if (file_index < 0) {
2079 /* finish if recording time exhausted */
2080 if (opts_min >= (recording_time / 1000000.0))
2083 /* finish if limit size exhausted */
2084 if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
2087 /* read a frame from it and output it in the fifo */
2088 is = input_files[file_index];
2089 if (av_read_frame(is, &pkt) < 0) {
2090 file_table[file_index].eof_reached = 1;
2098 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2100 /* the following test is needed in case new streams appear
2101 dynamically in stream : we ignore them */
2102 if (pkt.stream_index >= file_table[file_index].nb_streams)
2103 goto discard_packet;
2104 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2105 ist = ist_table[ist_index];
2107 goto discard_packet;
2109 if (pkt.dts != AV_NOPTS_VALUE)
2110 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2111 if (pkt.pts != AV_NOPTS_VALUE)
2112 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2114 if(input_files_ts_scale[file_index][pkt.stream_index]){
2115 if(pkt.pts != AV_NOPTS_VALUE)
2116 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2117 if(pkt.dts != AV_NOPTS_VALUE)
2118 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2121 // 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);
2122 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
2123 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2124 int64_t delta= pkt_dts - ist->next_pts;
2125 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2126 input_files_ts_offset[ist->file_index]-= delta;
2128 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2129 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2130 if(pkt.pts != AV_NOPTS_VALUE)
2131 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2135 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2136 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2139 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2140 ist->file_index, ist->index);
2142 av_free_packet(&pkt);
2147 av_free_packet(&pkt);
2149 /* dump report by using the output first video and audio streams */
2150 print_report(output_files, ost_table, nb_ostreams, 0);
2153 /* at the end of stream, we must flush the decoder buffers */
2154 for(i=0;i<nb_istreams;i++) {
2156 if (ist->decoding_needed) {
2157 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2163 /* write the trailer if needed and close file */
2164 for(i=0;i<nb_output_files;i++) {
2165 os = output_files[i];
2166 av_write_trailer(os);
2169 /* dump report by using the first video and audio streams */
2170 print_report(output_files, ost_table, nb_ostreams, 1);
2172 /* close each encoder */
2173 for(i=0;i<nb_ostreams;i++) {
2175 if (ost->encoding_needed) {
2176 av_freep(&ost->st->codec->stats_in);
2177 avcodec_close(ost->st->codec);
2181 /* close each decoder */
2182 for(i=0;i<nb_istreams;i++) {
2184 if (ist->decoding_needed) {
2185 avcodec_close(ist->st->codec);
2193 av_freep(&bit_buffer);
2194 av_free(file_table);
2197 for(i=0;i<nb_istreams;i++) {
2204 for(i=0;i<nb_ostreams;i++) {
2208 fclose(ost->logfile);
2209 ost->logfile = NULL;
2211 av_fifo_free(&ost->fifo); /* works even if fifo is not
2212 initialized but set to zero */
2213 av_free(ost->pict_tmp.data[0]);
2214 if (ost->video_resample)
2215 sws_freeContext(ost->img_resample_ctx);
2217 audio_resample_close(ost->resample);
2218 if (ost->reformat_ctx)
2219 av_audio_convert_free(ost->reformat_ctx);
2227 ret = AVERROR(ENOMEM);
2232 int file_read(const char *filename)
2235 unsigned char buffer[1024];
2238 if (url_open(&h, filename, O_RDONLY) < 0) {
2239 printf("could not open '%s'\n", filename);
2243 len = url_read(h, buffer, sizeof(buffer));
2246 for(i=0;i<len;i++) putchar(buffer[i]);
2253 static void opt_format(const char *arg)
2255 /* compatibility stuff for pgmyuv */
2256 if (!strcmp(arg, "pgmyuv")) {
2257 pgmyuv_compatibility_hack=1;
2258 // opt_image_format(arg);
2260 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2263 file_iformat = av_find_input_format(arg);
2264 file_oformat = guess_format(arg, NULL, NULL);
2265 if (!file_iformat && !file_oformat) {
2266 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2271 static int opt_default(const char *opt, const char *arg){
2273 const AVOption *o= NULL;
2274 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
2276 for(type=0; type<CODEC_TYPE_NB; type++){
2277 const AVOption *o2 = av_find_opt(avctx_opts[0], opt, NULL, opt_types[type], opt_types[type]);
2279 o = av_set_string2(avctx_opts[type], opt, arg, 1);
2282 o = av_set_string2(avformat_opts, opt, arg, 1);
2284 o = av_set_string2(sws_opts, opt, arg, 1);
2287 o = av_set_string2(avctx_opts[CODEC_TYPE_AUDIO], opt+1, arg, 1);
2288 else if(opt[0] == 'v')
2289 o = av_set_string2(avctx_opts[CODEC_TYPE_VIDEO], opt+1, arg, 1);
2290 else if(opt[0] == 's')
2291 o = av_set_string2(avctx_opts[CODEC_TYPE_SUBTITLE], opt+1, arg, 1);
2296 // 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));
2298 //FIXME we should always use avctx_opts, ... for storing options so there will not be any need to keep track of what i set over this
2299 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
2300 opt_names[opt_name_count++]= o->name;
2302 if(avctx_opts[0]->debug || avformat_opts->debug)
2303 av_log_set_level(AV_LOG_DEBUG);
2307 static void opt_video_rc_override_string(const char *arg)
2309 video_rc_override_string = arg;
2312 static int opt_me_threshold(const char *opt, const char *arg)
2314 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2318 static int opt_verbose(const char *opt, const char *arg)
2320 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2321 av_log_set_level(verbose);
2325 static int opt_frame_rate(const char *opt, const char *arg)
2327 if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2328 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2334 static int opt_bitrate(const char *opt, const char *arg)
2336 int codec_type = opt[0]=='a' ? CODEC_TYPE_AUDIO : CODEC_TYPE_VIDEO;
2338 opt_default(opt, arg);
2340 if (av_get_int(avctx_opts[codec_type], "b", NULL) < 1000)
2341 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2346 static void opt_frame_crop_top(const char *arg)
2348 frame_topBand = atoi(arg);
2349 if (frame_topBand < 0) {
2350 fprintf(stderr, "Incorrect top crop size\n");
2353 if ((frame_topBand % 2) != 0) {
2354 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2357 if ((frame_topBand) >= frame_height){
2358 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2361 frame_height -= frame_topBand;
2364 static void opt_frame_crop_bottom(const char *arg)
2366 frame_bottomBand = atoi(arg);
2367 if (frame_bottomBand < 0) {
2368 fprintf(stderr, "Incorrect bottom crop size\n");
2371 if ((frame_bottomBand % 2) != 0) {
2372 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2375 if ((frame_bottomBand) >= frame_height){
2376 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2379 frame_height -= frame_bottomBand;
2382 static void opt_frame_crop_left(const char *arg)
2384 frame_leftBand = atoi(arg);
2385 if (frame_leftBand < 0) {
2386 fprintf(stderr, "Incorrect left crop size\n");
2389 if ((frame_leftBand % 2) != 0) {
2390 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2393 if ((frame_leftBand) >= frame_width){
2394 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2397 frame_width -= frame_leftBand;
2400 static void opt_frame_crop_right(const char *arg)
2402 frame_rightBand = atoi(arg);
2403 if (frame_rightBand < 0) {
2404 fprintf(stderr, "Incorrect right crop size\n");
2407 if ((frame_rightBand % 2) != 0) {
2408 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2411 if ((frame_rightBand) >= frame_width){
2412 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2415 frame_width -= frame_rightBand;
2418 static void opt_frame_size(const char *arg)
2420 if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
2421 fprintf(stderr, "Incorrect frame size\n");
2424 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2425 fprintf(stderr, "Frame size must be a multiple of 2\n");
2431 #define SCALEBITS 10
2432 #define ONE_HALF (1 << (SCALEBITS - 1))
2433 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2435 #define RGB_TO_Y(r, g, b) \
2436 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2437 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2439 #define RGB_TO_U(r1, g1, b1, shift)\
2440 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2441 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2443 #define RGB_TO_V(r1, g1, b1, shift)\
2444 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2445 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2447 static void opt_pad_color(const char *arg) {
2448 /* Input is expected to be six hex digits similar to
2449 how colors are expressed in html tags (but without the #) */
2450 int rgb = strtol(arg, NULL, 16);
2454 g = ((rgb >> 8) & 255);
2457 padcolor[0] = RGB_TO_Y(r,g,b);
2458 padcolor[1] = RGB_TO_U(r,g,b,0);
2459 padcolor[2] = RGB_TO_V(r,g,b,0);
2462 static void opt_frame_pad_top(const char *arg)
2464 frame_padtop = atoi(arg);
2465 if (frame_padtop < 0) {
2466 fprintf(stderr, "Incorrect top pad size\n");
2469 if ((frame_padtop % 2) != 0) {
2470 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2475 static void opt_frame_pad_bottom(const char *arg)
2477 frame_padbottom = atoi(arg);
2478 if (frame_padbottom < 0) {
2479 fprintf(stderr, "Incorrect bottom pad size\n");
2482 if ((frame_padbottom % 2) != 0) {
2483 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2489 static void opt_frame_pad_left(const char *arg)
2491 frame_padleft = atoi(arg);
2492 if (frame_padleft < 0) {
2493 fprintf(stderr, "Incorrect left pad size\n");
2496 if ((frame_padleft % 2) != 0) {
2497 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2503 static void opt_frame_pad_right(const char *arg)
2505 frame_padright = atoi(arg);
2506 if (frame_padright < 0) {
2507 fprintf(stderr, "Incorrect right pad size\n");
2510 if ((frame_padright % 2) != 0) {
2511 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2516 static void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts)
2520 for (i=-1; i < nb_fmts; i++) {
2521 get_fmt_string (fmt_str, sizeof(fmt_str), i);
2522 fprintf(stdout, "%s\n", fmt_str);
2526 static void opt_frame_pix_fmt(const char *arg)
2528 if (strcmp(arg, "list"))
2529 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2531 list_fmts(avcodec_pix_fmt_string, PIX_FMT_NB);
2536 static void opt_frame_aspect_ratio(const char *arg)
2543 p = strchr(arg, ':');
2545 x = strtol(arg, &end, 10);
2547 y = strtol(end+1, &end, 10);
2549 ar = (double)x / (double)y;
2551 ar = strtod(arg, NULL);
2554 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2557 frame_aspect_ratio = ar;
2560 static void opt_qscale(const char *arg)
2562 video_qscale = atof(arg);
2563 if (video_qscale <= 0 ||
2564 video_qscale > 255) {
2565 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2570 static void opt_top_field_first(const char *arg)
2572 top_field_first= atoi(arg);
2575 static int opt_thread_count(const char *opt, const char *arg)
2577 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2578 #if !defined(HAVE_THREADS)
2580 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2585 static void opt_audio_sample_fmt(const char *arg)
2587 if (strcmp(arg, "list"))
2588 audio_sample_fmt = avcodec_get_sample_fmt(arg);
2590 list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
2595 static int opt_audio_rate(const char *opt, const char *arg)
2597 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2601 static int opt_audio_channels(const char *opt, const char *arg)
2603 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2607 static void opt_video_channel(const char *arg)
2609 video_channel = strtol(arg, NULL, 0);
2612 static void opt_video_standard(const char *arg)
2614 video_standard = av_strdup(arg);
2617 static void opt_codec(int *pstream_copy, char **pcodec_name,
2618 int codec_type, const char *arg)
2620 av_freep(pcodec_name);
2621 if (!strcmp(arg, "copy")) {
2624 *pcodec_name = av_strdup(arg);
2628 static void opt_audio_codec(const char *arg)
2630 opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg);
2633 static void opt_audio_tag(const char *arg)
2636 audio_codec_tag= strtol(arg, &tail, 0);
2639 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2642 static void opt_video_tag(const char *arg)
2645 video_codec_tag= strtol(arg, &tail, 0);
2648 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2652 static void add_frame_hooker(const char *arg)
2657 char *args = av_strdup(arg);
2661 argv[0] = strtok(args, " ");
2662 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2665 i = frame_hook_add(argc, argv);
2668 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2674 static void opt_video_codec(const char *arg)
2676 opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg);
2679 static void opt_subtitle_codec(const char *arg)
2681 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
2684 static void opt_map(const char *arg)
2689 m = &stream_maps[nb_stream_maps++];
2691 m->file_index = strtol(arg, &p, 0);
2695 m->stream_index = strtol(p, &p, 0);
2698 m->sync_file_index = strtol(p, &p, 0);
2701 m->sync_stream_index = strtol(p, &p, 0);
2703 m->sync_file_index = m->file_index;
2704 m->sync_stream_index = m->stream_index;
2708 static void opt_map_meta_data(const char *arg)
2713 m = &meta_data_maps[nb_meta_data_maps++];
2715 m->out_file = strtol(arg, &p, 0);
2719 m->in_file = strtol(p, &p, 0);
2722 static void opt_input_ts_scale(const char *arg)
2724 unsigned int stream;
2728 stream = strtol(arg, &p, 0);
2731 scale= strtod(p, &p);
2733 if(stream >= MAX_STREAMS)
2736 input_files_ts_scale[nb_input_files][stream]= scale;
2739 static int opt_recording_time(const char *opt, const char *arg)
2741 recording_time = parse_time_or_die(opt, arg, 1);
2745 static int opt_start_time(const char *opt, const char *arg)
2747 start_time = parse_time_or_die(opt, arg, 1);
2751 static int opt_rec_timestamp(const char *opt, const char *arg)
2753 rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
2757 static int opt_input_ts_offset(const char *opt, const char *arg)
2759 input_ts_offset = parse_time_or_die(opt, arg, 1);
2763 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
2765 const char *codec_string = encoder ? "encoder" : "decoder";
2769 return CODEC_ID_NONE;
2771 avcodec_find_encoder_by_name(name) :
2772 avcodec_find_decoder_by_name(name);
2774 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2777 if(codec->type != type) {
2778 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2784 static void set_context_opts(void *ctx, void *opts_ctx, int flags)
2787 for(i=0; i<opt_name_count; i++){
2789 const AVOption *opt;
2790 const char *str= av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
2791 /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
2792 if(str && ((opt->flags & flags) == flags))
2793 av_set_string2(ctx, opt_names[i], str, 1);
2797 static void opt_input_file(const char *filename)
2799 AVFormatContext *ic;
2800 AVFormatParameters params, *ap = ¶ms;
2801 int err, i, ret, rfps, rfps_base;
2804 if (!strcmp(filename, "-"))
2807 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2808 !strcmp(filename, "/dev/stdin");
2810 /* get default parameters from command line */
2811 ic = av_alloc_format_context();
2813 memset(ap, 0, sizeof(*ap));
2814 ap->prealloced_context = 1;
2815 ap->sample_rate = audio_sample_rate;
2816 ap->channels = audio_channels;
2817 ap->time_base.den = frame_rate.num;
2818 ap->time_base.num = frame_rate.den;
2819 ap->width = frame_width + frame_padleft + frame_padright;
2820 ap->height = frame_height + frame_padtop + frame_padbottom;
2821 ap->pix_fmt = frame_pix_fmt;
2822 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
2823 ap->channel = video_channel;
2824 ap->standard = video_standard;
2825 ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0);
2826 ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0);
2827 if(pgmyuv_compatibility_hack)
2828 ap->video_codec_id= CODEC_ID_PGMYUV;
2830 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
2832 ic->video_codec_id = find_codec_or_die(video_codec_name , CODEC_TYPE_VIDEO , 0);
2833 ic->audio_codec_id = find_codec_or_die(audio_codec_name , CODEC_TYPE_AUDIO , 0);
2834 ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 0);
2836 /* open the input file with generic libav function */
2837 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2839 print_error(filename, err);
2844 for(i=0; i<ic->nb_programs; i++)
2845 if(ic->programs[i]->id != opt_programid)
2846 ic->programs[i]->discard = AVDISCARD_ALL;
2849 ic->loop_input = loop_input;
2851 /* If not enough info to get the stream parameters, we decode the
2852 first frames to get it. (used in mpeg case for example) */
2853 ret = av_find_stream_info(ic);
2854 if (ret < 0 && verbose >= 0) {
2855 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2859 timestamp = start_time;
2860 /* add the stream start time */
2861 if (ic->start_time != AV_NOPTS_VALUE)
2862 timestamp += ic->start_time;
2864 /* if seeking requested, we execute it */
2865 if (start_time != 0) {
2866 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2868 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2869 filename, (double)timestamp / AV_TIME_BASE);
2871 /* reset seek info */
2875 /* update the current parameters so that they match the one of the input stream */
2876 for(i=0;i<ic->nb_streams;i++) {
2877 AVCodecContext *enc = ic->streams[i]->codec;
2879 avcodec_thread_init(enc, thread_count);
2880 enc->thread_count= thread_count;
2881 switch(enc->codec_type) {
2882 case CODEC_TYPE_AUDIO:
2883 set_context_opts(enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2884 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2885 audio_channels = enc->channels;
2886 audio_sample_rate = enc->sample_rate;
2887 audio_sample_fmt = enc->sample_fmt;
2889 ic->streams[i]->discard= AVDISCARD_ALL;
2891 case CODEC_TYPE_VIDEO:
2892 set_context_opts(enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2893 frame_height = enc->height;
2894 frame_width = enc->width;
2895 if(ic->streams[i]->sample_aspect_ratio.num)
2896 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
2898 frame_aspect_ratio=av_q2d(enc->sample_aspect_ratio);
2899 frame_aspect_ratio *= (float) enc->width / enc->height;
2900 frame_pix_fmt = enc->pix_fmt;
2901 rfps = ic->streams[i]->r_frame_rate.num;
2902 rfps_base = ic->streams[i]->r_frame_rate.den;
2903 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2905 enc->debug |= FF_DEBUG_MV;
2907 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2910 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2911 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2913 (float)rfps / rfps_base, rfps, rfps_base);
2915 /* update the current frame rate to match the stream frame rate */
2916 frame_rate.num = rfps;
2917 frame_rate.den = rfps_base;
2919 enc->rate_emu = rate_emu;
2921 ic->streams[i]->discard= AVDISCARD_ALL;
2922 else if(video_discard)
2923 ic->streams[i]->discard= video_discard;
2925 case CODEC_TYPE_DATA:
2927 case CODEC_TYPE_SUBTITLE:
2928 if(subtitle_disable)
2929 ic->streams[i]->discard = AVDISCARD_ALL;
2931 case CODEC_TYPE_ATTACHMENT:
2932 case CODEC_TYPE_UNKNOWN:
2939 input_files[nb_input_files] = ic;
2940 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2941 /* dump the file content */
2943 dump_format(ic, nb_input_files, filename, 0);
2946 file_iformat = NULL;
2947 file_oformat = NULL;
2952 av_freep(&video_codec_name);
2953 av_freep(&audio_codec_name);
2954 av_freep(&subtitle_codec_name);
2957 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
2958 int *has_subtitle_ptr)
2960 int has_video, has_audio, has_subtitle, i, j;
2961 AVFormatContext *ic;
2966 for(j=0;j<nb_input_files;j++) {
2967 ic = input_files[j];
2968 for(i=0;i<ic->nb_streams;i++) {
2969 AVCodecContext *enc = ic->streams[i]->codec;
2970 switch(enc->codec_type) {
2971 case CODEC_TYPE_AUDIO:
2974 case CODEC_TYPE_VIDEO:
2977 case CODEC_TYPE_SUBTITLE:
2980 case CODEC_TYPE_DATA:
2981 case CODEC_TYPE_ATTACHMENT:
2982 case CODEC_TYPE_UNKNOWN:
2989 *has_video_ptr = has_video;
2990 *has_audio_ptr = has_audio;
2991 *has_subtitle_ptr = has_subtitle;
2994 static void new_video_stream(AVFormatContext *oc)
2997 AVCodecContext *video_enc;
3000 st = av_new_stream(oc, oc->nb_streams);
3002 fprintf(stderr, "Could not alloc stream\n");
3005 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
3006 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
3007 video_bitstream_filters= NULL;
3010 avcodec_thread_init(st->codec, thread_count);
3012 video_enc = st->codec;
3015 video_enc->codec_tag= video_codec_tag;
3017 if( (video_global_header&1)
3018 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3019 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3020 avctx_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3022 if(video_global_header&2){
3023 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3024 avctx_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3027 if (video_stream_copy) {
3028 st->stream_copy = 1;
3029 video_enc->codec_type = CODEC_TYPE_VIDEO;
3030 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3035 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3037 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
3038 if (video_codec_name)
3039 codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
3041 video_enc->codec_id = codec_id;
3042 codec = avcodec_find_encoder(codec_id);
3044 set_context_opts(video_enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3046 video_enc->time_base.den = fps.num;
3047 video_enc->time_base.num = fps.den;
3048 if(codec && codec->supported_framerates){
3049 const AVRational *p= codec->supported_framerates;
3050 const AVRational *best=NULL;
3051 AVRational best_error= (AVRational){INT_MAX, 1};
3052 for(; p->den!=0; p++){
3053 AVRational error= av_sub_q(fps, *p);
3054 if(error.num <0) error.num *= -1;
3055 if(av_cmp_q(error, best_error) < 0){
3060 video_enc->time_base.den= best->num;
3061 video_enc->time_base.num= best->den;
3064 video_enc->width = frame_width + frame_padright + frame_padleft;
3065 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3066 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3067 video_enc->pix_fmt = frame_pix_fmt;
3068 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3070 if(codec && codec->pix_fmts){
3071 const enum PixelFormat *p= codec->pix_fmts;
3073 if(*p == video_enc->pix_fmt)
3077 video_enc->pix_fmt = codec->pix_fmts[0];
3081 video_enc->gop_size = 0;
3082 if (video_qscale || same_quality) {
3083 video_enc->flags |= CODEC_FLAG_QSCALE;
3084 video_enc->global_quality=
3085 st->quality = FF_QP2LAMBDA * video_qscale;
3089 video_enc->intra_matrix = intra_matrix;
3091 video_enc->inter_matrix = inter_matrix;
3093 video_enc->thread_count = thread_count;
3094 p= video_rc_override_string;
3097 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3099 fprintf(stderr, "error parsing rc_override\n");
3102 video_enc->rc_override=
3103 av_realloc(video_enc->rc_override,
3104 sizeof(RcOverride)*(i+1));
3105 video_enc->rc_override[i].start_frame= start;
3106 video_enc->rc_override[i].end_frame = end;
3108 video_enc->rc_override[i].qscale= q;
3109 video_enc->rc_override[i].quality_factor= 1.0;
3112 video_enc->rc_override[i].qscale= 0;
3113 video_enc->rc_override[i].quality_factor= -q/100.0;
3118 video_enc->rc_override_count=i;
3119 if (!video_enc->rc_initial_buffer_occupancy)
3120 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3121 video_enc->me_threshold= me_threshold;
3122 video_enc->intra_dc_precision= intra_dc_precision - 8;
3125 video_enc->flags|= CODEC_FLAG_PSNR;
3130 video_enc->flags |= CODEC_FLAG_PASS1;
3132 video_enc->flags |= CODEC_FLAG_PASS2;
3137 /* reset some key parameters */
3139 av_freep(&video_codec_name);
3140 video_stream_copy = 0;
3143 static void new_audio_stream(AVFormatContext *oc)
3146 AVCodecContext *audio_enc;
3149 st = av_new_stream(oc, oc->nb_streams);
3151 fprintf(stderr, "Could not alloc stream\n");
3154 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
3156 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
3157 audio_bitstream_filters= NULL;
3160 avcodec_thread_init(st->codec, thread_count);
3162 audio_enc = st->codec;
3163 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3166 audio_enc->codec_tag= audio_codec_tag;
3168 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3169 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3170 avctx_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3172 if (audio_stream_copy) {
3173 st->stream_copy = 1;
3174 audio_enc->channels = audio_channels;
3177 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3179 set_context_opts(audio_enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3181 if (audio_codec_name)
3182 codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
3183 audio_enc->codec_id = codec_id;
3184 codec = avcodec_find_encoder(codec_id);
3186 if (audio_qscale > QSCALE_NONE) {
3187 audio_enc->flags |= CODEC_FLAG_QSCALE;
3188 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3190 audio_enc->thread_count = thread_count;
3191 audio_enc->channels = audio_channels;
3192 audio_enc->sample_fmt = audio_sample_fmt;
3194 if(codec && codec->sample_fmts){
3195 const enum SampleFormat *p= codec->sample_fmts;
3197 if(*p == audio_enc->sample_fmt)
3201 audio_enc->sample_fmt = codec->sample_fmts[0];
3204 audio_enc->sample_rate = audio_sample_rate;
3205 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3206 if (audio_language) {
3207 av_strlcpy(st->language, audio_language, sizeof(st->language));
3208 av_free(audio_language);
3209 audio_language = NULL;
3212 /* reset some key parameters */
3214 av_freep(&audio_codec_name);
3215 audio_stream_copy = 0;
3218 static void new_subtitle_stream(AVFormatContext *oc)
3221 AVCodecContext *subtitle_enc;
3223 st = av_new_stream(oc, oc->nb_streams);
3225 fprintf(stderr, "Could not alloc stream\n");
3228 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
3230 bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
3231 subtitle_bitstream_filters= NULL;
3233 subtitle_enc = st->codec;
3234 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3235 if (subtitle_stream_copy) {
3236 st->stream_copy = 1;
3238 set_context_opts(avctx_opts[CODEC_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3239 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1);
3242 if (subtitle_language) {
3243 av_strlcpy(st->language, subtitle_language, sizeof(st->language));
3244 av_free(subtitle_language);
3245 subtitle_language = NULL;
3248 subtitle_disable = 0;
3249 av_freep(&subtitle_codec_name);
3250 subtitle_stream_copy = 0;
3253 static void opt_new_audio_stream(void)
3255 AVFormatContext *oc;
3256 if (nb_output_files <= 0) {
3257 fprintf(stderr, "At least one output file must be specified\n");
3260 oc = output_files[nb_output_files - 1];
3261 new_audio_stream(oc);
3264 static void opt_new_video_stream(void)
3266 AVFormatContext *oc;
3267 if (nb_output_files <= 0) {
3268 fprintf(stderr, "At least one output file must be specified\n");
3271 oc = output_files[nb_output_files - 1];
3272 new_video_stream(oc);
3275 static void opt_new_subtitle_stream(void)
3277 AVFormatContext *oc;
3278 if (nb_output_files <= 0) {
3279 fprintf(stderr, "At least one output file must be specified\n");
3282 oc = output_files[nb_output_files - 1];
3283 new_subtitle_stream(oc);
3286 static void opt_output_file(const char *filename)
3288 AVFormatContext *oc;
3289 int use_video, use_audio, use_subtitle;
3290 int input_has_video, input_has_audio, input_has_subtitle;
3291 AVFormatParameters params, *ap = ¶ms;
3293 if (!strcmp(filename, "-"))
3296 oc = av_alloc_format_context();
3298 if (!file_oformat) {
3299 file_oformat = guess_format(NULL, filename, NULL);
3300 if (!file_oformat) {
3301 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3307 oc->oformat = file_oformat;
3308 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3310 if (!strcmp(file_oformat->name, "ffm") &&
3311 av_strstart(filename, "http:", NULL)) {
3312 /* special case for files sent to ffserver: we get the stream
3313 parameters from ffserver */
3314 int err = read_ffserver_streams(oc, filename);
3316 print_error(filename, err);
3320 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3321 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3322 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3324 /* disable if no corresponding type found and at least one
3326 if (nb_input_files > 0) {
3327 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3328 &input_has_subtitle);
3329 if (!input_has_video)
3331 if (!input_has_audio)
3333 if (!input_has_subtitle)
3337 /* manual disable */
3338 if (audio_disable) {
3341 if (video_disable) {
3344 if (subtitle_disable) {
3349 new_video_stream(oc);
3353 new_audio_stream(oc);
3357 new_subtitle_stream(oc);
3360 oc->timestamp = rec_timestamp;
3363 av_strlcpy(oc->title, str_title, sizeof(oc->title));
3365 av_strlcpy(oc->author, str_author, sizeof(oc->author));
3367 av_strlcpy(oc->copyright, str_copyright, sizeof(oc->copyright));
3369 av_strlcpy(oc->comment, str_comment, sizeof(oc->comment));
3371 av_strlcpy(oc->album, str_album, sizeof(oc->album));
3373 av_strlcpy(oc->genre, str_genre, sizeof(oc->genre));
3376 output_files[nb_output_files++] = oc;
3378 /* check filename in case of an image number is expected */
3379 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3380 if (!av_filename_number_test(oc->filename)) {
3381 print_error(oc->filename, AVERROR_NUMEXPECTED);
3386 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3387 /* test if it already exists to avoid loosing precious files */
3388 if (!file_overwrite &&
3389 (strchr(filename, ':') == NULL ||
3390 filename[1] == ':' ||
3391 av_strstart(filename, "file:", NULL))) {
3392 if (url_exist(filename)) {
3396 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3399 if (toupper(c) != 'Y') {
3400 fprintf(stderr, "Not overwriting - exiting\n");
3405 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3412 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3413 fprintf(stderr, "Could not open '%s'\n", filename);
3418 memset(ap, 0, sizeof(*ap));
3419 if (av_set_parameters(oc, ap) < 0) {
3420 fprintf(stderr, "%s: Invalid encoding parameters\n",
3425 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3426 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3427 oc->loop_output = loop_output;
3429 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
3431 /* reset some options */
3432 file_oformat = NULL;
3433 file_iformat = NULL;
3436 /* same option as mencoder */
3437 static void opt_pass(const char *pass_str)
3440 pass = atoi(pass_str);
3441 if (pass != 1 && pass != 2) {
3442 fprintf(stderr, "pass number can be only 1 or 2\n");
3448 static int64_t getutime(void)
3450 #ifdef HAVE_GETRUSAGE
3451 struct rusage rusage;
3453 getrusage(RUSAGE_SELF, &rusage);
3454 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3455 #elif defined(HAVE_GETPROCESSTIMES)
3457 FILETIME c, e, k, u;
3458 proc = GetCurrentProcess();
3459 GetProcessTimes(proc, &c, &e, &k, &u);
3460 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3462 return av_gettime();
3466 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3469 const char *p = str;
3476 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3483 static void opt_inter_matrix(const char *arg)
3485 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3486 parse_matrix_coeffs(inter_matrix, arg);
3489 static void opt_intra_matrix(const char *arg)
3491 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3492 parse_matrix_coeffs(intra_matrix, arg);
3496 * Trivial log callback.
3497 * Only suitable for show_help and similar since it lacks prefix handling.
3499 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
3501 vfprintf(stdout, fmt, vl);
3504 static void show_help(void)
3506 av_log_set_callback(log_callback_help);
3507 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3508 "Hyper fast Audio and Video encoder\n");
3510 show_help_options(options, "Main options:\n",
3511 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3512 show_help_options(options, "\nAdvanced options:\n",
3513 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3515 show_help_options(options, "\nVideo options:\n",
3516 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3518 show_help_options(options, "\nAdvanced Video options:\n",
3519 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3520 OPT_VIDEO | OPT_EXPERT);
3521 show_help_options(options, "\nAudio options:\n",
3522 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3524 show_help_options(options, "\nAdvanced Audio options:\n",
3525 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3526 OPT_AUDIO | OPT_EXPERT);
3527 show_help_options(options, "\nSubtitle options:\n",
3528 OPT_SUBTITLE | OPT_GRAB,
3530 show_help_options(options, "\nAudio/Video grab options:\n",
3534 av_opt_show(avctx_opts[0], NULL);
3536 av_opt_show(avformat_opts, NULL);
3538 av_opt_show(sws_opts, NULL);
3541 static void opt_target(const char *arg)
3544 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3546 if(!strncmp(arg, "pal-", 4)) {
3549 } else if(!strncmp(arg, "ntsc-", 5)) {
3552 } else if(!strncmp(arg, "film-", 5)) {
3557 /* Calculate FR via float to avoid int overflow */
3558 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3561 } else if((fr == 29970) || (fr == 23976)) {
3564 /* Try to determine PAL/NTSC by peeking in the input files */
3565 if(nb_input_files) {
3567 for(j = 0; j < nb_input_files; j++) {
3568 for(i = 0; i < input_files[j]->nb_streams; i++) {
3569 AVCodecContext *c = input_files[j]->streams[i]->codec;
3570 if(c->codec_type != CODEC_TYPE_VIDEO)
3572 fr = c->time_base.den * 1000 / c->time_base.num;
3576 } else if((fr == 29970) || (fr == 23976)) {
3586 if(verbose && norm >= 0)
3587 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3591 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3592 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3593 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3597 if(!strcmp(arg, "vcd")) {
3599 opt_video_codec("mpeg1video");
3600 opt_audio_codec("mp2");
3603 opt_frame_size(norm ? "352x240" : "352x288");
3604 opt_frame_rate(NULL, frame_rates[norm]);
3605 opt_default("gop", norm ? "18" : "15");
3607 opt_default("b", "1150000");
3608 opt_default("maxrate", "1150000");
3609 opt_default("minrate", "1150000");
3610 opt_default("bufsize", "327680"); // 40*1024*8;
3612 opt_default("ab", "224000");
3613 audio_sample_rate = 44100;
3616 opt_default("packetsize", "2324");
3617 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3619 /* We have to offset the PTS, so that it is consistent with the SCR.
3620 SCR starts at 36000, but the first two packs contain only padding
3621 and the first pack from the other stream, respectively, may also have
3622 been written before.
3623 So the real data starts at SCR 36000+3*1200. */
3624 mux_preload= (36000+3*1200) / 90000.0; //0.44
3625 } else if(!strcmp(arg, "svcd")) {
3627 opt_video_codec("mpeg2video");
3628 opt_audio_codec("mp2");
3631 opt_frame_size(norm ? "480x480" : "480x576");
3632 opt_frame_rate(NULL, frame_rates[norm]);
3633 opt_default("gop", norm ? "18" : "15");
3635 opt_default("b", "2040000");
3636 opt_default("maxrate", "2516000");
3637 opt_default("minrate", "0"); //1145000;
3638 opt_default("bufsize", "1835008"); //224*1024*8;
3639 opt_default("flags", "+SCAN_OFFSET");
3642 opt_default("ab", "224000");
3643 audio_sample_rate = 44100;
3645 opt_default("packetsize", "2324");
3647 } else if(!strcmp(arg, "dvd")) {
3649 opt_video_codec("mpeg2video");
3650 opt_audio_codec("ac3");
3653 opt_frame_size(norm ? "720x480" : "720x576");
3654 opt_frame_rate(NULL, frame_rates[norm]);
3655 opt_default("gop", norm ? "18" : "15");
3657 opt_default("b", "6000000");
3658 opt_default("maxrate", "9000000");
3659 opt_default("minrate", "0"); //1500000;
3660 opt_default("bufsize", "1835008"); //224*1024*8;
3662 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3663 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3665 opt_default("ab", "448000");
3666 audio_sample_rate = 48000;
3668 } else if(!strncmp(arg, "dv", 2)) {
3672 opt_frame_size(norm ? "720x480" : "720x576");
3673 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3674 (norm ? "yuv411p" : "yuv420p"));
3675 opt_frame_rate(NULL, frame_rates[norm]);
3677 audio_sample_rate = 48000;
3681 fprintf(stderr, "Unknown target: %s\n", arg);
3686 static void opt_vstats_file (const char *arg)
3688 av_free (vstats_filename);
3689 vstats_filename=av_strdup (arg);
3692 static void opt_vstats (void)
3695 time_t today2 = time(NULL);
3696 struct tm *today = localtime(&today2);
3698 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3700 opt_vstats_file(filename);
3703 static int opt_bsf(const char *opt, const char *arg)
3705 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3706 AVBitStreamFilterContext **bsfp;
3709 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3713 bsfp= *opt == 'v' ? &video_bitstream_filters :
3714 *opt == 'a' ? &audio_bitstream_filters :
3715 &subtitle_bitstream_filters;
3717 bsfp= &(*bsfp)->next;
3724 static int opt_preset(const char *opt, const char *arg)
3727 char tmp[1000], tmp2[1000];
3729 const char *base[3]= { getenv("HOME"),
3734 for(i=!base[0]; i<3 && !f; i++){
3735 snprintf(tmp, sizeof(tmp), "%s/%sffmpeg/%s.ffpreset", base[i], i ? "" : ".", arg);
3738 char *codec_name= *opt == 'v' ? video_codec_name :
3739 *opt == 'a' ? audio_codec_name :
3740 subtitle_codec_name;
3741 snprintf(tmp, sizeof(tmp), "%s/%sffmpeg/%s-%s.ffpreset", base[i], i ? "" : ".", codec_name, arg);
3747 fprintf(stderr, "Preset file not found\n");
3752 int e= fscanf(f, "%999[^=]=%999[^\n]\n", tmp, tmp2);
3754 fprintf(stderr, "Preset file invalid\n");
3757 if(!strcmp(tmp, "acodec")){
3758 opt_audio_codec(tmp2);
3759 }else if(!strcmp(tmp, "vcodec")){
3760 opt_video_codec(tmp2);
3761 }else if(!strcmp(tmp, "scodec")){
3762 opt_subtitle_codec(tmp2);
3764 opt_default(tmp, tmp2);
3772 static const OptionDef options[] = {
3774 { "L", OPT_EXIT, {(void*)show_license}, "show license" },
3775 { "h", OPT_EXIT, {(void*)show_help}, "show help" },
3776 { "version", OPT_EXIT, {(void*)show_version}, "show version" },
3777 { "formats", OPT_EXIT, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3778 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3779 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3780 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3781 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3782 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3783 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3784 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3785 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3786 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3787 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
3788 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3789 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3790 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3791 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3792 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3793 { "genre", HAS_ARG | OPT_STRING, {(void*)&str_genre}, "set the genre", "string" },
3794 { "album", HAS_ARG | OPT_STRING, {(void*)&str_album}, "set the album", "string" },
3795 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3796 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3797 "add timings for benchmarking" },
3798 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3799 "dump each input packet" },
3800 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3801 "when dumping packets, also dump the payload" },
3802 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3803 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3804 { "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)", "" },
3805 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set the logging verbosity level", "number" },
3806 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3807 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3808 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3809 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3810 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3811 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3812 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3813 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3814 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3815 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3818 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3819 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3820 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3821 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3822 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3823 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3824 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format, 'list' as argument shows all the pixel formats supported", "format" },
3825 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3826 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3827 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3828 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3829 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3830 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3831 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3832 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3833 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3834 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3835 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3836 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3837 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3838 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3839 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3840 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
3841 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3842 "use same video quality as source (implies VBR)" },
3843 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3844 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3845 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3846 "deinterlace pictures" },
3847 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3848 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
3849 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
3851 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3853 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3854 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3855 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3856 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3857 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3858 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3859 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3862 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3863 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3864 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3865 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3866 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3867 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3868 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3869 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3870 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3871 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3872 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3873 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_sample_fmt}, "set sample format, 'list' as argument shows all the sample formats supported", "format" },
3875 /* subtitle options */
3876 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
3877 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3878 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
3879 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3882 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3883 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3884 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3887 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
3888 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
3890 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3891 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3892 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3894 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3895 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3896 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3898 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
3902 int main(int argc, char **argv)
3907 avcodec_register_all();
3908 avdevice_register_all();
3911 if(isatty(STDIN_FILENO))
3912 url_set_interrupt_cb(decode_interrupt_cb);
3914 for(i=0; i<CODEC_TYPE_NB; i++){
3915 avctx_opts[i]= avcodec_alloc_context2(i);
3917 avformat_opts = av_alloc_format_context();
3918 sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
3927 parse_options(argc, argv, options, opt_output_file);
3929 /* file converter / grab */
3930 if (nb_output_files <= 0) {
3931 fprintf(stderr, "Must supply at least one output file\n");
3935 if (nb_input_files == 0) {
3936 fprintf(stderr, "Must supply at least one input file\n");
3941 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3942 stream_maps, nb_stream_maps);
3943 ti = getutime() - ti;
3945 printf("bench: utime=%0.3fs\n", ti / 1000000.0);