3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 /* needed for usleep() */
23 #define _XOPEN_SOURCE 600
34 #include "libavformat/avformat.h"
35 #include "libavdevice/avdevice.h"
36 #include "libswscale/swscale.h"
37 #include "libavformat/framehook.h"
38 #include "libavcodec/opt.h"
39 #include "libavcodec/audioconvert.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/avstring.h"
42 #include "libavformat/os_support.h"
44 #ifdef HAVE_SYS_RESOURCE_H
45 #include <sys/types.h>
46 #include <sys/resource.h>
47 #elif defined(HAVE_GETPROCESSTIMES)
51 #ifdef HAVE_SYS_SELECT_H
52 #include <sys/select.h>
57 #include <sys/ioctl.h>
60 #elif defined(HAVE_CONIO_H)
63 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
73 const char program_name[] = "FFmpeg";
74 const int program_birth_year = 2000;
76 /* select an input stream for an output stream */
77 typedef struct AVStreamMap {
81 int sync_stream_index;
84 /** select an input file for an output file */
85 typedef struct AVMetaDataMap {
90 static const OptionDef options[];
94 static AVFormatContext *input_files[MAX_FILES];
95 static int64_t input_files_ts_offset[MAX_FILES];
96 static double input_files_ts_scale[MAX_FILES][MAX_STREAMS];
97 static int nb_input_files = 0;
99 static AVFormatContext *output_files[MAX_FILES];
100 static int nb_output_files = 0;
102 static AVStreamMap stream_maps[MAX_FILES*MAX_STREAMS];
103 static int nb_stream_maps;
105 static AVMetaDataMap meta_data_maps[MAX_FILES];
106 static int nb_meta_data_maps;
108 static AVInputFormat *file_iformat;
109 static AVOutputFormat *file_oformat;
110 static int frame_width = 0;
111 static int frame_height = 0;
112 static float frame_aspect_ratio = 0;
113 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
114 static enum SampleFormat audio_sample_fmt = SAMPLE_FMT_NONE;
115 static int frame_padtop = 0;
116 static int frame_padbottom = 0;
117 static int frame_padleft = 0;
118 static int frame_padright = 0;
119 static int padcolor[3] = {16,128,128}; /* default to black */
120 static int frame_topBand = 0;
121 static int frame_bottomBand = 0;
122 static int frame_leftBand = 0;
123 static int frame_rightBand = 0;
124 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
125 static AVRational frame_rate;
126 static float video_qscale = 0;
127 static uint16_t *intra_matrix = NULL;
128 static uint16_t *inter_matrix = NULL;
129 #if 0 //experimental, (can be removed)
130 static float video_rc_qsquish=1.0;
131 static float video_rc_qmod_amp=0;
132 static int video_rc_qmod_freq=0;
134 static const char *video_rc_override_string=NULL;
135 static int video_disable = 0;
136 static int video_discard = 0;
137 static char *video_codec_name = NULL;
138 static int video_codec_tag = 0;
139 static int same_quality = 0;
140 static int do_deinterlace = 0;
141 static int top_field_first = -1;
142 static int me_threshold = 0;
143 static int intra_dc_precision = 8;
144 static int loop_input = 0;
145 static int loop_output = AVFMT_NOOUTPUTLOOP;
146 static int qp_hist = 0;
148 static int intra_only = 0;
149 static int audio_sample_rate = 44100;
150 #define QSCALE_NONE -99999
151 static float audio_qscale = QSCALE_NONE;
152 static int audio_disable = 0;
153 static int audio_channels = 1;
154 static char *audio_codec_name = NULL;
155 static int audio_codec_tag = 0;
156 static char *audio_language = NULL;
158 static int subtitle_disable = 0;
159 static char *subtitle_codec_name = NULL;
160 static char *subtitle_language = NULL;
162 static float mux_preload= 0.5;
163 static float mux_max_delay= 0.7;
165 static int64_t recording_time = INT64_MAX;
166 static int64_t start_time = 0;
167 static int64_t rec_timestamp = 0;
168 static int64_t input_ts_offset = 0;
169 static int file_overwrite = 0;
170 static char *str_title = NULL;
171 static char *str_author = NULL;
172 static char *str_copyright = NULL;
173 static char *str_comment = NULL;
174 static char *str_genre = NULL;
175 static char *str_album = NULL;
176 static int do_benchmark = 0;
177 static int do_hex_dump = 0;
178 static int do_pkt_dump = 0;
179 static int do_psnr = 0;
180 static int do_pass = 0;
181 static char *pass_logfilename = NULL;
182 static int audio_stream_copy = 0;
183 static int video_stream_copy = 0;
184 static int subtitle_stream_copy = 0;
185 static int video_sync_method= -1;
186 static int audio_sync_method= 0;
187 static float audio_drift_threshold= 0.1;
188 static int copy_ts= 0;
189 static int opt_shortest = 0; //
190 static int video_global_header = 0;
191 static char *vstats_filename;
192 static FILE *vstats_file;
193 static int opt_programid = 0;
195 static int rate_emu = 0;
197 static int video_channel = 0;
198 static char *video_standard;
200 static int audio_volume = 256;
202 static int exit_on_error = 0;
203 static int using_stdin = 0;
204 static int using_vhook = 0;
205 static int verbose = 1;
206 static int thread_count= 1;
207 static int q_pressed = 0;
208 static int64_t video_size = 0;
209 static int64_t audio_size = 0;
210 static int64_t extra_size = 0;
211 static int nb_frames_dup = 0;
212 static int nb_frames_drop = 0;
213 static int input_sync;
214 static uint64_t limit_filesize = 0; //
215 static int force_fps = 0;
217 static int pgmyuv_compatibility_hack=0;
218 static float dts_delta_threshold = 10;
220 static unsigned int sws_flags = SWS_BICUBIC;
222 static int64_t timer_start;
224 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
225 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
226 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
227 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
229 #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
231 struct AVInputStream;
233 typedef struct AVOutputStream {
234 int file_index; /* file index */
235 int index; /* stream index in the output file */
236 int source_index; /* AVInputStream index */
237 AVStream *st; /* stream in the output file */
238 int encoding_needed; /* true if encoding needed for this stream */
240 /* input pts and corresponding output pts
242 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
243 struct AVInputStream *sync_ist; /* input stream to sync against */
244 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
247 AVFrame pict_tmp; /* temporary image for resampling */
248 struct SwsContext *img_resample_ctx; /* for image resampling */
252 int topBand; /* cropping area sizes */
256 int padtop; /* padding area sizes */
263 ReSampleContext *resample; /* for audio resampling */
265 AVAudioConvert *reformat_ctx;
266 AVFifoBuffer fifo; /* for compression: one audio fifo per codec */
270 typedef struct AVInputStream {
274 int discard; /* true if stream data should be discarded */
275 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
276 int64_t sample_index; /* current sample */
278 int64_t start; /* time when read started */
279 unsigned long frame; /* current frame */
280 int64_t next_pts; /* synthetic pts for cases where pkt.pts
282 int64_t pts; /* current pts */
283 int is_start; /* is 1 at the start and after a discontinuity */
286 typedef struct AVInputFile {
287 int eof_reached; /* true if eof reached */
288 int ist_index; /* index of first stream in ist_table */
289 int buffer_size; /* current total buffer size */
290 int nb_streams; /* nb streams we are aware of */
293 #ifdef HAVE_TERMIOS_H
295 /* init terminal so that we can grab keys */
296 static struct termios oldtty;
299 static void term_exit(void)
301 #ifdef HAVE_TERMIOS_H
302 tcsetattr (0, TCSANOW, &oldtty);
306 static volatile sig_atomic_t received_sigterm = 0;
309 sigterm_handler(int sig)
311 received_sigterm = sig;
315 static void term_init(void)
317 #ifdef HAVE_TERMIOS_H
323 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
324 |INLCR|IGNCR|ICRNL|IXON);
325 tty.c_oflag |= OPOST;
326 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
327 tty.c_cflag &= ~(CSIZE|PARENB);
332 tcsetattr (0, TCSANOW, &tty);
333 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
336 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
337 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
339 register a function to be called at normal program termination
342 #ifdef CONFIG_BEOS_NETSERVER
343 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
347 /* read a key without blocking */
348 static int read_key(void)
350 #if defined(HAVE_TERMIOS_H)
353 #ifndef CONFIG_BEOS_NETSERVER
361 n = select(1, &rfds, NULL, NULL, &tv);
370 #elif defined(HAVE_CONIO_H)
377 static int decode_interrupt_cb(void)
379 return q_pressed || (q_pressed = read_key() == 'q');
382 static int av_exit(int ret)
387 for(i=0;i<nb_output_files;i++) {
388 /* maybe av_close_output_file ??? */
389 AVFormatContext *s = output_files[i];
391 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
393 for(j=0;j<s->nb_streams;j++) {
394 av_free(s->streams[j]->codec);
395 av_free(s->streams[j]);
399 for(i=0;i<nb_input_files;i++)
400 av_close_input_file(input_files[i]);
402 av_free(intra_matrix);
403 av_free(inter_matrix);
407 av_free(vstats_filename);
411 av_free(video_codec_name);
412 av_free(audio_codec_name);
413 av_free(subtitle_codec_name);
415 av_free(video_standard);
417 #ifdef CONFIG_POWERPC_PERF
418 extern void powerpc_display_perf_report(void);
419 powerpc_display_perf_report();
420 #endif /* CONFIG_POWERPC_PERF */
422 if (received_sigterm) {
424 "Received signal %d: terminating.\n",
425 (int) received_sigterm);
429 exit(ret); /* not all OS-es handle main() return value */
433 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
439 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
442 /* copy stream format */
443 s->nb_streams = ic->nb_streams;
444 for(i=0;i<ic->nb_streams;i++) {
447 // FIXME: a more elegant solution is needed
448 st = av_mallocz(sizeof(AVStream));
449 memcpy(st, ic->streams[i], sizeof(AVStream));
450 st->codec = avcodec_alloc_context();
451 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
454 if (st->codec->codec_type == CODEC_TYPE_AUDIO && audio_stream_copy)
456 else if (st->codec->codec_type == CODEC_TYPE_VIDEO && video_stream_copy)
459 if(!st->codec->thread_count)
460 st->codec->thread_count = 1;
461 if(st->codec->thread_count>1)
462 avcodec_thread_init(st->codec, st->codec->thread_count);
464 if(st->codec->flags & CODEC_FLAG_BITEXACT)
469 s->timestamp = av_gettime();
471 av_close_input_file(ic);
476 get_sync_ipts(const AVOutputStream *ost)
478 const AVInputStream *ist = ost->sync_ist;
479 return (double)(ist->pts - start_time)/AV_TIME_BASE;
482 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
486 AVPacket new_pkt= *pkt;
487 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
488 &new_pkt.data, &new_pkt.size,
489 pkt->data, pkt->size,
490 pkt->flags & PKT_FLAG_KEY);
493 new_pkt.destruct= av_destruct_packet;
495 fprintf(stderr, "%s failed for stream %d, codec %s",
496 bsfc->filter->name, pkt->stream_index,
497 avctx->codec ? avctx->codec->name : "copy");
507 ret= av_interleaved_write_frame(s, pkt);
509 print_error("av_interleaved_write_frame()", ret);
514 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
516 static void do_audio_out(AVFormatContext *s,
519 unsigned char *buf, int size)
522 static uint8_t *audio_buf = NULL;
523 static uint8_t *audio_out = NULL;
524 static uint8_t *audio_out2 = NULL;
525 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
527 int size_out, frame_bytes, ret;
528 AVCodecContext *enc= ost->st->codec;
529 AVCodecContext *dec= ist->st->codec;
530 int osize= av_get_bits_per_sample_format(enc->sample_fmt)/8;
531 int isize= av_get_bits_per_sample_format(dec->sample_fmt)/8;
533 /* SC: dynamic allocation of buffers */
535 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
537 audio_out = av_malloc(audio_out_size);
538 if (!audio_buf || !audio_out)
539 return; /* Should signal an error ! */
541 if (enc->channels != dec->channels)
542 ost->audio_resample = 1;
544 if (ost->audio_resample && !ost->resample) {
545 if (dec->sample_fmt != SAMPLE_FMT_S16) {
546 fprintf(stderr, "Audio resampler only works with 16 bits per sample, patch welcome.\n");
549 ost->resample = audio_resample_init(enc->channels, dec->channels,
550 enc->sample_rate, dec->sample_rate);
551 if (!ost->resample) {
552 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
553 dec->channels, dec->sample_rate,
554 enc->channels, enc->sample_rate);
559 #define MAKE_SFMT_PAIR(a,b) ((a)+SAMPLE_FMT_NB*(b))
560 if (dec->sample_fmt!=enc->sample_fmt &&
561 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
563 audio_out2 = av_malloc(audio_out_size);
566 if (ost->reformat_ctx)
567 av_audio_convert_free(ost->reformat_ctx);
568 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
569 dec->sample_fmt, 1, NULL, 0);
570 if (!ost->reformat_ctx) {
571 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
572 avcodec_get_sample_fmt_name(dec->sample_fmt),
573 avcodec_get_sample_fmt_name(enc->sample_fmt));
576 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
579 if(audio_sync_method){
580 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
581 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2);
582 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
583 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
585 //FIXME resample delay
586 if(fabs(delta) > 50){
587 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
589 byte_delta= FFMAX(byte_delta, -size);
593 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
598 static uint8_t *input_tmp= NULL;
599 input_tmp= av_realloc(input_tmp, byte_delta + size);
601 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
604 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
606 memset(input_tmp, 0, byte_delta);
607 memcpy(input_tmp + byte_delta, buf, size);
611 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
613 }else if(audio_sync_method>1){
614 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
615 assert(ost->audio_resample);
617 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
618 // 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));
619 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
623 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
624 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
626 if (ost->audio_resample) {
628 size_out = audio_resample(ost->resample,
629 (short *)buftmp, (short *)buf,
630 size / (ist->st->codec->channels * isize));
631 size_out = size_out * enc->channels * osize;
637 if (dec->sample_fmt!=enc->sample_fmt) {
638 const void *ibuf[6]= {buftmp};
639 void *obuf[6]= {audio_out2};
640 int istride[6]= {isize};
641 int ostride[6]= {osize};
642 int len= size_out/istride[0];
643 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
644 printf("av_audio_convert() failed\n");
650 size_out = len*osize;
653 /* now encode as many frames as possible */
654 if (enc->frame_size > 1) {
655 /* output resampled raw samples */
656 if (av_fifo_realloc2(&ost->fifo, av_fifo_size(&ost->fifo) + size_out) < 0) {
657 fprintf(stderr, "av_fifo_realloc2() failed\n");
660 av_fifo_generic_write(&ost->fifo, buftmp, size_out, NULL);
662 frame_bytes = enc->frame_size * osize * enc->channels;
664 while (av_fifo_size(&ost->fifo) >= frame_bytes) {
666 av_init_packet(&pkt);
668 av_fifo_read(&ost->fifo, audio_buf, frame_bytes);
670 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
672 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
675 pkt.stream_index= ost->index;
678 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
679 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
680 pkt.flags |= PKT_FLAG_KEY;
681 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
683 ost->sync_opts += enc->frame_size;
687 int coded_bps = av_get_bits_per_sample(enc->codec->id)/8;
688 av_init_packet(&pkt);
690 ost->sync_opts += size_out / (osize * enc->channels);
692 /* output a pcm frame */
693 /* determine the size of the coded buffer */
696 size_out *= coded_bps;
698 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
699 ret = avcodec_encode_audio(enc, audio_out, size_out,
702 pkt.stream_index= ost->index;
705 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
706 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
707 pkt.flags |= PKT_FLAG_KEY;
708 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
712 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
716 AVPicture picture_tmp;
719 dec = ist->st->codec;
721 /* deinterlace : must be done before any resize */
722 if (do_deinterlace || using_vhook) {
725 /* create temporary picture */
726 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
727 buf = av_malloc(size);
731 picture2 = &picture_tmp;
732 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
735 if(avpicture_deinterlace(picture2, picture,
736 dec->pix_fmt, dec->width, dec->height) < 0) {
737 /* if error, do not deinterlace */
738 fprintf(stderr, "Deinterlacing failed\n");
744 av_picture_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
751 frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height,
752 1000000 * ist->pts / AV_TIME_BASE);
754 if (picture != picture2)
755 *picture = *picture2;
759 /* we begin to correct av delay at this threshold */
760 #define AV_DELAY_MAX 0.100
762 static void do_subtitle_out(AVFormatContext *s,
768 static uint8_t *subtitle_out = NULL;
769 int subtitle_out_max_size = 65536;
770 int subtitle_out_size, nb, i;
774 if (pts == AV_NOPTS_VALUE) {
775 fprintf(stderr, "Subtitle packets must have a pts\n");
781 enc = ost->st->codec;
784 subtitle_out = av_malloc(subtitle_out_max_size);
787 /* Note: DVB subtitle need one packet to draw them and one other
788 packet to clear them */
789 /* XXX: signal it in the codec context ? */
790 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
795 for(i = 0; i < nb; i++) {
796 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
797 subtitle_out_max_size, sub);
799 av_init_packet(&pkt);
800 pkt.stream_index = ost->index;
801 pkt.data = subtitle_out;
802 pkt.size = subtitle_out_size;
803 pkt.pts = av_rescale_q(pts, ist->st->time_base, ost->st->time_base);
804 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
805 /* XXX: the pts correction is handled here. Maybe handling
806 it in the codec would be better */
808 pkt.pts += 90 * sub->start_display_time;
810 pkt.pts += 90 * sub->end_display_time;
812 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
816 static int bit_buffer_size= 1024*256;
817 static uint8_t *bit_buffer= NULL;
819 static void do_video_out(AVFormatContext *s,
825 int nb_frames, i, ret;
826 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
827 AVFrame picture_crop_temp, picture_pad_temp;
828 AVCodecContext *enc, *dec;
830 avcodec_get_frame_defaults(&picture_crop_temp);
831 avcodec_get_frame_defaults(&picture_pad_temp);
833 enc = ost->st->codec;
834 dec = ist->st->codec;
836 /* by default, we output a single frame */
841 if(video_sync_method>0 || (video_sync_method && av_q2d(enc->time_base) > 0.001)){
843 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
844 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
847 else if (video_sync_method == 2)
848 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
849 else if (vdelta > 1.1)
850 nb_frames = lrintf(vdelta);
851 //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);
855 fprintf(stderr, "*** drop!\n");
856 }else if (nb_frames > 1) {
857 nb_frames_dup += nb_frames;
859 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
862 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
864 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
868 if (ost->video_crop) {
869 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
870 av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
875 formatted_picture = &picture_crop_temp;
877 formatted_picture = in_picture;
880 final_picture = formatted_picture;
881 padding_src = formatted_picture;
882 resampling_dst = &ost->pict_tmp;
883 if (ost->video_pad) {
884 final_picture = &ost->pict_tmp;
885 if (ost->video_resample) {
886 if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
887 av_log(NULL, AV_LOG_ERROR, "error padding picture\n");
892 resampling_dst = &picture_pad_temp;
896 if (ost->video_resample) {
898 final_picture = &ost->pict_tmp;
899 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
900 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
903 if (ost->video_pad) {
904 av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
905 enc->height, enc->width, enc->pix_fmt,
906 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
909 /* duplicates frame if needed */
910 for(i=0;i<nb_frames;i++) {
912 av_init_packet(&pkt);
913 pkt.stream_index= ost->index;
915 if (s->oformat->flags & AVFMT_RAWPICTURE) {
916 /* raw pictures are written as AVPicture structure to
917 avoid any copies. We support temorarily the older
919 AVFrame* old_frame = enc->coded_frame;
920 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
921 pkt.data= (uint8_t *)final_picture;
922 pkt.size= sizeof(AVPicture);
923 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
924 pkt.flags |= PKT_FLAG_KEY;
926 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
927 enc->coded_frame = old_frame;
931 big_picture= *final_picture;
932 /* better than nothing: use input picture interlaced
934 big_picture.interlaced_frame = in_picture->interlaced_frame;
935 if(avctx_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
936 if(top_field_first == -1)
937 big_picture.top_field_first = in_picture->top_field_first;
939 big_picture.top_field_first = top_field_first;
942 /* handles sameq here. This is not correct because it may
943 not be a global option */
945 big_picture.quality = ist->st->quality;
947 big_picture.quality = ost->st->quality;
949 big_picture.pict_type = 0;
950 // big_picture.pts = AV_NOPTS_VALUE;
951 big_picture.pts= ost->sync_opts;
952 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
953 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
954 ret = avcodec_encode_video(enc,
955 bit_buffer, bit_buffer_size,
958 fprintf(stderr, "Video encoding failed\n");
961 //enc->frame_number = enc->real_pict_num;
963 pkt.data= bit_buffer;
965 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
966 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
967 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
968 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
969 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
971 if(enc->coded_frame->key_frame)
972 pkt.flags |= PKT_FLAG_KEY;
973 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
976 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
977 // enc->frame_number-1, enc->real_pict_num, ret,
979 /* if two pass, output log */
980 if (ost->logfile && enc->stats_out) {
981 fprintf(ost->logfile, "%s", enc->stats_out);
990 static double psnr(double d){
991 return -10.0*log(d)/log(10.0);
994 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
999 double ti1, bitrate, avg_bitrate;
1001 /* this is executed just the first time do_video_stats is called */
1003 vstats_file = fopen(vstats_filename, "w");
1010 enc = ost->st->codec;
1011 if (enc->codec_type == CODEC_TYPE_VIDEO) {
1012 frame_number = ost->frame_number;
1013 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1014 if (enc->flags&CODEC_FLAG_PSNR)
1015 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1017 fprintf(vstats_file,"f_size= %6d ", frame_size);
1018 /* compute pts value */
1019 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1023 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1024 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1025 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1026 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1027 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1031 static void print_report(AVFormatContext **output_files,
1032 AVOutputStream **ost_table, int nb_ostreams,
1036 AVOutputStream *ost;
1037 AVFormatContext *oc, *os;
1039 AVCodecContext *enc;
1040 int frame_number, vid, i;
1041 double bitrate, ti1, pts;
1042 static int64_t last_time = -1;
1043 static int qp_histogram[52];
1045 if (!is_last_report) {
1047 /* display the report every 0.5 seconds */
1048 cur_time = av_gettime();
1049 if (last_time == -1) {
1050 last_time = cur_time;
1053 if ((cur_time - last_time) < 500000)
1055 last_time = cur_time;
1059 oc = output_files[0];
1061 total_size = url_fsize(oc->pb);
1062 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1063 total_size= url_ftell(oc->pb);
1068 for(i=0;i<nb_ostreams;i++) {
1070 os = output_files[ost->file_index];
1071 enc = ost->st->codec;
1072 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1073 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1074 !ost->st->stream_copy ?
1075 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1077 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1078 float t = (av_gettime()-timer_start) / 1000000.0;
1080 frame_number = ost->frame_number;
1081 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1082 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1083 !ost->st->stream_copy ?
1084 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1086 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1089 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1090 if(qp>=0 && qp<sizeof(qp_histogram)/sizeof(int))
1093 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1095 if (enc->flags&CODEC_FLAG_PSNR){
1097 double error, error_sum=0;
1098 double scale, scale_sum=0;
1099 char type[3]= {'Y','U','V'};
1100 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1103 error= enc->error[j];
1104 scale= enc->width*enc->height*255.0*255.0*frame_number;
1106 error= enc->coded_frame->error[j];
1107 scale= enc->width*enc->height*255.0*255.0;
1112 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1114 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1118 /* compute min output value */
1119 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1120 if ((pts < ti1) && (pts > 0))
1126 if (verbose || is_last_report) {
1127 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1129 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1130 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1131 (double)total_size / 1024, ti1, bitrate);
1134 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1135 nb_frames_dup, nb_frames_drop);
1138 fprintf(stderr, "%s \r", buf);
1143 if (is_last_report && verbose >= 0){
1144 int64_t raw= audio_size + video_size + extra_size;
1145 fprintf(stderr, "\n");
1146 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1150 100.0*(total_size - raw)/raw
1155 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1156 static int output_packet(AVInputStream *ist, int ist_index,
1157 AVOutputStream **ost_table, int nb_ostreams,
1158 const AVPacket *pkt)
1160 AVFormatContext *os;
1161 AVOutputStream *ost;
1165 int data_size, got_picture;
1167 void *buffer_to_free;
1168 static unsigned int samples_size= 0;
1169 static short *samples= NULL;
1170 AVSubtitle subtitle, *subtitle_to_free;
1173 if(ist->next_pts == AV_NOPTS_VALUE)
1174 ist->next_pts= ist->pts;
1183 if(pkt->dts != AV_NOPTS_VALUE)
1184 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1189 //while we have more to decode or while the decoder did output something on EOF
1190 while (len > 0 || (!pkt && ist->next_pts != ist->pts)) {
1192 ist->pts= ist->next_pts;
1194 if(len && len != pkt->size && verbose>0)
1195 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1197 /* decode the packet if needed */
1198 data_buf = NULL; /* fail safe */
1200 subtitle_to_free = NULL;
1201 if (ist->decoding_needed) {
1202 switch(ist->st->codec->codec_type) {
1203 case CODEC_TYPE_AUDIO:{
1204 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1205 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1207 samples= av_malloc(samples_size);
1209 data_size= samples_size;
1210 /* XXX: could avoid copy if PCM 16 bits with same
1211 endianness as CPU */
1212 ret = avcodec_decode_audio2(ist->st->codec, samples, &data_size,
1218 /* Some bug in mpeg audio decoder gives */
1219 /* data_size < 0, it seems they are overflows */
1220 if (data_size <= 0) {
1221 /* no audio frame */
1224 data_buf = (uint8_t *)samples;
1225 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1226 (ist->st->codec->sample_rate * ist->st->codec->channels);
1228 case CODEC_TYPE_VIDEO:
1229 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1230 /* XXX: allocate picture correctly */
1231 avcodec_get_frame_defaults(&picture);
1233 ret = avcodec_decode_video(ist->st->codec,
1234 &picture, &got_picture, ptr, len);
1235 ist->st->quality= picture.quality;
1239 /* no picture yet */
1240 goto discard_packet;
1242 if (ist->st->codec->time_base.num != 0) {
1243 ist->next_pts += ((int64_t)AV_TIME_BASE *
1244 ist->st->codec->time_base.num) /
1245 ist->st->codec->time_base.den;
1249 case CODEC_TYPE_SUBTITLE:
1250 ret = avcodec_decode_subtitle(ist->st->codec,
1251 &subtitle, &got_subtitle, ptr, len);
1254 if (!got_subtitle) {
1255 goto discard_packet;
1257 subtitle_to_free = &subtitle;
1264 switch(ist->st->codec->codec_type) {
1265 case CODEC_TYPE_AUDIO:
1266 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1267 ist->st->codec->sample_rate;
1269 case CODEC_TYPE_VIDEO:
1270 if (ist->st->codec->time_base.num != 0) {
1271 ist->next_pts += ((int64_t)AV_TIME_BASE *
1272 ist->st->codec->time_base.num) /
1273 ist->st->codec->time_base.den;
1283 buffer_to_free = NULL;
1284 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1285 pre_process_video_frame(ist, (AVPicture *)&picture,
1289 // preprocess audio (volume)
1290 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1291 if (audio_volume != 256) {
1294 for(i=0;i<(data_size / sizeof(short));i++) {
1295 int v = ((*volp) * audio_volume + 128) >> 8;
1296 if (v < -32768) v = -32768;
1297 if (v > 32767) v = 32767;
1303 /* frame rate emulation */
1304 if (ist->st->codec->rate_emu) {
1305 int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
1306 int64_t now = av_gettime() - ist->start;
1313 /* if output time reached then transcode raw format,
1314 encode packets and output them */
1315 if (start_time == 0 || ist->pts >= start_time)
1316 for(i=0;i<nb_ostreams;i++) {
1320 if (ost->source_index == ist_index) {
1321 os = output_files[ost->file_index];
1324 printf("%d: got pts=%0.3f %0.3f\n", i,
1325 (double)pkt->pts / AV_TIME_BASE,
1326 ((double)ist->pts / AV_TIME_BASE) -
1327 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1329 /* set the input output pts pairs */
1330 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1332 if (ost->encoding_needed) {
1333 switch(ost->st->codec->codec_type) {
1334 case CODEC_TYPE_AUDIO:
1335 do_audio_out(os, ost, ist, data_buf, data_size);
1337 case CODEC_TYPE_VIDEO:
1338 do_video_out(os, ost, ist, &picture, &frame_size);
1339 if (vstats_filename && frame_size)
1340 do_video_stats(os, ost, frame_size);
1342 case CODEC_TYPE_SUBTITLE:
1343 do_subtitle_out(os, ost, ist, &subtitle,
1350 AVFrame avframe; //FIXME/XXX remove this
1352 av_init_packet(&opkt);
1354 if (!ost->frame_number && !(pkt->flags & PKT_FLAG_KEY))
1357 /* no reencoding needed : output the packet directly */
1358 /* force the input stream PTS */
1360 avcodec_get_frame_defaults(&avframe);
1361 ost->st->codec->coded_frame= &avframe;
1362 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1364 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1365 audio_size += data_size;
1366 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1367 video_size += data_size;
1371 opkt.stream_index= ost->index;
1372 if(pkt->pts != AV_NOPTS_VALUE)
1373 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base);
1375 opkt.pts= AV_NOPTS_VALUE;
1377 if (pkt->dts == AV_NOPTS_VALUE)
1378 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1380 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1382 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1383 opkt.flags= pkt->flags;
1385 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1386 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1387 opkt.destruct= av_destruct_packet;
1389 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][opkt.stream_index]);
1390 ost->st->codec->frame_number++;
1391 ost->frame_number++;
1392 av_free_packet(&opkt);
1396 av_free(buffer_to_free);
1397 /* XXX: allocate the subtitles in the codec ? */
1398 if (subtitle_to_free) {
1399 if (subtitle_to_free->rects != NULL) {
1400 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1401 av_free(subtitle_to_free->rects[i].bitmap);
1402 av_free(subtitle_to_free->rects[i].rgba_palette);
1404 av_freep(&subtitle_to_free->rects);
1406 subtitle_to_free->num_rects = 0;
1407 subtitle_to_free = NULL;
1414 for(i=0;i<nb_ostreams;i++) {
1416 if (ost->source_index == ist_index) {
1417 AVCodecContext *enc= ost->st->codec;
1418 os = output_files[ost->file_index];
1420 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1422 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1425 if (ost->encoding_needed) {
1429 av_init_packet(&pkt);
1430 pkt.stream_index= ost->index;
1432 switch(ost->st->codec->codec_type) {
1433 case CODEC_TYPE_AUDIO:
1434 fifo_bytes = av_fifo_size(&ost->fifo);
1436 /* encode any samples remaining in fifo */
1437 if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1438 int fs_tmp = enc->frame_size;
1439 enc->frame_size = fifo_bytes / (2 * enc->channels);
1440 av_fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes);
1441 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1442 enc->frame_size = fs_tmp;
1445 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1448 pkt.flags |= PKT_FLAG_KEY;
1450 case CODEC_TYPE_VIDEO:
1451 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1453 if(enc->coded_frame && enc->coded_frame->key_frame)
1454 pkt.flags |= PKT_FLAG_KEY;
1455 if (ost->logfile && enc->stats_out) {
1456 fprintf(ost->logfile, "%s", enc->stats_out);
1465 pkt.data= bit_buffer;
1467 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1468 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1469 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1481 static void print_sdp(AVFormatContext **avc, int n)
1485 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1486 printf("SDP:\n%s\n", sdp);
1489 static int stream_index_from_inputs(AVFormatContext **input_files,
1491 AVInputFile *file_table,
1492 AVInputStream **ist_table,
1493 enum CodecType type,
1497 for(z=0; z<nb_input_files; z++) {
1498 AVFormatContext *ic = input_files[z];
1499 for(p=0; p<ic->nb_programs; p++) {
1500 AVProgram *program = ic->programs[p];
1501 if(program->id != programid)
1503 for(q=0; q<program->nb_stream_indexes; q++) {
1504 int sidx = program->stream_index[q];
1505 int ris = file_table[z].ist_index + sidx;
1506 if(ist_table[ris]->discard && ic->streams[sidx]->codec->codec_type == type)
1516 * The following code is the main loop of the file converter
1518 static int av_encode(AVFormatContext **output_files,
1519 int nb_output_files,
1520 AVFormatContext **input_files,
1522 AVStreamMap *stream_maps, int nb_stream_maps)
1524 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1525 AVFormatContext *is, *os;
1526 AVCodecContext *codec, *icodec;
1527 AVOutputStream *ost, **ost_table = NULL;
1528 AVInputStream *ist, **ist_table = NULL;
1529 AVInputFile *file_table;
1533 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1537 /* input stream init */
1539 for(i=0;i<nb_input_files;i++) {
1540 is = input_files[i];
1541 file_table[i].ist_index = j;
1542 file_table[i].nb_streams = is->nb_streams;
1543 j += is->nb_streams;
1547 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1551 for(i=0;i<nb_istreams;i++) {
1552 ist = av_mallocz(sizeof(AVInputStream));
1558 for(i=0;i<nb_input_files;i++) {
1559 is = input_files[i];
1560 for(k=0;k<is->nb_streams;k++) {
1561 ist = ist_table[j++];
1562 ist->st = is->streams[k];
1563 ist->file_index = i;
1565 ist->discard = 1; /* the stream is discarded by default
1568 if (ist->st->codec->rate_emu) {
1569 ist->start = av_gettime();
1575 /* output stream init */
1577 for(i=0;i<nb_output_files;i++) {
1578 os = output_files[i];
1579 if (!os->nb_streams) {
1580 fprintf(stderr, "Output file does not contain any stream\n");
1583 nb_ostreams += os->nb_streams;
1585 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1586 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1590 /* Sanity check the mapping args -- do the input files & streams exist? */
1591 for(i=0;i<nb_stream_maps;i++) {
1592 int fi = stream_maps[i].file_index;
1593 int si = stream_maps[i].stream_index;
1595 if (fi < 0 || fi > nb_input_files - 1 ||
1596 si < 0 || si > file_table[fi].nb_streams - 1) {
1597 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1600 fi = stream_maps[i].sync_file_index;
1601 si = stream_maps[i].sync_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 sync stream #%d.%d\n", fi, si);
1609 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1612 for(i=0;i<nb_ostreams;i++) {
1613 ost = av_mallocz(sizeof(AVOutputStream));
1620 for(k=0;k<nb_output_files;k++) {
1621 os = output_files[k];
1622 for(i=0;i<os->nb_streams;i++,n++) {
1625 ost->file_index = k;
1627 ost->st = os->streams[i];
1628 if (nb_stream_maps > 0) {
1629 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
1630 stream_maps[n].stream_index;
1632 /* Sanity check that the stream types match */
1633 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1634 int i= ost->file_index;
1635 dump_format(output_files[i], i, output_files[i]->filename, 1);
1636 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1637 stream_maps[n].file_index, stream_maps[n].stream_index,
1638 ost->file_index, ost->index);
1645 j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid);
1647 ost->source_index = j;
1651 /* get corresponding input stream index : we select the first one with the right type */
1653 for(j=0;j<nb_istreams;j++) {
1656 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1657 ost->source_index = j;
1665 if(! opt_programid) {
1666 /* try again and reuse existing stream */
1667 for(j=0;j<nb_istreams;j++) {
1669 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1670 ost->source_index = j;
1676 int i= ost->file_index;
1677 dump_format(output_files[i], i, output_files[i]->filename, 1);
1678 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1679 ost->file_index, ost->index);
1684 ist = ist_table[ost->source_index];
1686 ost->sync_ist = (nb_stream_maps > 0) ?
1687 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
1688 stream_maps[n].sync_stream_index] : ist;
1692 /* for each output stream, we compute the right encoding parameters */
1693 for(i=0;i<nb_ostreams;i++) {
1695 os = output_files[ost->file_index];
1696 ist = ist_table[ost->source_index];
1698 codec = ost->st->codec;
1699 icodec = ist->st->codec;
1701 if (!ost->st->language[0])
1702 av_strlcpy(ost->st->language, ist->st->language,
1703 sizeof(ost->st->language));
1705 ost->st->disposition = ist->st->disposition;
1707 if (ost->st->stream_copy) {
1708 /* if stream_copy is selected, no need to decode or encode */
1709 codec->codec_id = icodec->codec_id;
1710 codec->codec_type = icodec->codec_type;
1712 if(!codec->codec_tag){
1713 if( !os->oformat->codec_tag
1714 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) > 0
1715 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1716 codec->codec_tag = icodec->codec_tag;
1719 codec->bit_rate = icodec->bit_rate;
1720 codec->extradata= icodec->extradata;
1721 codec->extradata_size= icodec->extradata_size;
1722 if(av_q2d(icodec->time_base) > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000)
1723 codec->time_base = icodec->time_base;
1725 codec->time_base = ist->st->time_base;
1726 switch(codec->codec_type) {
1727 case CODEC_TYPE_AUDIO:
1728 if(audio_volume != 256) {
1729 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1732 codec->sample_rate = icodec->sample_rate;
1733 codec->channels = icodec->channels;
1734 codec->frame_size = icodec->frame_size;
1735 codec->block_align= icodec->block_align;
1736 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1737 codec->block_align= 0;
1738 if(codec->codec_id == CODEC_ID_AC3)
1739 codec->block_align= 0;
1741 case CODEC_TYPE_VIDEO:
1743 fprintf(stderr,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");
1746 codec->pix_fmt = icodec->pix_fmt;
1747 codec->width = icodec->width;
1748 codec->height = icodec->height;
1749 codec->has_b_frames = icodec->has_b_frames;
1751 case CODEC_TYPE_SUBTITLE:
1757 switch(codec->codec_type) {
1758 case CODEC_TYPE_AUDIO:
1759 if (av_fifo_init(&ost->fifo, 1024))
1761 ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
1762 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1763 icodec->request_channels = codec->channels;
1764 ist->decoding_needed = 1;
1765 ost->encoding_needed = 1;
1767 case CODEC_TYPE_VIDEO:
1768 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1769 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1770 ost->video_resample = ((codec->width != icodec->width -
1771 (frame_leftBand + frame_rightBand) +
1772 (frame_padleft + frame_padright)) ||
1773 (codec->height != icodec->height -
1774 (frame_topBand + frame_bottomBand) +
1775 (frame_padtop + frame_padbottom)) ||
1776 (codec->pix_fmt != icodec->pix_fmt));
1777 if (ost->video_crop) {
1778 ost->topBand = frame_topBand;
1779 ost->leftBand = frame_leftBand;
1781 if (ost->video_pad) {
1782 ost->padtop = frame_padtop;
1783 ost->padleft = frame_padleft;
1784 ost->padbottom = frame_padbottom;
1785 ost->padright = frame_padright;
1786 if (!ost->video_resample) {
1787 avcodec_get_frame_defaults(&ost->pict_tmp);
1788 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1789 codec->width, codec->height))
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)) {
1797 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1800 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1801 ost->img_resample_ctx = sws_getContext(
1802 icodec->width - (frame_leftBand + frame_rightBand),
1803 icodec->height - (frame_topBand + frame_bottomBand),
1805 codec->width - (frame_padleft + frame_padright),
1806 codec->height - (frame_padtop + frame_padbottom),
1808 sws_flags, NULL, NULL, NULL);
1809 if (ost->img_resample_ctx == NULL) {
1810 fprintf(stderr, "Cannot get resampling context\n");
1813 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1815 ost->encoding_needed = 1;
1816 ist->decoding_needed = 1;
1818 case CODEC_TYPE_SUBTITLE:
1819 ost->encoding_needed = 1;
1820 ist->decoding_needed = 1;
1827 if (ost->encoding_needed &&
1828 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1829 char logfilename[1024];
1834 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1836 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1837 if (codec->flags & CODEC_FLAG_PASS1) {
1838 f = fopen(logfilename, "w");
1840 perror(logfilename);
1845 /* read the log file */
1846 f = fopen(logfilename, "r");
1848 perror(logfilename);
1851 fseek(f, 0, SEEK_END);
1853 fseek(f, 0, SEEK_SET);
1854 logbuffer = av_malloc(size + 1);
1856 fprintf(stderr, "Could not allocate log buffer\n");
1859 size = fread(logbuffer, 1, size, f);
1861 logbuffer[size] = '\0';
1862 codec->stats_in = logbuffer;
1866 if(codec->codec_type == CODEC_TYPE_VIDEO){
1867 int size= codec->width * codec->height;
1868 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1873 bit_buffer = av_malloc(bit_buffer_size);
1877 /* dump the file output parameters - cannot be done before in case
1879 for(i=0;i<nb_output_files;i++) {
1880 dump_format(output_files[i], i, output_files[i]->filename, 1);
1883 /* dump the stream mapping */
1885 fprintf(stderr, "Stream mapping:\n");
1886 for(i=0;i<nb_ostreams;i++) {
1888 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1889 ist_table[ost->source_index]->file_index,
1890 ist_table[ost->source_index]->index,
1893 if (ost->sync_ist != ist_table[ost->source_index])
1894 fprintf(stderr, " [sync #%d.%d]",
1895 ost->sync_ist->file_index,
1896 ost->sync_ist->index);
1897 fprintf(stderr, "\n");
1901 /* open each encoder */
1902 for(i=0;i<nb_ostreams;i++) {
1904 if (ost->encoding_needed) {
1906 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1908 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1909 ost->file_index, ost->index);
1912 if (avcodec_open(ost->st->codec, codec) < 0) {
1913 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1914 ost->file_index, ost->index);
1917 extra_size += ost->st->codec->extradata_size;
1921 /* open each decoder */
1922 for(i=0;i<nb_istreams;i++) {
1924 if (ist->decoding_needed) {
1926 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1928 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1929 ist->st->codec->codec_id, ist->file_index, ist->index);
1932 if (avcodec_open(ist->st->codec, codec) < 0) {
1933 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1934 ist->file_index, ist->index);
1937 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1938 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1943 for(i=0;i<nb_istreams;i++) {
1945 is = input_files[ist->file_index];
1947 ist->next_pts = AV_NOPTS_VALUE;
1951 /* set meta data information from input file if required */
1952 for (i=0;i<nb_meta_data_maps;i++) {
1953 AVFormatContext *out_file;
1954 AVFormatContext *in_file;
1956 int out_file_index = meta_data_maps[i].out_file;
1957 int in_file_index = meta_data_maps[i].in_file;
1958 if (out_file_index < 0 || out_file_index >= nb_output_files) {
1959 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1960 ret = AVERROR(EINVAL);
1963 if (in_file_index < 0 || in_file_index >= nb_input_files) {
1964 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1965 ret = AVERROR(EINVAL);
1969 out_file = output_files[out_file_index];
1970 in_file = input_files[in_file_index];
1972 strcpy(out_file->title, in_file->title);
1973 strcpy(out_file->author, in_file->author);
1974 strcpy(out_file->copyright, in_file->copyright);
1975 strcpy(out_file->comment, in_file->comment);
1976 strcpy(out_file->album, in_file->album);
1977 out_file->year = in_file->year;
1978 out_file->track = in_file->track;
1979 strcpy(out_file->genre, in_file->genre);
1982 /* open files and write file headers */
1983 for(i=0;i<nb_output_files;i++) {
1984 os = output_files[i];
1985 if (av_write_header(os) < 0) {
1986 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1987 ret = AVERROR(EINVAL);
1990 if (strcmp(output_files[i]->oformat->name, "rtp")) {
1995 print_sdp(output_files, nb_output_files);
1998 if (!using_stdin && verbose >= 0) {
1999 fprintf(stderr, "Press [q] to stop encoding\n");
2000 url_set_interrupt_cb(decode_interrupt_cb);
2005 timer_start = av_gettime();
2007 for(; received_sigterm == 0;) {
2008 int file_index, ist_index;
2016 /* if 'q' pressed, exits */
2020 /* read_key() returns 0 on EOF */
2026 /* select the stream that we must read now by looking at the
2027 smallest output pts */
2029 for(i=0;i<nb_ostreams;i++) {
2032 os = output_files[ost->file_index];
2033 ist = ist_table[ost->source_index];
2034 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
2035 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
2037 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2038 ipts = (double)ist->pts;
2039 if (!file_table[ist->file_index].eof_reached){
2040 if(ipts < ipts_min) {
2042 if(input_sync ) file_index = ist->file_index;
2044 if(opts < opts_min) {
2046 if(!input_sync) file_index = ist->file_index;
2049 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2054 /* if none, if is finished */
2055 if (file_index < 0) {
2059 /* finish if recording time exhausted */
2060 if (opts_min >= (recording_time / 1000000.0))
2063 /* finish if limit size exhausted */
2064 if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
2067 /* read a frame from it and output it in the fifo */
2068 is = input_files[file_index];
2069 if (av_read_frame(is, &pkt) < 0) {
2070 file_table[file_index].eof_reached = 1;
2078 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2080 /* the following test is needed in case new streams appear
2081 dynamically in stream : we ignore them */
2082 if (pkt.stream_index >= file_table[file_index].nb_streams)
2083 goto discard_packet;
2084 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2085 ist = ist_table[ist_index];
2087 goto discard_packet;
2089 if (pkt.dts != AV_NOPTS_VALUE)
2090 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2091 if (pkt.pts != AV_NOPTS_VALUE)
2092 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2094 if(input_files_ts_scale[file_index][pkt.stream_index]){
2095 if(pkt.pts != AV_NOPTS_VALUE)
2096 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2097 if(pkt.dts != AV_NOPTS_VALUE)
2098 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2101 // 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);
2102 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
2103 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2104 int64_t delta= pkt_dts - ist->next_pts;
2105 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2106 input_files_ts_offset[ist->file_index]-= delta;
2108 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2109 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2110 if(pkt.pts != AV_NOPTS_VALUE)
2111 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2115 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2116 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2119 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2120 ist->file_index, ist->index);
2123 av_free_packet(&pkt);
2128 av_free_packet(&pkt);
2130 /* dump report by using the output first video and audio streams */
2131 print_report(output_files, ost_table, nb_ostreams, 0);
2134 /* at the end of stream, we must flush the decoder buffers */
2135 for(i=0;i<nb_istreams;i++) {
2137 if (ist->decoding_needed) {
2138 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2144 /* write the trailer if needed and close file */
2145 for(i=0;i<nb_output_files;i++) {
2146 os = output_files[i];
2147 av_write_trailer(os);
2150 /* dump report by using the first video and audio streams */
2151 print_report(output_files, ost_table, nb_ostreams, 1);
2153 /* close each encoder */
2154 for(i=0;i<nb_ostreams;i++) {
2156 if (ost->encoding_needed) {
2157 av_freep(&ost->st->codec->stats_in);
2158 avcodec_close(ost->st->codec);
2162 /* close each decoder */
2163 for(i=0;i<nb_istreams;i++) {
2165 if (ist->decoding_needed) {
2166 avcodec_close(ist->st->codec);
2174 av_freep(&bit_buffer);
2175 av_free(file_table);
2178 for(i=0;i<nb_istreams;i++) {
2185 for(i=0;i<nb_ostreams;i++) {
2189 fclose(ost->logfile);
2190 ost->logfile = NULL;
2192 av_fifo_free(&ost->fifo); /* works even if fifo is not
2193 initialized but set to zero */
2194 av_free(ost->pict_tmp.data[0]);
2195 if (ost->video_resample)
2196 sws_freeContext(ost->img_resample_ctx);
2198 audio_resample_close(ost->resample);
2199 if (ost->reformat_ctx)
2200 av_audio_convert_free(ost->reformat_ctx);
2208 ret = AVERROR(ENOMEM);
2213 int file_read(const char *filename)
2216 unsigned char buffer[1024];
2219 if (url_open(&h, filename, O_RDONLY) < 0) {
2220 printf("could not open '%s'\n", filename);
2224 len = url_read(h, buffer, sizeof(buffer));
2227 for(i=0;i<len;i++) putchar(buffer[i]);
2234 static void opt_format(const char *arg)
2236 /* compatibility stuff for pgmyuv */
2237 if (!strcmp(arg, "pgmyuv")) {
2238 pgmyuv_compatibility_hack=1;
2239 // opt_image_format(arg);
2241 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2244 file_iformat = av_find_input_format(arg);
2245 file_oformat = guess_format(arg, NULL, NULL);
2246 if (!file_iformat && !file_oformat) {
2247 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2252 static void opt_video_rc_override_string(const char *arg)
2254 video_rc_override_string = arg;
2257 static int opt_me_threshold(const char *opt, const char *arg)
2259 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2263 static int opt_verbose(const char *opt, const char *arg)
2265 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2266 av_log_set_level(verbose);
2270 static int opt_frame_rate(const char *opt, const char *arg)
2272 if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2273 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2279 static int opt_bitrate(const char *opt, const char *arg)
2281 int codec_type = opt[0]=='a' ? CODEC_TYPE_AUDIO : CODEC_TYPE_VIDEO;
2283 opt_default(opt, arg);
2285 if (av_get_int(avctx_opts[codec_type], "b", NULL) < 1000)
2286 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2291 static void opt_frame_crop_top(const char *arg)
2293 frame_topBand = atoi(arg);
2294 if (frame_topBand < 0) {
2295 fprintf(stderr, "Incorrect top crop size\n");
2298 if ((frame_topBand % 2) != 0) {
2299 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2302 if ((frame_topBand) >= frame_height){
2303 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2306 frame_height -= frame_topBand;
2309 static void opt_frame_crop_bottom(const char *arg)
2311 frame_bottomBand = atoi(arg);
2312 if (frame_bottomBand < 0) {
2313 fprintf(stderr, "Incorrect bottom crop size\n");
2316 if ((frame_bottomBand % 2) != 0) {
2317 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2320 if ((frame_bottomBand) >= frame_height){
2321 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2324 frame_height -= frame_bottomBand;
2327 static void opt_frame_crop_left(const char *arg)
2329 frame_leftBand = atoi(arg);
2330 if (frame_leftBand < 0) {
2331 fprintf(stderr, "Incorrect left crop size\n");
2334 if ((frame_leftBand % 2) != 0) {
2335 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2338 if ((frame_leftBand) >= frame_width){
2339 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2342 frame_width -= frame_leftBand;
2345 static void opt_frame_crop_right(const char *arg)
2347 frame_rightBand = atoi(arg);
2348 if (frame_rightBand < 0) {
2349 fprintf(stderr, "Incorrect right crop size\n");
2352 if ((frame_rightBand % 2) != 0) {
2353 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2356 if ((frame_rightBand) >= frame_width){
2357 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2360 frame_width -= frame_rightBand;
2363 static void opt_frame_size(const char *arg)
2365 if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
2366 fprintf(stderr, "Incorrect frame size\n");
2369 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2370 fprintf(stderr, "Frame size must be a multiple of 2\n");
2376 #define SCALEBITS 10
2377 #define ONE_HALF (1 << (SCALEBITS - 1))
2378 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2380 #define RGB_TO_Y(r, g, b) \
2381 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2382 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2384 #define RGB_TO_U(r1, g1, b1, shift)\
2385 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2386 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2388 #define RGB_TO_V(r1, g1, b1, shift)\
2389 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2390 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2392 static void opt_pad_color(const char *arg) {
2393 /* Input is expected to be six hex digits similar to
2394 how colors are expressed in html tags (but without the #) */
2395 int rgb = strtol(arg, NULL, 16);
2399 g = ((rgb >> 8) & 255);
2402 padcolor[0] = RGB_TO_Y(r,g,b);
2403 padcolor[1] = RGB_TO_U(r,g,b,0);
2404 padcolor[2] = RGB_TO_V(r,g,b,0);
2407 static void opt_frame_pad_top(const char *arg)
2409 frame_padtop = atoi(arg);
2410 if (frame_padtop < 0) {
2411 fprintf(stderr, "Incorrect top pad size\n");
2414 if ((frame_padtop % 2) != 0) {
2415 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2420 static void opt_frame_pad_bottom(const char *arg)
2422 frame_padbottom = atoi(arg);
2423 if (frame_padbottom < 0) {
2424 fprintf(stderr, "Incorrect bottom pad size\n");
2427 if ((frame_padbottom % 2) != 0) {
2428 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2434 static void opt_frame_pad_left(const char *arg)
2436 frame_padleft = atoi(arg);
2437 if (frame_padleft < 0) {
2438 fprintf(stderr, "Incorrect left pad size\n");
2441 if ((frame_padleft % 2) != 0) {
2442 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2448 static void opt_frame_pad_right(const char *arg)
2450 frame_padright = atoi(arg);
2451 if (frame_padright < 0) {
2452 fprintf(stderr, "Incorrect right pad size\n");
2455 if ((frame_padright % 2) != 0) {
2456 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2461 static void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts)
2465 for (i=-1; i < nb_fmts; i++) {
2466 get_fmt_string (fmt_str, sizeof(fmt_str), i);
2467 fprintf(stdout, "%s\n", fmt_str);
2471 static void opt_frame_pix_fmt(const char *arg)
2473 if (strcmp(arg, "list"))
2474 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2476 list_fmts(avcodec_pix_fmt_string, PIX_FMT_NB);
2481 static void opt_frame_aspect_ratio(const char *arg)
2488 p = strchr(arg, ':');
2490 x = strtol(arg, &end, 10);
2492 y = strtol(end+1, &end, 10);
2494 ar = (double)x / (double)y;
2496 ar = strtod(arg, NULL);
2499 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2502 frame_aspect_ratio = ar;
2505 static void opt_qscale(const char *arg)
2507 video_qscale = atof(arg);
2508 if (video_qscale <= 0 ||
2509 video_qscale > 255) {
2510 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2515 static void opt_top_field_first(const char *arg)
2517 top_field_first= atoi(arg);
2520 static int opt_thread_count(const char *opt, const char *arg)
2522 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2523 #if !defined(HAVE_THREADS)
2525 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2530 static void opt_audio_sample_fmt(const char *arg)
2532 if (strcmp(arg, "list"))
2533 audio_sample_fmt = avcodec_get_sample_fmt(arg);
2535 list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
2540 static int opt_audio_rate(const char *opt, const char *arg)
2542 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2546 static int opt_audio_channels(const char *opt, const char *arg)
2548 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2552 static void opt_video_channel(const char *arg)
2554 video_channel = strtol(arg, NULL, 0);
2557 static void opt_video_standard(const char *arg)
2559 video_standard = av_strdup(arg);
2562 static void opt_codec(int *pstream_copy, char **pcodec_name,
2563 int codec_type, const char *arg)
2565 av_freep(pcodec_name);
2566 if (!strcmp(arg, "copy")) {
2569 *pcodec_name = av_strdup(arg);
2573 static void opt_audio_codec(const char *arg)
2575 opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg);
2578 static void opt_audio_tag(const char *arg)
2581 audio_codec_tag= strtol(arg, &tail, 0);
2584 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2587 static void opt_video_tag(const char *arg)
2590 video_codec_tag= strtol(arg, &tail, 0);
2593 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2597 static void add_frame_hooker(const char *arg)
2602 char *args = av_strdup(arg);
2606 argv[0] = strtok(args, " ");
2607 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2610 i = frame_hook_add(argc, argv);
2613 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2619 static void opt_video_codec(const char *arg)
2621 opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg);
2624 static void opt_subtitle_codec(const char *arg)
2626 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
2629 static void opt_map(const char *arg)
2634 m = &stream_maps[nb_stream_maps++];
2636 m->file_index = strtol(arg, &p, 0);
2640 m->stream_index = strtol(p, &p, 0);
2643 m->sync_file_index = strtol(p, &p, 0);
2646 m->sync_stream_index = strtol(p, &p, 0);
2648 m->sync_file_index = m->file_index;
2649 m->sync_stream_index = m->stream_index;
2653 static void opt_map_meta_data(const char *arg)
2658 m = &meta_data_maps[nb_meta_data_maps++];
2660 m->out_file = strtol(arg, &p, 0);
2664 m->in_file = strtol(p, &p, 0);
2667 static void opt_input_ts_scale(const char *arg)
2669 unsigned int stream;
2673 stream = strtol(arg, &p, 0);
2676 scale= strtod(p, &p);
2678 if(stream >= MAX_STREAMS)
2681 input_files_ts_scale[nb_input_files][stream]= scale;
2684 static int opt_recording_time(const char *opt, const char *arg)
2686 recording_time = parse_time_or_die(opt, arg, 1);
2690 static int opt_start_time(const char *opt, const char *arg)
2692 start_time = parse_time_or_die(opt, arg, 1);
2696 static int opt_rec_timestamp(const char *opt, const char *arg)
2698 rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
2702 static int opt_input_ts_offset(const char *opt, const char *arg)
2704 input_ts_offset = parse_time_or_die(opt, arg, 1);
2708 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
2710 const char *codec_string = encoder ? "encoder" : "decoder";
2714 return CODEC_ID_NONE;
2716 avcodec_find_encoder_by_name(name) :
2717 avcodec_find_decoder_by_name(name);
2719 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2722 if(codec->type != type) {
2723 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2729 static void opt_input_file(const char *filename)
2731 AVFormatContext *ic;
2732 AVFormatParameters params, *ap = ¶ms;
2733 int err, i, ret, rfps, rfps_base;
2736 if (!strcmp(filename, "-"))
2739 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2740 !strcmp(filename, "/dev/stdin");
2742 /* get default parameters from command line */
2743 ic = av_alloc_format_context();
2745 memset(ap, 0, sizeof(*ap));
2746 ap->prealloced_context = 1;
2747 ap->sample_rate = audio_sample_rate;
2748 ap->channels = audio_channels;
2749 ap->time_base.den = frame_rate.num;
2750 ap->time_base.num = frame_rate.den;
2751 ap->width = frame_width + frame_padleft + frame_padright;
2752 ap->height = frame_height + frame_padtop + frame_padbottom;
2753 ap->pix_fmt = frame_pix_fmt;
2754 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
2755 ap->channel = video_channel;
2756 ap->standard = video_standard;
2757 ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0);
2758 ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0);
2759 if(pgmyuv_compatibility_hack)
2760 ap->video_codec_id= CODEC_ID_PGMYUV;
2762 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
2764 ic->video_codec_id = find_codec_or_die(video_codec_name , CODEC_TYPE_VIDEO , 0);
2765 ic->audio_codec_id = find_codec_or_die(audio_codec_name , CODEC_TYPE_AUDIO , 0);
2766 ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 0);
2768 /* open the input file with generic libav function */
2769 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2771 print_error(filename, err);
2776 for(i=0; i<ic->nb_programs; i++)
2777 if(ic->programs[i]->id != opt_programid)
2778 ic->programs[i]->discard = AVDISCARD_ALL;
2781 ic->loop_input = loop_input;
2783 /* If not enough info to get the stream parameters, we decode the
2784 first frames to get it. (used in mpeg case for example) */
2785 ret = av_find_stream_info(ic);
2786 if (ret < 0 && verbose >= 0) {
2787 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2791 timestamp = start_time;
2792 /* add the stream start time */
2793 if (ic->start_time != AV_NOPTS_VALUE)
2794 timestamp += ic->start_time;
2796 /* if seeking requested, we execute it */
2797 if (start_time != 0) {
2798 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2800 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2801 filename, (double)timestamp / AV_TIME_BASE);
2803 /* reset seek info */
2807 /* update the current parameters so that they match the one of the input stream */
2808 for(i=0;i<ic->nb_streams;i++) {
2809 AVCodecContext *enc = ic->streams[i]->codec;
2811 avcodec_thread_init(enc, thread_count);
2812 enc->thread_count= thread_count;
2813 switch(enc->codec_type) {
2814 case CODEC_TYPE_AUDIO:
2815 set_context_opts(enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2816 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2817 audio_channels = enc->channels;
2818 audio_sample_rate = enc->sample_rate;
2819 audio_sample_fmt = enc->sample_fmt;
2821 ic->streams[i]->discard= AVDISCARD_ALL;
2823 case CODEC_TYPE_VIDEO:
2824 set_context_opts(enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2825 frame_height = enc->height;
2826 frame_width = enc->width;
2827 if(ic->streams[i]->sample_aspect_ratio.num)
2828 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
2830 frame_aspect_ratio=av_q2d(enc->sample_aspect_ratio);
2831 frame_aspect_ratio *= (float) enc->width / enc->height;
2832 frame_pix_fmt = enc->pix_fmt;
2833 rfps = ic->streams[i]->r_frame_rate.num;
2834 rfps_base = ic->streams[i]->r_frame_rate.den;
2835 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2837 enc->debug |= FF_DEBUG_MV;
2839 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2842 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2843 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2845 (float)rfps / rfps_base, rfps, rfps_base);
2847 /* update the current frame rate to match the stream frame rate */
2848 frame_rate.num = rfps;
2849 frame_rate.den = rfps_base;
2851 enc->rate_emu = rate_emu;
2853 ic->streams[i]->discard= AVDISCARD_ALL;
2854 else if(video_discard)
2855 ic->streams[i]->discard= video_discard;
2857 case CODEC_TYPE_DATA:
2859 case CODEC_TYPE_SUBTITLE:
2860 if(subtitle_disable)
2861 ic->streams[i]->discard = AVDISCARD_ALL;
2863 case CODEC_TYPE_ATTACHMENT:
2864 case CODEC_TYPE_UNKNOWN:
2871 input_files[nb_input_files] = ic;
2872 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2873 /* dump the file content */
2875 dump_format(ic, nb_input_files, filename, 0);
2878 file_iformat = NULL;
2879 file_oformat = NULL;
2884 av_freep(&video_codec_name);
2885 av_freep(&audio_codec_name);
2886 av_freep(&subtitle_codec_name);
2889 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
2890 int *has_subtitle_ptr)
2892 int has_video, has_audio, has_subtitle, i, j;
2893 AVFormatContext *ic;
2898 for(j=0;j<nb_input_files;j++) {
2899 ic = input_files[j];
2900 for(i=0;i<ic->nb_streams;i++) {
2901 AVCodecContext *enc = ic->streams[i]->codec;
2902 switch(enc->codec_type) {
2903 case CODEC_TYPE_AUDIO:
2906 case CODEC_TYPE_VIDEO:
2909 case CODEC_TYPE_SUBTITLE:
2912 case CODEC_TYPE_DATA:
2913 case CODEC_TYPE_ATTACHMENT:
2914 case CODEC_TYPE_UNKNOWN:
2921 *has_video_ptr = has_video;
2922 *has_audio_ptr = has_audio;
2923 *has_subtitle_ptr = has_subtitle;
2926 static void new_video_stream(AVFormatContext *oc)
2929 AVCodecContext *video_enc;
2932 st = av_new_stream(oc, oc->nb_streams);
2934 fprintf(stderr, "Could not alloc stream\n");
2937 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
2938 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
2939 video_bitstream_filters= NULL;
2942 avcodec_thread_init(st->codec, thread_count);
2944 video_enc = st->codec;
2947 video_enc->codec_tag= video_codec_tag;
2949 if( (video_global_header&1)
2950 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
2951 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2952 avctx_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
2954 if(video_global_header&2){
2955 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
2956 avctx_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
2959 if (video_stream_copy) {
2960 st->stream_copy = 1;
2961 video_enc->codec_type = CODEC_TYPE_VIDEO;
2962 video_enc->sample_aspect_ratio =
2963 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
2968 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
2970 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
2971 if (video_codec_name)
2972 codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
2974 video_enc->codec_id = codec_id;
2975 codec = avcodec_find_encoder(codec_id);
2977 set_context_opts(video_enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
2979 if (codec && codec->supported_framerates && !force_fps)
2980 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
2981 video_enc->time_base.den = fps.num;
2982 video_enc->time_base.num = fps.den;
2984 video_enc->width = frame_width + frame_padright + frame_padleft;
2985 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2986 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
2987 video_enc->pix_fmt = frame_pix_fmt;
2988 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
2990 if(codec && codec->pix_fmts){
2991 const enum PixelFormat *p= codec->pix_fmts;
2993 if(*p == video_enc->pix_fmt)
2997 video_enc->pix_fmt = codec->pix_fmts[0];
3001 video_enc->gop_size = 0;
3002 if (video_qscale || same_quality) {
3003 video_enc->flags |= CODEC_FLAG_QSCALE;
3004 video_enc->global_quality=
3005 st->quality = FF_QP2LAMBDA * video_qscale;
3009 video_enc->intra_matrix = intra_matrix;
3011 video_enc->inter_matrix = inter_matrix;
3013 video_enc->thread_count = thread_count;
3014 p= video_rc_override_string;
3017 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3019 fprintf(stderr, "error parsing rc_override\n");
3022 video_enc->rc_override=
3023 av_realloc(video_enc->rc_override,
3024 sizeof(RcOverride)*(i+1));
3025 video_enc->rc_override[i].start_frame= start;
3026 video_enc->rc_override[i].end_frame = end;
3028 video_enc->rc_override[i].qscale= q;
3029 video_enc->rc_override[i].quality_factor= 1.0;
3032 video_enc->rc_override[i].qscale= 0;
3033 video_enc->rc_override[i].quality_factor= -q/100.0;
3038 video_enc->rc_override_count=i;
3039 if (!video_enc->rc_initial_buffer_occupancy)
3040 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3041 video_enc->me_threshold= me_threshold;
3042 video_enc->intra_dc_precision= intra_dc_precision - 8;
3045 video_enc->flags|= CODEC_FLAG_PSNR;
3050 video_enc->flags |= CODEC_FLAG_PASS1;
3052 video_enc->flags |= CODEC_FLAG_PASS2;
3057 /* reset some key parameters */
3059 av_freep(&video_codec_name);
3060 video_stream_copy = 0;
3063 static void new_audio_stream(AVFormatContext *oc)
3066 AVCodecContext *audio_enc;
3069 st = av_new_stream(oc, oc->nb_streams);
3071 fprintf(stderr, "Could not alloc stream\n");
3074 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
3076 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
3077 audio_bitstream_filters= NULL;
3080 avcodec_thread_init(st->codec, thread_count);
3082 audio_enc = st->codec;
3083 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3086 audio_enc->codec_tag= audio_codec_tag;
3088 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3089 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3090 avctx_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3092 if (audio_stream_copy) {
3093 st->stream_copy = 1;
3094 audio_enc->channels = audio_channels;
3097 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3099 set_context_opts(audio_enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3101 if (audio_codec_name)
3102 codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
3103 audio_enc->codec_id = codec_id;
3104 codec = avcodec_find_encoder(codec_id);
3106 if (audio_qscale > QSCALE_NONE) {
3107 audio_enc->flags |= CODEC_FLAG_QSCALE;
3108 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3110 audio_enc->thread_count = thread_count;
3111 audio_enc->channels = audio_channels;
3112 audio_enc->sample_fmt = audio_sample_fmt;
3114 if(codec && codec->sample_fmts){
3115 const enum SampleFormat *p= codec->sample_fmts;
3117 if(*p == audio_enc->sample_fmt)
3121 audio_enc->sample_fmt = codec->sample_fmts[0];
3124 audio_enc->sample_rate = audio_sample_rate;
3125 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3126 if (audio_language) {
3127 av_strlcpy(st->language, audio_language, sizeof(st->language));
3128 av_free(audio_language);
3129 audio_language = NULL;
3132 /* reset some key parameters */
3134 av_freep(&audio_codec_name);
3135 audio_stream_copy = 0;
3138 static void new_subtitle_stream(AVFormatContext *oc)
3141 AVCodecContext *subtitle_enc;
3143 st = av_new_stream(oc, oc->nb_streams);
3145 fprintf(stderr, "Could not alloc stream\n");
3148 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
3150 bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
3151 subtitle_bitstream_filters= NULL;
3153 subtitle_enc = st->codec;
3154 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3155 if (subtitle_stream_copy) {
3156 st->stream_copy = 1;
3158 set_context_opts(avctx_opts[CODEC_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3159 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1);
3162 if (subtitle_language) {
3163 av_strlcpy(st->language, subtitle_language, sizeof(st->language));
3164 av_free(subtitle_language);
3165 subtitle_language = NULL;
3168 subtitle_disable = 0;
3169 av_freep(&subtitle_codec_name);
3170 subtitle_stream_copy = 0;
3173 static void opt_new_audio_stream(void)
3175 AVFormatContext *oc;
3176 if (nb_output_files <= 0) {
3177 fprintf(stderr, "At least one output file must be specified\n");
3180 oc = output_files[nb_output_files - 1];
3181 new_audio_stream(oc);
3184 static void opt_new_video_stream(void)
3186 AVFormatContext *oc;
3187 if (nb_output_files <= 0) {
3188 fprintf(stderr, "At least one output file must be specified\n");
3191 oc = output_files[nb_output_files - 1];
3192 new_video_stream(oc);
3195 static void opt_new_subtitle_stream(void)
3197 AVFormatContext *oc;
3198 if (nb_output_files <= 0) {
3199 fprintf(stderr, "At least one output file must be specified\n");
3202 oc = output_files[nb_output_files - 1];
3203 new_subtitle_stream(oc);
3206 static void opt_output_file(const char *filename)
3208 AVFormatContext *oc;
3209 int use_video, use_audio, use_subtitle;
3210 int input_has_video, input_has_audio, input_has_subtitle;
3211 AVFormatParameters params, *ap = ¶ms;
3213 if (!strcmp(filename, "-"))
3216 oc = av_alloc_format_context();
3218 if (!file_oformat) {
3219 file_oformat = guess_format(NULL, filename, NULL);
3220 if (!file_oformat) {
3221 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3227 oc->oformat = file_oformat;
3228 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3230 if (!strcmp(file_oformat->name, "ffm") &&
3231 av_strstart(filename, "http:", NULL)) {
3232 /* special case for files sent to ffserver: we get the stream
3233 parameters from ffserver */
3234 int err = read_ffserver_streams(oc, filename);
3236 print_error(filename, err);
3240 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3241 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3242 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3244 /* disable if no corresponding type found and at least one
3246 if (nb_input_files > 0) {
3247 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3248 &input_has_subtitle);
3249 if (!input_has_video)
3251 if (!input_has_audio)
3253 if (!input_has_subtitle)
3257 /* manual disable */
3258 if (audio_disable) {
3261 if (video_disable) {
3264 if (subtitle_disable) {
3269 new_video_stream(oc);
3273 new_audio_stream(oc);
3277 new_subtitle_stream(oc);
3280 oc->timestamp = rec_timestamp;
3283 av_strlcpy(oc->title, str_title, sizeof(oc->title));
3285 av_strlcpy(oc->author, str_author, sizeof(oc->author));
3287 av_strlcpy(oc->copyright, str_copyright, sizeof(oc->copyright));
3289 av_strlcpy(oc->comment, str_comment, sizeof(oc->comment));
3291 av_strlcpy(oc->album, str_album, sizeof(oc->album));
3293 av_strlcpy(oc->genre, str_genre, sizeof(oc->genre));
3296 output_files[nb_output_files++] = oc;
3298 /* check filename in case of an image number is expected */
3299 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3300 if (!av_filename_number_test(oc->filename)) {
3301 print_error(oc->filename, AVERROR_NUMEXPECTED);
3306 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3307 /* test if it already exists to avoid loosing precious files */
3308 if (!file_overwrite &&
3309 (strchr(filename, ':') == NULL ||
3310 filename[1] == ':' ||
3311 av_strstart(filename, "file:", NULL))) {
3312 if (url_exist(filename)) {
3316 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3319 if (toupper(c) != 'Y') {
3320 fprintf(stderr, "Not overwriting - exiting\n");
3325 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3332 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3333 fprintf(stderr, "Could not open '%s'\n", filename);
3338 memset(ap, 0, sizeof(*ap));
3339 if (av_set_parameters(oc, ap) < 0) {
3340 fprintf(stderr, "%s: Invalid encoding parameters\n",
3345 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3346 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3347 oc->loop_output = loop_output;
3349 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
3351 /* reset some options */
3352 file_oformat = NULL;
3353 file_iformat = NULL;
3356 /* same option as mencoder */
3357 static void opt_pass(const char *pass_str)
3360 pass = atoi(pass_str);
3361 if (pass != 1 && pass != 2) {
3362 fprintf(stderr, "pass number can be only 1 or 2\n");
3368 static int64_t getutime(void)
3370 #ifdef HAVE_GETRUSAGE
3371 struct rusage rusage;
3373 getrusage(RUSAGE_SELF, &rusage);
3374 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3375 #elif defined(HAVE_GETPROCESSTIMES)
3377 FILETIME c, e, k, u;
3378 proc = GetCurrentProcess();
3379 GetProcessTimes(proc, &c, &e, &k, &u);
3380 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3382 return av_gettime();
3386 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3389 const char *p = str;
3396 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3403 static void opt_inter_matrix(const char *arg)
3405 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3406 parse_matrix_coeffs(inter_matrix, arg);
3409 static void opt_intra_matrix(const char *arg)
3411 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3412 parse_matrix_coeffs(intra_matrix, arg);
3416 * Trivial log callback.
3417 * Only suitable for show_help and similar since it lacks prefix handling.
3419 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
3421 vfprintf(stdout, fmt, vl);
3424 static void show_help(void)
3426 av_log_set_callback(log_callback_help);
3427 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3428 "Hyper fast Audio and Video encoder\n");
3430 show_help_options(options, "Main options:\n",
3431 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3432 show_help_options(options, "\nAdvanced options:\n",
3433 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3435 show_help_options(options, "\nVideo options:\n",
3436 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3438 show_help_options(options, "\nAdvanced Video options:\n",
3439 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3440 OPT_VIDEO | OPT_EXPERT);
3441 show_help_options(options, "\nAudio options:\n",
3442 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3444 show_help_options(options, "\nAdvanced Audio options:\n",
3445 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3446 OPT_AUDIO | OPT_EXPERT);
3447 show_help_options(options, "\nSubtitle options:\n",
3448 OPT_SUBTITLE | OPT_GRAB,
3450 show_help_options(options, "\nAudio/Video grab options:\n",
3454 av_opt_show(avctx_opts[0], NULL);
3456 av_opt_show(avformat_opts, NULL);
3458 av_opt_show(sws_opts, NULL);
3461 static void opt_target(const char *arg)
3464 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3466 if(!strncmp(arg, "pal-", 4)) {
3469 } else if(!strncmp(arg, "ntsc-", 5)) {
3472 } else if(!strncmp(arg, "film-", 5)) {
3477 /* Calculate FR via float to avoid int overflow */
3478 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3481 } else if((fr == 29970) || (fr == 23976)) {
3484 /* Try to determine PAL/NTSC by peeking in the input files */
3485 if(nb_input_files) {
3487 for(j = 0; j < nb_input_files; j++) {
3488 for(i = 0; i < input_files[j]->nb_streams; i++) {
3489 AVCodecContext *c = input_files[j]->streams[i]->codec;
3490 if(c->codec_type != CODEC_TYPE_VIDEO)
3492 fr = c->time_base.den * 1000 / c->time_base.num;
3496 } else if((fr == 29970) || (fr == 23976)) {
3506 if(verbose && norm >= 0)
3507 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3511 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3512 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3513 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3517 if(!strcmp(arg, "vcd")) {
3519 opt_video_codec("mpeg1video");
3520 opt_audio_codec("mp2");
3523 opt_frame_size(norm ? "352x240" : "352x288");
3524 opt_frame_rate(NULL, frame_rates[norm]);
3525 opt_default("gop", norm ? "18" : "15");
3527 opt_default("b", "1150000");
3528 opt_default("maxrate", "1150000");
3529 opt_default("minrate", "1150000");
3530 opt_default("bufsize", "327680"); // 40*1024*8;
3532 opt_default("ab", "224000");
3533 audio_sample_rate = 44100;
3536 opt_default("packetsize", "2324");
3537 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3539 /* We have to offset the PTS, so that it is consistent with the SCR.
3540 SCR starts at 36000, but the first two packs contain only padding
3541 and the first pack from the other stream, respectively, may also have
3542 been written before.
3543 So the real data starts at SCR 36000+3*1200. */
3544 mux_preload= (36000+3*1200) / 90000.0; //0.44
3545 } else if(!strcmp(arg, "svcd")) {
3547 opt_video_codec("mpeg2video");
3548 opt_audio_codec("mp2");
3551 opt_frame_size(norm ? "480x480" : "480x576");
3552 opt_frame_rate(NULL, frame_rates[norm]);
3553 opt_default("gop", norm ? "18" : "15");
3555 opt_default("b", "2040000");
3556 opt_default("maxrate", "2516000");
3557 opt_default("minrate", "0"); //1145000;
3558 opt_default("bufsize", "1835008"); //224*1024*8;
3559 opt_default("flags", "+scan_offset");
3562 opt_default("ab", "224000");
3563 audio_sample_rate = 44100;
3565 opt_default("packetsize", "2324");
3567 } else if(!strcmp(arg, "dvd")) {
3569 opt_video_codec("mpeg2video");
3570 opt_audio_codec("ac3");
3573 opt_frame_size(norm ? "720x480" : "720x576");
3574 opt_frame_rate(NULL, frame_rates[norm]);
3575 opt_default("gop", norm ? "18" : "15");
3577 opt_default("b", "6000000");
3578 opt_default("maxrate", "9000000");
3579 opt_default("minrate", "0"); //1500000;
3580 opt_default("bufsize", "1835008"); //224*1024*8;
3582 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3583 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3585 opt_default("ab", "448000");
3586 audio_sample_rate = 48000;
3588 } else if(!strncmp(arg, "dv", 2)) {
3592 opt_frame_size(norm ? "720x480" : "720x576");
3593 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3594 (norm ? "yuv411p" : "yuv420p"));
3595 opt_frame_rate(NULL, frame_rates[norm]);
3597 audio_sample_rate = 48000;
3601 fprintf(stderr, "Unknown target: %s\n", arg);
3606 static void opt_vstats_file (const char *arg)
3608 av_free (vstats_filename);
3609 vstats_filename=av_strdup (arg);
3612 static void opt_vstats (void)
3615 time_t today2 = time(NULL);
3616 struct tm *today = localtime(&today2);
3618 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3620 opt_vstats_file(filename);
3623 static int opt_bsf(const char *opt, const char *arg)
3625 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3626 AVBitStreamFilterContext **bsfp;
3629 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3633 bsfp= *opt == 'v' ? &video_bitstream_filters :
3634 *opt == 'a' ? &audio_bitstream_filters :
3635 &subtitle_bitstream_filters;
3637 bsfp= &(*bsfp)->next;
3644 static int opt_preset(const char *opt, const char *arg)
3647 char tmp[1000], tmp2[1000], line[1000];
3649 const char *base[3]= { getenv("HOME"),
3654 for(i=!base[0]; i<3 && !f; i++){
3655 snprintf(tmp, sizeof(tmp), "%s/%sffmpeg/%s.ffpreset", base[i], i ? "" : ".", arg);
3658 char *codec_name= *opt == 'v' ? video_codec_name :
3659 *opt == 'a' ? audio_codec_name :
3660 subtitle_codec_name;
3661 snprintf(tmp, sizeof(tmp), "%s/%sffmpeg/%s-%s.ffpreset", base[i], i ? "" : ".", codec_name, arg);
3665 if(!f && ((arg[0]=='.' && arg[1]=='/') || arg[0]=='/')){
3670 fprintf(stderr, "Preset file not found\n");
3675 int e= fscanf(f, "%999[^\n]\n", line) - 1;
3676 if(line[0] == '#' && !e)
3678 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
3680 fprintf(stderr, "Preset file invalid\n");
3683 if(!strcmp(tmp, "acodec")){
3684 opt_audio_codec(tmp2);
3685 }else if(!strcmp(tmp, "vcodec")){
3686 opt_video_codec(tmp2);
3687 }else if(!strcmp(tmp, "scodec")){
3688 opt_subtitle_codec(tmp2);
3690 opt_default(tmp, tmp2);
3698 static const OptionDef options[] = {
3700 { "L", OPT_EXIT, {(void*)show_license}, "show license" },
3701 { "h", OPT_EXIT, {(void*)show_help}, "show help" },
3702 { "version", OPT_EXIT, {(void*)show_version}, "show version" },
3703 { "formats", OPT_EXIT, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3704 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3705 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3706 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3707 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3708 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3709 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3710 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3711 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3712 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3713 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
3714 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3715 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3716 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3717 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3718 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3719 { "genre", HAS_ARG | OPT_STRING, {(void*)&str_genre}, "set the genre", "string" },
3720 { "album", HAS_ARG | OPT_STRING, {(void*)&str_album}, "set the album", "string" },
3721 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3722 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3723 "add timings for benchmarking" },
3724 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3725 "dump each input packet" },
3726 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3727 "when dumping packets, also dump the payload" },
3728 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3729 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3730 { "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)", "" },
3731 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set the logging verbosity level", "number" },
3732 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3733 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3734 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3735 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3736 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3737 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3738 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3739 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3740 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3741 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3742 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
3745 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3746 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3747 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3748 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3749 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3750 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3751 { "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" },
3752 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3753 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3754 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3755 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3756 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3757 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3758 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3759 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3760 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3761 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3762 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3763 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3764 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3765 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3766 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3767 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
3768 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3769 "use same video quality as source (implies VBR)" },
3770 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3771 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3772 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3773 "deinterlace pictures" },
3774 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3775 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
3776 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
3778 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3780 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3781 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3782 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3783 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3784 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3785 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3786 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3787 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
3790 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3791 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3792 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3793 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3794 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3795 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3796 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3797 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3798 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3799 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3800 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3801 { "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" },
3803 /* subtitle options */
3804 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
3805 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3806 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
3807 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3810 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3811 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3812 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3815 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
3816 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
3818 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3819 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3820 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3822 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3823 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3824 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3826 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
3830 int main(int argc, char **argv)
3835 avcodec_register_all();
3836 avdevice_register_all();
3839 if(isatty(STDIN_FILENO))
3840 url_set_interrupt_cb(decode_interrupt_cb);
3842 for(i=0; i<CODEC_TYPE_NB; i++){
3843 avctx_opts[i]= avcodec_alloc_context2(i);
3845 avformat_opts = av_alloc_format_context();
3846 sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
3855 parse_options(argc, argv, options, opt_output_file);
3857 /* file converter / grab */
3858 if (nb_output_files <= 0) {
3859 fprintf(stderr, "Must supply at least one output file\n");
3863 if (nb_input_files == 0) {
3864 fprintf(stderr, "Must supply at least one input file\n");
3869 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3870 stream_maps, nb_stream_maps);
3871 ti = getutime() - ti;
3873 printf("bench: utime=%0.3fs\n", ti / 1000000.0);