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
30 #include "libavformat/avformat.h"
31 #include "libavdevice/avdevice.h"
32 #include "libswscale/swscale.h"
33 #include "libavformat/framehook.h"
34 #include "libavcodec/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/fifo.h"
37 #include "libavutil/avstring.h"
38 #include "libavformat/os_support.h"
40 #ifdef HAVE_SYS_RESOURCE_H
41 #include <sys/types.h>
42 #include <sys/resource.h>
43 #elif defined(HAVE_GETPROCESSTIMES)
47 #if defined(HAVE_TERMIOS_H)
50 #include <sys/ioctl.h>
53 #elif defined(HAVE_CONIO_H)
56 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
66 const char program_name[] = "FFmpeg";
67 const int program_birth_year = 2000;
69 /* select an input stream for an output stream */
70 typedef struct AVStreamMap {
74 int sync_stream_index;
77 /** select an input file for an output file */
78 typedef struct AVMetaDataMap {
83 static const OptionDef options[];
87 static AVFormatContext *input_files[MAX_FILES];
88 static int64_t input_files_ts_offset[MAX_FILES];
89 static double input_files_ts_scale[MAX_FILES][MAX_STREAMS];
90 static int nb_input_files = 0;
92 static AVFormatContext *output_files[MAX_FILES];
93 static int nb_output_files = 0;
95 static AVStreamMap stream_maps[MAX_FILES];
96 static int nb_stream_maps;
98 static AVMetaDataMap meta_data_maps[MAX_FILES];
99 static int nb_meta_data_maps;
101 static AVInputFormat *file_iformat;
102 static AVOutputFormat *file_oformat;
103 static int frame_width = 0;
104 static int frame_height = 0;
105 static float frame_aspect_ratio = 0;
106 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
107 static enum SampleFormat audio_sample_fmt = SAMPLE_FMT_NONE;
108 static int frame_padtop = 0;
109 static int frame_padbottom = 0;
110 static int frame_padleft = 0;
111 static int frame_padright = 0;
112 static int padcolor[3] = {16,128,128}; /* default to black */
113 static int frame_topBand = 0;
114 static int frame_bottomBand = 0;
115 static int frame_leftBand = 0;
116 static int frame_rightBand = 0;
117 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
118 static AVRational frame_rate;
119 static float video_qscale = 0;
120 static uint16_t *intra_matrix = NULL;
121 static uint16_t *inter_matrix = NULL;
122 #if 0 //experimental, (can be removed)
123 static float video_rc_qsquish=1.0;
124 static float video_rc_qmod_amp=0;
125 static int video_rc_qmod_freq=0;
127 static const char *video_rc_override_string=NULL;
128 static int video_disable = 0;
129 static int video_discard = 0;
130 static char *video_codec_name = NULL;
131 static int video_codec_tag = 0;
132 static int same_quality = 0;
133 static int do_deinterlace = 0;
134 static int top_field_first = -1;
135 static int me_threshold = 0;
136 static int intra_dc_precision = 8;
137 static int loop_input = 0;
138 static int loop_output = AVFMT_NOOUTPUTLOOP;
139 static int qp_hist = 0;
141 static int intra_only = 0;
142 static int audio_sample_rate = 44100;
143 #define QSCALE_NONE -99999
144 static float audio_qscale = QSCALE_NONE;
145 static int audio_disable = 0;
146 static int audio_channels = 1;
147 static char *audio_codec_name = NULL;
148 static int audio_codec_tag = 0;
149 static char *audio_language = NULL;
151 static int subtitle_disable = 0;
152 static char *subtitle_codec_name = NULL;
153 static char *subtitle_language = NULL;
155 static float mux_preload= 0.5;
156 static float mux_max_delay= 0.7;
158 static int64_t recording_time = INT64_MAX;
159 static int64_t start_time = 0;
160 static int64_t rec_timestamp = 0;
161 static int64_t input_ts_offset = 0;
162 static int file_overwrite = 0;
163 static char *str_title = NULL;
164 static char *str_author = NULL;
165 static char *str_copyright = NULL;
166 static char *str_comment = NULL;
167 static char *str_genre = NULL;
168 static char *str_album = NULL;
169 static int do_benchmark = 0;
170 static int do_hex_dump = 0;
171 static int do_pkt_dump = 0;
172 static int do_psnr = 0;
173 static int do_pass = 0;
174 static char *pass_logfilename = NULL;
175 static int audio_stream_copy = 0;
176 static int video_stream_copy = 0;
177 static int subtitle_stream_copy = 0;
178 static int video_sync_method= -1;
179 static int audio_sync_method= 0;
180 static float audio_drift_threshold= 0.1;
181 static int copy_ts= 0;
182 static int opt_shortest = 0; //
183 static int video_global_header = 0;
184 static char *vstats_filename;
185 static FILE *vstats_file;
186 static int opt_programid = 0;
188 static int rate_emu = 0;
190 static int video_channel = 0;
191 static char *video_standard;
193 static int audio_volume = 256;
195 static int using_stdin = 0;
196 static int using_vhook = 0;
197 static int verbose = 1;
198 static int thread_count= 1;
199 static int q_pressed = 0;
200 static int64_t video_size = 0;
201 static int64_t audio_size = 0;
202 static int64_t extra_size = 0;
203 static int nb_frames_dup = 0;
204 static int nb_frames_drop = 0;
205 static int input_sync;
206 static uint64_t limit_filesize = 0; //
208 static int pgmyuv_compatibility_hack=0;
209 static float dts_delta_threshold = 10;
211 static unsigned int sws_flags = SWS_BICUBIC;
213 static const char **opt_names;
214 static int opt_name_count;
215 static AVCodecContext *avctx_opts[CODEC_TYPE_NB];
216 static AVFormatContext *avformat_opts;
217 static struct SwsContext *sws_opts;
218 static int64_t timer_start;
220 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
221 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
222 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
223 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
225 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
227 struct AVInputStream;
229 typedef struct AVOutputStream {
230 int file_index; /* file index */
231 int index; /* stream index in the output file */
232 int source_index; /* AVInputStream index */
233 AVStream *st; /* stream in the output file */
234 int encoding_needed; /* true if encoding needed for this stream */
236 /* input pts and corresponding output pts
238 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
239 struct AVInputStream *sync_ist; /* input stream to sync against */
240 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
243 AVFrame pict_tmp; /* temporary image for resampling */
244 struct SwsContext *img_resample_ctx; /* for image resampling */
248 int topBand; /* cropping area sizes */
252 int padtop; /* padding area sizes */
259 ReSampleContext *resample; /* for audio resampling */
261 AVAudioConvert *reformat_ctx;
262 AVFifoBuffer fifo; /* for compression: one audio fifo per codec */
266 typedef struct AVInputStream {
270 int discard; /* true if stream data should be discarded */
271 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
272 int64_t sample_index; /* current sample */
274 int64_t start; /* time when read started */
275 unsigned long frame; /* current frame */
276 int64_t next_pts; /* synthetic pts for cases where pkt.pts
278 int64_t pts; /* current pts */
279 int is_start; /* is 1 at the start and after a discontinuity */
282 typedef struct AVInputFile {
283 int eof_reached; /* true if eof reached */
284 int ist_index; /* index of first stream in ist_table */
285 int buffer_size; /* current total buffer size */
286 int nb_streams; /* nb streams we are aware of */
289 #ifdef HAVE_TERMIOS_H
291 /* init terminal so that we can grab keys */
292 static struct termios oldtty;
295 static void term_exit(void)
297 #ifdef HAVE_TERMIOS_H
298 tcsetattr (0, TCSANOW, &oldtty);
302 static volatile sig_atomic_t received_sigterm = 0;
305 sigterm_handler(int sig)
307 received_sigterm = sig;
311 static void term_init(void)
313 #ifdef HAVE_TERMIOS_H
319 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
320 |INLCR|IGNCR|ICRNL|IXON);
321 tty.c_oflag |= OPOST;
322 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
323 tty.c_cflag &= ~(CSIZE|PARENB);
328 tcsetattr (0, TCSANOW, &tty);
329 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
332 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
333 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
335 register a function to be called at normal program termination
338 #ifdef CONFIG_BEOS_NETSERVER
339 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
343 /* read a key without blocking */
344 static int read_key(void)
346 #if defined(HAVE_TERMIOS_H)
349 #ifndef CONFIG_BEOS_NETSERVER
357 n = select(1, &rfds, NULL, NULL, &tv);
366 #elif defined(HAVE_CONIO_H)
373 static int decode_interrupt_cb(void)
375 return q_pressed || (q_pressed = read_key() == 'q');
378 static int av_exit(int ret)
383 for(i=0;i<nb_output_files;i++) {
384 /* maybe av_close_output_file ??? */
385 AVFormatContext *s = output_files[i];
387 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
389 for(j=0;j<s->nb_streams;j++) {
390 av_free(s->streams[j]->codec);
391 av_free(s->streams[j]);
395 for(i=0;i<nb_input_files;i++)
396 av_close_input_file(input_files[i]);
398 av_free(intra_matrix);
399 av_free(inter_matrix);
403 av_free(vstats_filename);
407 av_free(video_codec_name);
408 av_free(audio_codec_name);
409 av_free(subtitle_codec_name);
411 av_free(video_standard);
413 #ifdef CONFIG_POWERPC_PERF
414 extern void powerpc_display_perf_report(void);
415 powerpc_display_perf_report();
416 #endif /* CONFIG_POWERPC_PERF */
418 if (received_sigterm) {
420 "Received signal %d: terminating.\n",
421 (int) received_sigterm);
425 exit(ret); /* not all OS-es handle main() return value */
429 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
435 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
438 /* copy stream format */
439 s->nb_streams = ic->nb_streams;
440 for(i=0;i<ic->nb_streams;i++) {
443 // FIXME: a more elegant solution is needed
444 st = av_mallocz(sizeof(AVStream));
445 memcpy(st, ic->streams[i], sizeof(AVStream));
446 st->codec = avcodec_alloc_context();
447 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
450 if (st->codec->codec_type == CODEC_TYPE_AUDIO && audio_stream_copy)
452 else if (st->codec->codec_type == CODEC_TYPE_VIDEO && video_stream_copy)
455 if(!st->codec->thread_count)
456 st->codec->thread_count = 1;
457 if(st->codec->thread_count>1)
458 avcodec_thread_init(st->codec, st->codec->thread_count);
460 if(st->codec->flags & CODEC_FLAG_BITEXACT)
465 s->timestamp = av_gettime();
467 av_close_input_file(ic);
472 get_sync_ipts(const AVOutputStream *ost)
474 const AVInputStream *ist = ost->sync_ist;
475 return (double)(ist->pts - start_time)/AV_TIME_BASE;
478 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
482 AVPacket new_pkt= *pkt;
483 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
484 &new_pkt.data, &new_pkt.size,
485 pkt->data, pkt->size,
486 pkt->flags & PKT_FLAG_KEY);
489 new_pkt.destruct= av_destruct_packet;
491 fprintf(stderr, "%s failed for stream %d, codec %s",
492 bsfc->filter->name, pkt->stream_index,
493 avctx->codec ? avctx->codec->name : "copy");
501 ret= av_interleaved_write_frame(s, pkt);
503 print_error("av_interleaved_write_frame()", ret);
508 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
510 static void do_audio_out(AVFormatContext *s,
513 unsigned char *buf, int size)
516 static uint8_t *audio_buf = NULL;
517 static uint8_t *audio_out = NULL;
518 static uint8_t *audio_out2 = NULL;
519 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
521 int size_out, frame_bytes, ret;
522 AVCodecContext *enc= ost->st->codec;
523 AVCodecContext *dec= ist->st->codec;
525 /* SC: dynamic allocation of buffers */
527 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
529 audio_out = av_malloc(audio_out_size);
530 if (!audio_buf || !audio_out)
531 return; /* Should signal an error ! */
533 if (enc->channels != dec->channels)
534 ost->audio_resample = 1;
536 if (ost->audio_resample && !ost->resample) {
537 ost->resample = audio_resample_init(enc->channels, dec->channels,
538 enc->sample_rate, dec->sample_rate);
539 if (!ost->resample) {
540 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
541 dec->channels, dec->sample_rate,
542 enc->channels, enc->sample_rate);
547 #define MAKE_SFMT_PAIR(a,b) ((a)+SAMPLE_FMT_NB*(b))
548 if (dec->sample_fmt!=enc->sample_fmt &&
549 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
551 audio_out2 = av_malloc(audio_out_size);
554 if (ost->reformat_ctx)
555 av_audio_convert_free(ost->reformat_ctx);
556 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
557 dec->sample_fmt, 1, NULL, 0);
558 if (!ost->reformat_ctx) {
559 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
560 avcodec_get_sample_fmt_name(dec->sample_fmt),
561 avcodec_get_sample_fmt_name(enc->sample_fmt));
564 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
567 if(audio_sync_method){
568 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
569 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2);
570 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
571 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
573 //FIXME resample delay
574 if(fabs(delta) > 50){
575 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
577 byte_delta= FFMAX(byte_delta, -size);
581 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
586 static uint8_t *input_tmp= NULL;
587 input_tmp= av_realloc(input_tmp, byte_delta + size);
589 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
592 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
594 memset(input_tmp, 0, byte_delta);
595 memcpy(input_tmp + byte_delta, buf, size);
599 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
601 }else if(audio_sync_method>1){
602 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
603 assert(ost->audio_resample);
605 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
606 // 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));
607 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
611 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
612 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
614 if (ost->audio_resample) {
616 size_out = audio_resample(ost->resample,
617 (short *)buftmp, (short *)buf,
618 size / (ist->st->codec->channels * 2));
619 size_out = size_out * enc->channels * 2;
625 if (dec->sample_fmt!=enc->sample_fmt) {
626 const void *ibuf[6]= {buftmp};
627 void *obuf[6]= {audio_out2};
628 int istride[6]= {av_get_bits_per_sample_format(dec->sample_fmt)/8};
629 int ostride[6]= {av_get_bits_per_sample_format(enc->sample_fmt)/8};
630 int len= size_out/istride[0];
631 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
632 printf("av_audio_convert() failed\n");
636 /* FIXME: existing code assume that size_out equals framesize*channels*2
637 remove this legacy cruft */
641 /* now encode as many frames as possible */
642 if (enc->frame_size > 1) {
643 /* output resampled raw samples */
644 av_fifo_realloc(&ost->fifo, av_fifo_size(&ost->fifo) + size_out);
645 av_fifo_generic_write(&ost->fifo, buftmp, size_out, NULL);
647 frame_bytes = enc->frame_size * 2 * enc->channels;
649 while (av_fifo_size(&ost->fifo) >= frame_bytes) {
651 av_init_packet(&pkt);
653 av_fifo_read(&ost->fifo, audio_buf, frame_bytes);
655 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
657 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
660 pkt.stream_index= ost->index;
663 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
664 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
665 pkt.flags |= PKT_FLAG_KEY;
666 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
668 ost->sync_opts += enc->frame_size;
672 av_init_packet(&pkt);
674 ost->sync_opts += size_out / (2 * enc->channels);
676 /* output a pcm frame */
677 /* XXX: change encoding codec API to avoid this ? */
678 switch(enc->codec->id) {
679 case CODEC_ID_PCM_S32LE:
680 case CODEC_ID_PCM_S32BE:
681 case CODEC_ID_PCM_U32LE:
682 case CODEC_ID_PCM_U32BE:
683 case CODEC_ID_PCM_F32BE:
684 size_out = size_out << 1;
686 case CODEC_ID_PCM_S24LE:
687 case CODEC_ID_PCM_S24BE:
688 case CODEC_ID_PCM_U24LE:
689 case CODEC_ID_PCM_U24BE:
690 case CODEC_ID_PCM_S24DAUD:
691 size_out = size_out / 2 * 3;
693 case CODEC_ID_PCM_S16LE:
694 case CODEC_ID_PCM_S16BE:
695 case CODEC_ID_PCM_U16LE:
696 case CODEC_ID_PCM_U16BE:
699 size_out = size_out >> 1;
702 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
703 ret = avcodec_encode_audio(enc, audio_out, size_out,
706 pkt.stream_index= ost->index;
709 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
710 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
711 pkt.flags |= PKT_FLAG_KEY;
712 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
716 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
720 AVPicture picture_tmp;
723 dec = ist->st->codec;
725 /* deinterlace : must be done before any resize */
726 if (do_deinterlace || using_vhook) {
729 /* create temporary picture */
730 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
731 buf = av_malloc(size);
735 picture2 = &picture_tmp;
736 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
739 if(avpicture_deinterlace(picture2, picture,
740 dec->pix_fmt, dec->width, dec->height) < 0) {
741 /* if error, do not deinterlace */
747 av_picture_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
754 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height,
755 1000000 * ist->pts / AV_TIME_BASE);
757 if (picture != picture2)
758 *picture = *picture2;
762 /* we begin to correct av delay at this threshold */
763 #define AV_DELAY_MAX 0.100
765 static void do_subtitle_out(AVFormatContext *s,
771 static uint8_t *subtitle_out = NULL;
772 int subtitle_out_max_size = 65536;
773 int subtitle_out_size, nb, i;
777 if (pts == AV_NOPTS_VALUE) {
778 fprintf(stderr, "Subtitle packets must have a pts\n");
782 enc = ost->st->codec;
785 subtitle_out = av_malloc(subtitle_out_max_size);
788 /* Note: DVB subtitle need one packet to draw them and one other
789 packet to clear them */
790 /* XXX: signal it in the codec context ? */
791 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
796 for(i = 0; i < nb; i++) {
797 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
798 subtitle_out_max_size, sub);
800 av_init_packet(&pkt);
801 pkt.stream_index = ost->index;
802 pkt.data = subtitle_out;
803 pkt.size = subtitle_out_size;
804 pkt.pts = av_rescale_q(pts, ist->st->time_base, ost->st->time_base);
805 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
806 /* XXX: the pts correction is handled here. Maybe handling
807 it in the codec would be better */
809 pkt.pts += 90 * sub->start_display_time;
811 pkt.pts += 90 * sub->end_display_time;
813 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
817 static int bit_buffer_size= 1024*256;
818 static uint8_t *bit_buffer= NULL;
820 static void do_video_out(AVFormatContext *s,
826 int nb_frames, i, ret;
827 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
828 AVFrame picture_crop_temp, picture_pad_temp;
829 AVCodecContext *enc, *dec;
831 avcodec_get_frame_defaults(&picture_crop_temp);
832 avcodec_get_frame_defaults(&picture_pad_temp);
834 enc = ost->st->codec;
835 dec = ist->st->codec;
837 /* by default, we output a single frame */
842 if(video_sync_method>0 || (video_sync_method && av_q2d(enc->time_base) > 0.001)){
844 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
845 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
848 else if (video_sync_method == 2)
849 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
850 else if (vdelta > 1.1)
851 nb_frames = lrintf(vdelta);
852 //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);
856 fprintf(stderr, "*** drop!\n");
857 }else if (nb_frames > 1) {
858 nb_frames_dup += nb_frames;
860 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
863 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
865 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
869 if (ost->video_crop) {
870 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
871 av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
874 formatted_picture = &picture_crop_temp;
876 formatted_picture = in_picture;
879 final_picture = formatted_picture;
880 padding_src = formatted_picture;
881 resampling_dst = &ost->pict_tmp;
882 if (ost->video_pad) {
883 final_picture = &ost->pict_tmp;
884 if (ost->video_resample) {
885 if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
886 av_log(NULL, AV_LOG_ERROR, "error padding picture\n");
889 resampling_dst = &picture_pad_temp;
893 if (ost->video_resample) {
895 final_picture = &ost->pict_tmp;
896 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
897 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
900 if (ost->video_pad) {
901 av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
902 enc->height, enc->width, enc->pix_fmt,
903 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
906 /* duplicates frame if needed */
907 for(i=0;i<nb_frames;i++) {
909 av_init_packet(&pkt);
910 pkt.stream_index= ost->index;
912 if (s->oformat->flags & AVFMT_RAWPICTURE) {
913 /* raw pictures are written as AVPicture structure to
914 avoid any copies. We support temorarily the older
916 AVFrame* old_frame = enc->coded_frame;
917 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
918 pkt.data= (uint8_t *)final_picture;
919 pkt.size= sizeof(AVPicture);
920 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
921 pkt.flags |= PKT_FLAG_KEY;
923 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
924 enc->coded_frame = old_frame;
928 big_picture= *final_picture;
929 /* better than nothing: use input picture interlaced
931 big_picture.interlaced_frame = in_picture->interlaced_frame;
932 if(avctx_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
933 if(top_field_first == -1)
934 big_picture.top_field_first = in_picture->top_field_first;
936 big_picture.top_field_first = top_field_first;
939 /* handles sameq here. This is not correct because it may
940 not be a global option */
942 big_picture.quality = ist->st->quality;
944 big_picture.quality = ost->st->quality;
946 big_picture.pict_type = 0;
947 // big_picture.pts = AV_NOPTS_VALUE;
948 big_picture.pts= ost->sync_opts;
949 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
950 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
951 ret = avcodec_encode_video(enc,
952 bit_buffer, bit_buffer_size,
955 fprintf(stderr, "Video encoding failed\n");
958 //enc->frame_number = enc->real_pict_num;
960 pkt.data= bit_buffer;
962 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
963 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
964 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
965 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
966 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
968 if(enc->coded_frame->key_frame)
969 pkt.flags |= PKT_FLAG_KEY;
970 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
973 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
974 // enc->frame_number-1, enc->real_pict_num, ret,
976 /* if two pass, output log */
977 if (ost->logfile && enc->stats_out) {
978 fprintf(ost->logfile, "%s", enc->stats_out);
987 static double psnr(double d){
988 return -10.0*log(d)/log(10.0);
991 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
996 double ti1, bitrate, avg_bitrate;
998 /* this is executed just the first time do_video_stats is called */
1000 vstats_file = fopen(vstats_filename, "w");
1007 enc = ost->st->codec;
1008 if (enc->codec_type == CODEC_TYPE_VIDEO) {
1009 frame_number = ost->frame_number;
1010 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1011 if (enc->flags&CODEC_FLAG_PSNR)
1012 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1014 fprintf(vstats_file,"f_size= %6d ", frame_size);
1015 /* compute pts value */
1016 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1020 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1021 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1022 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1023 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1024 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1028 static void print_report(AVFormatContext **output_files,
1029 AVOutputStream **ost_table, int nb_ostreams,
1033 AVOutputStream *ost;
1034 AVFormatContext *oc, *os;
1036 AVCodecContext *enc;
1037 int frame_number, vid, i;
1038 double bitrate, ti1, pts;
1039 static int64_t last_time = -1;
1040 static int qp_histogram[52];
1042 if (!is_last_report) {
1044 /* display the report every 0.5 seconds */
1045 cur_time = av_gettime();
1046 if (last_time == -1) {
1047 last_time = cur_time;
1050 if ((cur_time - last_time) < 500000)
1052 last_time = cur_time;
1056 oc = output_files[0];
1058 total_size = url_fsize(oc->pb);
1059 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1060 total_size= url_ftell(oc->pb);
1065 for(i=0;i<nb_ostreams;i++) {
1067 os = output_files[ost->file_index];
1068 enc = ost->st->codec;
1069 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1070 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1071 !ost->st->stream_copy ?
1072 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1074 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1075 float t = (av_gettime()-timer_start) / 1000000.0;
1077 frame_number = ost->frame_number;
1078 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1079 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1080 !ost->st->stream_copy ?
1081 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1083 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1086 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1087 if(qp>=0 && qp<sizeof(qp_histogram)/sizeof(int))
1090 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1092 if (enc->flags&CODEC_FLAG_PSNR){
1094 double error, error_sum=0;
1095 double scale, scale_sum=0;
1096 char type[3]= {'Y','U','V'};
1097 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1100 error= enc->error[j];
1101 scale= enc->width*enc->height*255.0*255.0*frame_number;
1103 error= enc->coded_frame->error[j];
1104 scale= enc->width*enc->height*255.0*255.0;
1109 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1111 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1115 /* compute min output value */
1116 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1117 if ((pts < ti1) && (pts > 0))
1123 if (verbose || is_last_report) {
1124 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1126 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1127 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1128 (double)total_size / 1024, ti1, bitrate);
1131 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1132 nb_frames_dup, nb_frames_drop);
1135 fprintf(stderr, "%s \r", buf);
1140 if (is_last_report && verbose >= 0){
1141 int64_t raw= audio_size + video_size + extra_size;
1142 fprintf(stderr, "\n");
1143 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1147 100.0*(total_size - raw)/raw
1152 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1153 static int output_packet(AVInputStream *ist, int ist_index,
1154 AVOutputStream **ost_table, int nb_ostreams,
1155 const AVPacket *pkt)
1157 AVFormatContext *os;
1158 AVOutputStream *ost;
1162 int data_size, got_picture;
1164 void *buffer_to_free;
1165 static unsigned int samples_size= 0;
1166 static short *samples= NULL;
1167 AVSubtitle subtitle, *subtitle_to_free;
1170 if(ist->next_pts == AV_NOPTS_VALUE)
1171 ist->next_pts= ist->pts;
1180 if(pkt->dts != AV_NOPTS_VALUE)
1181 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1186 //while we have more to decode or while the decoder did output something on EOF
1187 while (len > 0 || (!pkt && ist->next_pts != ist->pts)) {
1189 ist->pts= ist->next_pts;
1191 if(len && len != pkt->size && verbose>0)
1192 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1194 /* decode the packet if needed */
1195 data_buf = NULL; /* fail safe */
1197 subtitle_to_free = NULL;
1198 if (ist->decoding_needed) {
1199 switch(ist->st->codec->codec_type) {
1200 case CODEC_TYPE_AUDIO:{
1202 samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE));
1203 data_size= samples_size;
1204 /* XXX: could avoid copy if PCM 16 bits with same
1205 endianness as CPU */
1206 ret = avcodec_decode_audio2(ist->st->codec, samples, &data_size,
1212 /* Some bug in mpeg audio decoder gives */
1213 /* data_size < 0, it seems they are overflows */
1214 if (data_size <= 0) {
1215 /* no audio frame */
1218 data_buf = (uint8_t *)samples;
1219 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1220 (ist->st->codec->sample_rate * ist->st->codec->channels);
1222 case CODEC_TYPE_VIDEO:
1223 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1224 /* XXX: allocate picture correctly */
1225 avcodec_get_frame_defaults(&picture);
1227 ret = avcodec_decode_video(ist->st->codec,
1228 &picture, &got_picture, ptr, len);
1229 ist->st->quality= picture.quality;
1233 /* no picture yet */
1234 goto discard_packet;
1236 if (ist->st->codec->time_base.num != 0) {
1237 ist->next_pts += ((int64_t)AV_TIME_BASE *
1238 ist->st->codec->time_base.num) /
1239 ist->st->codec->time_base.den;
1243 case CODEC_TYPE_SUBTITLE:
1244 ret = avcodec_decode_subtitle(ist->st->codec,
1245 &subtitle, &got_subtitle, ptr, len);
1248 if (!got_subtitle) {
1249 goto discard_packet;
1251 subtitle_to_free = &subtitle;
1258 switch(ist->st->codec->codec_type) {
1259 case CODEC_TYPE_AUDIO:
1260 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1261 ist->st->codec->sample_rate;
1263 case CODEC_TYPE_VIDEO:
1264 if (ist->st->codec->time_base.num != 0) {
1265 ist->next_pts += ((int64_t)AV_TIME_BASE *
1266 ist->st->codec->time_base.num) /
1267 ist->st->codec->time_base.den;
1277 buffer_to_free = NULL;
1278 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1279 pre_process_video_frame(ist, (AVPicture *)&picture,
1283 // preprocess audio (volume)
1284 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1285 if (audio_volume != 256) {
1288 for(i=0;i<(data_size / sizeof(short));i++) {
1289 int v = ((*volp) * audio_volume + 128) >> 8;
1290 if (v < -32768) v = -32768;
1291 if (v > 32767) v = 32767;
1297 /* frame rate emulation */
1298 if (ist->st->codec->rate_emu) {
1299 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
1300 int64_t now = av_gettime() - ist->start;
1308 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1309 is the one of the next displayed one */
1310 /* XXX: add mpeg4 too ? */
1311 if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
1312 if (ist->st->codec->pict_type != B_TYPE) {
1314 tmp = ist->last_ip_pts;
1315 ist->last_ip_pts = ist->frac_pts.val;
1316 ist->frac_pts.val = tmp;
1320 /* if output time reached then transcode raw format,
1321 encode packets and output them */
1322 if (start_time == 0 || ist->pts >= start_time)
1323 for(i=0;i<nb_ostreams;i++) {
1327 if (ost->source_index == ist_index) {
1328 os = output_files[ost->file_index];
1331 printf("%d: got pts=%0.3f %0.3f\n", i,
1332 (double)pkt->pts / AV_TIME_BASE,
1333 ((double)ist->pts / AV_TIME_BASE) -
1334 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1336 /* set the input output pts pairs */
1337 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1339 if (ost->encoding_needed) {
1340 switch(ost->st->codec->codec_type) {
1341 case CODEC_TYPE_AUDIO:
1342 do_audio_out(os, ost, ist, data_buf, data_size);
1344 case CODEC_TYPE_VIDEO:
1345 do_video_out(os, ost, ist, &picture, &frame_size);
1346 if (vstats_filename && frame_size)
1347 do_video_stats(os, ost, frame_size);
1349 case CODEC_TYPE_SUBTITLE:
1350 do_subtitle_out(os, ost, ist, &subtitle,
1357 AVFrame avframe; //FIXME/XXX remove this
1359 av_init_packet(&opkt);
1361 if (!ost->frame_number && !(pkt->flags & PKT_FLAG_KEY))
1364 /* no reencoding needed : output the packet directly */
1365 /* force the input stream PTS */
1367 avcodec_get_frame_defaults(&avframe);
1368 ost->st->codec->coded_frame= &avframe;
1369 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1371 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1372 audio_size += data_size;
1373 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1374 video_size += data_size;
1378 opkt.stream_index= ost->index;
1379 if(pkt->pts != AV_NOPTS_VALUE)
1380 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base);
1382 opkt.pts= AV_NOPTS_VALUE;
1384 if (pkt->dts == AV_NOPTS_VALUE)
1385 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1387 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1389 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1390 opkt.flags= pkt->flags;
1392 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1393 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1394 opkt.destruct= av_destruct_packet;
1396 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][opkt.stream_index]);
1397 ost->st->codec->frame_number++;
1398 ost->frame_number++;
1399 av_free_packet(&opkt);
1403 av_free(buffer_to_free);
1404 /* XXX: allocate the subtitles in the codec ? */
1405 if (subtitle_to_free) {
1406 if (subtitle_to_free->rects != NULL) {
1407 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1408 av_free(subtitle_to_free->rects[i].bitmap);
1409 av_free(subtitle_to_free->rects[i].rgba_palette);
1411 av_freep(&subtitle_to_free->rects);
1413 subtitle_to_free->num_rects = 0;
1414 subtitle_to_free = NULL;
1421 for(i=0;i<nb_ostreams;i++) {
1423 if (ost->source_index == ist_index) {
1424 AVCodecContext *enc= ost->st->codec;
1425 os = output_files[ost->file_index];
1427 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1429 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1432 if (ost->encoding_needed) {
1436 av_init_packet(&pkt);
1437 pkt.stream_index= ost->index;
1439 switch(ost->st->codec->codec_type) {
1440 case CODEC_TYPE_AUDIO:
1441 fifo_bytes = av_fifo_size(&ost->fifo);
1443 /* encode any samples remaining in fifo */
1444 if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1445 int fs_tmp = enc->frame_size;
1446 enc->frame_size = fifo_bytes / (2 * enc->channels);
1447 av_fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes);
1448 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1449 enc->frame_size = fs_tmp;
1452 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1455 pkt.flags |= PKT_FLAG_KEY;
1457 case CODEC_TYPE_VIDEO:
1458 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1460 if(enc->coded_frame && enc->coded_frame->key_frame)
1461 pkt.flags |= PKT_FLAG_KEY;
1462 if (ost->logfile && enc->stats_out) {
1463 fprintf(ost->logfile, "%s", enc->stats_out);
1472 pkt.data= bit_buffer;
1474 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1475 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1476 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1488 static void print_sdp(AVFormatContext **avc, int n)
1492 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1493 printf("SDP:\n%s\n", sdp);
1496 static int stream_index_from_inputs(AVFormatContext **input_files,
1498 AVInputFile *file_table,
1499 AVInputStream **ist_table,
1500 enum CodecType type,
1504 for(z=0; z<nb_input_files; z++) {
1505 AVFormatContext *ic = input_files[z];
1506 for(p=0; p<ic->nb_programs; p++) {
1507 AVProgram *program = ic->programs[p];
1508 if(program->id != programid)
1510 for(q=0; q<program->nb_stream_indexes; q++) {
1511 int sidx = program->stream_index[q];
1512 int ris = file_table[z].ist_index + sidx;
1513 if(ist_table[ris]->discard && ic->streams[sidx]->codec->codec_type == type)
1523 * The following code is the main loop of the file converter
1525 static int av_encode(AVFormatContext **output_files,
1526 int nb_output_files,
1527 AVFormatContext **input_files,
1529 AVStreamMap *stream_maps, int nb_stream_maps)
1531 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1532 AVFormatContext *is, *os;
1533 AVCodecContext *codec, *icodec;
1534 AVOutputStream *ost, **ost_table = NULL;
1535 AVInputStream *ist, **ist_table = NULL;
1536 AVInputFile *file_table;
1540 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1544 /* input stream init */
1546 for(i=0;i<nb_input_files;i++) {
1547 is = input_files[i];
1548 file_table[i].ist_index = j;
1549 file_table[i].nb_streams = is->nb_streams;
1550 j += is->nb_streams;
1554 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1558 for(i=0;i<nb_istreams;i++) {
1559 ist = av_mallocz(sizeof(AVInputStream));
1565 for(i=0;i<nb_input_files;i++) {
1566 is = input_files[i];
1567 for(k=0;k<is->nb_streams;k++) {
1568 ist = ist_table[j++];
1569 ist->st = is->streams[k];
1570 ist->file_index = i;
1572 ist->discard = 1; /* the stream is discarded by default
1575 if (ist->st->codec->rate_emu) {
1576 ist->start = av_gettime();
1582 /* output stream init */
1584 for(i=0;i<nb_output_files;i++) {
1585 os = output_files[i];
1586 if (!os->nb_streams) {
1587 fprintf(stderr, "Output file does not contain any stream\n");
1590 nb_ostreams += os->nb_streams;
1592 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1593 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1597 /* Sanity check the mapping args -- do the input files & streams exist? */
1598 for(i=0;i<nb_stream_maps;i++) {
1599 int fi = stream_maps[i].file_index;
1600 int si = stream_maps[i].stream_index;
1602 if (fi < 0 || fi > nb_input_files - 1 ||
1603 si < 0 || si > file_table[fi].nb_streams - 1) {
1604 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1607 fi = stream_maps[i].sync_file_index;
1608 si = stream_maps[i].sync_stream_index;
1609 if (fi < 0 || fi > nb_input_files - 1 ||
1610 si < 0 || si > file_table[fi].nb_streams - 1) {
1611 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1616 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1619 for(i=0;i<nb_ostreams;i++) {
1620 ost = av_mallocz(sizeof(AVOutputStream));
1627 for(k=0;k<nb_output_files;k++) {
1628 os = output_files[k];
1629 for(i=0;i<os->nb_streams;i++) {
1631 ost = ost_table[n++];
1632 ost->file_index = k;
1634 ost->st = os->streams[i];
1635 if (nb_stream_maps > 0) {
1636 ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
1637 stream_maps[n-1].stream_index;
1639 /* Sanity check that the stream types match */
1640 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1641 int i= ost->file_index;
1642 dump_format(output_files[i], i, output_files[i]->filename, 1);
1643 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1644 stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
1645 ost->file_index, ost->index);
1652 j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid);
1654 ost->source_index = j;
1658 /* get corresponding input stream index : we select the first one with the right type */
1660 for(j=0;j<nb_istreams;j++) {
1663 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1664 ost->source_index = j;
1672 if(! opt_programid) {
1673 /* try again and reuse existing stream */
1674 for(j=0;j<nb_istreams;j++) {
1676 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1677 ost->source_index = j;
1683 int i= ost->file_index;
1684 dump_format(output_files[i], i, output_files[i]->filename, 1);
1685 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1686 ost->file_index, ost->index);
1691 ist = ist_table[ost->source_index];
1693 ost->sync_ist = (nb_stream_maps > 0) ?
1694 ist_table[file_table[stream_maps[n-1].sync_file_index].ist_index +
1695 stream_maps[n-1].sync_stream_index] : ist;
1699 /* for each output stream, we compute the right encoding parameters */
1700 for(i=0;i<nb_ostreams;i++) {
1702 os = output_files[ost->file_index];
1703 ist = ist_table[ost->source_index];
1705 codec = ost->st->codec;
1706 icodec = ist->st->codec;
1708 if (!ost->st->language[0])
1709 av_strlcpy(ost->st->language, ist->st->language,
1710 sizeof(ost->st->language));
1712 ost->st->disposition = ist->st->disposition;
1714 if (ost->st->stream_copy) {
1715 /* if stream_copy is selected, no need to decode or encode */
1716 codec->codec_id = icodec->codec_id;
1717 codec->codec_type = icodec->codec_type;
1719 if(!codec->codec_tag){
1720 if( !os->oformat->codec_tag
1721 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) > 0
1722 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1723 codec->codec_tag = icodec->codec_tag;
1726 codec->bit_rate = icodec->bit_rate;
1727 codec->extradata= icodec->extradata;
1728 codec->extradata_size= icodec->extradata_size;
1729 if(av_q2d(icodec->time_base) > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000)
1730 codec->time_base = icodec->time_base;
1732 codec->time_base = ist->st->time_base;
1733 switch(codec->codec_type) {
1734 case CODEC_TYPE_AUDIO:
1735 if(audio_volume != 256) {
1736 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1739 codec->sample_rate = icodec->sample_rate;
1740 codec->channels = icodec->channels;
1741 codec->frame_size = icodec->frame_size;
1742 codec->block_align= icodec->block_align;
1743 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1744 codec->block_align= 0;
1745 if(codec->codec_id == CODEC_ID_AC3)
1746 codec->block_align= 0;
1748 case CODEC_TYPE_VIDEO:
1750 fprintf(stderr,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");
1753 codec->pix_fmt = icodec->pix_fmt;
1754 codec->width = icodec->width;
1755 codec->height = icodec->height;
1756 codec->has_b_frames = icodec->has_b_frames;
1758 case CODEC_TYPE_SUBTITLE:
1764 switch(codec->codec_type) {
1765 case CODEC_TYPE_AUDIO:
1766 if (av_fifo_init(&ost->fifo, 1024))
1768 ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
1769 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1770 icodec->request_channels = codec->channels;
1771 ist->decoding_needed = 1;
1772 ost->encoding_needed = 1;
1774 case CODEC_TYPE_VIDEO:
1775 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1776 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1777 ost->video_resample = ((codec->width != icodec->width -
1778 (frame_leftBand + frame_rightBand) +
1779 (frame_padleft + frame_padright)) ||
1780 (codec->height != icodec->height -
1781 (frame_topBand + frame_bottomBand) +
1782 (frame_padtop + frame_padbottom)) ||
1783 (codec->pix_fmt != icodec->pix_fmt));
1784 if (ost->video_crop) {
1785 ost->topBand = frame_topBand;
1786 ost->leftBand = frame_leftBand;
1788 if (ost->video_pad) {
1789 ost->padtop = frame_padtop;
1790 ost->padleft = frame_padleft;
1791 ost->padbottom = frame_padbottom;
1792 ost->padright = frame_padright;
1793 if (!ost->video_resample) {
1794 avcodec_get_frame_defaults(&ost->pict_tmp);
1795 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1796 codec->width, codec->height))
1800 if (ost->video_resample) {
1801 avcodec_get_frame_defaults(&ost->pict_tmp);
1802 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1803 codec->width, codec->height)) {
1804 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1807 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1808 ost->img_resample_ctx = sws_getContext(
1809 icodec->width - (frame_leftBand + frame_rightBand),
1810 icodec->height - (frame_topBand + frame_bottomBand),
1812 codec->width - (frame_padleft + frame_padright),
1813 codec->height - (frame_padtop + frame_padbottom),
1815 sws_flags, NULL, NULL, NULL);
1816 if (ost->img_resample_ctx == NULL) {
1817 fprintf(stderr, "Cannot get resampling context\n");
1820 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1822 ost->encoding_needed = 1;
1823 ist->decoding_needed = 1;
1825 case CODEC_TYPE_SUBTITLE:
1826 ost->encoding_needed = 1;
1827 ist->decoding_needed = 1;
1834 if (ost->encoding_needed &&
1835 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1836 char logfilename[1024];
1841 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1843 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1844 if (codec->flags & CODEC_FLAG_PASS1) {
1845 f = fopen(logfilename, "w");
1847 perror(logfilename);
1852 /* read the log file */
1853 f = fopen(logfilename, "r");
1855 perror(logfilename);
1858 fseek(f, 0, SEEK_END);
1860 fseek(f, 0, SEEK_SET);
1861 logbuffer = av_malloc(size + 1);
1863 fprintf(stderr, "Could not allocate log buffer\n");
1866 size = fread(logbuffer, 1, size, f);
1868 logbuffer[size] = '\0';
1869 codec->stats_in = logbuffer;
1873 if(codec->codec_type == CODEC_TYPE_VIDEO){
1874 int size= codec->width * codec->height;
1875 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1880 bit_buffer = av_malloc(bit_buffer_size);
1884 /* dump the file output parameters - cannot be done before in case
1886 for(i=0;i<nb_output_files;i++) {
1887 dump_format(output_files[i], i, output_files[i]->filename, 1);
1890 /* dump the stream mapping */
1892 fprintf(stderr, "Stream mapping:\n");
1893 for(i=0;i<nb_ostreams;i++) {
1895 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1896 ist_table[ost->source_index]->file_index,
1897 ist_table[ost->source_index]->index,
1900 if (ost->sync_ist != ist_table[ost->source_index])
1901 fprintf(stderr, " [sync #%d.%d]",
1902 ost->sync_ist->file_index,
1903 ost->sync_ist->index);
1904 fprintf(stderr, "\n");
1908 /* open each encoder */
1909 for(i=0;i<nb_ostreams;i++) {
1911 if (ost->encoding_needed) {
1913 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1915 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1916 ost->file_index, ost->index);
1919 if (avcodec_open(ost->st->codec, codec) < 0) {
1920 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1921 ost->file_index, ost->index);
1924 extra_size += ost->st->codec->extradata_size;
1928 /* open each decoder */
1929 for(i=0;i<nb_istreams;i++) {
1931 if (ist->decoding_needed) {
1933 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1935 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1936 ist->st->codec->codec_id, ist->file_index, ist->index);
1939 if (avcodec_open(ist->st->codec, codec) < 0) {
1940 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1941 ist->file_index, ist->index);
1944 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1945 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1950 for(i=0;i<nb_istreams;i++) {
1952 is = input_files[ist->file_index];
1954 ist->next_pts = AV_NOPTS_VALUE;
1958 /* set meta data information from input file if required */
1959 for (i=0;i<nb_meta_data_maps;i++) {
1960 AVFormatContext *out_file;
1961 AVFormatContext *in_file;
1963 int out_file_index = meta_data_maps[i].out_file;
1964 int in_file_index = meta_data_maps[i].in_file;
1965 if (out_file_index < 0 || out_file_index >= nb_output_files) {
1966 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1967 ret = AVERROR(EINVAL);
1970 if (in_file_index < 0 || in_file_index >= nb_input_files) {
1971 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1972 ret = AVERROR(EINVAL);
1976 out_file = output_files[out_file_index];
1977 in_file = input_files[in_file_index];
1979 strcpy(out_file->title, in_file->title);
1980 strcpy(out_file->author, in_file->author);
1981 strcpy(out_file->copyright, in_file->copyright);
1982 strcpy(out_file->comment, in_file->comment);
1983 strcpy(out_file->album, in_file->album);
1984 out_file->year = in_file->year;
1985 out_file->track = in_file->track;
1986 strcpy(out_file->genre, in_file->genre);
1989 /* open files and write file headers */
1990 for(i=0;i<nb_output_files;i++) {
1991 os = output_files[i];
1992 if (av_write_header(os) < 0) {
1993 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1994 ret = AVERROR(EINVAL);
1997 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2002 print_sdp(output_files, nb_output_files);
2005 if (!using_stdin && verbose >= 0) {
2006 fprintf(stderr, "Press [q] to stop encoding\n");
2007 url_set_interrupt_cb(decode_interrupt_cb);
2012 timer_start = av_gettime();
2014 for(; received_sigterm == 0;) {
2015 int file_index, ist_index;
2023 /* if 'q' pressed, exits */
2027 /* read_key() returns 0 on EOF */
2033 /* select the stream that we must read now by looking at the
2034 smallest output pts */
2036 for(i=0;i<nb_ostreams;i++) {
2039 os = output_files[ost->file_index];
2040 ist = ist_table[ost->source_index];
2041 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
2042 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
2044 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2045 ipts = (double)ist->pts;
2046 if (!file_table[ist->file_index].eof_reached){
2047 if(ipts < ipts_min) {
2049 if(input_sync ) file_index = ist->file_index;
2051 if(opts < opts_min) {
2053 if(!input_sync) file_index = ist->file_index;
2056 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2061 /* if none, if is finished */
2062 if (file_index < 0) {
2066 /* finish if recording time exhausted */
2067 if (opts_min >= (recording_time / 1000000.0))
2070 /* finish if limit size exhausted */
2071 if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
2074 /* read a frame from it and output it in the fifo */
2075 is = input_files[file_index];
2076 if (av_read_frame(is, &pkt) < 0) {
2077 file_table[file_index].eof_reached = 1;
2085 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2087 /* the following test is needed in case new streams appear
2088 dynamically in stream : we ignore them */
2089 if (pkt.stream_index >= file_table[file_index].nb_streams)
2090 goto discard_packet;
2091 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2092 ist = ist_table[ist_index];
2094 goto discard_packet;
2096 if (pkt.dts != AV_NOPTS_VALUE)
2097 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2098 if (pkt.pts != AV_NOPTS_VALUE)
2099 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2101 if(input_files_ts_scale[file_index][pkt.stream_index]){
2102 if(pkt.pts != AV_NOPTS_VALUE)
2103 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2104 if(pkt.dts != AV_NOPTS_VALUE)
2105 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2108 // 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);
2109 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
2110 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2111 int64_t delta= pkt_dts - ist->next_pts;
2112 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2113 input_files_ts_offset[ist->file_index]-= delta;
2115 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2116 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2117 if(pkt.pts != AV_NOPTS_VALUE)
2118 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2122 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2123 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2126 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2127 ist->file_index, ist->index);
2129 av_free_packet(&pkt);
2134 av_free_packet(&pkt);
2136 /* dump report by using the output first video and audio streams */
2137 print_report(output_files, ost_table, nb_ostreams, 0);
2140 /* at the end of stream, we must flush the decoder buffers */
2141 for(i=0;i<nb_istreams;i++) {
2143 if (ist->decoding_needed) {
2144 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2150 /* write the trailer if needed and close file */
2151 for(i=0;i<nb_output_files;i++) {
2152 os = output_files[i];
2153 av_write_trailer(os);
2156 /* dump report by using the first video and audio streams */
2157 print_report(output_files, ost_table, nb_ostreams, 1);
2159 /* close each encoder */
2160 for(i=0;i<nb_ostreams;i++) {
2162 if (ost->encoding_needed) {
2163 av_freep(&ost->st->codec->stats_in);
2164 avcodec_close(ost->st->codec);
2168 /* close each decoder */
2169 for(i=0;i<nb_istreams;i++) {
2171 if (ist->decoding_needed) {
2172 avcodec_close(ist->st->codec);
2180 av_freep(&bit_buffer);
2181 av_free(file_table);
2184 for(i=0;i<nb_istreams;i++) {
2191 for(i=0;i<nb_ostreams;i++) {
2195 fclose(ost->logfile);
2196 ost->logfile = NULL;
2198 av_fifo_free(&ost->fifo); /* works even if fifo is not
2199 initialized but set to zero */
2200 av_free(ost->pict_tmp.data[0]);
2201 if (ost->video_resample)
2202 sws_freeContext(ost->img_resample_ctx);
2204 audio_resample_close(ost->resample);
2205 if (ost->reformat_ctx)
2206 av_audio_convert_free(ost->reformat_ctx);
2214 ret = AVERROR(ENOMEM);
2219 int file_read(const char *filename)
2222 unsigned char buffer[1024];
2225 if (url_open(&h, filename, O_RDONLY) < 0) {
2226 printf("could not open '%s'\n", filename);
2230 len = url_read(h, buffer, sizeof(buffer));
2233 for(i=0;i<len;i++) putchar(buffer[i]);
2240 static void opt_format(const char *arg)
2242 /* compatibility stuff for pgmyuv */
2243 if (!strcmp(arg, "pgmyuv")) {
2244 pgmyuv_compatibility_hack=1;
2245 // opt_image_format(arg);
2247 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2250 file_iformat = av_find_input_format(arg);
2251 file_oformat = guess_format(arg, NULL, NULL);
2252 if (!file_iformat && !file_oformat) {
2253 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2258 static int opt_default(const char *opt, const char *arg){
2260 const AVOption *o= NULL;
2261 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
2263 for(type=0; type<CODEC_TYPE_NB; type++){
2264 const AVOption *o2 = av_find_opt(avctx_opts[0], opt, NULL, opt_types[type], opt_types[type]);
2266 o = av_set_string2(avctx_opts[type], opt, arg, 1);
2269 o = av_set_string2(avformat_opts, opt, arg, 1);
2271 o = av_set_string2(sws_opts, opt, arg, 1);
2274 o = av_set_string2(avctx_opts[CODEC_TYPE_AUDIO], opt+1, arg, 1);
2275 else if(opt[0] == 'v')
2276 o = av_set_string2(avctx_opts[CODEC_TYPE_VIDEO], opt+1, arg, 1);
2277 else if(opt[0] == 's')
2278 o = av_set_string2(avctx_opts[CODEC_TYPE_SUBTITLE], opt+1, arg, 1);
2283 // 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));
2285 //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
2286 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
2287 opt_names[opt_name_count++]= o->name;
2289 if(avctx_opts[0]->debug || avformat_opts->debug)
2290 av_log_set_level(AV_LOG_DEBUG);
2294 static void opt_video_rc_override_string(const char *arg)
2296 video_rc_override_string = arg;
2299 static int opt_me_threshold(const char *opt, const char *arg)
2301 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2305 static int opt_verbose(const char *opt, const char *arg)
2307 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2308 av_log_set_level(verbose);
2312 static void opt_frame_rate(const char *arg)
2314 if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2315 fprintf(stderr, "Incorrect frame rate\n");
2320 static int opt_bitrate(const char *opt, const char *arg)
2322 int codec_type = opt[0]=='a' ? CODEC_TYPE_AUDIO : CODEC_TYPE_VIDEO;
2324 opt_default(opt, arg);
2326 if (av_get_int(avctx_opts[codec_type], "b", NULL) < 1000)
2327 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2332 static void opt_frame_crop_top(const char *arg)
2334 frame_topBand = atoi(arg);
2335 if (frame_topBand < 0) {
2336 fprintf(stderr, "Incorrect top crop size\n");
2339 if ((frame_topBand % 2) != 0) {
2340 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2343 if ((frame_topBand) >= frame_height){
2344 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2347 frame_height -= frame_topBand;
2350 static void opt_frame_crop_bottom(const char *arg)
2352 frame_bottomBand = atoi(arg);
2353 if (frame_bottomBand < 0) {
2354 fprintf(stderr, "Incorrect bottom crop size\n");
2357 if ((frame_bottomBand % 2) != 0) {
2358 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2361 if ((frame_bottomBand) >= frame_height){
2362 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2365 frame_height -= frame_bottomBand;
2368 static void opt_frame_crop_left(const char *arg)
2370 frame_leftBand = atoi(arg);
2371 if (frame_leftBand < 0) {
2372 fprintf(stderr, "Incorrect left crop size\n");
2375 if ((frame_leftBand % 2) != 0) {
2376 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2379 if ((frame_leftBand) >= frame_width){
2380 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2383 frame_width -= frame_leftBand;
2386 static void opt_frame_crop_right(const char *arg)
2388 frame_rightBand = atoi(arg);
2389 if (frame_rightBand < 0) {
2390 fprintf(stderr, "Incorrect right crop size\n");
2393 if ((frame_rightBand % 2) != 0) {
2394 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2397 if ((frame_rightBand) >= frame_width){
2398 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2401 frame_width -= frame_rightBand;
2404 static void opt_frame_size(const char *arg)
2406 if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
2407 fprintf(stderr, "Incorrect frame size\n");
2410 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2411 fprintf(stderr, "Frame size must be a multiple of 2\n");
2417 #define SCALEBITS 10
2418 #define ONE_HALF (1 << (SCALEBITS - 1))
2419 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2421 #define RGB_TO_Y(r, g, b) \
2422 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2423 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2425 #define RGB_TO_U(r1, g1, b1, shift)\
2426 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2427 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2429 #define RGB_TO_V(r1, g1, b1, shift)\
2430 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2431 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2433 static void opt_pad_color(const char *arg) {
2434 /* Input is expected to be six hex digits similar to
2435 how colors are expressed in html tags (but without the #) */
2436 int rgb = strtol(arg, NULL, 16);
2440 g = ((rgb >> 8) & 255);
2443 padcolor[0] = RGB_TO_Y(r,g,b);
2444 padcolor[1] = RGB_TO_U(r,g,b,0);
2445 padcolor[2] = RGB_TO_V(r,g,b,0);
2448 static void opt_frame_pad_top(const char *arg)
2450 frame_padtop = atoi(arg);
2451 if (frame_padtop < 0) {
2452 fprintf(stderr, "Incorrect top pad size\n");
2455 if ((frame_padtop % 2) != 0) {
2456 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2461 static void opt_frame_pad_bottom(const char *arg)
2463 frame_padbottom = atoi(arg);
2464 if (frame_padbottom < 0) {
2465 fprintf(stderr, "Incorrect bottom pad size\n");
2468 if ((frame_padbottom % 2) != 0) {
2469 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2475 static void opt_frame_pad_left(const char *arg)
2477 frame_padleft = atoi(arg);
2478 if (frame_padleft < 0) {
2479 fprintf(stderr, "Incorrect left pad size\n");
2482 if ((frame_padleft % 2) != 0) {
2483 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2489 static void opt_frame_pad_right(const char *arg)
2491 frame_padright = atoi(arg);
2492 if (frame_padright < 0) {
2493 fprintf(stderr, "Incorrect right pad size\n");
2496 if ((frame_padright % 2) != 0) {
2497 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2502 static void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts)
2506 for (i=-1; i < nb_fmts; i++) {
2507 get_fmt_string (fmt_str, sizeof(fmt_str), i);
2508 fprintf(stdout, "%s\n", fmt_str);
2512 static void opt_frame_pix_fmt(const char *arg)
2514 if (strcmp(arg, "list"))
2515 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2517 list_fmts(avcodec_pix_fmt_string, PIX_FMT_NB);
2522 static void opt_frame_aspect_ratio(const char *arg)
2529 p = strchr(arg, ':');
2531 x = strtol(arg, &end, 10);
2533 y = strtol(end+1, &end, 10);
2535 ar = (double)x / (double)y;
2537 ar = strtod(arg, NULL);
2540 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2543 frame_aspect_ratio = ar;
2546 static void opt_qscale(const char *arg)
2548 video_qscale = atof(arg);
2549 if (video_qscale <= 0 ||
2550 video_qscale > 255) {
2551 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2556 static void opt_top_field_first(const char *arg)
2558 top_field_first= atoi(arg);
2561 static int opt_thread_count(const char *opt, const char *arg)
2563 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2564 #if !defined(HAVE_THREADS)
2566 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2571 static void opt_audio_sample_fmt(const char *arg)
2573 if (strcmp(arg, "list"))
2574 audio_sample_fmt = avcodec_get_sample_fmt(arg);
2576 list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
2581 static int opt_audio_rate(const char *opt, const char *arg)
2583 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2587 static int opt_audio_channels(const char *opt, const char *arg)
2589 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2593 static void opt_video_channel(const char *arg)
2595 video_channel = strtol(arg, NULL, 0);
2598 static void opt_video_standard(const char *arg)
2600 video_standard = av_strdup(arg);
2603 static void opt_codec(int *pstream_copy, char **pcodec_name,
2604 int codec_type, const char *arg)
2606 av_freep(pcodec_name);
2607 if (!strcmp(arg, "copy")) {
2610 *pcodec_name = av_strdup(arg);
2614 static void opt_audio_codec(const char *arg)
2616 opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg);
2619 static void opt_audio_tag(const char *arg)
2622 audio_codec_tag= strtol(arg, &tail, 0);
2625 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2628 static void opt_video_tag(const char *arg)
2631 video_codec_tag= strtol(arg, &tail, 0);
2634 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2638 static void add_frame_hooker(const char *arg)
2643 char *args = av_strdup(arg);
2647 argv[0] = strtok(args, " ");
2648 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2651 i = frame_hook_add(argc, argv);
2654 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2660 static void opt_video_codec(const char *arg)
2662 opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg);
2665 static void opt_subtitle_codec(const char *arg)
2667 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
2670 static void opt_map(const char *arg)
2675 m = &stream_maps[nb_stream_maps++];
2677 m->file_index = strtol(arg, &p, 0);
2681 m->stream_index = strtol(p, &p, 0);
2684 m->sync_file_index = strtol(p, &p, 0);
2687 m->sync_stream_index = strtol(p, &p, 0);
2689 m->sync_file_index = m->file_index;
2690 m->sync_stream_index = m->stream_index;
2694 static void opt_map_meta_data(const char *arg)
2699 m = &meta_data_maps[nb_meta_data_maps++];
2701 m->out_file = strtol(arg, &p, 0);
2705 m->in_file = strtol(p, &p, 0);
2708 static void opt_input_ts_scale(const char *arg)
2710 unsigned int stream;
2714 stream = strtol(arg, &p, 0);
2717 scale= strtod(p, &p);
2719 if(stream >= MAX_STREAMS)
2722 input_files_ts_scale[nb_input_files][stream]= scale;
2725 static int opt_recording_time(const char *opt, const char *arg)
2727 recording_time = parse_time_or_die(opt, arg, 1);
2731 static int opt_start_time(const char *opt, const char *arg)
2733 start_time = parse_time_or_die(opt, arg, 1);
2737 static int opt_rec_timestamp(const char *opt, const char *arg)
2739 rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
2743 static int opt_input_ts_offset(const char *opt, const char *arg)
2745 input_ts_offset = parse_time_or_die(opt, arg, 1);
2749 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
2751 const char *codec_string = encoder ? "encoder" : "decoder";
2755 return CODEC_ID_NONE;
2757 avcodec_find_encoder_by_name(name) :
2758 avcodec_find_decoder_by_name(name);
2760 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2763 if(codec->type != type) {
2764 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2770 static void set_context_opts(void *ctx, void *opts_ctx, int flags)
2773 for(i=0; i<opt_name_count; i++){
2775 const AVOption *opt;
2776 const char *str= av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
2777 /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
2778 if(str && ((opt->flags & flags) == flags))
2779 av_set_string2(ctx, opt_names[i], str, 1);
2783 static void opt_input_file(const char *filename)
2785 AVFormatContext *ic;
2786 AVFormatParameters params, *ap = ¶ms;
2787 int err, i, ret, rfps, rfps_base;
2790 if (!strcmp(filename, "-"))
2793 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2794 !strcmp(filename, "/dev/stdin");
2796 /* get default parameters from command line */
2797 ic = av_alloc_format_context();
2799 memset(ap, 0, sizeof(*ap));
2800 ap->prealloced_context = 1;
2801 ap->sample_rate = audio_sample_rate;
2802 ap->channels = audio_channels;
2803 ap->time_base.den = frame_rate.num;
2804 ap->time_base.num = frame_rate.den;
2805 ap->width = frame_width + frame_padleft + frame_padright;
2806 ap->height = frame_height + frame_padtop + frame_padbottom;
2807 ap->pix_fmt = frame_pix_fmt;
2808 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
2809 ap->channel = video_channel;
2810 ap->standard = video_standard;
2811 ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0);
2812 ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0);
2813 if(pgmyuv_compatibility_hack)
2814 ap->video_codec_id= CODEC_ID_PGMYUV;
2816 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
2818 ic->video_codec_id = find_codec_or_die(video_codec_name , CODEC_TYPE_VIDEO , 0);
2819 ic->audio_codec_id = find_codec_or_die(audio_codec_name , CODEC_TYPE_AUDIO , 0);
2820 ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 0);
2822 /* open the input file with generic libav function */
2823 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2825 print_error(filename, err);
2830 for(i=0; i<ic->nb_programs; i++)
2831 if(ic->programs[i]->id != opt_programid)
2832 ic->programs[i]->discard = AVDISCARD_ALL;
2835 ic->loop_input = loop_input;
2837 /* If not enough info to get the stream parameters, we decode the
2838 first frames to get it. (used in mpeg case for example) */
2839 ret = av_find_stream_info(ic);
2840 if (ret < 0 && verbose >= 0) {
2841 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2845 timestamp = start_time;
2846 /* add the stream start time */
2847 if (ic->start_time != AV_NOPTS_VALUE)
2848 timestamp += ic->start_time;
2850 /* if seeking requested, we execute it */
2851 if (start_time != 0) {
2852 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2854 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2855 filename, (double)timestamp / AV_TIME_BASE);
2857 /* reset seek info */
2861 /* update the current parameters so that they match the one of the input stream */
2862 for(i=0;i<ic->nb_streams;i++) {
2863 AVCodecContext *enc = ic->streams[i]->codec;
2865 avcodec_thread_init(enc, thread_count);
2866 enc->thread_count= thread_count;
2867 switch(enc->codec_type) {
2868 case CODEC_TYPE_AUDIO:
2869 set_context_opts(enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2870 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2871 audio_channels = enc->channels;
2872 audio_sample_rate = enc->sample_rate;
2873 audio_sample_fmt = enc->sample_fmt;
2875 ic->streams[i]->discard= AVDISCARD_ALL;
2877 case CODEC_TYPE_VIDEO:
2878 set_context_opts(enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2879 frame_height = enc->height;
2880 frame_width = enc->width;
2881 frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
2882 frame_pix_fmt = enc->pix_fmt;
2883 rfps = ic->streams[i]->r_frame_rate.num;
2884 rfps_base = ic->streams[i]->r_frame_rate.den;
2885 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2887 enc->debug |= FF_DEBUG_MV;
2889 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2892 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2893 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2895 (float)rfps / rfps_base, rfps, rfps_base);
2897 /* update the current frame rate to match the stream frame rate */
2898 frame_rate.num = rfps;
2899 frame_rate.den = rfps_base;
2901 enc->rate_emu = rate_emu;
2903 ic->streams[i]->discard= AVDISCARD_ALL;
2904 else if(video_discard)
2905 ic->streams[i]->discard= video_discard;
2907 case CODEC_TYPE_DATA:
2909 case CODEC_TYPE_SUBTITLE:
2910 if(subtitle_disable)
2911 ic->streams[i]->discard = AVDISCARD_ALL;
2913 case CODEC_TYPE_ATTACHMENT:
2914 case CODEC_TYPE_UNKNOWN:
2921 input_files[nb_input_files] = ic;
2922 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2923 /* dump the file content */
2925 dump_format(ic, nb_input_files, filename, 0);
2928 file_iformat = NULL;
2929 file_oformat = NULL;
2934 av_freep(&video_codec_name);
2935 av_freep(&audio_codec_name);
2936 av_freep(&subtitle_codec_name);
2939 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
2940 int *has_subtitle_ptr)
2942 int has_video, has_audio, has_subtitle, i, j;
2943 AVFormatContext *ic;
2948 for(j=0;j<nb_input_files;j++) {
2949 ic = input_files[j];
2950 for(i=0;i<ic->nb_streams;i++) {
2951 AVCodecContext *enc = ic->streams[i]->codec;
2952 switch(enc->codec_type) {
2953 case CODEC_TYPE_AUDIO:
2956 case CODEC_TYPE_VIDEO:
2959 case CODEC_TYPE_SUBTITLE:
2962 case CODEC_TYPE_DATA:
2963 case CODEC_TYPE_ATTACHMENT:
2964 case CODEC_TYPE_UNKNOWN:
2971 *has_video_ptr = has_video;
2972 *has_audio_ptr = has_audio;
2973 *has_subtitle_ptr = has_subtitle;
2976 static void new_video_stream(AVFormatContext *oc)
2979 AVCodecContext *video_enc;
2982 st = av_new_stream(oc, oc->nb_streams);
2984 fprintf(stderr, "Could not alloc stream\n");
2987 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
2988 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
2989 video_bitstream_filters= NULL;
2992 avcodec_thread_init(st->codec, thread_count);
2994 video_enc = st->codec;
2997 video_enc->codec_tag= video_codec_tag;
2999 if( (video_global_header&1)
3000 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3001 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3002 avctx_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3004 if(video_global_header&2){
3005 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3006 avctx_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3009 if (video_stream_copy) {
3010 st->stream_copy = 1;
3011 video_enc->codec_type = CODEC_TYPE_VIDEO;
3016 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3018 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
3019 if (video_codec_name)
3020 codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
3022 video_enc->codec_id = codec_id;
3023 codec = avcodec_find_encoder(codec_id);
3025 set_context_opts(video_enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3027 video_enc->time_base.den = fps.num;
3028 video_enc->time_base.num = fps.den;
3029 if(codec && codec->supported_framerates){
3030 const AVRational *p= codec->supported_framerates;
3031 const AVRational *best=NULL;
3032 AVRational best_error= (AVRational){INT_MAX, 1};
3033 for(; p->den!=0; p++){
3034 AVRational error= av_sub_q(fps, *p);
3035 if(error.num <0) error.num *= -1;
3036 if(av_cmp_q(error, best_error) < 0){
3041 video_enc->time_base.den= best->num;
3042 video_enc->time_base.num= best->den;
3045 video_enc->width = frame_width + frame_padright + frame_padleft;
3046 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3047 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3048 video_enc->pix_fmt = frame_pix_fmt;
3050 if(codec && codec->pix_fmts){
3051 const enum PixelFormat *p= codec->pix_fmts;
3053 if(*p == video_enc->pix_fmt)
3057 video_enc->pix_fmt = codec->pix_fmts[0];
3061 video_enc->gop_size = 0;
3062 if (video_qscale || same_quality) {
3063 video_enc->flags |= CODEC_FLAG_QSCALE;
3064 video_enc->global_quality=
3065 st->quality = FF_QP2LAMBDA * video_qscale;
3069 video_enc->intra_matrix = intra_matrix;
3071 video_enc->inter_matrix = inter_matrix;
3073 video_enc->thread_count = thread_count;
3074 p= video_rc_override_string;
3077 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3079 fprintf(stderr, "error parsing rc_override\n");
3082 video_enc->rc_override=
3083 av_realloc(video_enc->rc_override,
3084 sizeof(RcOverride)*(i+1));
3085 video_enc->rc_override[i].start_frame= start;
3086 video_enc->rc_override[i].end_frame = end;
3088 video_enc->rc_override[i].qscale= q;
3089 video_enc->rc_override[i].quality_factor= 1.0;
3092 video_enc->rc_override[i].qscale= 0;
3093 video_enc->rc_override[i].quality_factor= -q/100.0;
3098 video_enc->rc_override_count=i;
3099 if (!video_enc->rc_initial_buffer_occupancy)
3100 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3101 video_enc->me_threshold= me_threshold;
3102 video_enc->intra_dc_precision= intra_dc_precision - 8;
3105 video_enc->flags|= CODEC_FLAG_PSNR;
3110 video_enc->flags |= CODEC_FLAG_PASS1;
3112 video_enc->flags |= CODEC_FLAG_PASS2;
3117 /* reset some key parameters */
3119 av_freep(&video_codec_name);
3120 video_stream_copy = 0;
3123 static void new_audio_stream(AVFormatContext *oc)
3126 AVCodecContext *audio_enc;
3129 st = av_new_stream(oc, oc->nb_streams);
3131 fprintf(stderr, "Could not alloc stream\n");
3134 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
3136 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
3137 audio_bitstream_filters= NULL;
3140 avcodec_thread_init(st->codec, thread_count);
3142 audio_enc = st->codec;
3143 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3146 audio_enc->codec_tag= audio_codec_tag;
3148 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3149 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3150 avctx_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3152 if (audio_stream_copy) {
3153 st->stream_copy = 1;
3154 audio_enc->channels = audio_channels;
3157 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3159 set_context_opts(audio_enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3161 if (audio_codec_name)
3162 codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
3163 audio_enc->codec_id = codec_id;
3164 codec = avcodec_find_encoder(codec_id);
3166 if (audio_qscale > QSCALE_NONE) {
3167 audio_enc->flags |= CODEC_FLAG_QSCALE;
3168 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3170 audio_enc->thread_count = thread_count;
3171 audio_enc->channels = audio_channels;
3172 audio_enc->sample_fmt = audio_sample_fmt;
3174 if(codec && codec->sample_fmts){
3175 const enum SampleFormat *p= codec->sample_fmts;
3177 if(*p == audio_enc->sample_fmt)
3181 audio_enc->sample_fmt = codec->sample_fmts[0];
3184 audio_enc->sample_rate = audio_sample_rate;
3185 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3186 if (audio_language) {
3187 av_strlcpy(st->language, audio_language, sizeof(st->language));
3188 av_free(audio_language);
3189 audio_language = NULL;
3192 /* reset some key parameters */
3194 av_freep(&audio_codec_name);
3195 audio_stream_copy = 0;
3198 static void new_subtitle_stream(AVFormatContext *oc)
3201 AVCodecContext *subtitle_enc;
3203 st = av_new_stream(oc, oc->nb_streams);
3205 fprintf(stderr, "Could not alloc stream\n");
3208 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
3210 bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
3211 subtitle_bitstream_filters= NULL;
3213 subtitle_enc = st->codec;
3214 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3215 if (subtitle_stream_copy) {
3216 st->stream_copy = 1;
3218 set_context_opts(avctx_opts[CODEC_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3219 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1);
3222 if (subtitle_language) {
3223 av_strlcpy(st->language, subtitle_language, sizeof(st->language));
3224 av_free(subtitle_language);
3225 subtitle_language = NULL;
3228 subtitle_disable = 0;
3229 av_freep(&subtitle_codec_name);
3230 subtitle_stream_copy = 0;
3233 static void opt_new_audio_stream(void)
3235 AVFormatContext *oc;
3236 if (nb_output_files <= 0) {
3237 fprintf(stderr, "At least one output file must be specified\n");
3240 oc = output_files[nb_output_files - 1];
3241 new_audio_stream(oc);
3244 static void opt_new_video_stream(void)
3246 AVFormatContext *oc;
3247 if (nb_output_files <= 0) {
3248 fprintf(stderr, "At least one output file must be specified\n");
3251 oc = output_files[nb_output_files - 1];
3252 new_video_stream(oc);
3255 static void opt_new_subtitle_stream(void)
3257 AVFormatContext *oc;
3258 if (nb_output_files <= 0) {
3259 fprintf(stderr, "At least one output file must be specified\n");
3262 oc = output_files[nb_output_files - 1];
3263 new_subtitle_stream(oc);
3266 static void opt_output_file(const char *filename)
3268 AVFormatContext *oc;
3269 int use_video, use_audio, use_subtitle;
3270 int input_has_video, input_has_audio, input_has_subtitle;
3271 AVFormatParameters params, *ap = ¶ms;
3273 if (!strcmp(filename, "-"))
3276 oc = av_alloc_format_context();
3278 if (!file_oformat) {
3279 file_oformat = guess_format(NULL, filename, NULL);
3280 if (!file_oformat) {
3281 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3287 oc->oformat = file_oformat;
3288 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3290 if (!strcmp(file_oformat->name, "ffm") &&
3291 av_strstart(filename, "http:", NULL)) {
3292 /* special case for files sent to ffserver: we get the stream
3293 parameters from ffserver */
3294 int err = read_ffserver_streams(oc, filename);
3296 print_error(filename, err);
3300 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3301 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3302 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3304 /* disable if no corresponding type found and at least one
3306 if (nb_input_files > 0) {
3307 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3308 &input_has_subtitle);
3309 if (!input_has_video)
3311 if (!input_has_audio)
3313 if (!input_has_subtitle)
3317 /* manual disable */
3318 if (audio_disable) {
3321 if (video_disable) {
3324 if (subtitle_disable) {
3329 new_video_stream(oc);
3333 new_audio_stream(oc);
3337 new_subtitle_stream(oc);
3340 oc->timestamp = rec_timestamp;
3343 av_strlcpy(oc->title, str_title, sizeof(oc->title));
3345 av_strlcpy(oc->author, str_author, sizeof(oc->author));
3347 av_strlcpy(oc->copyright, str_copyright, sizeof(oc->copyright));
3349 av_strlcpy(oc->comment, str_comment, sizeof(oc->comment));
3351 av_strlcpy(oc->album, str_album, sizeof(oc->album));
3353 av_strlcpy(oc->genre, str_genre, sizeof(oc->genre));
3356 output_files[nb_output_files++] = oc;
3358 /* check filename in case of an image number is expected */
3359 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3360 if (!av_filename_number_test(oc->filename)) {
3361 print_error(oc->filename, AVERROR_NUMEXPECTED);
3366 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3367 /* test if it already exists to avoid loosing precious files */
3368 if (!file_overwrite &&
3369 (strchr(filename, ':') == NULL ||
3370 filename[1] == ':' ||
3371 av_strstart(filename, "file:", NULL))) {
3372 if (url_exist(filename)) {
3376 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3379 if (toupper(c) != 'Y') {
3380 fprintf(stderr, "Not overwriting - exiting\n");
3385 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3392 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3393 fprintf(stderr, "Could not open '%s'\n", filename);
3398 memset(ap, 0, sizeof(*ap));
3399 if (av_set_parameters(oc, ap) < 0) {
3400 fprintf(stderr, "%s: Invalid encoding parameters\n",
3405 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3406 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3407 oc->loop_output = loop_output;
3409 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
3411 /* reset some options */
3412 file_oformat = NULL;
3413 file_iformat = NULL;
3416 /* same option as mencoder */
3417 static void opt_pass(const char *pass_str)
3420 pass = atoi(pass_str);
3421 if (pass != 1 && pass != 2) {
3422 fprintf(stderr, "pass number can be only 1 or 2\n");
3428 static int64_t getutime(void)
3430 #ifdef HAVE_GETRUSAGE
3431 struct rusage rusage;
3433 getrusage(RUSAGE_SELF, &rusage);
3434 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3435 #elif defined(HAVE_GETPROCESSTIMES)
3437 FILETIME c, e, k, u;
3438 proc = GetCurrentProcess();
3439 GetProcessTimes(proc, &c, &e, &k, &u);
3440 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3442 return av_gettime();
3446 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3449 const char *p = str;
3456 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3463 static void opt_inter_matrix(const char *arg)
3465 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3466 parse_matrix_coeffs(inter_matrix, arg);
3469 static void opt_intra_matrix(const char *arg)
3471 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3472 parse_matrix_coeffs(intra_matrix, arg);
3476 * Trivial log callback.
3477 * Only suitable for show_help and similar since it lacks prefix handling.
3479 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
3481 vfprintf(stdout, fmt, vl);
3484 static void show_help(void)
3486 av_log_set_callback(log_callback_help);
3487 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3488 "Hyper fast Audio and Video encoder\n");
3490 show_help_options(options, "Main options:\n",
3491 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3492 show_help_options(options, "\nAdvanced options:\n",
3493 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3495 show_help_options(options, "\nVideo options:\n",
3496 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3498 show_help_options(options, "\nAdvanced Video options:\n",
3499 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3500 OPT_VIDEO | OPT_EXPERT);
3501 show_help_options(options, "\nAudio options:\n",
3502 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3504 show_help_options(options, "\nAdvanced Audio options:\n",
3505 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3506 OPT_AUDIO | OPT_EXPERT);
3507 show_help_options(options, "\nSubtitle options:\n",
3508 OPT_SUBTITLE | OPT_GRAB,
3510 show_help_options(options, "\nAudio/Video grab options:\n",
3514 av_opt_show(avctx_opts[0], NULL);
3516 av_opt_show(avformat_opts, NULL);
3518 av_opt_show(sws_opts, NULL);
3521 static void opt_target(const char *arg)
3524 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3526 if(!strncmp(arg, "pal-", 4)) {
3529 } else if(!strncmp(arg, "ntsc-", 5)) {
3532 } else if(!strncmp(arg, "film-", 5)) {
3537 /* Calculate FR via float to avoid int overflow */
3538 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3541 } else if((fr == 29970) || (fr == 23976)) {
3544 /* Try to determine PAL/NTSC by peeking in the input files */
3545 if(nb_input_files) {
3547 for(j = 0; j < nb_input_files; j++) {
3548 for(i = 0; i < input_files[j]->nb_streams; i++) {
3549 AVCodecContext *c = input_files[j]->streams[i]->codec;
3550 if(c->codec_type != CODEC_TYPE_VIDEO)
3552 fr = c->time_base.den * 1000 / c->time_base.num;
3556 } else if((fr == 29970) || (fr == 23976)) {
3566 if(verbose && norm >= 0)
3567 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3571 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3572 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3573 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3577 if(!strcmp(arg, "vcd")) {
3579 opt_video_codec("mpeg1video");
3580 opt_audio_codec("mp2");
3583 opt_frame_size(norm ? "352x240" : "352x288");
3584 opt_frame_rate(frame_rates[norm]);
3585 opt_default("gop", norm ? "18" : "15");
3587 opt_default("b", "1150000");
3588 opt_default("maxrate", "1150000");
3589 opt_default("minrate", "1150000");
3590 opt_default("bufsize", "327680"); // 40*1024*8;
3592 opt_default("ab", "224000");
3593 audio_sample_rate = 44100;
3596 opt_default("packetsize", "2324");
3597 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3599 /* We have to offset the PTS, so that it is consistent with the SCR.
3600 SCR starts at 36000, but the first two packs contain only padding
3601 and the first pack from the other stream, respectively, may also have
3602 been written before.
3603 So the real data starts at SCR 36000+3*1200. */
3604 mux_preload= (36000+3*1200) / 90000.0; //0.44
3605 } else if(!strcmp(arg, "svcd")) {
3607 opt_video_codec("mpeg2video");
3608 opt_audio_codec("mp2");
3611 opt_frame_size(norm ? "480x480" : "480x576");
3612 opt_frame_rate(frame_rates[norm]);
3613 opt_default("gop", norm ? "18" : "15");
3615 opt_default("b", "2040000");
3616 opt_default("maxrate", "2516000");
3617 opt_default("minrate", "0"); //1145000;
3618 opt_default("bufsize", "1835008"); //224*1024*8;
3619 opt_default("flags", "+SCAN_OFFSET");
3622 opt_default("ab", "224000");
3623 audio_sample_rate = 44100;
3625 opt_default("packetsize", "2324");
3627 } else if(!strcmp(arg, "dvd")) {
3629 opt_video_codec("mpeg2video");
3630 opt_audio_codec("ac3");
3633 opt_frame_size(norm ? "720x480" : "720x576");
3634 opt_frame_rate(frame_rates[norm]);
3635 opt_default("gop", norm ? "18" : "15");
3637 opt_default("b", "6000000");
3638 opt_default("maxrate", "9000000");
3639 opt_default("minrate", "0"); //1500000;
3640 opt_default("bufsize", "1835008"); //224*1024*8;
3642 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3643 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3645 opt_default("ab", "448000");
3646 audio_sample_rate = 48000;
3648 } else if(!strncmp(arg, "dv", 2)) {
3652 opt_frame_size(norm ? "720x480" : "720x576");
3653 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3654 (norm ? "yuv411p" : "yuv420p"));
3655 opt_frame_rate(frame_rates[norm]);
3657 audio_sample_rate = 48000;
3661 fprintf(stderr, "Unknown target: %s\n", arg);
3666 static void opt_vstats_file (const char *arg)
3668 av_free (vstats_filename);
3669 vstats_filename=av_strdup (arg);
3672 static void opt_vstats (void)
3675 time_t today2 = time(NULL);
3676 struct tm *today = localtime(&today2);
3678 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3680 opt_vstats_file(filename);
3683 static int opt_bsf(const char *opt, const char *arg)
3685 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3686 AVBitStreamFilterContext **bsfp;
3689 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3693 bsfp= *opt == 'v' ? &video_bitstream_filters :
3694 *opt == 'a' ? &audio_bitstream_filters :
3695 &subtitle_bitstream_filters;
3697 bsfp= &(*bsfp)->next;
3704 static int opt_preset(const char *opt, const char *arg)
3707 char tmp[1000], tmp2[1000];
3709 const char *base[3]= { getenv("HOME"),
3714 for(i=!base[0]; i<3 && !f; i++){
3715 snprintf(tmp, sizeof(tmp), "%s/%sffmpeg/%s.ffpreset", base[i], i ? "" : ".", arg);
3718 char *codec_name= *opt == 'v' ? video_codec_name :
3719 *opt == 'a' ? audio_codec_name :
3720 subtitle_codec_name;
3721 snprintf(tmp, sizeof(tmp), "%s/%sffmpeg/%s-%s.ffpreset", base[i], i ? "" : ".", codec_name, arg);
3727 fprintf(stderr, "Preset file not found\n");
3732 int e= fscanf(f, "%999[^=]=%999[^\n]\n", tmp, tmp2);
3734 fprintf(stderr, "Preset file invalid\n");
3737 if(!strcmp(tmp, "acodec")){
3738 opt_audio_codec(tmp2);
3739 }else if(!strcmp(tmp, "vcodec")){
3740 opt_video_codec(tmp2);
3741 }else if(!strcmp(tmp, "scodec")){
3742 opt_subtitle_codec(tmp2);
3744 opt_default(tmp, tmp2);
3752 static const OptionDef options[] = {
3754 { "L", OPT_EXIT, {(void*)show_license}, "show license" },
3755 { "h", OPT_EXIT, {(void*)show_help}, "show help" },
3756 { "version", OPT_EXIT, {(void*)show_version}, "show version" },
3757 { "formats", OPT_EXIT, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3758 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3759 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3760 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3761 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3762 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3763 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3764 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3765 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3766 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3767 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
3768 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3769 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3770 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3771 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3772 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3773 { "genre", HAS_ARG | OPT_STRING, {(void*)&str_genre}, "set the genre", "string" },
3774 { "album", HAS_ARG | OPT_STRING, {(void*)&str_album}, "set the album", "string" },
3775 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3776 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3777 "add timings for benchmarking" },
3778 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3779 "dump each input packet" },
3780 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3781 "when dumping packets, also dump the payload" },
3782 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3783 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3784 { "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)", "" },
3785 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set the logging verbosity level", "number" },
3786 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3787 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3788 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3789 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3790 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3791 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3792 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3793 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3794 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3795 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3798 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3799 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3800 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3801 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3802 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3803 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3804 { "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" },
3805 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3806 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3807 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3808 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3809 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3810 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3811 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3812 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3813 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3814 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3815 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3816 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3817 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3818 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3819 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3820 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
3821 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3822 "use same video quality as source (implies VBR)" },
3823 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3824 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3825 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3826 "deinterlace pictures" },
3827 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3828 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
3829 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
3831 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3833 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3834 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3835 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3836 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3837 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3838 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3839 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3842 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3843 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3844 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3845 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3846 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3847 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3848 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3849 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3850 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3851 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3852 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3853 { "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" },
3855 /* subtitle options */
3856 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
3857 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3858 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
3859 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3862 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3863 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3864 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3867 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
3868 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
3870 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3871 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3872 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3874 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3875 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3876 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3878 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
3882 int main(int argc, char **argv)
3887 avcodec_register_all();
3888 avdevice_register_all();
3891 if(isatty(STDIN_FILENO))
3892 url_set_interrupt_cb(decode_interrupt_cb);
3894 for(i=0; i<CODEC_TYPE_NB; i++){
3895 avctx_opts[i]= avcodec_alloc_context2(i);
3897 avformat_opts = av_alloc_format_context();
3898 sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
3907 parse_options(argc, argv, options, opt_output_file);
3909 /* file converter / grab */
3910 if (nb_output_files <= 0) {
3911 fprintf(stderr, "Must supply at least one output file\n");
3915 if (nb_input_files == 0) {
3916 fprintf(stderr, "Must supply at least one input file\n");
3921 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3922 stream_maps, nb_stream_maps);
3923 ti = getutime() - ti;
3925 printf("bench: utime=%0.3fs\n", ti / 1000000.0);