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;
1314 /* mpeg PTS deordering : if it is a P or I frame, the PTS
1315 is the one of the next displayed one */
1316 /* XXX: add mpeg4 too ? */
1317 if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
1318 if (ist->st->codec->pict_type != B_TYPE) {
1320 tmp = ist->last_ip_pts;
1321 ist->last_ip_pts = ist->frac_pts.val;
1322 ist->frac_pts.val = tmp;
1326 /* if output time reached then transcode raw format,
1327 encode packets and output them */
1328 if (start_time == 0 || ist->pts >= start_time)
1329 for(i=0;i<nb_ostreams;i++) {
1333 if (ost->source_index == ist_index) {
1334 os = output_files[ost->file_index];
1337 printf("%d: got pts=%0.3f %0.3f\n", i,
1338 (double)pkt->pts / AV_TIME_BASE,
1339 ((double)ist->pts / AV_TIME_BASE) -
1340 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1342 /* set the input output pts pairs */
1343 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1345 if (ost->encoding_needed) {
1346 switch(ost->st->codec->codec_type) {
1347 case CODEC_TYPE_AUDIO:
1348 do_audio_out(os, ost, ist, data_buf, data_size);
1350 case CODEC_TYPE_VIDEO:
1351 do_video_out(os, ost, ist, &picture, &frame_size);
1352 if (vstats_filename && frame_size)
1353 do_video_stats(os, ost, frame_size);
1355 case CODEC_TYPE_SUBTITLE:
1356 do_subtitle_out(os, ost, ist, &subtitle,
1363 AVFrame avframe; //FIXME/XXX remove this
1365 av_init_packet(&opkt);
1367 if (!ost->frame_number && !(pkt->flags & PKT_FLAG_KEY))
1370 /* no reencoding needed : output the packet directly */
1371 /* force the input stream PTS */
1373 avcodec_get_frame_defaults(&avframe);
1374 ost->st->codec->coded_frame= &avframe;
1375 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1377 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1378 audio_size += data_size;
1379 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1380 video_size += data_size;
1384 opkt.stream_index= ost->index;
1385 if(pkt->pts != AV_NOPTS_VALUE)
1386 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base);
1388 opkt.pts= AV_NOPTS_VALUE;
1390 if (pkt->dts == AV_NOPTS_VALUE)
1391 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1393 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1395 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1396 opkt.flags= pkt->flags;
1398 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1399 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1400 opkt.destruct= av_destruct_packet;
1402 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][opkt.stream_index]);
1403 ost->st->codec->frame_number++;
1404 ost->frame_number++;
1405 av_free_packet(&opkt);
1409 av_free(buffer_to_free);
1410 /* XXX: allocate the subtitles in the codec ? */
1411 if (subtitle_to_free) {
1412 if (subtitle_to_free->rects != NULL) {
1413 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1414 av_free(subtitle_to_free->rects[i].bitmap);
1415 av_free(subtitle_to_free->rects[i].rgba_palette);
1417 av_freep(&subtitle_to_free->rects);
1419 subtitle_to_free->num_rects = 0;
1420 subtitle_to_free = NULL;
1427 for(i=0;i<nb_ostreams;i++) {
1429 if (ost->source_index == ist_index) {
1430 AVCodecContext *enc= ost->st->codec;
1431 os = output_files[ost->file_index];
1433 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1435 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1438 if (ost->encoding_needed) {
1442 av_init_packet(&pkt);
1443 pkt.stream_index= ost->index;
1445 switch(ost->st->codec->codec_type) {
1446 case CODEC_TYPE_AUDIO:
1447 fifo_bytes = av_fifo_size(&ost->fifo);
1449 /* encode any samples remaining in fifo */
1450 if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1451 int fs_tmp = enc->frame_size;
1452 enc->frame_size = fifo_bytes / (2 * enc->channels);
1453 av_fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes);
1454 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1455 enc->frame_size = fs_tmp;
1458 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1461 pkt.flags |= PKT_FLAG_KEY;
1463 case CODEC_TYPE_VIDEO:
1464 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1466 if(enc->coded_frame && enc->coded_frame->key_frame)
1467 pkt.flags |= PKT_FLAG_KEY;
1468 if (ost->logfile && enc->stats_out) {
1469 fprintf(ost->logfile, "%s", enc->stats_out);
1478 pkt.data= bit_buffer;
1480 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1481 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1482 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1494 static void print_sdp(AVFormatContext **avc, int n)
1498 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1499 printf("SDP:\n%s\n", sdp);
1502 static int stream_index_from_inputs(AVFormatContext **input_files,
1504 AVInputFile *file_table,
1505 AVInputStream **ist_table,
1506 enum CodecType type,
1510 for(z=0; z<nb_input_files; z++) {
1511 AVFormatContext *ic = input_files[z];
1512 for(p=0; p<ic->nb_programs; p++) {
1513 AVProgram *program = ic->programs[p];
1514 if(program->id != programid)
1516 for(q=0; q<program->nb_stream_indexes; q++) {
1517 int sidx = program->stream_index[q];
1518 int ris = file_table[z].ist_index + sidx;
1519 if(ist_table[ris]->discard && ic->streams[sidx]->codec->codec_type == type)
1529 * The following code is the main loop of the file converter
1531 static int av_encode(AVFormatContext **output_files,
1532 int nb_output_files,
1533 AVFormatContext **input_files,
1535 AVStreamMap *stream_maps, int nb_stream_maps)
1537 int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1538 AVFormatContext *is, *os;
1539 AVCodecContext *codec, *icodec;
1540 AVOutputStream *ost, **ost_table = NULL;
1541 AVInputStream *ist, **ist_table = NULL;
1542 AVInputFile *file_table;
1546 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1550 /* input stream init */
1552 for(i=0;i<nb_input_files;i++) {
1553 is = input_files[i];
1554 file_table[i].ist_index = j;
1555 file_table[i].nb_streams = is->nb_streams;
1556 j += is->nb_streams;
1560 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1564 for(i=0;i<nb_istreams;i++) {
1565 ist = av_mallocz(sizeof(AVInputStream));
1571 for(i=0;i<nb_input_files;i++) {
1572 is = input_files[i];
1573 for(k=0;k<is->nb_streams;k++) {
1574 ist = ist_table[j++];
1575 ist->st = is->streams[k];
1576 ist->file_index = i;
1578 ist->discard = 1; /* the stream is discarded by default
1581 if (ist->st->codec->rate_emu) {
1582 ist->start = av_gettime();
1588 /* output stream init */
1590 for(i=0;i<nb_output_files;i++) {
1591 os = output_files[i];
1592 if (!os->nb_streams) {
1593 fprintf(stderr, "Output file does not contain any stream\n");
1596 nb_ostreams += os->nb_streams;
1598 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1599 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1603 /* Sanity check the mapping args -- do the input files & streams exist? */
1604 for(i=0;i<nb_stream_maps;i++) {
1605 int fi = stream_maps[i].file_index;
1606 int si = stream_maps[i].stream_index;
1608 if (fi < 0 || fi > nb_input_files - 1 ||
1609 si < 0 || si > file_table[fi].nb_streams - 1) {
1610 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1613 fi = stream_maps[i].sync_file_index;
1614 si = stream_maps[i].sync_stream_index;
1615 if (fi < 0 || fi > nb_input_files - 1 ||
1616 si < 0 || si > file_table[fi].nb_streams - 1) {
1617 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1622 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1625 for(i=0;i<nb_ostreams;i++) {
1626 ost = av_mallocz(sizeof(AVOutputStream));
1633 for(k=0;k<nb_output_files;k++) {
1634 os = output_files[k];
1635 for(i=0;i<os->nb_streams;i++,n++) {
1638 ost->file_index = k;
1640 ost->st = os->streams[i];
1641 if (nb_stream_maps > 0) {
1642 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
1643 stream_maps[n].stream_index;
1645 /* Sanity check that the stream types match */
1646 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1647 int i= ost->file_index;
1648 dump_format(output_files[i], i, output_files[i]->filename, 1);
1649 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1650 stream_maps[n].file_index, stream_maps[n].stream_index,
1651 ost->file_index, ost->index);
1658 j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid);
1660 ost->source_index = j;
1664 /* get corresponding input stream index : we select the first one with the right type */
1666 for(j=0;j<nb_istreams;j++) {
1669 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1670 ost->source_index = j;
1678 if(! opt_programid) {
1679 /* try again and reuse existing stream */
1680 for(j=0;j<nb_istreams;j++) {
1682 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1683 ost->source_index = j;
1689 int i= ost->file_index;
1690 dump_format(output_files[i], i, output_files[i]->filename, 1);
1691 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1692 ost->file_index, ost->index);
1697 ist = ist_table[ost->source_index];
1699 ost->sync_ist = (nb_stream_maps > 0) ?
1700 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
1701 stream_maps[n].sync_stream_index] : ist;
1705 /* for each output stream, we compute the right encoding parameters */
1706 for(i=0;i<nb_ostreams;i++) {
1708 os = output_files[ost->file_index];
1709 ist = ist_table[ost->source_index];
1711 codec = ost->st->codec;
1712 icodec = ist->st->codec;
1714 if (!ost->st->language[0])
1715 av_strlcpy(ost->st->language, ist->st->language,
1716 sizeof(ost->st->language));
1718 ost->st->disposition = ist->st->disposition;
1720 if (ost->st->stream_copy) {
1721 /* if stream_copy is selected, no need to decode or encode */
1722 codec->codec_id = icodec->codec_id;
1723 codec->codec_type = icodec->codec_type;
1725 if(!codec->codec_tag){
1726 if( !os->oformat->codec_tag
1727 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) > 0
1728 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1729 codec->codec_tag = icodec->codec_tag;
1732 codec->bit_rate = icodec->bit_rate;
1733 codec->extradata= icodec->extradata;
1734 codec->extradata_size= icodec->extradata_size;
1735 if(av_q2d(icodec->time_base) > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000)
1736 codec->time_base = icodec->time_base;
1738 codec->time_base = ist->st->time_base;
1739 switch(codec->codec_type) {
1740 case CODEC_TYPE_AUDIO:
1741 if(audio_volume != 256) {
1742 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1745 codec->sample_rate = icodec->sample_rate;
1746 codec->channels = icodec->channels;
1747 codec->frame_size = icodec->frame_size;
1748 codec->block_align= icodec->block_align;
1749 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1750 codec->block_align= 0;
1751 if(codec->codec_id == CODEC_ID_AC3)
1752 codec->block_align= 0;
1754 case CODEC_TYPE_VIDEO:
1756 fprintf(stderr,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");
1759 codec->pix_fmt = icodec->pix_fmt;
1760 codec->width = icodec->width;
1761 codec->height = icodec->height;
1762 codec->has_b_frames = icodec->has_b_frames;
1764 case CODEC_TYPE_SUBTITLE:
1770 switch(codec->codec_type) {
1771 case CODEC_TYPE_AUDIO:
1772 if (av_fifo_init(&ost->fifo, 1024))
1774 ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
1775 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1776 icodec->request_channels = codec->channels;
1777 ist->decoding_needed = 1;
1778 ost->encoding_needed = 1;
1780 case CODEC_TYPE_VIDEO:
1781 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1782 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1783 ost->video_resample = ((codec->width != icodec->width -
1784 (frame_leftBand + frame_rightBand) +
1785 (frame_padleft + frame_padright)) ||
1786 (codec->height != icodec->height -
1787 (frame_topBand + frame_bottomBand) +
1788 (frame_padtop + frame_padbottom)) ||
1789 (codec->pix_fmt != icodec->pix_fmt));
1790 if (ost->video_crop) {
1791 ost->topBand = frame_topBand;
1792 ost->leftBand = frame_leftBand;
1794 if (ost->video_pad) {
1795 ost->padtop = frame_padtop;
1796 ost->padleft = frame_padleft;
1797 ost->padbottom = frame_padbottom;
1798 ost->padright = frame_padright;
1799 if (!ost->video_resample) {
1800 avcodec_get_frame_defaults(&ost->pict_tmp);
1801 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1802 codec->width, codec->height))
1806 if (ost->video_resample) {
1807 avcodec_get_frame_defaults(&ost->pict_tmp);
1808 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1809 codec->width, codec->height)) {
1810 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1813 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1814 ost->img_resample_ctx = sws_getContext(
1815 icodec->width - (frame_leftBand + frame_rightBand),
1816 icodec->height - (frame_topBand + frame_bottomBand),
1818 codec->width - (frame_padleft + frame_padright),
1819 codec->height - (frame_padtop + frame_padbottom),
1821 sws_flags, NULL, NULL, NULL);
1822 if (ost->img_resample_ctx == NULL) {
1823 fprintf(stderr, "Cannot get resampling context\n");
1826 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1828 ost->encoding_needed = 1;
1829 ist->decoding_needed = 1;
1831 case CODEC_TYPE_SUBTITLE:
1832 ost->encoding_needed = 1;
1833 ist->decoding_needed = 1;
1840 if (ost->encoding_needed &&
1841 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1842 char logfilename[1024];
1847 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1849 pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
1850 if (codec->flags & CODEC_FLAG_PASS1) {
1851 f = fopen(logfilename, "w");
1853 perror(logfilename);
1858 /* read the log file */
1859 f = fopen(logfilename, "r");
1861 perror(logfilename);
1864 fseek(f, 0, SEEK_END);
1866 fseek(f, 0, SEEK_SET);
1867 logbuffer = av_malloc(size + 1);
1869 fprintf(stderr, "Could not allocate log buffer\n");
1872 size = fread(logbuffer, 1, size, f);
1874 logbuffer[size] = '\0';
1875 codec->stats_in = logbuffer;
1879 if(codec->codec_type == CODEC_TYPE_VIDEO){
1880 int size= codec->width * codec->height;
1881 bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
1886 bit_buffer = av_malloc(bit_buffer_size);
1890 /* dump the file output parameters - cannot be done before in case
1892 for(i=0;i<nb_output_files;i++) {
1893 dump_format(output_files[i], i, output_files[i]->filename, 1);
1896 /* dump the stream mapping */
1898 fprintf(stderr, "Stream mapping:\n");
1899 for(i=0;i<nb_ostreams;i++) {
1901 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
1902 ist_table[ost->source_index]->file_index,
1903 ist_table[ost->source_index]->index,
1906 if (ost->sync_ist != ist_table[ost->source_index])
1907 fprintf(stderr, " [sync #%d.%d]",
1908 ost->sync_ist->file_index,
1909 ost->sync_ist->index);
1910 fprintf(stderr, "\n");
1914 /* open each encoder */
1915 for(i=0;i<nb_ostreams;i++) {
1917 if (ost->encoding_needed) {
1919 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1921 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
1922 ost->file_index, ost->index);
1925 if (avcodec_open(ost->st->codec, codec) < 0) {
1926 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
1927 ost->file_index, ost->index);
1930 extra_size += ost->st->codec->extradata_size;
1934 /* open each decoder */
1935 for(i=0;i<nb_istreams;i++) {
1937 if (ist->decoding_needed) {
1939 codec = avcodec_find_decoder(ist->st->codec->codec_id);
1941 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1942 ist->st->codec->codec_id, ist->file_index, ist->index);
1945 if (avcodec_open(ist->st->codec, codec) < 0) {
1946 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
1947 ist->file_index, ist->index);
1950 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
1951 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
1956 for(i=0;i<nb_istreams;i++) {
1958 is = input_files[ist->file_index];
1960 ist->next_pts = AV_NOPTS_VALUE;
1964 /* set meta data information from input file if required */
1965 for (i=0;i<nb_meta_data_maps;i++) {
1966 AVFormatContext *out_file;
1967 AVFormatContext *in_file;
1969 int out_file_index = meta_data_maps[i].out_file;
1970 int in_file_index = meta_data_maps[i].in_file;
1971 if (out_file_index < 0 || out_file_index >= nb_output_files) {
1972 fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1973 ret = AVERROR(EINVAL);
1976 if (in_file_index < 0 || in_file_index >= nb_input_files) {
1977 fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1978 ret = AVERROR(EINVAL);
1982 out_file = output_files[out_file_index];
1983 in_file = input_files[in_file_index];
1985 strcpy(out_file->title, in_file->title);
1986 strcpy(out_file->author, in_file->author);
1987 strcpy(out_file->copyright, in_file->copyright);
1988 strcpy(out_file->comment, in_file->comment);
1989 strcpy(out_file->album, in_file->album);
1990 out_file->year = in_file->year;
1991 out_file->track = in_file->track;
1992 strcpy(out_file->genre, in_file->genre);
1995 /* open files and write file headers */
1996 for(i=0;i<nb_output_files;i++) {
1997 os = output_files[i];
1998 if (av_write_header(os) < 0) {
1999 fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
2000 ret = AVERROR(EINVAL);
2003 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2008 print_sdp(output_files, nb_output_files);
2011 if (!using_stdin && verbose >= 0) {
2012 fprintf(stderr, "Press [q] to stop encoding\n");
2013 url_set_interrupt_cb(decode_interrupt_cb);
2018 timer_start = av_gettime();
2020 for(; received_sigterm == 0;) {
2021 int file_index, ist_index;
2029 /* if 'q' pressed, exits */
2033 /* read_key() returns 0 on EOF */
2039 /* select the stream that we must read now by looking at the
2040 smallest output pts */
2042 for(i=0;i<nb_ostreams;i++) {
2045 os = output_files[ost->file_index];
2046 ist = ist_table[ost->source_index];
2047 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
2048 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
2050 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2051 ipts = (double)ist->pts;
2052 if (!file_table[ist->file_index].eof_reached){
2053 if(ipts < ipts_min) {
2055 if(input_sync ) file_index = ist->file_index;
2057 if(opts < opts_min) {
2059 if(!input_sync) file_index = ist->file_index;
2062 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2067 /* if none, if is finished */
2068 if (file_index < 0) {
2072 /* finish if recording time exhausted */
2073 if (opts_min >= (recording_time / 1000000.0))
2076 /* finish if limit size exhausted */
2077 if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
2080 /* read a frame from it and output it in the fifo */
2081 is = input_files[file_index];
2082 if (av_read_frame(is, &pkt) < 0) {
2083 file_table[file_index].eof_reached = 1;
2091 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2093 /* the following test is needed in case new streams appear
2094 dynamically in stream : we ignore them */
2095 if (pkt.stream_index >= file_table[file_index].nb_streams)
2096 goto discard_packet;
2097 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2098 ist = ist_table[ist_index];
2100 goto discard_packet;
2102 if (pkt.dts != AV_NOPTS_VALUE)
2103 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2104 if (pkt.pts != AV_NOPTS_VALUE)
2105 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2107 if(input_files_ts_scale[file_index][pkt.stream_index]){
2108 if(pkt.pts != AV_NOPTS_VALUE)
2109 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2110 if(pkt.dts != AV_NOPTS_VALUE)
2111 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2114 // 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);
2115 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
2116 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2117 int64_t delta= pkt_dts - ist->next_pts;
2118 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2119 input_files_ts_offset[ist->file_index]-= delta;
2121 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2122 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2123 if(pkt.pts != AV_NOPTS_VALUE)
2124 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2128 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2129 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2132 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2133 ist->file_index, ist->index);
2136 av_free_packet(&pkt);
2141 av_free_packet(&pkt);
2143 /* dump report by using the output first video and audio streams */
2144 print_report(output_files, ost_table, nb_ostreams, 0);
2147 /* at the end of stream, we must flush the decoder buffers */
2148 for(i=0;i<nb_istreams;i++) {
2150 if (ist->decoding_needed) {
2151 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2157 /* write the trailer if needed and close file */
2158 for(i=0;i<nb_output_files;i++) {
2159 os = output_files[i];
2160 av_write_trailer(os);
2163 /* dump report by using the first video and audio streams */
2164 print_report(output_files, ost_table, nb_ostreams, 1);
2166 /* close each encoder */
2167 for(i=0;i<nb_ostreams;i++) {
2169 if (ost->encoding_needed) {
2170 av_freep(&ost->st->codec->stats_in);
2171 avcodec_close(ost->st->codec);
2175 /* close each decoder */
2176 for(i=0;i<nb_istreams;i++) {
2178 if (ist->decoding_needed) {
2179 avcodec_close(ist->st->codec);
2187 av_freep(&bit_buffer);
2188 av_free(file_table);
2191 for(i=0;i<nb_istreams;i++) {
2198 for(i=0;i<nb_ostreams;i++) {
2202 fclose(ost->logfile);
2203 ost->logfile = NULL;
2205 av_fifo_free(&ost->fifo); /* works even if fifo is not
2206 initialized but set to zero */
2207 av_free(ost->pict_tmp.data[0]);
2208 if (ost->video_resample)
2209 sws_freeContext(ost->img_resample_ctx);
2211 audio_resample_close(ost->resample);
2212 if (ost->reformat_ctx)
2213 av_audio_convert_free(ost->reformat_ctx);
2221 ret = AVERROR(ENOMEM);
2226 int file_read(const char *filename)
2229 unsigned char buffer[1024];
2232 if (url_open(&h, filename, O_RDONLY) < 0) {
2233 printf("could not open '%s'\n", filename);
2237 len = url_read(h, buffer, sizeof(buffer));
2240 for(i=0;i<len;i++) putchar(buffer[i]);
2247 static void opt_format(const char *arg)
2249 /* compatibility stuff for pgmyuv */
2250 if (!strcmp(arg, "pgmyuv")) {
2251 pgmyuv_compatibility_hack=1;
2252 // opt_image_format(arg);
2254 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2257 file_iformat = av_find_input_format(arg);
2258 file_oformat = guess_format(arg, NULL, NULL);
2259 if (!file_iformat && !file_oformat) {
2260 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2265 static void opt_video_rc_override_string(const char *arg)
2267 video_rc_override_string = arg;
2270 static int opt_me_threshold(const char *opt, const char *arg)
2272 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2276 static int opt_verbose(const char *opt, const char *arg)
2278 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2279 av_log_set_level(verbose);
2283 static int opt_frame_rate(const char *opt, const char *arg)
2285 if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2286 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2292 static int opt_bitrate(const char *opt, const char *arg)
2294 int codec_type = opt[0]=='a' ? CODEC_TYPE_AUDIO : CODEC_TYPE_VIDEO;
2296 opt_default(opt, arg);
2298 if (av_get_int(avctx_opts[codec_type], "b", NULL) < 1000)
2299 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2304 static void opt_frame_crop_top(const char *arg)
2306 frame_topBand = atoi(arg);
2307 if (frame_topBand < 0) {
2308 fprintf(stderr, "Incorrect top crop size\n");
2311 if ((frame_topBand % 2) != 0) {
2312 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2315 if ((frame_topBand) >= frame_height){
2316 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2319 frame_height -= frame_topBand;
2322 static void opt_frame_crop_bottom(const char *arg)
2324 frame_bottomBand = atoi(arg);
2325 if (frame_bottomBand < 0) {
2326 fprintf(stderr, "Incorrect bottom crop size\n");
2329 if ((frame_bottomBand % 2) != 0) {
2330 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2333 if ((frame_bottomBand) >= frame_height){
2334 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2337 frame_height -= frame_bottomBand;
2340 static void opt_frame_crop_left(const char *arg)
2342 frame_leftBand = atoi(arg);
2343 if (frame_leftBand < 0) {
2344 fprintf(stderr, "Incorrect left crop size\n");
2347 if ((frame_leftBand % 2) != 0) {
2348 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2351 if ((frame_leftBand) >= frame_width){
2352 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2355 frame_width -= frame_leftBand;
2358 static void opt_frame_crop_right(const char *arg)
2360 frame_rightBand = atoi(arg);
2361 if (frame_rightBand < 0) {
2362 fprintf(stderr, "Incorrect right crop size\n");
2365 if ((frame_rightBand % 2) != 0) {
2366 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2369 if ((frame_rightBand) >= frame_width){
2370 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2373 frame_width -= frame_rightBand;
2376 static void opt_frame_size(const char *arg)
2378 if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
2379 fprintf(stderr, "Incorrect frame size\n");
2382 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2383 fprintf(stderr, "Frame size must be a multiple of 2\n");
2389 #define SCALEBITS 10
2390 #define ONE_HALF (1 << (SCALEBITS - 1))
2391 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2393 #define RGB_TO_Y(r, g, b) \
2394 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2395 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2397 #define RGB_TO_U(r1, g1, b1, shift)\
2398 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2399 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2401 #define RGB_TO_V(r1, g1, b1, shift)\
2402 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2403 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2405 static void opt_pad_color(const char *arg) {
2406 /* Input is expected to be six hex digits similar to
2407 how colors are expressed in html tags (but without the #) */
2408 int rgb = strtol(arg, NULL, 16);
2412 g = ((rgb >> 8) & 255);
2415 padcolor[0] = RGB_TO_Y(r,g,b);
2416 padcolor[1] = RGB_TO_U(r,g,b,0);
2417 padcolor[2] = RGB_TO_V(r,g,b,0);
2420 static void opt_frame_pad_top(const char *arg)
2422 frame_padtop = atoi(arg);
2423 if (frame_padtop < 0) {
2424 fprintf(stderr, "Incorrect top pad size\n");
2427 if ((frame_padtop % 2) != 0) {
2428 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2433 static void opt_frame_pad_bottom(const char *arg)
2435 frame_padbottom = atoi(arg);
2436 if (frame_padbottom < 0) {
2437 fprintf(stderr, "Incorrect bottom pad size\n");
2440 if ((frame_padbottom % 2) != 0) {
2441 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2447 static void opt_frame_pad_left(const char *arg)
2449 frame_padleft = atoi(arg);
2450 if (frame_padleft < 0) {
2451 fprintf(stderr, "Incorrect left pad size\n");
2454 if ((frame_padleft % 2) != 0) {
2455 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2461 static void opt_frame_pad_right(const char *arg)
2463 frame_padright = atoi(arg);
2464 if (frame_padright < 0) {
2465 fprintf(stderr, "Incorrect right pad size\n");
2468 if ((frame_padright % 2) != 0) {
2469 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2474 static void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts)
2478 for (i=-1; i < nb_fmts; i++) {
2479 get_fmt_string (fmt_str, sizeof(fmt_str), i);
2480 fprintf(stdout, "%s\n", fmt_str);
2484 static void opt_frame_pix_fmt(const char *arg)
2486 if (strcmp(arg, "list"))
2487 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2489 list_fmts(avcodec_pix_fmt_string, PIX_FMT_NB);
2494 static void opt_frame_aspect_ratio(const char *arg)
2501 p = strchr(arg, ':');
2503 x = strtol(arg, &end, 10);
2505 y = strtol(end+1, &end, 10);
2507 ar = (double)x / (double)y;
2509 ar = strtod(arg, NULL);
2512 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2515 frame_aspect_ratio = ar;
2518 static void opt_qscale(const char *arg)
2520 video_qscale = atof(arg);
2521 if (video_qscale <= 0 ||
2522 video_qscale > 255) {
2523 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2528 static void opt_top_field_first(const char *arg)
2530 top_field_first= atoi(arg);
2533 static int opt_thread_count(const char *opt, const char *arg)
2535 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2536 #if !defined(HAVE_THREADS)
2538 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2543 static void opt_audio_sample_fmt(const char *arg)
2545 if (strcmp(arg, "list"))
2546 audio_sample_fmt = avcodec_get_sample_fmt(arg);
2548 list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
2553 static int opt_audio_rate(const char *opt, const char *arg)
2555 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2559 static int opt_audio_channels(const char *opt, const char *arg)
2561 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2565 static void opt_video_channel(const char *arg)
2567 video_channel = strtol(arg, NULL, 0);
2570 static void opt_video_standard(const char *arg)
2572 video_standard = av_strdup(arg);
2575 static void opt_codec(int *pstream_copy, char **pcodec_name,
2576 int codec_type, const char *arg)
2578 av_freep(pcodec_name);
2579 if (!strcmp(arg, "copy")) {
2582 *pcodec_name = av_strdup(arg);
2586 static void opt_audio_codec(const char *arg)
2588 opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg);
2591 static void opt_audio_tag(const char *arg)
2594 audio_codec_tag= strtol(arg, &tail, 0);
2597 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2600 static void opt_video_tag(const char *arg)
2603 video_codec_tag= strtol(arg, &tail, 0);
2606 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2610 static void add_frame_hooker(const char *arg)
2615 char *args = av_strdup(arg);
2619 argv[0] = strtok(args, " ");
2620 while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
2623 i = frame_hook_add(argc, argv);
2626 fprintf(stderr, "Failed to add video hook function: %s\n", arg);
2632 static void opt_video_codec(const char *arg)
2634 opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg);
2637 static void opt_subtitle_codec(const char *arg)
2639 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
2642 static void opt_map(const char *arg)
2647 m = &stream_maps[nb_stream_maps++];
2649 m->file_index = strtol(arg, &p, 0);
2653 m->stream_index = strtol(p, &p, 0);
2656 m->sync_file_index = strtol(p, &p, 0);
2659 m->sync_stream_index = strtol(p, &p, 0);
2661 m->sync_file_index = m->file_index;
2662 m->sync_stream_index = m->stream_index;
2666 static void opt_map_meta_data(const char *arg)
2671 m = &meta_data_maps[nb_meta_data_maps++];
2673 m->out_file = strtol(arg, &p, 0);
2677 m->in_file = strtol(p, &p, 0);
2680 static void opt_input_ts_scale(const char *arg)
2682 unsigned int stream;
2686 stream = strtol(arg, &p, 0);
2689 scale= strtod(p, &p);
2691 if(stream >= MAX_STREAMS)
2694 input_files_ts_scale[nb_input_files][stream]= scale;
2697 static int opt_recording_time(const char *opt, const char *arg)
2699 recording_time = parse_time_or_die(opt, arg, 1);
2703 static int opt_start_time(const char *opt, const char *arg)
2705 start_time = parse_time_or_die(opt, arg, 1);
2709 static int opt_rec_timestamp(const char *opt, const char *arg)
2711 rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
2715 static int opt_input_ts_offset(const char *opt, const char *arg)
2717 input_ts_offset = parse_time_or_die(opt, arg, 1);
2721 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
2723 const char *codec_string = encoder ? "encoder" : "decoder";
2727 return CODEC_ID_NONE;
2729 avcodec_find_encoder_by_name(name) :
2730 avcodec_find_decoder_by_name(name);
2732 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2735 if(codec->type != type) {
2736 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2742 static void opt_input_file(const char *filename)
2744 AVFormatContext *ic;
2745 AVFormatParameters params, *ap = ¶ms;
2746 int err, i, ret, rfps, rfps_base;
2749 if (!strcmp(filename, "-"))
2752 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2753 !strcmp(filename, "/dev/stdin");
2755 /* get default parameters from command line */
2756 ic = av_alloc_format_context();
2758 memset(ap, 0, sizeof(*ap));
2759 ap->prealloced_context = 1;
2760 ap->sample_rate = audio_sample_rate;
2761 ap->channels = audio_channels;
2762 ap->time_base.den = frame_rate.num;
2763 ap->time_base.num = frame_rate.den;
2764 ap->width = frame_width + frame_padleft + frame_padright;
2765 ap->height = frame_height + frame_padtop + frame_padbottom;
2766 ap->pix_fmt = frame_pix_fmt;
2767 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
2768 ap->channel = video_channel;
2769 ap->standard = video_standard;
2770 ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0);
2771 ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0);
2772 if(pgmyuv_compatibility_hack)
2773 ap->video_codec_id= CODEC_ID_PGMYUV;
2775 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
2777 ic->video_codec_id = find_codec_or_die(video_codec_name , CODEC_TYPE_VIDEO , 0);
2778 ic->audio_codec_id = find_codec_or_die(audio_codec_name , CODEC_TYPE_AUDIO , 0);
2779 ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 0);
2781 /* open the input file with generic libav function */
2782 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2784 print_error(filename, err);
2789 for(i=0; i<ic->nb_programs; i++)
2790 if(ic->programs[i]->id != opt_programid)
2791 ic->programs[i]->discard = AVDISCARD_ALL;
2794 ic->loop_input = loop_input;
2796 /* If not enough info to get the stream parameters, we decode the
2797 first frames to get it. (used in mpeg case for example) */
2798 ret = av_find_stream_info(ic);
2799 if (ret < 0 && verbose >= 0) {
2800 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2804 timestamp = start_time;
2805 /* add the stream start time */
2806 if (ic->start_time != AV_NOPTS_VALUE)
2807 timestamp += ic->start_time;
2809 /* if seeking requested, we execute it */
2810 if (start_time != 0) {
2811 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2813 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2814 filename, (double)timestamp / AV_TIME_BASE);
2816 /* reset seek info */
2820 /* update the current parameters so that they match the one of the input stream */
2821 for(i=0;i<ic->nb_streams;i++) {
2822 AVCodecContext *enc = ic->streams[i]->codec;
2824 avcodec_thread_init(enc, thread_count);
2825 enc->thread_count= thread_count;
2826 switch(enc->codec_type) {
2827 case CODEC_TYPE_AUDIO:
2828 set_context_opts(enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2829 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2830 audio_channels = enc->channels;
2831 audio_sample_rate = enc->sample_rate;
2832 audio_sample_fmt = enc->sample_fmt;
2834 ic->streams[i]->discard= AVDISCARD_ALL;
2836 case CODEC_TYPE_VIDEO:
2837 set_context_opts(enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2838 frame_height = enc->height;
2839 frame_width = enc->width;
2840 if(ic->streams[i]->sample_aspect_ratio.num)
2841 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
2843 frame_aspect_ratio=av_q2d(enc->sample_aspect_ratio);
2844 frame_aspect_ratio *= (float) enc->width / enc->height;
2845 frame_pix_fmt = enc->pix_fmt;
2846 rfps = ic->streams[i]->r_frame_rate.num;
2847 rfps_base = ic->streams[i]->r_frame_rate.den;
2848 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2850 enc->debug |= FF_DEBUG_MV;
2852 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2855 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2856 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2858 (float)rfps / rfps_base, rfps, rfps_base);
2860 /* update the current frame rate to match the stream frame rate */
2861 frame_rate.num = rfps;
2862 frame_rate.den = rfps_base;
2864 enc->rate_emu = rate_emu;
2866 ic->streams[i]->discard= AVDISCARD_ALL;
2867 else if(video_discard)
2868 ic->streams[i]->discard= video_discard;
2870 case CODEC_TYPE_DATA:
2872 case CODEC_TYPE_SUBTITLE:
2873 if(subtitle_disable)
2874 ic->streams[i]->discard = AVDISCARD_ALL;
2876 case CODEC_TYPE_ATTACHMENT:
2877 case CODEC_TYPE_UNKNOWN:
2884 input_files[nb_input_files] = ic;
2885 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
2886 /* dump the file content */
2888 dump_format(ic, nb_input_files, filename, 0);
2891 file_iformat = NULL;
2892 file_oformat = NULL;
2897 av_freep(&video_codec_name);
2898 av_freep(&audio_codec_name);
2899 av_freep(&subtitle_codec_name);
2902 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
2903 int *has_subtitle_ptr)
2905 int has_video, has_audio, has_subtitle, i, j;
2906 AVFormatContext *ic;
2911 for(j=0;j<nb_input_files;j++) {
2912 ic = input_files[j];
2913 for(i=0;i<ic->nb_streams;i++) {
2914 AVCodecContext *enc = ic->streams[i]->codec;
2915 switch(enc->codec_type) {
2916 case CODEC_TYPE_AUDIO:
2919 case CODEC_TYPE_VIDEO:
2922 case CODEC_TYPE_SUBTITLE:
2925 case CODEC_TYPE_DATA:
2926 case CODEC_TYPE_ATTACHMENT:
2927 case CODEC_TYPE_UNKNOWN:
2934 *has_video_ptr = has_video;
2935 *has_audio_ptr = has_audio;
2936 *has_subtitle_ptr = has_subtitle;
2939 static void new_video_stream(AVFormatContext *oc)
2942 AVCodecContext *video_enc;
2945 st = av_new_stream(oc, oc->nb_streams);
2947 fprintf(stderr, "Could not alloc stream\n");
2950 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
2951 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
2952 video_bitstream_filters= NULL;
2955 avcodec_thread_init(st->codec, thread_count);
2957 video_enc = st->codec;
2960 video_enc->codec_tag= video_codec_tag;
2962 if( (video_global_header&1)
2963 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
2964 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2965 avctx_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
2967 if(video_global_header&2){
2968 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
2969 avctx_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
2972 if (video_stream_copy) {
2973 st->stream_copy = 1;
2974 video_enc->codec_type = CODEC_TYPE_VIDEO;
2975 video_enc->sample_aspect_ratio =
2976 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
2981 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
2983 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
2984 if (video_codec_name)
2985 codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
2987 video_enc->codec_id = codec_id;
2988 codec = avcodec_find_encoder(codec_id);
2990 set_context_opts(video_enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
2992 if (codec && codec->supported_framerates && !force_fps)
2993 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
2994 video_enc->time_base.den = fps.num;
2995 video_enc->time_base.num = fps.den;
2997 video_enc->width = frame_width + frame_padright + frame_padleft;
2998 video_enc->height = frame_height + frame_padtop + frame_padbottom;
2999 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3000 video_enc->pix_fmt = frame_pix_fmt;
3001 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3003 if(codec && codec->pix_fmts){
3004 const enum PixelFormat *p= codec->pix_fmts;
3006 if(*p == video_enc->pix_fmt)
3010 video_enc->pix_fmt = codec->pix_fmts[0];
3014 video_enc->gop_size = 0;
3015 if (video_qscale || same_quality) {
3016 video_enc->flags |= CODEC_FLAG_QSCALE;
3017 video_enc->global_quality=
3018 st->quality = FF_QP2LAMBDA * video_qscale;
3022 video_enc->intra_matrix = intra_matrix;
3024 video_enc->inter_matrix = inter_matrix;
3026 video_enc->thread_count = thread_count;
3027 p= video_rc_override_string;
3030 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3032 fprintf(stderr, "error parsing rc_override\n");
3035 video_enc->rc_override=
3036 av_realloc(video_enc->rc_override,
3037 sizeof(RcOverride)*(i+1));
3038 video_enc->rc_override[i].start_frame= start;
3039 video_enc->rc_override[i].end_frame = end;
3041 video_enc->rc_override[i].qscale= q;
3042 video_enc->rc_override[i].quality_factor= 1.0;
3045 video_enc->rc_override[i].qscale= 0;
3046 video_enc->rc_override[i].quality_factor= -q/100.0;
3051 video_enc->rc_override_count=i;
3052 if (!video_enc->rc_initial_buffer_occupancy)
3053 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3054 video_enc->me_threshold= me_threshold;
3055 video_enc->intra_dc_precision= intra_dc_precision - 8;
3058 video_enc->flags|= CODEC_FLAG_PSNR;
3063 video_enc->flags |= CODEC_FLAG_PASS1;
3065 video_enc->flags |= CODEC_FLAG_PASS2;
3070 /* reset some key parameters */
3072 av_freep(&video_codec_name);
3073 video_stream_copy = 0;
3076 static void new_audio_stream(AVFormatContext *oc)
3079 AVCodecContext *audio_enc;
3082 st = av_new_stream(oc, oc->nb_streams);
3084 fprintf(stderr, "Could not alloc stream\n");
3087 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
3089 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
3090 audio_bitstream_filters= NULL;
3093 avcodec_thread_init(st->codec, thread_count);
3095 audio_enc = st->codec;
3096 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3099 audio_enc->codec_tag= audio_codec_tag;
3101 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3102 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3103 avctx_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3105 if (audio_stream_copy) {
3106 st->stream_copy = 1;
3107 audio_enc->channels = audio_channels;
3110 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3112 set_context_opts(audio_enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3114 if (audio_codec_name)
3115 codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
3116 audio_enc->codec_id = codec_id;
3117 codec = avcodec_find_encoder(codec_id);
3119 if (audio_qscale > QSCALE_NONE) {
3120 audio_enc->flags |= CODEC_FLAG_QSCALE;
3121 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3123 audio_enc->thread_count = thread_count;
3124 audio_enc->channels = audio_channels;
3125 audio_enc->sample_fmt = audio_sample_fmt;
3127 if(codec && codec->sample_fmts){
3128 const enum SampleFormat *p= codec->sample_fmts;
3130 if(*p == audio_enc->sample_fmt)
3134 audio_enc->sample_fmt = codec->sample_fmts[0];
3137 audio_enc->sample_rate = audio_sample_rate;
3138 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3139 if (audio_language) {
3140 av_strlcpy(st->language, audio_language, sizeof(st->language));
3141 av_free(audio_language);
3142 audio_language = NULL;
3145 /* reset some key parameters */
3147 av_freep(&audio_codec_name);
3148 audio_stream_copy = 0;
3151 static void new_subtitle_stream(AVFormatContext *oc)
3154 AVCodecContext *subtitle_enc;
3156 st = av_new_stream(oc, oc->nb_streams);
3158 fprintf(stderr, "Could not alloc stream\n");
3161 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
3163 bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
3164 subtitle_bitstream_filters= NULL;
3166 subtitle_enc = st->codec;
3167 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3168 if (subtitle_stream_copy) {
3169 st->stream_copy = 1;
3171 set_context_opts(avctx_opts[CODEC_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3172 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1);
3175 if (subtitle_language) {
3176 av_strlcpy(st->language, subtitle_language, sizeof(st->language));
3177 av_free(subtitle_language);
3178 subtitle_language = NULL;
3181 subtitle_disable = 0;
3182 av_freep(&subtitle_codec_name);
3183 subtitle_stream_copy = 0;
3186 static void opt_new_audio_stream(void)
3188 AVFormatContext *oc;
3189 if (nb_output_files <= 0) {
3190 fprintf(stderr, "At least one output file must be specified\n");
3193 oc = output_files[nb_output_files - 1];
3194 new_audio_stream(oc);
3197 static void opt_new_video_stream(void)
3199 AVFormatContext *oc;
3200 if (nb_output_files <= 0) {
3201 fprintf(stderr, "At least one output file must be specified\n");
3204 oc = output_files[nb_output_files - 1];
3205 new_video_stream(oc);
3208 static void opt_new_subtitle_stream(void)
3210 AVFormatContext *oc;
3211 if (nb_output_files <= 0) {
3212 fprintf(stderr, "At least one output file must be specified\n");
3215 oc = output_files[nb_output_files - 1];
3216 new_subtitle_stream(oc);
3219 static void opt_output_file(const char *filename)
3221 AVFormatContext *oc;
3222 int use_video, use_audio, use_subtitle;
3223 int input_has_video, input_has_audio, input_has_subtitle;
3224 AVFormatParameters params, *ap = ¶ms;
3226 if (!strcmp(filename, "-"))
3229 oc = av_alloc_format_context();
3231 if (!file_oformat) {
3232 file_oformat = guess_format(NULL, filename, NULL);
3233 if (!file_oformat) {
3234 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3240 oc->oformat = file_oformat;
3241 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3243 if (!strcmp(file_oformat->name, "ffm") &&
3244 av_strstart(filename, "http:", NULL)) {
3245 /* special case for files sent to ffserver: we get the stream
3246 parameters from ffserver */
3247 int err = read_ffserver_streams(oc, filename);
3249 print_error(filename, err);
3253 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3254 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3255 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3257 /* disable if no corresponding type found and at least one
3259 if (nb_input_files > 0) {
3260 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3261 &input_has_subtitle);
3262 if (!input_has_video)
3264 if (!input_has_audio)
3266 if (!input_has_subtitle)
3270 /* manual disable */
3271 if (audio_disable) {
3274 if (video_disable) {
3277 if (subtitle_disable) {
3282 new_video_stream(oc);
3286 new_audio_stream(oc);
3290 new_subtitle_stream(oc);
3293 oc->timestamp = rec_timestamp;
3296 av_strlcpy(oc->title, str_title, sizeof(oc->title));
3298 av_strlcpy(oc->author, str_author, sizeof(oc->author));
3300 av_strlcpy(oc->copyright, str_copyright, sizeof(oc->copyright));
3302 av_strlcpy(oc->comment, str_comment, sizeof(oc->comment));
3304 av_strlcpy(oc->album, str_album, sizeof(oc->album));
3306 av_strlcpy(oc->genre, str_genre, sizeof(oc->genre));
3309 output_files[nb_output_files++] = oc;
3311 /* check filename in case of an image number is expected */
3312 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3313 if (!av_filename_number_test(oc->filename)) {
3314 print_error(oc->filename, AVERROR_NUMEXPECTED);
3319 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3320 /* test if it already exists to avoid loosing precious files */
3321 if (!file_overwrite &&
3322 (strchr(filename, ':') == NULL ||
3323 filename[1] == ':' ||
3324 av_strstart(filename, "file:", NULL))) {
3325 if (url_exist(filename)) {
3329 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3332 if (toupper(c) != 'Y') {
3333 fprintf(stderr, "Not overwriting - exiting\n");
3338 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3345 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3346 fprintf(stderr, "Could not open '%s'\n", filename);
3351 memset(ap, 0, sizeof(*ap));
3352 if (av_set_parameters(oc, ap) < 0) {
3353 fprintf(stderr, "%s: Invalid encoding parameters\n",
3358 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3359 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3360 oc->loop_output = loop_output;
3362 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
3364 /* reset some options */
3365 file_oformat = NULL;
3366 file_iformat = NULL;
3369 /* same option as mencoder */
3370 static void opt_pass(const char *pass_str)
3373 pass = atoi(pass_str);
3374 if (pass != 1 && pass != 2) {
3375 fprintf(stderr, "pass number can be only 1 or 2\n");
3381 static int64_t getutime(void)
3383 #ifdef HAVE_GETRUSAGE
3384 struct rusage rusage;
3386 getrusage(RUSAGE_SELF, &rusage);
3387 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3388 #elif defined(HAVE_GETPROCESSTIMES)
3390 FILETIME c, e, k, u;
3391 proc = GetCurrentProcess();
3392 GetProcessTimes(proc, &c, &e, &k, &u);
3393 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3395 return av_gettime();
3399 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3402 const char *p = str;
3409 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3416 static void opt_inter_matrix(const char *arg)
3418 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3419 parse_matrix_coeffs(inter_matrix, arg);
3422 static void opt_intra_matrix(const char *arg)
3424 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3425 parse_matrix_coeffs(intra_matrix, arg);
3429 * Trivial log callback.
3430 * Only suitable for show_help and similar since it lacks prefix handling.
3432 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
3434 vfprintf(stdout, fmt, vl);
3437 static void show_help(void)
3439 av_log_set_callback(log_callback_help);
3440 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3441 "Hyper fast Audio and Video encoder\n");
3443 show_help_options(options, "Main options:\n",
3444 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3445 show_help_options(options, "\nAdvanced options:\n",
3446 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3448 show_help_options(options, "\nVideo options:\n",
3449 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3451 show_help_options(options, "\nAdvanced Video options:\n",
3452 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3453 OPT_VIDEO | OPT_EXPERT);
3454 show_help_options(options, "\nAudio options:\n",
3455 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3457 show_help_options(options, "\nAdvanced Audio options:\n",
3458 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3459 OPT_AUDIO | OPT_EXPERT);
3460 show_help_options(options, "\nSubtitle options:\n",
3461 OPT_SUBTITLE | OPT_GRAB,
3463 show_help_options(options, "\nAudio/Video grab options:\n",
3467 av_opt_show(avctx_opts[0], NULL);
3469 av_opt_show(avformat_opts, NULL);
3471 av_opt_show(sws_opts, NULL);
3474 static void opt_target(const char *arg)
3477 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3479 if(!strncmp(arg, "pal-", 4)) {
3482 } else if(!strncmp(arg, "ntsc-", 5)) {
3485 } else if(!strncmp(arg, "film-", 5)) {
3490 /* Calculate FR via float to avoid int overflow */
3491 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3494 } else if((fr == 29970) || (fr == 23976)) {
3497 /* Try to determine PAL/NTSC by peeking in the input files */
3498 if(nb_input_files) {
3500 for(j = 0; j < nb_input_files; j++) {
3501 for(i = 0; i < input_files[j]->nb_streams; i++) {
3502 AVCodecContext *c = input_files[j]->streams[i]->codec;
3503 if(c->codec_type != CODEC_TYPE_VIDEO)
3505 fr = c->time_base.den * 1000 / c->time_base.num;
3509 } else if((fr == 29970) || (fr == 23976)) {
3519 if(verbose && norm >= 0)
3520 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3524 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3525 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3526 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3530 if(!strcmp(arg, "vcd")) {
3532 opt_video_codec("mpeg1video");
3533 opt_audio_codec("mp2");
3536 opt_frame_size(norm ? "352x240" : "352x288");
3537 opt_frame_rate(NULL, frame_rates[norm]);
3538 opt_default("gop", norm ? "18" : "15");
3540 opt_default("b", "1150000");
3541 opt_default("maxrate", "1150000");
3542 opt_default("minrate", "1150000");
3543 opt_default("bufsize", "327680"); // 40*1024*8;
3545 opt_default("ab", "224000");
3546 audio_sample_rate = 44100;
3549 opt_default("packetsize", "2324");
3550 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3552 /* We have to offset the PTS, so that it is consistent with the SCR.
3553 SCR starts at 36000, but the first two packs contain only padding
3554 and the first pack from the other stream, respectively, may also have
3555 been written before.
3556 So the real data starts at SCR 36000+3*1200. */
3557 mux_preload= (36000+3*1200) / 90000.0; //0.44
3558 } else if(!strcmp(arg, "svcd")) {
3560 opt_video_codec("mpeg2video");
3561 opt_audio_codec("mp2");
3564 opt_frame_size(norm ? "480x480" : "480x576");
3565 opt_frame_rate(NULL, frame_rates[norm]);
3566 opt_default("gop", norm ? "18" : "15");
3568 opt_default("b", "2040000");
3569 opt_default("maxrate", "2516000");
3570 opt_default("minrate", "0"); //1145000;
3571 opt_default("bufsize", "1835008"); //224*1024*8;
3572 opt_default("flags", "+scan_offset");
3575 opt_default("ab", "224000");
3576 audio_sample_rate = 44100;
3578 opt_default("packetsize", "2324");
3580 } else if(!strcmp(arg, "dvd")) {
3582 opt_video_codec("mpeg2video");
3583 opt_audio_codec("ac3");
3586 opt_frame_size(norm ? "720x480" : "720x576");
3587 opt_frame_rate(NULL, frame_rates[norm]);
3588 opt_default("gop", norm ? "18" : "15");
3590 opt_default("b", "6000000");
3591 opt_default("maxrate", "9000000");
3592 opt_default("minrate", "0"); //1500000;
3593 opt_default("bufsize", "1835008"); //224*1024*8;
3595 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3596 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3598 opt_default("ab", "448000");
3599 audio_sample_rate = 48000;
3601 } else if(!strncmp(arg, "dv", 2)) {
3605 opt_frame_size(norm ? "720x480" : "720x576");
3606 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3607 (norm ? "yuv411p" : "yuv420p"));
3608 opt_frame_rate(NULL, frame_rates[norm]);
3610 audio_sample_rate = 48000;
3614 fprintf(stderr, "Unknown target: %s\n", arg);
3619 static void opt_vstats_file (const char *arg)
3621 av_free (vstats_filename);
3622 vstats_filename=av_strdup (arg);
3625 static void opt_vstats (void)
3628 time_t today2 = time(NULL);
3629 struct tm *today = localtime(&today2);
3631 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3633 opt_vstats_file(filename);
3636 static int opt_bsf(const char *opt, const char *arg)
3638 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3639 AVBitStreamFilterContext **bsfp;
3642 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3646 bsfp= *opt == 'v' ? &video_bitstream_filters :
3647 *opt == 'a' ? &audio_bitstream_filters :
3648 &subtitle_bitstream_filters;
3650 bsfp= &(*bsfp)->next;
3657 static int opt_preset(const char *opt, const char *arg)
3660 char tmp[1000], tmp2[1000], line[1000];
3662 const char *base[3]= { getenv("HOME"),
3667 for(i=!base[0]; i<3 && !f; i++){
3668 snprintf(tmp, sizeof(tmp), "%s/%sffmpeg/%s.ffpreset", base[i], i ? "" : ".", arg);
3671 char *codec_name= *opt == 'v' ? video_codec_name :
3672 *opt == 'a' ? audio_codec_name :
3673 subtitle_codec_name;
3674 snprintf(tmp, sizeof(tmp), "%s/%sffmpeg/%s-%s.ffpreset", base[i], i ? "" : ".", codec_name, arg);
3678 if(!f && ((arg[0]=='.' && arg[1]=='/') || arg[0]=='/')){
3683 fprintf(stderr, "Preset file not found\n");
3688 int e= fscanf(f, "%999[^\n]\n", line) - 1;
3689 if(line[0] == '#' && !e)
3691 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
3693 fprintf(stderr, "Preset file invalid\n");
3696 if(!strcmp(tmp, "acodec")){
3697 opt_audio_codec(tmp2);
3698 }else if(!strcmp(tmp, "vcodec")){
3699 opt_video_codec(tmp2);
3700 }else if(!strcmp(tmp, "scodec")){
3701 opt_subtitle_codec(tmp2);
3703 opt_default(tmp, tmp2);
3711 static const OptionDef options[] = {
3713 { "L", OPT_EXIT, {(void*)show_license}, "show license" },
3714 { "h", OPT_EXIT, {(void*)show_help}, "show help" },
3715 { "version", OPT_EXIT, {(void*)show_version}, "show version" },
3716 { "formats", OPT_EXIT, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3717 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3718 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3719 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3720 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3721 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3722 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3723 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3724 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3725 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3726 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
3727 { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3728 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
3729 { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
3730 { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
3731 { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3732 { "genre", HAS_ARG | OPT_STRING, {(void*)&str_genre}, "set the genre", "string" },
3733 { "album", HAS_ARG | OPT_STRING, {(void*)&str_album}, "set the album", "string" },
3734 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3735 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3736 "add timings for benchmarking" },
3737 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3738 "dump each input packet" },
3739 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3740 "when dumping packets, also dump the payload" },
3741 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3742 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3743 { "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)", "" },
3744 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set the logging verbosity level", "number" },
3745 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3746 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3747 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3748 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3749 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3750 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3751 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3752 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3753 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3754 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3755 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
3758 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3759 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3760 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3761 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3762 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3763 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3764 { "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" },
3765 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3766 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3767 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3768 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3769 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3770 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3771 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3772 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3773 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3774 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3775 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3776 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3777 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3778 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3779 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3780 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
3781 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3782 "use same video quality as source (implies VBR)" },
3783 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3784 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3785 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3786 "deinterlace pictures" },
3787 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3788 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
3789 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
3791 { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3793 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3794 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3795 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3796 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3797 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3798 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3799 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3800 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
3803 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3804 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3805 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3806 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3807 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3808 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3809 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3810 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3811 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3812 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3813 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3814 { "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" },
3816 /* subtitle options */
3817 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
3818 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3819 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
3820 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3823 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3824 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3825 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3828 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
3829 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
3831 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3832 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3833 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3835 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3836 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3837 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "", "preset" },
3839 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
3843 int main(int argc, char **argv)
3848 avcodec_register_all();
3849 avdevice_register_all();
3852 if(isatty(STDIN_FILENO))
3853 url_set_interrupt_cb(decode_interrupt_cb);
3855 for(i=0; i<CODEC_TYPE_NB; i++){
3856 avctx_opts[i]= avcodec_alloc_context2(i);
3858 avformat_opts = av_alloc_format_context();
3859 sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
3868 parse_options(argc, argv, options, opt_output_file);
3870 /* file converter / grab */
3871 if (nb_output_files <= 0) {
3872 fprintf(stderr, "Must supply at least one output file\n");
3876 if (nb_input_files == 0) {
3877 fprintf(stderr, "Must supply at least one input file\n");
3882 av_encode(output_files, nb_output_files, input_files, nb_input_files,
3883 stream_maps, nb_stream_maps);
3884 ti = getutime() - ti;
3886 printf("bench: utime=%0.3fs\n", ti / 1000000.0);