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 "libavcodec/opt.h"
38 #include "libavcodec/audioconvert.h"
39 #include "libavutil/fifo.h"
40 #include "libavutil/avstring.h"
41 #include "libavformat/os_support.h"
42 #include "recorder_config.h"
44 #if HAVE_SYS_RESOURCE_H
45 #include <sys/types.h>
46 #include <sys/resource.h>
47 #elif HAVE_GETPROCESSTIMES
52 #include <sys/select.h>
57 #include <sys/ioctl.h>
63 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
66 #ifdef CONFIG_FFMPEG_WITH_FRSH
77 const char program_name[] = "FFmpeg";
78 const int program_birth_year = 2000;
80 /* select an input stream for an output stream */
81 typedef struct AVStreamMap {
85 int sync_stream_index;
88 /** select an input file for an output file */
89 typedef struct AVMetaDataMap {
94 static const OptionDef options[];
98 static AVFormatContext *input_files[MAX_FILES];
99 static int64_t input_files_ts_offset[MAX_FILES];
100 static double input_files_ts_scale[MAX_FILES][MAX_STREAMS];
101 static AVCodec *input_codecs[MAX_FILES*MAX_STREAMS];
102 static int nb_input_files = 0;
103 static int nb_icodecs;
105 static AVFormatContext *output_files[MAX_FILES];
106 static AVCodec *output_codecs[MAX_FILES*MAX_STREAMS];
107 static int nb_output_files = 0;
108 static int nb_ocodecs;
110 static AVStreamMap stream_maps[MAX_FILES*MAX_STREAMS];
111 static int nb_stream_maps;
113 static AVMetaDataMap meta_data_maps[MAX_FILES];
114 static int nb_meta_data_maps;
116 static AVInputFormat *file_iformat;
117 static AVOutputFormat *file_oformat;
118 static int frame_width = 0;
119 static int frame_height = 0;
120 static float frame_aspect_ratio = 0;
121 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
122 static enum SampleFormat audio_sample_fmt = SAMPLE_FMT_NONE;
123 static int frame_padtop = 0;
124 static int frame_padbottom = 0;
125 static int frame_padleft = 0;
126 static int frame_padright = 0;
127 static int padcolor[3] = {16,128,128}; /* default to black */
128 static int frame_topBand = 0;
129 static int frame_bottomBand = 0;
130 static int frame_leftBand = 0;
131 static int frame_rightBand = 0;
132 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
133 static AVRational frame_rate;
134 static float video_qscale = 0;
135 static uint16_t *intra_matrix = NULL;
136 static uint16_t *inter_matrix = NULL;
137 #if 0 //experimental, (can be removed)
138 static float video_rc_qsquish=1.0;
139 static float video_rc_qmod_amp=0;
140 static int video_rc_qmod_freq=0;
142 static const char *video_rc_override_string=NULL;
143 static int video_disable = 0;
144 static int video_discard = 0;
145 static char *video_codec_name = NULL;
146 static int video_codec_tag = 0;
147 static int same_quality = 0;
148 static int do_deinterlace = 0;
149 static int top_field_first = -1;
150 static int me_threshold = 0;
151 static int intra_dc_precision = 8;
152 static int loop_input = 0;
153 static int loop_output = AVFMT_NOOUTPUTLOOP;
154 static int qp_hist = 0;
156 static int intra_only = 0;
157 static int audio_sample_rate = 44100;
158 static int64_t channel_layout = 0;
159 #define QSCALE_NONE -99999
160 static float audio_qscale = QSCALE_NONE;
161 static int audio_disable = 0;
162 static int audio_channels = 1;
163 static char *audio_codec_name = NULL;
164 static int audio_codec_tag = 0;
165 static char *audio_language = NULL;
167 static int subtitle_disable = 0;
168 static char *subtitle_codec_name = NULL;
169 static char *subtitle_language = NULL;
170 static int subtitle_codec_tag = 0;
172 static float mux_preload= 0.5;
173 static float mux_max_delay= 0.7;
175 static int64_t recording_time = INT64_MAX;
176 static int64_t start_time = 0;
177 static int64_t rec_timestamp = 0;
178 static int64_t input_ts_offset = 0;
179 static int file_overwrite = 0;
180 static int metadata_count;
181 static AVMetadataTag *metadata;
182 static int do_benchmark = 0;
183 static int do_hex_dump = 0;
184 static int do_pkt_dump = 0;
185 static int do_psnr = 0;
186 static int do_pass = 0;
187 static char *pass_logfilename_prefix = NULL;
188 static int audio_stream_copy = 0;
189 static int video_stream_copy = 0;
190 static int subtitle_stream_copy = 0;
191 static int video_sync_method= -1;
192 static int audio_sync_method= 0;
193 static float audio_drift_threshold= 0.1;
194 static int copy_ts= 0;
195 static int opt_shortest = 0;
196 static int video_global_header = 0;
197 static char *vstats_filename;
198 static FILE *vstats_file;
199 static int opt_programid = 0;
200 static int copy_initial_nonkeyframes = 0;
202 static int rate_emu = 0;
204 static int video_channel = 0;
205 static char *video_standard;
207 static int audio_volume = 256;
209 static int exit_on_error = 0;
210 static int using_stdin = 0;
211 static int verbose = 1;
212 static int thread_count= 1;
213 static int q_pressed = 0;
214 static int64_t video_size = 0;
215 static int64_t audio_size = 0;
216 static int64_t extra_size = 0;
217 static int nb_frames_dup = 0;
218 static int nb_frames_drop = 0;
219 static int input_sync;
220 static uint64_t limit_filesize = 0;
221 static int force_fps = 0;
223 static int pgmyuv_compatibility_hack=0;
224 static float dts_delta_threshold = 10;
226 static unsigned int sws_flags = SWS_BICUBIC;
228 static int64_t timer_start;
230 static uint8_t *audio_buf;
231 static uint8_t *audio_out;
232 static uint8_t *audio_out2;
234 static short *samples;
236 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
237 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
238 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
239 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
241 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
243 struct AVInputStream;
245 typedef struct AVOutputStream {
246 int file_index; /* file index */
247 int index; /* stream index in the output file */
248 int source_index; /* AVInputStream index */
249 AVStream *st; /* stream in the output file */
250 int encoding_needed; /* true if encoding needed for this stream */
252 /* input pts and corresponding output pts
254 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
255 struct AVInputStream *sync_ist; /* input stream to sync against */
256 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
259 AVFrame pict_tmp; /* temporary image for resampling */
260 struct SwsContext *img_resample_ctx; /* for image resampling */
264 int topBand; /* cropping area sizes */
268 int padtop; /* padding area sizes */
275 ReSampleContext *resample; /* for audio resampling */
277 AVAudioConvert *reformat_ctx;
278 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
282 typedef struct AVInputStream {
286 int discard; /* true if stream data should be discarded */
287 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
288 int64_t sample_index; /* current sample */
290 int64_t start; /* time when read started */
291 int64_t next_pts; /* synthetic pts for cases where pkt.pts
293 int64_t pts; /* current pts */
294 int is_start; /* is 1 at the start and after a discontinuity */
297 typedef struct AVInputFile {
298 int eof_reached; /* true if eof reached */
299 int ist_index; /* index of first stream in ist_table */
300 int buffer_size; /* current total buffer size */
301 int nb_streams; /* nb streams we are aware of */
306 /* init terminal so that we can grab keys */
307 static struct termios oldtty;
310 static void term_exit(void)
313 tcsetattr (0, TCSANOW, &oldtty);
317 static volatile sig_atomic_t received_sigterm = 0;
320 sigterm_handler(int sig)
322 received_sigterm = sig;
326 static void term_init(void)
334 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
335 |INLCR|IGNCR|ICRNL|IXON);
336 tty.c_oflag |= OPOST;
337 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
338 tty.c_cflag &= ~(CSIZE|PARENB);
343 tcsetattr (0, TCSANOW, &tty);
344 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
347 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
348 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
350 register a function to be called at normal program termination
353 #if CONFIG_BEOS_NETSERVER
354 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
358 /* read a key without blocking */
359 static int read_key(void)
364 #if !CONFIG_BEOS_NETSERVER
372 n = select(1, &rfds, NULL, NULL, &tv);
388 static int decode_interrupt_cb(void)
390 return q_pressed || (q_pressed = read_key() == 'q');
393 static int av_exit(int ret)
398 for(i=0;i<nb_output_files;i++) {
399 /* maybe av_close_output_file ??? */
400 AVFormatContext *s = output_files[i];
402 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
404 for(j=0;j<s->nb_streams;j++) {
405 av_metadata_free(&s->streams[j]->metadata);
406 av_free(s->streams[j]->codec);
407 av_free(s->streams[j]);
409 for(j=0;j<s->nb_programs;j++) {
410 av_metadata_free(&s->programs[j]->metadata);
412 for(j=0;j<s->nb_chapters;j++) {
413 av_metadata_free(&s->chapters[j]->metadata);
415 av_metadata_free(&s->metadata);
418 for(i=0;i<nb_input_files;i++)
419 av_close_input_file(input_files[i]);
421 av_free(intra_matrix);
422 av_free(inter_matrix);
426 av_free(vstats_filename);
430 av_free(video_codec_name);
431 av_free(audio_codec_name);
432 av_free(subtitle_codec_name);
434 av_free(video_standard);
436 #if CONFIG_POWERPC_PERF
437 void powerpc_display_perf_report(void);
438 powerpc_display_perf_report();
439 #endif /* CONFIG_POWERPC_PERF */
441 for (i=0;i<CODEC_TYPE_NB;i++)
442 av_free(avcodec_opts[i]);
443 av_free(avformat_opts);
450 if (received_sigterm) {
452 "Received signal %d: terminating.\n",
453 (int) received_sigterm);
457 exit(ret); /* not all OS-es handle main() return value */
461 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
467 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
470 /* copy stream format */
471 s->nb_streams = ic->nb_streams;
472 for(i=0;i<ic->nb_streams;i++) {
475 // FIXME: a more elegant solution is needed
476 st = av_mallocz(sizeof(AVStream));
477 memcpy(st, ic->streams[i], sizeof(AVStream));
478 st->codec = avcodec_alloc_context();
479 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
482 if (st->codec->codec_type == CODEC_TYPE_AUDIO && audio_stream_copy)
484 else if (st->codec->codec_type == CODEC_TYPE_VIDEO && video_stream_copy)
487 if(!st->codec->thread_count)
488 st->codec->thread_count = 1;
489 if(st->codec->thread_count>1)
490 avcodec_thread_init(st->codec, st->codec->thread_count);
492 if(st->codec->flags & CODEC_FLAG_BITEXACT)
497 s->timestamp = av_gettime();
499 av_close_input_file(ic);
504 get_sync_ipts(const AVOutputStream *ost)
506 const AVInputStream *ist = ost->sync_ist;
507 return (double)(ist->pts - start_time)/AV_TIME_BASE;
510 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
514 AVPacket new_pkt= *pkt;
515 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
516 &new_pkt.data, &new_pkt.size,
517 pkt->data, pkt->size,
518 pkt->flags & PKT_FLAG_KEY);
521 new_pkt.destruct= av_destruct_packet;
523 fprintf(stderr, "%s failed for stream %d, codec %s",
524 bsfc->filter->name, pkt->stream_index,
525 avctx->codec ? avctx->codec->name : "copy");
535 ret= av_interleaved_write_frame(s, pkt);
537 print_error("av_interleaved_write_frame()", ret);
542 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
544 static void do_audio_out(AVFormatContext *s,
547 unsigned char *buf, int size)
550 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
552 int size_out, frame_bytes, ret;
553 AVCodecContext *enc= ost->st->codec;
554 AVCodecContext *dec= ist->st->codec;
555 int osize= av_get_bits_per_sample_format(enc->sample_fmt)/8;
556 int isize= av_get_bits_per_sample_format(dec->sample_fmt)/8;
558 /* SC: dynamic allocation of buffers */
560 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
562 audio_out = av_malloc(audio_out_size);
563 if (!audio_buf || !audio_out)
564 return; /* Should signal an error ! */
566 if (enc->channels != dec->channels)
567 ost->audio_resample = 1;
569 if (ost->audio_resample && !ost->resample) {
570 if (dec->sample_fmt != SAMPLE_FMT_S16)
571 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
572 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
573 enc->sample_rate, dec->sample_rate,
574 enc->sample_fmt, dec->sample_fmt,
576 if (!ost->resample) {
577 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
578 dec->channels, dec->sample_rate,
579 enc->channels, enc->sample_rate);
584 #define MAKE_SFMT_PAIR(a,b) ((a)+SAMPLE_FMT_NB*(b))
585 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
586 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
588 audio_out2 = av_malloc(audio_out_size);
591 if (ost->reformat_ctx)
592 av_audio_convert_free(ost->reformat_ctx);
593 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
594 dec->sample_fmt, 1, NULL, 0);
595 if (!ost->reformat_ctx) {
596 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
597 avcodec_get_sample_fmt_name(dec->sample_fmt),
598 avcodec_get_sample_fmt_name(enc->sample_fmt));
601 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
604 if(audio_sync_method){
605 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
606 - av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2);
607 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
608 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
610 //FIXME resample delay
611 if(fabs(delta) > 50){
612 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
614 byte_delta= FFMAX(byte_delta, -size);
618 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
623 static uint8_t *input_tmp= NULL;
624 input_tmp= av_realloc(input_tmp, byte_delta + size);
626 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
629 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
631 memset(input_tmp, 0, byte_delta);
632 memcpy(input_tmp + byte_delta, buf, size);
636 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
638 }else if(audio_sync_method>1){
639 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
640 assert(ost->audio_resample);
642 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
643 // 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));
644 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
648 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
649 - av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
651 if (ost->audio_resample) {
653 size_out = audio_resample(ost->resample,
654 (short *)buftmp, (short *)buf,
655 size / (ist->st->codec->channels * isize));
656 size_out = size_out * enc->channels * osize;
662 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
663 const void *ibuf[6]= {buftmp};
664 void *obuf[6]= {audio_out2};
665 int istride[6]= {isize};
666 int ostride[6]= {osize};
667 int len= size_out/istride[0];
668 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
669 printf("av_audio_convert() failed\n");
675 size_out = len*osize;
678 /* now encode as many frames as possible */
679 if (enc->frame_size > 1) {
680 /* output resampled raw samples */
681 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
682 fprintf(stderr, "av_fifo_realloc2() failed\n");
685 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
687 frame_bytes = enc->frame_size * osize * enc->channels;
689 while (av_fifo_size(ost->fifo) >= frame_bytes) {
691 av_init_packet(&pkt);
693 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
695 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
697 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
700 fprintf(stderr, "Audio encoding failed\n");
704 pkt.stream_index= ost->index;
707 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
708 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
709 pkt.flags |= PKT_FLAG_KEY;
710 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
712 ost->sync_opts += enc->frame_size;
716 int coded_bps = av_get_bits_per_sample(enc->codec->id)/8;
717 av_init_packet(&pkt);
719 ost->sync_opts += size_out / (osize * enc->channels);
721 /* output a pcm frame */
722 /* determine the size of the coded buffer */
725 size_out *= coded_bps;
727 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
728 ret = avcodec_encode_audio(enc, audio_out, size_out,
731 fprintf(stderr, "Audio encoding failed\n");
735 pkt.stream_index= ost->index;
738 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
739 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
740 pkt.flags |= PKT_FLAG_KEY;
741 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
745 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
749 AVPicture picture_tmp;
752 dec = ist->st->codec;
754 /* deinterlace : must be done before any resize */
755 if (do_deinterlace) {
758 /* create temporary picture */
759 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
760 buf = av_malloc(size);
764 picture2 = &picture_tmp;
765 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
768 if(avpicture_deinterlace(picture2, picture,
769 dec->pix_fmt, dec->width, dec->height) < 0) {
770 /* if error, do not deinterlace */
771 fprintf(stderr, "Deinterlacing failed\n");
777 av_picture_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
783 if (picture != picture2)
784 *picture = *picture2;
788 /* we begin to correct av delay at this threshold */
789 #define AV_DELAY_MAX 0.100
791 static void do_subtitle_out(AVFormatContext *s,
797 static uint8_t *subtitle_out = NULL;
798 int subtitle_out_max_size = 65536;
799 int subtitle_out_size, nb, i;
803 if (pts == AV_NOPTS_VALUE) {
804 fprintf(stderr, "Subtitle packets must have a pts\n");
810 enc = ost->st->codec;
813 subtitle_out = av_malloc(subtitle_out_max_size);
816 /* Note: DVB subtitle need one packet to draw them and one other
817 packet to clear them */
818 /* XXX: signal it in the codec context ? */
819 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
824 for(i = 0; i < nb; i++) {
825 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
826 subtitle_out_max_size, sub);
828 av_init_packet(&pkt);
829 pkt.stream_index = ost->index;
830 pkt.data = subtitle_out;
831 pkt.size = subtitle_out_size;
832 pkt.pts = av_rescale_q(pts, ist->st->time_base, ost->st->time_base);
833 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
834 /* XXX: the pts correction is handled here. Maybe handling
835 it in the codec would be better */
837 pkt.pts += 90 * sub->start_display_time;
839 pkt.pts += 90 * sub->end_display_time;
841 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
845 static int bit_buffer_size= 1024*256;
846 static uint8_t *bit_buffer= NULL;
848 static void do_video_out(AVFormatContext *s,
854 int nb_frames, i, ret;
855 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
856 AVFrame picture_crop_temp, picture_pad_temp;
857 AVCodecContext *enc, *dec;
859 avcodec_get_frame_defaults(&picture_crop_temp);
860 avcodec_get_frame_defaults(&picture_pad_temp);
862 enc = ost->st->codec;
863 dec = ist->st->codec;
865 /* by default, we output a single frame */
870 if(video_sync_method>0 || (video_sync_method && av_q2d(enc->time_base) > 0.001)){
872 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
873 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
876 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
880 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
881 }else if (vdelta > 1.1)
882 nb_frames = lrintf(vdelta);
883 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, get_sync_ipts(ost), nb_frames);
887 fprintf(stderr, "*** drop!\n");
888 }else if (nb_frames > 1) {
889 nb_frames_dup += nb_frames;
891 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
894 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
896 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
900 if (ost->video_crop) {
901 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
902 fprintf(stderr, "error cropping picture\n");
907 formatted_picture = &picture_crop_temp;
909 formatted_picture = in_picture;
912 final_picture = formatted_picture;
913 padding_src = formatted_picture;
914 resampling_dst = &ost->pict_tmp;
915 if (ost->video_pad) {
916 final_picture = &ost->pict_tmp;
917 if (ost->video_resample) {
918 if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
919 fprintf(stderr, "error padding picture\n");
924 resampling_dst = &picture_pad_temp;
928 if (ost->video_resample) {
930 final_picture = &ost->pict_tmp;
931 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
932 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
935 if (ost->video_pad) {
936 av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
937 enc->height, enc->width, enc->pix_fmt,
938 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
941 /* duplicates frame if needed */
942 for(i=0;i<nb_frames;i++) {
944 av_init_packet(&pkt);
945 pkt.stream_index= ost->index;
947 if (s->oformat->flags & AVFMT_RAWPICTURE) {
948 /* raw pictures are written as AVPicture structure to
949 avoid any copies. We support temorarily the older
951 AVFrame* old_frame = enc->coded_frame;
952 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
953 pkt.data= (uint8_t *)final_picture;
954 pkt.size= sizeof(AVPicture);
955 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
956 pkt.flags |= PKT_FLAG_KEY;
958 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
959 enc->coded_frame = old_frame;
963 big_picture= *final_picture;
964 /* better than nothing: use input picture interlaced
966 big_picture.interlaced_frame = in_picture->interlaced_frame;
967 if(avcodec_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
968 if(top_field_first == -1)
969 big_picture.top_field_first = in_picture->top_field_first;
971 big_picture.top_field_first = top_field_first;
974 /* handles sameq here. This is not correct because it may
975 not be a global option */
977 big_picture.quality = ist->st->quality;
979 big_picture.quality = ost->st->quality;
981 big_picture.pict_type = 0;
982 // big_picture.pts = AV_NOPTS_VALUE;
983 big_picture.pts= ost->sync_opts;
984 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
985 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
986 ret = avcodec_encode_video(enc,
987 bit_buffer, bit_buffer_size,
990 fprintf(stderr, "Video encoding failed\n");
993 //enc->frame_number = enc->real_pict_num;
995 pkt.data= bit_buffer;
997 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
998 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
999 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1000 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1001 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1003 if(enc->coded_frame->key_frame)
1004 pkt.flags |= PKT_FLAG_KEY;
1005 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1008 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
1009 // enc->frame_number-1, enc->real_pict_num, ret,
1011 /* if two pass, output log */
1012 if (ost->logfile && enc->stats_out) {
1013 fprintf(ost->logfile, "%s", enc->stats_out);
1018 ost->frame_number++;
1022 static double psnr(double d){
1023 return -10.0*log(d)/log(10.0);
1026 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1029 AVCodecContext *enc;
1031 double ti1, bitrate, avg_bitrate;
1033 /* this is executed just the first time do_video_stats is called */
1035 vstats_file = fopen(vstats_filename, "w");
1042 enc = ost->st->codec;
1043 if (enc->codec_type == CODEC_TYPE_VIDEO) {
1044 frame_number = ost->frame_number;
1045 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1046 if (enc->flags&CODEC_FLAG_PSNR)
1047 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1049 fprintf(vstats_file,"f_size= %6d ", frame_size);
1050 /* compute pts value */
1051 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1055 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1056 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1057 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1058 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1059 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1063 static void print_report(AVFormatContext **output_files,
1064 AVOutputStream **ost_table, int nb_ostreams,
1068 AVOutputStream *ost;
1069 AVFormatContext *oc;
1071 AVCodecContext *enc;
1072 int frame_number, vid, i;
1073 double bitrate, ti1, pts;
1074 static int64_t last_time = -1;
1075 static int qp_histogram[52];
1077 if (!is_last_report) {
1079 /* display the report every 0.5 seconds */
1080 cur_time = av_gettime();
1081 if (last_time == -1) {
1082 last_time = cur_time;
1085 if ((cur_time - last_time) < 500000)
1087 last_time = cur_time;
1091 oc = output_files[0];
1093 total_size = url_fsize(oc->pb);
1094 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1095 total_size= url_ftell(oc->pb);
1100 for(i=0;i<nb_ostreams;i++) {
1102 enc = ost->st->codec;
1103 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1104 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1105 !ost->st->stream_copy ?
1106 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1108 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1109 float t = (av_gettime()-timer_start) / 1000000.0;
1111 frame_number = ost->frame_number;
1112 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1113 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1114 !ost->st->stream_copy ?
1115 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1117 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1120 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1121 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1124 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1126 if (enc->flags&CODEC_FLAG_PSNR){
1128 double error, error_sum=0;
1129 double scale, scale_sum=0;
1130 char type[3]= {'Y','U','V'};
1131 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1134 error= enc->error[j];
1135 scale= enc->width*enc->height*255.0*255.0*frame_number;
1137 error= enc->coded_frame->error[j];
1138 scale= enc->width*enc->height*255.0*255.0;
1143 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1145 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1149 /* compute min output value */
1150 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1151 if ((pts < ti1) && (pts > 0))
1157 if (verbose || is_last_report) {
1158 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1160 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1161 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1162 (double)total_size / 1024, ti1, bitrate);
1165 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1166 nb_frames_dup, nb_frames_drop);
1169 fprintf(stderr, "%s \r", buf);
1174 if (is_last_report && verbose >= 0){
1175 int64_t raw= audio_size + video_size + extra_size;
1176 fprintf(stderr, "\n");
1177 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1181 100.0*(total_size - raw)/raw
1186 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1187 static int output_packet(AVInputStream *ist, int ist_index,
1188 AVOutputStream **ost_table, int nb_ostreams,
1189 const AVPacket *pkt)
1191 AVFormatContext *os;
1192 AVOutputStream *ost;
1195 int data_size, got_picture;
1197 void *buffer_to_free;
1198 static unsigned int samples_size= 0;
1199 AVSubtitle subtitle, *subtitle_to_free;
1203 if(ist->next_pts == AV_NOPTS_VALUE)
1204 ist->next_pts= ist->pts;
1208 av_init_packet(&avpkt);
1216 if(pkt->dts != AV_NOPTS_VALUE)
1217 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1219 //while we have more to decode or while the decoder did output something on EOF
1220 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1222 ist->pts= ist->next_pts;
1224 if(avpkt.size && avpkt.size != pkt->size && verbose>0)
1225 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1227 /* decode the packet if needed */
1228 data_buf = NULL; /* fail safe */
1230 subtitle_to_free = NULL;
1231 if (ist->decoding_needed) {
1232 switch(ist->st->codec->codec_type) {
1233 case CODEC_TYPE_AUDIO:{
1234 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1235 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1237 samples= av_malloc(samples_size);
1239 data_size= samples_size;
1240 /* XXX: could avoid copy if PCM 16 bits with same
1241 endianness as CPU */
1242 ret = avcodec_decode_audio3(ist->st->codec, samples, &data_size,
1248 /* Some bug in mpeg audio decoder gives */
1249 /* data_size < 0, it seems they are overflows */
1250 if (data_size <= 0) {
1251 /* no audio frame */
1254 data_buf = (uint8_t *)samples;
1255 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1256 (ist->st->codec->sample_rate * ist->st->codec->channels);
1258 case CODEC_TYPE_VIDEO:
1259 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1260 /* XXX: allocate picture correctly */
1261 avcodec_get_frame_defaults(&picture);
1263 ret = avcodec_decode_video2(ist->st->codec,
1264 &picture, &got_picture, &avpkt);
1265 ist->st->quality= picture.quality;
1269 /* no picture yet */
1270 goto discard_packet;
1272 if (ist->st->codec->time_base.num != 0) {
1273 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1274 ist->next_pts += ((int64_t)AV_TIME_BASE *
1275 ist->st->codec->time_base.num * ticks) /
1276 ist->st->codec->time_base.den;
1280 case CODEC_TYPE_SUBTITLE:
1281 ret = avcodec_decode_subtitle2(ist->st->codec,
1282 &subtitle, &got_subtitle, &avpkt);
1285 if (!got_subtitle) {
1286 goto discard_packet;
1288 subtitle_to_free = &subtitle;
1295 switch(ist->st->codec->codec_type) {
1296 case CODEC_TYPE_AUDIO:
1297 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1298 ist->st->codec->sample_rate;
1300 case CODEC_TYPE_VIDEO:
1301 if (ist->st->codec->time_base.num != 0) {
1302 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1303 ist->next_pts += ((int64_t)AV_TIME_BASE *
1304 ist->st->codec->time_base.num * ticks) /
1305 ist->st->codec->time_base.den;
1309 data_buf = avpkt.data;
1310 data_size = avpkt.size;
1315 buffer_to_free = NULL;
1316 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1317 pre_process_video_frame(ist, (AVPicture *)&picture,
1321 // preprocess audio (volume)
1322 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1323 if (audio_volume != 256) {
1326 for(i=0;i<(data_size / sizeof(short));i++) {
1327 int v = ((*volp) * audio_volume + 128) >> 8;
1328 if (v < -32768) v = -32768;
1329 if (v > 32767) v = 32767;
1335 /* frame rate emulation */
1337 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1338 int64_t now = av_gettime() - ist->start;
1343 /* if output time reached then transcode raw format,
1344 encode packets and output them */
1345 if (start_time == 0 || ist->pts >= start_time)
1346 for(i=0;i<nb_ostreams;i++) {
1350 if (ost->source_index == ist_index) {
1351 os = output_files[ost->file_index];
1354 printf("%d: got pts=%0.3f %0.3f\n", i,
1355 (double)pkt->pts / AV_TIME_BASE,
1356 ((double)ist->pts / AV_TIME_BASE) -
1357 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1359 /* set the input output pts pairs */
1360 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1362 if (ost->encoding_needed) {
1363 switch(ost->st->codec->codec_type) {
1364 case CODEC_TYPE_AUDIO:
1365 do_audio_out(os, ost, ist, data_buf, data_size);
1367 case CODEC_TYPE_VIDEO:
1368 do_video_out(os, ost, ist, &picture, &frame_size);
1369 if (vstats_filename && frame_size)
1370 do_video_stats(os, ost, frame_size);
1372 case CODEC_TYPE_SUBTITLE:
1373 do_subtitle_out(os, ost, ist, &subtitle,
1380 AVFrame avframe; //FIXME/XXX remove this
1382 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1384 av_init_packet(&opkt);
1386 if ((!ost->frame_number && !(pkt->flags & PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1389 /* no reencoding needed : output the packet directly */
1390 /* force the input stream PTS */
1392 avcodec_get_frame_defaults(&avframe);
1393 ost->st->codec->coded_frame= &avframe;
1394 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1396 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1397 audio_size += data_size;
1398 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1399 video_size += data_size;
1403 opkt.stream_index= ost->index;
1404 if(pkt->pts != AV_NOPTS_VALUE)
1405 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1407 opkt.pts= AV_NOPTS_VALUE;
1409 if (pkt->dts == AV_NOPTS_VALUE)
1410 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1412 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1413 opkt.dts -= ost_tb_start_time;
1415 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1416 opkt.flags= pkt->flags;
1418 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1419 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1420 opkt.destruct= av_destruct_packet;
1422 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][opkt.stream_index]);
1423 ost->st->codec->frame_number++;
1424 ost->frame_number++;
1425 av_free_packet(&opkt);
1429 av_free(buffer_to_free);
1430 /* XXX: allocate the subtitles in the codec ? */
1431 if (subtitle_to_free) {
1432 if (subtitle_to_free->rects != NULL) {
1433 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1434 av_freep(&subtitle_to_free->rects[i]->pict.data[0]);
1435 av_freep(&subtitle_to_free->rects[i]->pict.data[1]);
1436 av_freep(&subtitle_to_free->rects[i]);
1438 av_freep(&subtitle_to_free->rects);
1440 subtitle_to_free->num_rects = 0;
1441 subtitle_to_free = NULL;
1448 for(i=0;i<nb_ostreams;i++) {
1450 if (ost->source_index == ist_index) {
1451 AVCodecContext *enc= ost->st->codec;
1452 os = output_files[ost->file_index];
1454 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1456 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1459 if (ost->encoding_needed) {
1463 av_init_packet(&pkt);
1464 pkt.stream_index= ost->index;
1466 switch(ost->st->codec->codec_type) {
1467 case CODEC_TYPE_AUDIO:
1468 fifo_bytes = av_fifo_size(ost->fifo);
1470 /* encode any samples remaining in fifo */
1471 if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1472 int osize = av_get_bits_per_sample_format(enc->sample_fmt) >> 3;
1473 int fs_tmp = enc->frame_size;
1474 enc->frame_size = fifo_bytes / (osize * enc->channels);
1475 av_fifo_generic_read(ost->fifo, samples, fifo_bytes, NULL);
1476 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1477 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1478 ost->st->time_base.num, enc->sample_rate);
1479 enc->frame_size = fs_tmp;
1482 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1485 fprintf(stderr, "Audio encoding failed\n");
1489 pkt.flags |= PKT_FLAG_KEY;
1491 case CODEC_TYPE_VIDEO:
1492 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1494 fprintf(stderr, "Video encoding failed\n");
1498 if(enc->coded_frame && enc->coded_frame->key_frame)
1499 pkt.flags |= PKT_FLAG_KEY;
1500 if (ost->logfile && enc->stats_out) {
1501 fprintf(ost->logfile, "%s", enc->stats_out);
1510 pkt.data= bit_buffer;
1512 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1513 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1514 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1526 static void print_sdp(AVFormatContext **avc, int n)
1530 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1531 printf("SDP:\n%s\n", sdp);
1535 static int stream_index_from_inputs(AVFormatContext **input_files,
1537 AVInputFile *file_table,
1538 AVInputStream **ist_table,
1539 enum CodecType type,
1543 for(z=0; z<nb_input_files; z++) {
1544 AVFormatContext *ic = input_files[z];
1545 for(p=0; p<ic->nb_programs; p++) {
1546 AVProgram *program = ic->programs[p];
1547 if(program->id != programid)
1549 for(q=0; q<program->nb_stream_indexes; q++) {
1550 int sidx = program->stream_index[q];
1551 int ris = file_table[z].ist_index + sidx;
1552 if(ist_table[ris]->discard && ic->streams[sidx]->codec->codec_type == type)
1562 timespec_subtract (struct timespec *result,
1566 /* Perform the carry for the later subtraction by updating Y. */
1567 if (x->tv_nsec < y->tv_nsec) {
1568 int num_sec = (y->tv_nsec - x->tv_nsec) / 1000000000 + 1;
1569 y->tv_nsec -= 1000000000 * num_sec;
1570 y->tv_sec += num_sec;
1572 if (x->tv_nsec - y->tv_nsec > 1000000000) {
1573 int num_sec = (x->tv_nsec - y->tv_nsec) / 1000000000;
1574 y->tv_nsec += 1000000000 * num_sec;
1575 y->tv_sec -= num_sec;
1578 /* Compute the time remaining to wait.
1579 `tv_nsec' is certainly positive. */
1580 result->tv_sec = x->tv_sec - y->tv_sec;
1581 result->tv_nsec = x->tv_nsec - y->tv_nsec;
1583 /* Return 1 if result is negative. */
1584 return x->tv_sec < y->tv_sec;
1590 static struct timespec start = {0,0};
1591 struct timespec end, d;
1592 static int f = 0; /* number of frames */
1594 static double ifi_avg=0, ifi_var=0;
1596 clock_gettime(CLOCK_MONOTONIC, &end);
1597 timespec_subtract(&d, &end, &start);
1599 goto out; /* First run */
1600 ifi = (double)d.tv_sec + 1e-9*d.tv_nsec;
1601 #define SQ(x) ((x)*(x))
1602 ifi_var = ifi_var*(f-1)/f + (double)(f-1)/SQ(f)*SQ(ifi-ifi_avg);
1603 ifi_avg = ifi_avg*(f-1)/f + (double)ifi/f;
1604 printf("%5d: interframe interval = 1/%5.2lf s avg=1/%.2f stddev=1/%3.2f\n",
1605 f, 1/ifi, 1/ifi_avg, 1/sqrt(ifi_var));
1611 * The following code is the main loop of the file converter
1613 static int av_encode(AVFormatContext **output_files,
1614 int nb_output_files,
1615 AVFormatContext **input_files,
1617 AVStreamMap *stream_maps, int nb_stream_maps)
1619 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1620 AVFormatContext *is, *os;
1621 AVCodecContext *codec, *icodec;
1622 AVOutputStream *ost, **ost_table = NULL;
1623 AVInputStream *ist, **ist_table = NULL;
1624 AVInputFile *file_table;
1628 uint8_t no_packet[MAX_FILES]={0};
1629 int no_packet_count=0;
1631 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1635 /* input stream init */
1637 for(i=0;i<nb_input_files;i++) {
1638 is = input_files[i];
1639 file_table[i].ist_index = j;
1640 file_table[i].nb_streams = is->nb_streams;
1641 j += is->nb_streams;
1645 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1649 for(i=0;i<nb_istreams;i++) {
1650 ist = av_mallocz(sizeof(AVInputStream));
1656 for(i=0;i<nb_input_files;i++) {
1657 is = input_files[i];
1658 for(k=0;k<is->nb_streams;k++) {
1659 ist = ist_table[j++];
1660 ist->st = is->streams[k];
1661 ist->file_index = i;
1663 ist->discard = 1; /* the stream is discarded by default
1667 ist->start = av_gettime();
1672 /* output stream init */
1674 for(i=0;i<nb_output_files;i++) {
1675 os = output_files[i];
1676 if (!os->nb_streams) {
1677 dump_format(output_files[i], i, output_files[i]->filename, 1);
1678 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1681 nb_ostreams += os->nb_streams;
1683 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1684 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1688 /* Sanity check the mapping args -- do the input files & streams exist? */
1689 for(i=0;i<nb_stream_maps;i++) {
1690 int fi = stream_maps[i].file_index;
1691 int si = stream_maps[i].stream_index;
1693 if (fi < 0 || fi > nb_input_files - 1 ||
1694 si < 0 || si > file_table[fi].nb_streams - 1) {
1695 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1698 fi = stream_maps[i].sync_file_index;
1699 si = stream_maps[i].sync_stream_index;
1700 if (fi < 0 || fi > nb_input_files - 1 ||
1701 si < 0 || si > file_table[fi].nb_streams - 1) {
1702 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1707 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1710 for(i=0;i<nb_ostreams;i++) {
1711 ost = av_mallocz(sizeof(AVOutputStream));
1718 for(k=0;k<nb_output_files;k++) {
1719 os = output_files[k];
1720 for(i=0;i<os->nb_streams;i++,n++) {
1723 ost->file_index = k;
1725 ost->st = os->streams[i];
1726 if (nb_stream_maps > 0) {
1727 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
1728 stream_maps[n].stream_index;
1730 /* Sanity check that the stream types match */
1731 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1732 int i= ost->file_index;
1733 dump_format(output_files[i], i, output_files[i]->filename, 1);
1734 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1735 stream_maps[n].file_index, stream_maps[n].stream_index,
1736 ost->file_index, ost->index);
1743 j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid);
1745 ost->source_index = j;
1749 /* get corresponding input stream index : we select the first one with the right type */
1751 for(j=0;j<nb_istreams;j++) {
1754 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1755 ost->source_index = j;
1763 if(! opt_programid) {
1764 /* try again and reuse existing stream */
1765 for(j=0;j<nb_istreams;j++) {
1767 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1768 ost->source_index = j;
1774 int i= ost->file_index;
1775 dump_format(output_files[i], i, output_files[i]->filename, 1);
1776 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1777 ost->file_index, ost->index);
1782 ist = ist_table[ost->source_index];
1784 ost->sync_ist = (nb_stream_maps > 0) ?
1785 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
1786 stream_maps[n].sync_stream_index] : ist;
1790 /* for each output stream, we compute the right encoding parameters */
1791 for(i=0;i<nb_ostreams;i++) {
1792 AVMetadataTag *lang;
1794 os = output_files[ost->file_index];
1795 ist = ist_table[ost->source_index];
1797 codec = ost->st->codec;
1798 icodec = ist->st->codec;
1800 if ((lang=av_metadata_get(ist->st->metadata, "language", NULL, 0))
1801 && !av_metadata_get(ost->st->metadata, "language", NULL, 0))
1802 av_metadata_set(&ost->st->metadata, "language", lang->value);
1804 ost->st->disposition = ist->st->disposition;
1805 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1806 codec->chroma_sample_location = icodec->chroma_sample_location;
1808 if (ost->st->stream_copy) {
1809 /* if stream_copy is selected, no need to decode or encode */
1810 codec->codec_id = icodec->codec_id;
1811 codec->codec_type = icodec->codec_type;
1813 if(!codec->codec_tag){
1814 if( !os->oformat->codec_tag
1815 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) > 0
1816 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1817 codec->codec_tag = icodec->codec_tag;
1820 codec->bit_rate = icodec->bit_rate;
1821 codec->extradata= icodec->extradata;
1822 codec->extradata_size= icodec->extradata_size;
1823 if(av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000){
1824 codec->time_base = icodec->time_base;
1825 codec->time_base.num *= icodec->ticks_per_frame;
1827 codec->time_base = ist->st->time_base;
1828 switch(codec->codec_type) {
1829 case CODEC_TYPE_AUDIO:
1830 if(audio_volume != 256) {
1831 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1834 codec->channel_layout = icodec->channel_layout;
1835 codec->sample_rate = icodec->sample_rate;
1836 codec->channels = icodec->channels;
1837 codec->frame_size = icodec->frame_size;
1838 codec->block_align= icodec->block_align;
1839 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1840 codec->block_align= 0;
1841 if(codec->codec_id == CODEC_ID_AC3)
1842 codec->block_align= 0;
1844 case CODEC_TYPE_VIDEO:
1845 codec->pix_fmt = icodec->pix_fmt;
1846 codec->width = icodec->width;
1847 codec->height = icodec->height;
1848 codec->has_b_frames = icodec->has_b_frames;
1850 case CODEC_TYPE_SUBTITLE:
1851 codec->width = icodec->width;
1852 codec->height = icodec->height;
1858 switch(codec->codec_type) {
1859 case CODEC_TYPE_AUDIO:
1860 ost->fifo= av_fifo_alloc(1024);
1863 ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
1864 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1865 icodec->request_channels = codec->channels;
1866 ist->decoding_needed = 1;
1867 ost->encoding_needed = 1;
1869 case CODEC_TYPE_VIDEO:
1870 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1871 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1872 ost->video_resample = ((codec->width != icodec->width -
1873 (frame_leftBand + frame_rightBand) +
1874 (frame_padleft + frame_padright)) ||
1875 (codec->height != icodec->height -
1876 (frame_topBand + frame_bottomBand) +
1877 (frame_padtop + frame_padbottom)) ||
1878 (codec->pix_fmt != icodec->pix_fmt));
1879 if (ost->video_crop) {
1880 ost->topBand = frame_topBand;
1881 ost->leftBand = frame_leftBand;
1883 if (ost->video_pad) {
1884 ost->padtop = frame_padtop;
1885 ost->padleft = frame_padleft;
1886 ost->padbottom = frame_padbottom;
1887 ost->padright = frame_padright;
1888 if (!ost->video_resample) {
1889 avcodec_get_frame_defaults(&ost->pict_tmp);
1890 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1891 codec->width, codec->height))
1895 if (ost->video_resample) {
1896 avcodec_get_frame_defaults(&ost->pict_tmp);
1897 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1898 codec->width, codec->height)) {
1899 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1902 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1903 ost->img_resample_ctx = sws_getContext(
1904 icodec->width - (frame_leftBand + frame_rightBand),
1905 icodec->height - (frame_topBand + frame_bottomBand),
1907 codec->width - (frame_padleft + frame_padright),
1908 codec->height - (frame_padtop + frame_padbottom),
1910 sws_flags, NULL, NULL, NULL);
1911 if (ost->img_resample_ctx == NULL) {
1912 fprintf(stderr, "Cannot get resampling context\n");
1915 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1916 codec->bits_per_raw_sample= 0;
1918 ost->encoding_needed = 1;
1919 ist->decoding_needed = 1;
1921 case CODEC_TYPE_SUBTITLE:
1922 ost->encoding_needed = 1;
1923 ist->decoding_needed = 1;
1930 if (ost->encoding_needed &&
1931 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1932 char logfilename[1024];
1937 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1938 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
1940 if (codec->flags & CODEC_FLAG_PASS1) {
1941 f = fopen(logfilename, "w");
1943 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
1948 /* read the log file */
1949 f = fopen(logfilename, "r");
1951 fprintf(stderr, "Cannot read log file '%s' for pass-2 encoding: %s\n", logfilename, strerror(errno));
1954 fseek(f, 0, SEEK_END);
1956 fseek(f, 0, SEEK_SET);
1957 logbuffer = av_malloc(size + 1);
1959 fprintf(stderr, "Could not allocate log buffer\n");
1962 size = fread(logbuffer, 1, size, f);
1964 logbuffer[size] = '\0';
1965 codec->stats_in = logbuffer;
1969 if(codec->codec_type == CODEC_TYPE_VIDEO){
1970 int size= codec->width * codec->height;
1971 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
1976 bit_buffer = av_malloc(bit_buffer_size);
1978 ret = AVERROR(ENOMEM);
1982 /* open each encoder */
1983 for(i=0;i<nb_ostreams;i++) {
1985 if (ost->encoding_needed) {
1986 AVCodec *codec = output_codecs[i];
1988 codec = avcodec_find_encoder(ost->st->codec->codec_id);
1990 snprintf(error, sizeof(error), "Unsupported codec for output stream #%d.%d",
1991 ost->file_index, ost->index);
1992 ret = AVERROR(EINVAL);
1995 if (avcodec_open(ost->st->codec, codec) < 0) {
1996 snprintf(error, sizeof(error), "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
1997 ost->file_index, ost->index);
1998 ret = AVERROR(EINVAL);
2001 extra_size += ost->st->codec->extradata_size;
2005 /* open each decoder */
2006 for(i=0;i<nb_istreams;i++) {
2008 if (ist->decoding_needed) {
2009 AVCodec *codec = input_codecs[i];
2011 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2013 snprintf(error, sizeof(error), "Unsupported codec (id=%d) for input stream #%d.%d",
2014 ist->st->codec->codec_id, ist->file_index, ist->index);
2015 ret = AVERROR(EINVAL);
2018 if (avcodec_open(ist->st->codec, codec) < 0) {
2019 snprintf(error, sizeof(error), "Error while opening codec for input stream #%d.%d",
2020 ist->file_index, ist->index);
2021 ret = AVERROR(EINVAL);
2024 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
2025 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2030 for(i=0;i<nb_istreams;i++) {
2033 ist->next_pts = AV_NOPTS_VALUE;
2037 /* set meta data information from input file if required */
2038 for (i=0;i<nb_meta_data_maps;i++) {
2039 AVFormatContext *out_file;
2040 AVFormatContext *in_file;
2041 AVMetadataTag *mtag;
2043 int out_file_index = meta_data_maps[i].out_file;
2044 int in_file_index = meta_data_maps[i].in_file;
2045 if (out_file_index < 0 || out_file_index >= nb_output_files) {
2046 snprintf(error, sizeof(error), "Invalid output file index %d map_meta_data(%d,%d)",
2047 out_file_index, out_file_index, in_file_index);
2048 ret = AVERROR(EINVAL);
2051 if (in_file_index < 0 || in_file_index >= nb_input_files) {
2052 snprintf(error, sizeof(error), "Invalid input file index %d map_meta_data(%d,%d)",
2053 in_file_index, out_file_index, in_file_index);
2054 ret = AVERROR(EINVAL);
2058 out_file = output_files[out_file_index];
2059 in_file = input_files[in_file_index];
2063 while((mtag=av_metadata_get(in_file->metadata, "", mtag, AV_METADATA_IGNORE_SUFFIX)))
2064 av_metadata_set(&out_file->metadata, mtag->key, mtag->value);
2065 av_metadata_conv(out_file, out_file->oformat->metadata_conv,
2066 in_file->iformat->metadata_conv);
2069 /* open files and write file headers */
2070 for(i=0;i<nb_output_files;i++) {
2071 os = output_files[i];
2072 if (av_write_header(os) < 0) {
2073 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2074 ret = AVERROR(EINVAL);
2077 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2083 /* dump the file output parameters - cannot be done before in case
2085 for(i=0;i<nb_output_files;i++) {
2086 dump_format(output_files[i], i, output_files[i]->filename, 1);
2089 /* dump the stream mapping */
2091 fprintf(stderr, "Stream mapping:\n");
2092 for(i=0;i<nb_ostreams;i++) {
2094 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2095 ist_table[ost->source_index]->file_index,
2096 ist_table[ost->source_index]->index,
2099 if (ost->sync_ist != ist_table[ost->source_index])
2100 fprintf(stderr, " [sync #%d.%d]",
2101 ost->sync_ist->file_index,
2102 ost->sync_ist->index);
2103 fprintf(stderr, "\n");
2108 fprintf(stderr, "%s\n", error);
2113 print_sdp(output_files, nb_output_files);
2116 if (!using_stdin && verbose >= 0) {
2117 fprintf(stderr, "Press [q] to stop encoding\n");
2118 url_set_interrupt_cb(decode_interrupt_cb);
2122 timer_start = av_gettime();
2124 for(; received_sigterm == 0;) {
2125 int file_index, ist_index;
2133 /* if 'q' pressed, exits */
2137 /* read_key() returns 0 on EOF */
2143 /* select the stream that we must read now by looking at the
2144 smallest output pts */
2146 for(i=0;i<nb_ostreams;i++) {
2149 os = output_files[ost->file_index];
2150 ist = ist_table[ost->source_index];
2151 if(no_packet[ist->file_index])
2153 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
2154 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
2156 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2157 ipts = (double)ist->pts;
2158 if (!file_table[ist->file_index].eof_reached){
2159 if(ipts < ipts_min) {
2161 if(input_sync ) file_index = ist->file_index;
2163 if(opts < opts_min) {
2165 if(!input_sync) file_index = ist->file_index;
2168 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2173 /* if none, if is finished */
2174 if (file_index < 0) {
2175 if(no_packet_count){
2177 memset(no_packet, 0, sizeof(no_packet));
2184 /* finish if recording time exhausted */
2185 if (opts_min >= (recording_time / 1000000.0))
2188 /* finish if limit size exhausted */
2189 if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
2192 /* read a frame from it and output it in the fifo */
2193 is = input_files[file_index];
2194 ret= av_read_frame(is, &pkt);
2195 if(ret == AVERROR(EAGAIN)){
2196 no_packet[file_index]=1;
2201 file_table[file_index].eof_reached = 1;
2209 memset(no_packet, 0, sizeof(no_packet));
2212 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2214 /* the following test is needed in case new streams appear
2215 dynamically in stream : we ignore them */
2216 if (pkt.stream_index >= file_table[file_index].nb_streams)
2217 goto discard_packet;
2218 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2219 ist = ist_table[ist_index];
2221 goto discard_packet;
2223 if (pkt.dts != AV_NOPTS_VALUE)
2224 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2225 if (pkt.pts != AV_NOPTS_VALUE)
2226 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2228 if(input_files_ts_scale[file_index][pkt.stream_index]){
2229 if(pkt.pts != AV_NOPTS_VALUE)
2230 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2231 if(pkt.dts != AV_NOPTS_VALUE)
2232 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2235 //av_log(NULL, AV_LOG_ERROR, "timestamp=%"PRId64" %"PRId64"\n", pkt.pts, pkt.dts);
2238 // 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);
2239 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2240 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2241 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2242 int64_t delta= pkt_dts - ist->next_pts;
2243 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2244 input_files_ts_offset[ist->file_index]-= delta;
2246 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2247 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2248 if(pkt.pts != AV_NOPTS_VALUE)
2249 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2253 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2254 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2257 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2258 ist->file_index, ist->index);
2261 av_free_packet(&pkt);
2268 av_free_packet(&pkt);
2270 /* dump report by using the output first video and audio streams */
2271 //print_report(output_files, ost_table, nb_ostreams, 0);
2274 /* at the end of stream, we must flush the decoder buffers */
2275 for(i=0;i<nb_istreams;i++) {
2277 if (ist->decoding_needed) {
2278 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2284 /* write the trailer if needed and close file */
2285 for(i=0;i<nb_output_files;i++) {
2286 os = output_files[i];
2287 av_write_trailer(os);
2290 /* dump report by using the first video and audio streams */
2291 print_report(output_files, ost_table, nb_ostreams, 1);
2293 /* close each encoder */
2294 for(i=0;i<nb_ostreams;i++) {
2296 if (ost->encoding_needed) {
2297 av_freep(&ost->st->codec->stats_in);
2298 avcodec_close(ost->st->codec);
2302 /* close each decoder */
2303 for(i=0;i<nb_istreams;i++) {
2305 if (ist->decoding_needed) {
2306 avcodec_close(ist->st->codec);
2314 av_freep(&bit_buffer);
2315 av_free(file_table);
2318 for(i=0;i<nb_istreams;i++) {
2325 for(i=0;i<nb_ostreams;i++) {
2329 fclose(ost->logfile);
2330 ost->logfile = NULL;
2332 av_fifo_free(ost->fifo); /* works even if fifo is not
2333 initialized but set to zero */
2334 av_free(ost->pict_tmp.data[0]);
2335 if (ost->video_resample)
2336 sws_freeContext(ost->img_resample_ctx);
2338 audio_resample_close(ost->resample);
2339 if (ost->reformat_ctx)
2340 av_audio_convert_free(ost->reformat_ctx);
2350 int file_read(const char *filename)
2353 unsigned char buffer[1024];
2356 if (url_open(&h, filename, O_RDONLY) < 0) {
2357 printf("could not open '%s'\n", filename);
2361 len = url_read(h, buffer, sizeof(buffer));
2364 for(i=0;i<len;i++) putchar(buffer[i]);
2371 static void opt_format(const char *arg)
2373 /* compatibility stuff for pgmyuv */
2374 if (!strcmp(arg, "pgmyuv")) {
2375 pgmyuv_compatibility_hack=1;
2376 // opt_image_format(arg);
2378 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2381 file_iformat = av_find_input_format(arg);
2382 file_oformat = guess_format(arg, NULL, NULL);
2383 if (!file_iformat && !file_oformat) {
2384 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2389 static void opt_video_rc_override_string(const char *arg)
2391 video_rc_override_string = arg;
2394 static int opt_me_threshold(const char *opt, const char *arg)
2396 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2400 static int opt_loglevel(const char *opt, const char *arg)
2402 int level = parse_number_or_die(opt, arg, OPT_INT, INT_MIN, INT_MAX);
2403 av_log_set_level(level);
2407 static int opt_verbose(const char *opt, const char *arg)
2409 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2413 static int opt_frame_rate(const char *opt, const char *arg)
2415 if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2416 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2422 static int opt_bitrate(const char *opt, const char *arg)
2424 int codec_type = opt[0]=='a' ? CODEC_TYPE_AUDIO : CODEC_TYPE_VIDEO;
2426 opt_default(opt, arg);
2428 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2429 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2434 static void opt_frame_crop_top(const char *arg)
2436 frame_topBand = atoi(arg);
2437 if (frame_topBand < 0) {
2438 fprintf(stderr, "Incorrect top crop size\n");
2441 if ((frame_topBand % 2) != 0) {
2442 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2445 if ((frame_topBand) >= frame_height){
2446 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2449 frame_height -= frame_topBand;
2452 static void opt_frame_crop_bottom(const char *arg)
2454 frame_bottomBand = atoi(arg);
2455 if (frame_bottomBand < 0) {
2456 fprintf(stderr, "Incorrect bottom crop size\n");
2459 if ((frame_bottomBand % 2) != 0) {
2460 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2463 if ((frame_bottomBand) >= frame_height){
2464 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2467 frame_height -= frame_bottomBand;
2470 static void opt_frame_crop_left(const char *arg)
2472 frame_leftBand = atoi(arg);
2473 if (frame_leftBand < 0) {
2474 fprintf(stderr, "Incorrect left crop size\n");
2477 if ((frame_leftBand % 2) != 0) {
2478 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2481 if ((frame_leftBand) >= frame_width){
2482 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2485 frame_width -= frame_leftBand;
2488 static void opt_frame_crop_right(const char *arg)
2490 frame_rightBand = atoi(arg);
2491 if (frame_rightBand < 0) {
2492 fprintf(stderr, "Incorrect right crop size\n");
2495 if ((frame_rightBand % 2) != 0) {
2496 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2499 if ((frame_rightBand) >= frame_width){
2500 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2503 frame_width -= frame_rightBand;
2506 static void opt_frame_size(const char *arg)
2508 if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
2509 fprintf(stderr, "Incorrect frame size\n");
2512 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2513 fprintf(stderr, "Frame size must be a multiple of 2\n");
2519 #define SCALEBITS 10
2520 #define ONE_HALF (1 << (SCALEBITS - 1))
2521 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2523 #define RGB_TO_Y(r, g, b) \
2524 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2525 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2527 #define RGB_TO_U(r1, g1, b1, shift)\
2528 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2529 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2531 #define RGB_TO_V(r1, g1, b1, shift)\
2532 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2533 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2535 static void opt_pad_color(const char *arg) {
2536 /* Input is expected to be six hex digits similar to
2537 how colors are expressed in html tags (but without the #) */
2538 int rgb = strtol(arg, NULL, 16);
2542 g = ((rgb >> 8) & 255);
2545 padcolor[0] = RGB_TO_Y(r,g,b);
2546 padcolor[1] = RGB_TO_U(r,g,b,0);
2547 padcolor[2] = RGB_TO_V(r,g,b,0);
2550 static void opt_frame_pad_top(const char *arg)
2552 frame_padtop = atoi(arg);
2553 if (frame_padtop < 0) {
2554 fprintf(stderr, "Incorrect top pad size\n");
2557 if ((frame_padtop % 2) != 0) {
2558 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2563 static void opt_frame_pad_bottom(const char *arg)
2565 frame_padbottom = atoi(arg);
2566 if (frame_padbottom < 0) {
2567 fprintf(stderr, "Incorrect bottom pad size\n");
2570 if ((frame_padbottom % 2) != 0) {
2571 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2577 static void opt_frame_pad_left(const char *arg)
2579 frame_padleft = atoi(arg);
2580 if (frame_padleft < 0) {
2581 fprintf(stderr, "Incorrect left pad size\n");
2584 if ((frame_padleft % 2) != 0) {
2585 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2591 static void opt_frame_pad_right(const char *arg)
2593 frame_padright = atoi(arg);
2594 if (frame_padright < 0) {
2595 fprintf(stderr, "Incorrect right pad size\n");
2598 if ((frame_padright % 2) != 0) {
2599 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2604 static void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts)
2608 for (i=-1; i < nb_fmts; i++) {
2609 get_fmt_string (fmt_str, sizeof(fmt_str), i);
2610 fprintf(stdout, "%s\n", fmt_str);
2614 static void opt_frame_pix_fmt(const char *arg)
2616 if (strcmp(arg, "list")) {
2617 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2618 if (frame_pix_fmt == PIX_FMT_NONE) {
2619 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2623 list_fmts(avcodec_pix_fmt_string, PIX_FMT_NB);
2628 static void opt_frame_aspect_ratio(const char *arg)
2635 p = strchr(arg, ':');
2637 x = strtol(arg, &end, 10);
2639 y = strtol(end+1, &end, 10);
2641 ar = (double)x / (double)y;
2643 ar = strtod(arg, NULL);
2646 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2649 frame_aspect_ratio = ar;
2652 static int opt_metadata(const char *opt, const char *arg)
2654 char *mid= strchr(arg, '=');
2657 fprintf(stderr, "Missing =\n");
2663 metadata= av_realloc(metadata, sizeof(*metadata)*metadata_count);
2664 metadata[metadata_count-1].key = av_strdup(arg);
2665 metadata[metadata_count-1].value= av_strdup(mid);
2670 static void opt_qscale(const char *arg)
2672 video_qscale = atof(arg);
2673 if (video_qscale <= 0 ||
2674 video_qscale > 255) {
2675 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2680 static void opt_top_field_first(const char *arg)
2682 top_field_first= atoi(arg);
2685 static int opt_thread_count(const char *opt, const char *arg)
2687 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2690 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2695 static void opt_audio_sample_fmt(const char *arg)
2697 if (strcmp(arg, "list"))
2698 audio_sample_fmt = avcodec_get_sample_fmt(arg);
2700 list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
2705 static int opt_audio_rate(const char *opt, const char *arg)
2707 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2711 static int opt_audio_channels(const char *opt, const char *arg)
2713 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2717 static void opt_video_channel(const char *arg)
2719 video_channel = strtol(arg, NULL, 0);
2722 static void opt_video_standard(const char *arg)
2724 video_standard = av_strdup(arg);
2727 static void opt_codec(int *pstream_copy, char **pcodec_name,
2728 int codec_type, const char *arg)
2730 av_freep(pcodec_name);
2731 if (!strcmp(arg, "copy")) {
2734 *pcodec_name = av_strdup(arg);
2738 static void opt_audio_codec(const char *arg)
2740 opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg);
2743 static void opt_audio_tag(const char *arg)
2746 audio_codec_tag= strtol(arg, &tail, 0);
2749 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2752 static void opt_video_tag(const char *arg)
2755 video_codec_tag= strtol(arg, &tail, 0);
2758 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2761 static void opt_video_codec(const char *arg)
2763 opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg);
2766 static void opt_subtitle_codec(const char *arg)
2768 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
2771 static void opt_subtitle_tag(const char *arg)
2774 subtitle_codec_tag= strtol(arg, &tail, 0);
2777 subtitle_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2780 static void opt_map(const char *arg)
2785 m = &stream_maps[nb_stream_maps++];
2787 m->file_index = strtol(arg, &p, 0);
2791 m->stream_index = strtol(p, &p, 0);
2794 m->sync_file_index = strtol(p, &p, 0);
2797 m->sync_stream_index = strtol(p, &p, 0);
2799 m->sync_file_index = m->file_index;
2800 m->sync_stream_index = m->stream_index;
2804 static void opt_map_meta_data(const char *arg)
2809 m = &meta_data_maps[nb_meta_data_maps++];
2811 m->out_file = strtol(arg, &p, 0);
2815 m->in_file = strtol(p, &p, 0);
2818 static void opt_input_ts_scale(const char *arg)
2820 unsigned int stream;
2824 stream = strtol(arg, &p, 0);
2827 scale= strtod(p, &p);
2829 if(stream >= MAX_STREAMS)
2832 input_files_ts_scale[nb_input_files][stream]= scale;
2835 static int opt_recording_time(const char *opt, const char *arg)
2837 recording_time = parse_time_or_die(opt, arg, 1);
2841 static int opt_start_time(const char *opt, const char *arg)
2843 start_time = parse_time_or_die(opt, arg, 1);
2847 static int opt_rec_timestamp(const char *opt, const char *arg)
2849 rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
2853 static int opt_input_ts_offset(const char *opt, const char *arg)
2855 input_ts_offset = parse_time_or_die(opt, arg, 1);
2859 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
2861 const char *codec_string = encoder ? "encoder" : "decoder";
2865 return CODEC_ID_NONE;
2867 avcodec_find_encoder_by_name(name) :
2868 avcodec_find_decoder_by_name(name);
2870 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
2873 if(codec->type != type) {
2874 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
2880 static void opt_input_file(const char *filename)
2882 AVFormatContext *ic;
2883 AVFormatParameters params, *ap = ¶ms;
2884 int err, i, ret, rfps, rfps_base;
2887 if (!strcmp(filename, "-"))
2890 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2891 !strcmp(filename, "/dev/stdin");
2893 /* get default parameters from command line */
2894 ic = avformat_alloc_context();
2896 memset(ap, 0, sizeof(*ap));
2897 ap->prealloced_context = 1;
2898 ap->sample_rate = audio_sample_rate;
2899 ap->channels = audio_channels;
2900 ap->time_base.den = frame_rate.num;
2901 ap->time_base.num = frame_rate.den;
2902 ap->width = frame_width + frame_padleft + frame_padright;
2903 ap->height = frame_height + frame_padtop + frame_padbottom;
2904 ap->pix_fmt = frame_pix_fmt;
2905 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
2906 ap->channel = video_channel;
2907 ap->standard = video_standard;
2908 ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0);
2909 ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0);
2910 if(pgmyuv_compatibility_hack)
2911 ap->video_codec_id= CODEC_ID_PGMYUV;
2913 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
2915 ic->video_codec_id = find_codec_or_die(video_codec_name , CODEC_TYPE_VIDEO , 0);
2916 ic->audio_codec_id = find_codec_or_die(audio_codec_name , CODEC_TYPE_AUDIO , 0);
2917 ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 0);
2918 ic->flags |= AVFMT_FLAG_NONBLOCK;
2920 /* open the input file with generic libav function */
2921 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2923 print_error(filename, err);
2928 for(i=0; i<ic->nb_programs; i++)
2929 if(ic->programs[i]->id != opt_programid)
2930 ic->programs[i]->discard = AVDISCARD_ALL;
2933 ic->loop_input = loop_input;
2935 /* If not enough info to get the stream parameters, we decode the
2936 first frames to get it. (used in mpeg case for example) */
2937 ret = av_find_stream_info(ic);
2938 if (ret < 0 && verbose >= 0) {
2939 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2943 timestamp = start_time;
2944 /* add the stream start time */
2945 if (ic->start_time != AV_NOPTS_VALUE)
2946 timestamp += ic->start_time;
2948 /* if seeking requested, we execute it */
2949 if (start_time != 0) {
2950 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2952 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2953 filename, (double)timestamp / AV_TIME_BASE);
2955 /* reset seek info */
2959 /* update the current parameters so that they match the one of the input stream */
2960 for(i=0;i<ic->nb_streams;i++) {
2961 AVCodecContext *enc = ic->streams[i]->codec;
2963 avcodec_thread_init(enc, thread_count);
2964 enc->thread_count= thread_count;
2965 switch(enc->codec_type) {
2966 case CODEC_TYPE_AUDIO:
2967 set_context_opts(enc, avcodec_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2968 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2969 channel_layout = enc->channel_layout;
2970 audio_channels = enc->channels;
2971 audio_sample_rate = enc->sample_rate;
2972 audio_sample_fmt = enc->sample_fmt;
2973 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(audio_codec_name);
2975 ic->streams[i]->discard= AVDISCARD_ALL;
2977 case CODEC_TYPE_VIDEO:
2978 set_context_opts(enc, avcodec_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2979 frame_height = enc->height;
2980 frame_width = enc->width;
2981 if(ic->streams[i]->sample_aspect_ratio.num)
2982 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
2984 frame_aspect_ratio=av_q2d(enc->sample_aspect_ratio);
2985 frame_aspect_ratio *= (float) enc->width / enc->height;
2986 frame_pix_fmt = enc->pix_fmt;
2987 rfps = ic->streams[i]->r_frame_rate.num;
2988 rfps_base = ic->streams[i]->r_frame_rate.den;
2989 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2991 enc->debug |= FF_DEBUG_MV;
2993 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2996 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2997 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2999 (float)rfps / rfps_base, rfps, rfps_base);
3001 /* update the current frame rate to match the stream frame rate */
3002 frame_rate.num = rfps;
3003 frame_rate.den = rfps_base;
3005 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(video_codec_name);
3007 ic->streams[i]->discard= AVDISCARD_ALL;
3008 else if(video_discard)
3009 ic->streams[i]->discard= video_discard;
3011 case CODEC_TYPE_DATA:
3013 case CODEC_TYPE_SUBTITLE:
3014 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(subtitle_codec_name);
3015 if(subtitle_disable)
3016 ic->streams[i]->discard = AVDISCARD_ALL;
3018 case CODEC_TYPE_ATTACHMENT:
3019 case CODEC_TYPE_UNKNOWN:
3027 input_files[nb_input_files] = ic;
3028 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3029 /* dump the file content */
3031 dump_format(ic, nb_input_files, filename, 0);
3034 file_iformat = NULL;
3035 file_oformat = NULL;
3039 av_freep(&video_codec_name);
3040 av_freep(&audio_codec_name);
3041 av_freep(&subtitle_codec_name);
3044 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3045 int *has_subtitle_ptr)
3047 int has_video, has_audio, has_subtitle, i, j;
3048 AVFormatContext *ic;
3053 for(j=0;j<nb_input_files;j++) {
3054 ic = input_files[j];
3055 for(i=0;i<ic->nb_streams;i++) {
3056 AVCodecContext *enc = ic->streams[i]->codec;
3057 switch(enc->codec_type) {
3058 case CODEC_TYPE_AUDIO:
3061 case CODEC_TYPE_VIDEO:
3064 case CODEC_TYPE_SUBTITLE:
3067 case CODEC_TYPE_DATA:
3068 case CODEC_TYPE_ATTACHMENT:
3069 case CODEC_TYPE_UNKNOWN:
3076 *has_video_ptr = has_video;
3077 *has_audio_ptr = has_audio;
3078 *has_subtitle_ptr = has_subtitle;
3081 static void new_video_stream(AVFormatContext *oc)
3084 AVCodecContext *video_enc;
3087 st = av_new_stream(oc, oc->nb_streams);
3089 fprintf(stderr, "Could not alloc stream\n");
3092 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
3093 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
3094 video_bitstream_filters= NULL;
3097 avcodec_thread_init(st->codec, thread_count);
3099 video_enc = st->codec;
3102 video_enc->codec_tag= video_codec_tag;
3104 if( (video_global_header&1)
3105 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3106 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3107 avcodec_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3109 if(video_global_header&2){
3110 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3111 avcodec_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3114 if (video_stream_copy) {
3115 st->stream_copy = 1;
3116 video_enc->codec_type = CODEC_TYPE_VIDEO;
3117 video_enc->sample_aspect_ratio =
3118 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3123 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3125 if (video_codec_name) {
3126 codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
3127 codec = avcodec_find_encoder_by_name(video_codec_name);
3128 output_codecs[nb_ocodecs] = codec;
3130 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
3131 codec = avcodec_find_encoder(codec_id);
3134 video_enc->codec_id = codec_id;
3136 set_context_opts(video_enc, avcodec_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3138 if (codec && codec->supported_framerates && !force_fps)
3139 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3140 video_enc->time_base.den = fps.num;
3141 video_enc->time_base.num = fps.den;
3143 video_enc->width = frame_width + frame_padright + frame_padleft;
3144 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3145 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3146 video_enc->pix_fmt = frame_pix_fmt;
3147 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3149 if(codec && codec->pix_fmts){
3150 const enum PixelFormat *p= codec->pix_fmts;
3152 if(*p == video_enc->pix_fmt)
3156 video_enc->pix_fmt = codec->pix_fmts[0];
3160 video_enc->gop_size = 0;
3161 if (video_qscale || same_quality) {
3162 video_enc->flags |= CODEC_FLAG_QSCALE;
3163 video_enc->global_quality=
3164 st->quality = FF_QP2LAMBDA * video_qscale;
3168 video_enc->intra_matrix = intra_matrix;
3170 video_enc->inter_matrix = inter_matrix;
3172 video_enc->thread_count = thread_count;
3173 p= video_rc_override_string;
3176 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3178 fprintf(stderr, "error parsing rc_override\n");
3181 video_enc->rc_override=
3182 av_realloc(video_enc->rc_override,
3183 sizeof(RcOverride)*(i+1));
3184 video_enc->rc_override[i].start_frame= start;
3185 video_enc->rc_override[i].end_frame = end;
3187 video_enc->rc_override[i].qscale= q;
3188 video_enc->rc_override[i].quality_factor= 1.0;
3191 video_enc->rc_override[i].qscale= 0;
3192 video_enc->rc_override[i].quality_factor= -q/100.0;
3197 video_enc->rc_override_count=i;
3198 if (!video_enc->rc_initial_buffer_occupancy)
3199 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3200 video_enc->me_threshold= me_threshold;
3201 video_enc->intra_dc_precision= intra_dc_precision - 8;
3204 video_enc->flags|= CODEC_FLAG_PSNR;
3209 video_enc->flags |= CODEC_FLAG_PASS1;
3211 video_enc->flags |= CODEC_FLAG_PASS2;
3217 /* reset some key parameters */
3219 av_freep(&video_codec_name);
3220 video_stream_copy = 0;
3223 static void new_audio_stream(AVFormatContext *oc)
3226 AVCodecContext *audio_enc;
3229 st = av_new_stream(oc, oc->nb_streams);
3231 fprintf(stderr, "Could not alloc stream\n");
3234 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
3236 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
3237 audio_bitstream_filters= NULL;
3240 avcodec_thread_init(st->codec, thread_count);
3242 audio_enc = st->codec;
3243 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3246 audio_enc->codec_tag= audio_codec_tag;
3248 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3249 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3250 avcodec_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3252 if (audio_stream_copy) {
3253 st->stream_copy = 1;
3254 audio_enc->channels = audio_channels;
3258 set_context_opts(audio_enc, avcodec_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3260 if (audio_codec_name) {
3261 codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
3262 codec = avcodec_find_encoder_by_name(audio_codec_name);
3263 output_codecs[nb_ocodecs] = codec;
3265 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3266 codec = avcodec_find_encoder(codec_id);
3268 audio_enc->codec_id = codec_id;
3270 if (audio_qscale > QSCALE_NONE) {
3271 audio_enc->flags |= CODEC_FLAG_QSCALE;
3272 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3274 audio_enc->thread_count = thread_count;
3275 audio_enc->channels = audio_channels;
3276 audio_enc->sample_fmt = audio_sample_fmt;
3277 audio_enc->channel_layout = channel_layout;
3278 if (avcodec_channel_layout_num_channels(channel_layout) != audio_channels)
3279 audio_enc->channel_layout = 0;
3281 if(codec && codec->sample_fmts){
3282 const enum SampleFormat *p= codec->sample_fmts;
3284 if(*p == audio_enc->sample_fmt)
3288 audio_enc->sample_fmt = codec->sample_fmts[0];
3292 audio_enc->sample_rate = audio_sample_rate;
3293 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3294 if (audio_language) {
3295 av_metadata_set(&st->metadata, "language", audio_language);
3296 av_free(audio_language);
3297 audio_language = NULL;
3300 /* reset some key parameters */
3302 av_freep(&audio_codec_name);
3303 audio_stream_copy = 0;
3306 static void new_subtitle_stream(AVFormatContext *oc)
3309 AVCodecContext *subtitle_enc;
3311 st = av_new_stream(oc, oc->nb_streams);
3313 fprintf(stderr, "Could not alloc stream\n");
3316 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
3318 bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
3319 subtitle_bitstream_filters= NULL;
3321 subtitle_enc = st->codec;
3322 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3324 if(subtitle_codec_tag)
3325 subtitle_enc->codec_tag= subtitle_codec_tag;
3327 if (subtitle_stream_copy) {
3328 st->stream_copy = 1;
3330 set_context_opts(avcodec_opts[CODEC_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3331 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1);
3332 output_codecs[nb_ocodecs] = avcodec_find_encoder_by_name(subtitle_codec_name);
3336 if (subtitle_language) {
3337 av_metadata_set(&st->metadata, "language", subtitle_language);
3338 av_free(subtitle_language);
3339 subtitle_language = NULL;
3342 subtitle_disable = 0;
3343 av_freep(&subtitle_codec_name);
3344 subtitle_stream_copy = 0;
3347 static void opt_new_audio_stream(void)
3349 AVFormatContext *oc;
3350 if (nb_output_files <= 0) {
3351 fprintf(stderr, "At least one output file must be specified\n");
3354 oc = output_files[nb_output_files - 1];
3355 new_audio_stream(oc);
3358 static void opt_new_video_stream(void)
3360 AVFormatContext *oc;
3361 if (nb_output_files <= 0) {
3362 fprintf(stderr, "At least one output file must be specified\n");
3365 oc = output_files[nb_output_files - 1];
3366 new_video_stream(oc);
3369 static void opt_new_subtitle_stream(void)
3371 AVFormatContext *oc;
3372 if (nb_output_files <= 0) {
3373 fprintf(stderr, "At least one output file must be specified\n");
3376 oc = output_files[nb_output_files - 1];
3377 new_subtitle_stream(oc);
3380 static void opt_output_file(const char *filename)
3382 AVFormatContext *oc;
3383 int use_video, use_audio, use_subtitle;
3384 int input_has_video, input_has_audio, input_has_subtitle;
3385 AVFormatParameters params, *ap = ¶ms;
3387 if (!strcmp(filename, "-"))
3390 oc = avformat_alloc_context();
3392 if (!file_oformat) {
3393 file_oformat = guess_format(NULL, filename, NULL);
3394 if (!file_oformat) {
3395 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3401 oc->oformat = file_oformat;
3402 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3404 if (!strcmp(file_oformat->name, "ffm") &&
3405 av_strstart(filename, "http:", NULL)) {
3406 /* special case for files sent to ffserver: we get the stream
3407 parameters from ffserver */
3408 int err = read_ffserver_streams(oc, filename);
3410 print_error(filename, err);
3414 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3415 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3416 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3418 /* disable if no corresponding type found and at least one
3420 if (nb_input_files > 0) {
3421 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3422 &input_has_subtitle);
3423 if (!input_has_video)
3425 if (!input_has_audio)
3427 if (!input_has_subtitle)
3431 /* manual disable */
3432 if (audio_disable) {
3435 if (video_disable) {
3438 if (subtitle_disable) {
3443 new_video_stream(oc);
3447 new_audio_stream(oc);
3451 new_subtitle_stream(oc);
3454 oc->timestamp = rec_timestamp;
3456 for(; metadata_count>0; metadata_count--){
3457 av_metadata_set(&oc->metadata, metadata[metadata_count-1].key,
3458 metadata[metadata_count-1].value);
3460 av_metadata_conv(oc, oc->oformat->metadata_conv, NULL);
3463 output_files[nb_output_files++] = oc;
3465 /* check filename in case of an image number is expected */
3466 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3467 if (!av_filename_number_test(oc->filename)) {
3468 print_error(oc->filename, AVERROR_NUMEXPECTED);
3473 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3474 /* test if it already exists to avoid loosing precious files */
3475 if (!file_overwrite &&
3476 (strchr(filename, ':') == NULL ||
3477 filename[1] == ':' ||
3478 av_strstart(filename, "file:", NULL))) {
3479 if (url_exist(filename)) {
3481 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3483 if (!read_yesno()) {
3484 fprintf(stderr, "Not overwriting - exiting\n");
3489 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3496 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
3497 fprintf(stderr, "Could not open '%s'\n", filename);
3502 memset(ap, 0, sizeof(*ap));
3503 if (av_set_parameters(oc, ap) < 0) {
3504 fprintf(stderr, "%s: Invalid encoding parameters\n",
3509 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3510 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3511 oc->loop_output = loop_output;
3512 oc->flags |= AVFMT_FLAG_NONBLOCK;
3514 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
3516 /* reset some options */
3517 file_oformat = NULL;
3518 file_iformat = NULL;
3521 /* same option as mencoder */
3522 static void opt_pass(const char *pass_str)
3525 pass = atoi(pass_str);
3526 if (pass != 1 && pass != 2) {
3527 fprintf(stderr, "pass number can be only 1 or 2\n");
3533 static int64_t getutime(void)
3536 struct rusage rusage;
3538 getrusage(RUSAGE_SELF, &rusage);
3539 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3540 #elif HAVE_GETPROCESSTIMES
3542 FILETIME c, e, k, u;
3543 proc = GetCurrentProcess();
3544 GetProcessTimes(proc, &c, &e, &k, &u);
3545 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3547 return av_gettime();
3551 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3554 const char *p = str;
3561 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3568 static void opt_inter_matrix(const char *arg)
3570 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3571 parse_matrix_coeffs(inter_matrix, arg);
3574 static void opt_intra_matrix(const char *arg)
3576 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3577 parse_matrix_coeffs(intra_matrix, arg);
3581 * Trivial log callback.
3582 * Only suitable for show_help and similar since it lacks prefix handling.
3584 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
3586 vfprintf(stdout, fmt, vl);
3589 static void show_help(void)
3591 av_log_set_callback(log_callback_help);
3592 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3593 "Hyper fast Audio and Video encoder\n");
3595 show_help_options(options, "Main options:\n",
3596 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3597 show_help_options(options, "\nAdvanced options:\n",
3598 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3600 show_help_options(options, "\nVideo options:\n",
3601 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3603 show_help_options(options, "\nAdvanced Video options:\n",
3604 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3605 OPT_VIDEO | OPT_EXPERT);
3606 show_help_options(options, "\nAudio options:\n",
3607 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3609 show_help_options(options, "\nAdvanced Audio options:\n",
3610 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3611 OPT_AUDIO | OPT_EXPERT);
3612 show_help_options(options, "\nSubtitle options:\n",
3613 OPT_SUBTITLE | OPT_GRAB,
3615 show_help_options(options, "\nAudio/Video grab options:\n",
3619 av_opt_show(avcodec_opts[0], NULL);
3621 av_opt_show(avformat_opts, NULL);
3623 av_opt_show(sws_opts, NULL);
3626 static void opt_target(const char *arg)
3629 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3631 if(!strncmp(arg, "pal-", 4)) {
3634 } else if(!strncmp(arg, "ntsc-", 5)) {
3637 } else if(!strncmp(arg, "film-", 5)) {
3642 /* Calculate FR via float to avoid int overflow */
3643 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3646 } else if((fr == 29970) || (fr == 23976)) {
3649 /* Try to determine PAL/NTSC by peeking in the input files */
3650 if(nb_input_files) {
3652 for(j = 0; j < nb_input_files; j++) {
3653 for(i = 0; i < input_files[j]->nb_streams; i++) {
3654 AVCodecContext *c = input_files[j]->streams[i]->codec;
3655 if(c->codec_type != CODEC_TYPE_VIDEO)
3657 fr = c->time_base.den * 1000 / c->time_base.num;
3661 } else if((fr == 29970) || (fr == 23976)) {
3671 if(verbose && norm >= 0)
3672 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3676 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3677 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3678 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3682 if(!strcmp(arg, "vcd")) {
3684 opt_video_codec("mpeg1video");
3685 opt_audio_codec("mp2");
3688 opt_frame_size(norm ? "352x240" : "352x288");
3689 opt_frame_rate(NULL, frame_rates[norm]);
3690 opt_default("gop", norm ? "18" : "15");
3692 opt_default("b", "1150000");
3693 opt_default("maxrate", "1150000");
3694 opt_default("minrate", "1150000");
3695 opt_default("bufsize", "327680"); // 40*1024*8;
3697 opt_default("ab", "224000");
3698 audio_sample_rate = 44100;
3701 opt_default("packetsize", "2324");
3702 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3704 /* We have to offset the PTS, so that it is consistent with the SCR.
3705 SCR starts at 36000, but the first two packs contain only padding
3706 and the first pack from the other stream, respectively, may also have
3707 been written before.
3708 So the real data starts at SCR 36000+3*1200. */
3709 mux_preload= (36000+3*1200) / 90000.0; //0.44
3710 } else if(!strcmp(arg, "svcd")) {
3712 opt_video_codec("mpeg2video");
3713 opt_audio_codec("mp2");
3716 opt_frame_size(norm ? "480x480" : "480x576");
3717 opt_frame_rate(NULL, frame_rates[norm]);
3718 opt_default("gop", norm ? "18" : "15");
3720 opt_default("b", "2040000");
3721 opt_default("maxrate", "2516000");
3722 opt_default("minrate", "0"); //1145000;
3723 opt_default("bufsize", "1835008"); //224*1024*8;
3724 opt_default("flags", "+scan_offset");
3727 opt_default("ab", "224000");
3728 audio_sample_rate = 44100;
3730 opt_default("packetsize", "2324");
3732 } else if(!strcmp(arg, "dvd")) {
3734 opt_video_codec("mpeg2video");
3735 opt_audio_codec("ac3");
3738 opt_frame_size(norm ? "720x480" : "720x576");
3739 opt_frame_rate(NULL, frame_rates[norm]);
3740 opt_default("gop", norm ? "18" : "15");
3742 opt_default("b", "6000000");
3743 opt_default("maxrate", "9000000");
3744 opt_default("minrate", "0"); //1500000;
3745 opt_default("bufsize", "1835008"); //224*1024*8;
3747 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3748 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3750 opt_default("ab", "448000");
3751 audio_sample_rate = 48000;
3753 } else if(!strncmp(arg, "dv", 2)) {
3757 opt_frame_size(norm ? "720x480" : "720x576");
3758 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3759 (norm ? "yuv411p" : "yuv420p"));
3760 opt_frame_rate(NULL, frame_rates[norm]);
3762 audio_sample_rate = 48000;
3766 fprintf(stderr, "Unknown target: %s\n", arg);
3771 static void opt_vstats_file (const char *arg)
3773 av_free (vstats_filename);
3774 vstats_filename=av_strdup (arg);
3777 static void opt_vstats (void)
3780 time_t today2 = time(NULL);
3781 struct tm *today = localtime(&today2);
3783 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3785 opt_vstats_file(filename);
3788 static int opt_bsf(const char *opt, const char *arg)
3790 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3791 AVBitStreamFilterContext **bsfp;
3794 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3798 bsfp= *opt == 'v' ? &video_bitstream_filters :
3799 *opt == 'a' ? &audio_bitstream_filters :
3800 &subtitle_bitstream_filters;
3802 bsfp= &(*bsfp)->next;
3809 static int opt_preset(const char *opt, const char *arg)
3812 char filename[1000], tmp[1000], tmp2[1000], line[1000];
3814 const char *base[2]= { getenv("HOME"),
3817 for(i=!base[0]; i<2 && !f; i++){
3818 snprintf(filename, sizeof(filename), "%s%s/%s.ffpreset", base[i], i ? "" : "/.ffmpeg", arg);
3819 f= fopen(filename, "r");
3821 char *codec_name= *opt == 'v' ? video_codec_name :
3822 *opt == 'a' ? audio_codec_name :
3823 subtitle_codec_name;
3824 snprintf(filename, sizeof(filename), "%s%s/%s-%s.ffpreset", base[i], i ? "" : "/.ffmpeg", codec_name, arg);
3825 f= fopen(filename, "r");
3828 if(!f && ((arg[0]=='.' && arg[1]=='/') || arg[0]=='/' ||
3830 av_strlcpy(filename, arg, sizeof(filename));
3831 f= fopen(filename, "r");
3835 fprintf(stderr, "File for preset '%s' not found\n", arg);
3840 int e= fscanf(f, "%999[^\n]\n", line) - 1;
3841 if(line[0] == '#' && !e)
3843 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
3845 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
3848 if(!strcmp(tmp, "acodec")){
3849 opt_audio_codec(tmp2);
3850 }else if(!strcmp(tmp, "vcodec")){
3851 opt_video_codec(tmp2);
3852 }else if(!strcmp(tmp, "scodec")){
3853 opt_subtitle_codec(tmp2);
3854 }else if(opt_default(tmp, tmp2) < 0){
3855 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
3865 static const OptionDef options[] = {
3867 { "L", OPT_EXIT, {(void*)show_license}, "show license" },
3868 { "h", OPT_EXIT, {(void*)show_help}, "show help" },
3869 { "version", OPT_EXIT, {(void*)show_version}, "show version" },
3870 { "formats", OPT_EXIT, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3871 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3872 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3873 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3874 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3875 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3876 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3877 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3878 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3879 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3880 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
3881 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_rec_timestamp}, "set the timestamp ('now' to set the current time)", "time" },
3882 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
3883 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3884 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3885 "add timings for benchmarking" },
3886 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3887 "dump each input packet" },
3888 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3889 "when dumping packets, also dump the payload" },
3890 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3891 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3892 { "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)", "" },
3893 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
3894 { "loglevel", HAS_ARG | OPT_FUNC2, {(void*)opt_loglevel}, "set libav* logging level", "number" },
3895 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3896 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3897 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3898 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3899 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3900 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3901 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3902 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3903 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3904 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3905 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
3906 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
3909 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3910 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3911 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3912 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3913 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3914 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3915 { "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" },
3916 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3917 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3918 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3919 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3920 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3921 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3922 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3923 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3924 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3925 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3926 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3927 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3928 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3929 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3930 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3931 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
3932 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3933 "use same video quality as source (implies VBR)" },
3934 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3935 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
3936 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3937 "deinterlace pictures" },
3938 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3939 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
3940 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
3941 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3942 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3943 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3944 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3945 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3946 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3947 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3948 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
3951 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3952 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3953 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3954 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3955 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3956 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3957 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3958 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3959 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3960 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3961 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3962 { "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" },
3964 /* subtitle options */
3965 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
3966 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3967 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
3968 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3969 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
3972 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
3973 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3974 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3977 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
3978 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
3980 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3981 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3982 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3984 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
3985 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
3986 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
3988 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
3992 #ifdef CONFIG_FFMPEG_WITH_FRSH
3994 frsh_vres_id_t disk_vres;
3996 void *av_encode_thread(void *arg)
3999 frsh_thread_id_t thread_id;
4001 /* bind this thread to vres */
4002 thread_id = fosa_thread_self();
4003 /* PXW(frsh_thread_bind(disk_vres, thread_id)); */
4005 ret = av_encode(output_files, nb_output_files,
4006 input_files, nb_input_files,
4007 stream_maps, nb_stream_maps);
4008 return (void*)(intptr_t)ret;
4013 frsh_thread_attr_t frsh_attr;
4014 frsh_thread_id_t thread;
4015 frsh_vres_id_t cpu_vres;
4016 frsh_contract_t cpu_contract;
4017 frsh_rel_time_t cpu_budget, cpu_period;
4019 frsh_contract_t disk_contract;
4020 frsh_rel_time_t disk_budget, disk_period;
4026 cpu_budget = fosa_msec_to_rel_time(5);
4027 cpu_period = fosa_msec_to_rel_time(1000/50);
4029 /* #define DISK_THROUGHPUT 20277LLU /\* units??? probably MB/s *\/ */
4030 /* disk_budget = fosa_nsec_to_rel_time(1000000000LLU/\*nsec/s*\/ * 500000 /\*bytes/s*\/ */
4031 /* / (DISK_THROUGHPUT*1000000) /\* bytes *\/); // is this correct? */
4032 disk_budget = fosa_msec_to_rel_time(1);
4033 disk_period = fosa_msec_to_rel_time(1000/50);
4035 /* Contract negotiation for CPU */
4036 ret = frsh_contract_init(&cpu_contract);
4037 if (ret) PERROR_AND_EXIT(ret, "CPU:frsh_contract_init");
4039 ret = frsh_contract_set_basic_params(&cpu_contract,
4044 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_basic_params");
4045 ret = frsh_contract_set_resource_and_label(&cpu_contract,
4046 FRSH_RT_PROCESSOR, FRSH_CPU_ID_DEFAULT, "recorder");
4047 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_resource_and_label");
4049 ret = frsh_contract_negotiate(&cpu_contract, &cpu_vres);
4050 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_negotiate cpu");
4051 printf("Aqcpu vres negotiated\n");
4053 /* Contract negotiation for Disk */
4054 ret = frsh_contract_init(&disk_contract);
4055 if (ret) PERROR_AND_EXIT(ret, "DISK:frsh_contract_init");
4057 ret = frsh_contract_set_basic_params(&disk_contract,
4060 FRSH_WT_INDETERMINATE,
4062 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_basic_params");
4063 ret = frsh_contract_set_resource_and_label(&disk_contract,
4064 FRSH_RT_DISK, 0, "recorder");
4065 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_resource_and_label");
4067 ret = frsh_contract_negotiate(&disk_contract, &disk_vres);
4068 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_negotiate disk");
4069 printf("Disk vres negotiated\n");
4071 pthread_attr_init(&frsh_attr);
4072 ret = frsh_thread_create_and_bind(cpu_vres, &thread, &frsh_attr,
4073 av_encode_thread, (void*) NULL);
4074 if (ret) PERROR_AND_EXIT(ret, "frsh_thread_create_and_bind");
4076 pthread_join(thread.pthread_id, (void**) NULL);
4078 printf("Ending contracts\n");
4080 ret = frsh_contract_cancel(cpu_vres);
4081 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_cancel");
4083 printf("Finishing\n");
4086 #endif /* CONFIG_FFMPEG_WITH_FRSH */
4088 void flush_buffered_frames(AVFormatContext *s)
4091 while ((pktl = s->packet_buffer)) {
4092 av_free_packet(&pktl->pkt);
4093 s->packet_buffer = pktl->next;
4098 int main(int argc, char **argv)
4103 avcodec_register_all();
4104 avdevice_register_all();
4107 if(isatty(STDIN_FILENO))
4108 url_set_interrupt_cb(decode_interrupt_cb);
4110 for(i=0; i<CODEC_TYPE_NB; i++){
4111 avcodec_opts[i]= avcodec_alloc_context2(i);
4113 avformat_opts = avformat_alloc_context();
4114 sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
4119 parse_options(argc, argv, options, opt_output_file);
4121 if (nb_input_files == 0) {
4122 opt_input_file("sdp.txt");
4125 /* file converter / grab */
4126 if (nb_output_files <= 0) {
4128 opt_output_file("stream.mp4");
4131 for (i=0; i<nb_input_files; i++)
4132 flush_buffered_frames(input_files[i]);
4135 #if CONFIG_FFMPEG_WITH_FRSH
4136 if (frsh_stuff() < 0)
4139 if (av_encode(output_files, nb_output_files, input_files, nb_input_files,
4140 stream_maps, nb_stream_maps) < 0)
4143 ti = getutime() - ti;
4145 printf("bench: utime=%0.3fs\n", ti / 1000000.0);