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
25 #include <ffmpeg-config.h>
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[];
100 static AVFormatContext *input_files[MAX_FILES];
101 static int64_t input_files_ts_offset[MAX_FILES];
102 static double input_files_ts_scale[MAX_FILES][MAX_STREAMS];
103 static AVCodec *input_codecs[MAX_FILES*MAX_STREAMS];
104 static int nb_input_files = 0;
105 static int nb_icodecs;
107 static AVFormatContext *output_files[MAX_FILES];
108 static AVCodec *output_codecs[MAX_FILES*MAX_STREAMS];
109 static int nb_output_files = 0;
110 static int nb_ocodecs;
112 static AVStreamMap stream_maps[MAX_FILES*MAX_STREAMS];
113 static int nb_stream_maps;
115 static AVMetaDataMap meta_data_maps[MAX_FILES];
116 static int nb_meta_data_maps;
118 static AVInputFormat *file_iformat;
119 static AVOutputFormat *file_oformat;
120 static int frame_width = 0;
121 static int frame_height = 0;
122 static float frame_aspect_ratio = 0;
123 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
124 static enum SampleFormat audio_sample_fmt = SAMPLE_FMT_NONE;
125 static int frame_padtop = 0;
126 static int frame_padbottom = 0;
127 static int frame_padleft = 0;
128 static int frame_padright = 0;
129 static int padcolor[3] = {16,128,128}; /* default to black */
130 static int frame_topBand = 0;
131 static int frame_bottomBand = 0;
132 static int frame_leftBand = 0;
133 static int frame_rightBand = 0;
134 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
135 static AVRational frame_rate;
136 static float video_qscale = 0;
137 static uint16_t *intra_matrix = NULL;
138 static uint16_t *inter_matrix = NULL;
139 #if 0 //experimental, (can be removed)
140 static float video_rc_qsquish=1.0;
141 static float video_rc_qmod_amp=0;
142 static int video_rc_qmod_freq=0;
144 static const char *video_rc_override_string=NULL;
145 static int video_disable = 0;
146 static int video_discard = 0;
147 static char *video_codec_name = NULL;
148 static int video_codec_tag = 0;
149 static int same_quality = 0;
150 static int do_deinterlace = 0;
151 static int top_field_first = -1;
152 static int me_threshold = 0;
153 static int intra_dc_precision = 8;
154 static int loop_input = 0;
155 static int loop_output = AVFMT_NOOUTPUTLOOP;
156 static int qp_hist = 0;
158 static int intra_only = 0;
159 static int audio_sample_rate = 44100;
160 static int64_t channel_layout = 0;
161 #define QSCALE_NONE -99999
162 static float audio_qscale = QSCALE_NONE;
163 static int audio_disable = 0;
164 static int audio_channels = 1;
165 static char *audio_codec_name = NULL;
166 static int audio_codec_tag = 0;
167 static char *audio_language = NULL;
169 static int subtitle_disable = 0;
170 static char *subtitle_codec_name = NULL;
171 static char *subtitle_language = NULL;
172 static int subtitle_codec_tag = 0;
174 static float mux_preload= 0.5;
175 static float mux_max_delay= 0.7;
177 static int64_t recording_time = INT64_MAX;
178 static int64_t start_time = 0;
179 static int64_t rec_timestamp = 0;
180 static int64_t input_ts_offset = 0;
181 static int file_overwrite = 0;
182 static int o_direct = 0;
183 static const char *contract_label = "recorder";
184 static int metadata_count;
185 static AVMetadataTag *metadata;
186 static int do_benchmark = 0;
187 static int do_hex_dump = 0;
188 static int do_pkt_dump = 0;
189 static int do_psnr = 0;
190 static int do_pass = 0;
191 static char *pass_logfilename_prefix = NULL;
192 static int audio_stream_copy = 0;
193 static int video_stream_copy = 0;
194 static int subtitle_stream_copy = 0;
195 static int video_sync_method= -1;
196 static int audio_sync_method= 0;
197 static float audio_drift_threshold= 0.1;
198 static int copy_ts= 0;
199 static int opt_shortest = 0;
200 static int video_global_header = 0;
201 static char *vstats_filename;
202 static FILE *vstats_file;
203 static int opt_programid = 0;
204 static int copy_initial_nonkeyframes = 0;
206 static int rate_emu = 0;
208 static int video_channel = 0;
209 static char *video_standard;
211 static int audio_volume = 256;
213 static int exit_on_error = 0;
214 static int using_stdin = 0;
215 static int verbose = 1;
216 static int thread_count= 1;
217 static int q_pressed = 0;
218 static int64_t video_size = 0;
219 static int64_t audio_size = 0;
220 static int64_t extra_size = 0;
221 static int nb_frames_dup = 0;
222 static int nb_frames_drop = 0;
223 static int input_sync;
224 static uint64_t limit_filesize = 0;
225 static int force_fps = 0;
227 static int pgmyuv_compatibility_hack=0;
228 static float dts_delta_threshold = 10;
230 static unsigned int sws_flags = SWS_BICUBIC;
232 static int64_t timer_start;
234 static uint8_t *audio_buf;
235 static uint8_t *audio_out;
236 static uint8_t *audio_out2;
238 static short *samples;
240 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
241 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
242 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
243 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
245 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
247 struct AVInputStream;
249 typedef struct AVOutputStream {
250 int file_index; /* file index */
251 int index; /* stream index in the output file */
252 int source_index; /* AVInputStream index */
253 AVStream *st; /* stream in the output file */
254 int encoding_needed; /* true if encoding needed for this stream */
256 /* input pts and corresponding output pts
258 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
259 struct AVInputStream *sync_ist; /* input stream to sync against */
260 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
263 AVFrame pict_tmp; /* temporary image for resampling */
264 struct SwsContext *img_resample_ctx; /* for image resampling */
268 int topBand; /* cropping area sizes */
272 int padtop; /* padding area sizes */
279 ReSampleContext *resample; /* for audio resampling */
281 AVAudioConvert *reformat_ctx;
282 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
286 typedef struct AVInputStream {
290 int discard; /* true if stream data should be discarded */
291 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
292 int64_t sample_index; /* current sample */
294 int64_t start; /* time when read started */
295 int64_t next_pts; /* synthetic pts for cases where pkt.pts
297 int64_t pts; /* current pts */
298 int is_start; /* is 1 at the start and after a discontinuity */
301 typedef struct AVInputFile {
302 int eof_reached; /* true if eof reached */
303 int ist_index; /* index of first stream in ist_table */
304 int buffer_size; /* current total buffer size */
305 int nb_streams; /* nb streams we are aware of */
310 /* init terminal so that we can grab keys */
311 static struct termios oldtty;
314 static void term_exit(void)
317 tcsetattr (0, TCSANOW, &oldtty);
321 static volatile sig_atomic_t received_sigterm = 0;
324 sigterm_handler(int sig)
326 received_sigterm = sig;
330 static void term_init(void)
338 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
339 |INLCR|IGNCR|ICRNL|IXON);
340 tty.c_oflag |= OPOST;
341 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
342 tty.c_cflag &= ~(CSIZE|PARENB);
347 tcsetattr (0, TCSANOW, &tty);
348 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
351 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
352 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
354 register a function to be called at normal program termination
357 #if CONFIG_BEOS_NETSERVER
358 fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
362 /* read a key without blocking */
363 static int read_key(void)
368 #if !CONFIG_BEOS_NETSERVER
376 n = select(1, &rfds, NULL, NULL, &tv);
392 static int decode_interrupt_cb(void)
394 return q_pressed || (q_pressed = read_key() == 'q');
397 static int av_exit(int ret)
402 for(i=0;i<nb_output_files;i++) {
403 /* maybe av_close_output_file ??? */
404 AVFormatContext *s = output_files[i];
406 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
408 for(j=0;j<s->nb_streams;j++) {
409 av_metadata_free(&s->streams[j]->metadata);
410 av_free(s->streams[j]->codec);
411 av_free(s->streams[j]);
413 for(j=0;j<s->nb_programs;j++) {
414 av_metadata_free(&s->programs[j]->metadata);
416 for(j=0;j<s->nb_chapters;j++) {
417 av_metadata_free(&s->chapters[j]->metadata);
419 av_metadata_free(&s->metadata);
422 for(i=0;i<nb_input_files;i++)
423 av_close_input_file(input_files[i]);
425 av_free(intra_matrix);
426 av_free(inter_matrix);
430 av_free(vstats_filename);
434 av_free(video_codec_name);
435 av_free(audio_codec_name);
436 av_free(subtitle_codec_name);
438 av_free(video_standard);
440 #if CONFIG_POWERPC_PERF
441 void powerpc_display_perf_report(void);
442 powerpc_display_perf_report();
443 #endif /* CONFIG_POWERPC_PERF */
445 for (i=0;i<CODEC_TYPE_NB;i++)
446 av_free(avcodec_opts[i]);
447 av_free(avformat_opts);
454 if (received_sigterm) {
456 "Received signal %d: terminating.\n",
457 (int) received_sigterm);
461 exit(ret); /* not all OS-es handle main() return value */
465 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
471 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
474 /* copy stream format */
475 s->nb_streams = ic->nb_streams;
476 for(i=0;i<ic->nb_streams;i++) {
479 // FIXME: a more elegant solution is needed
480 st = av_mallocz(sizeof(AVStream));
481 memcpy(st, ic->streams[i], sizeof(AVStream));
482 st->codec = avcodec_alloc_context();
483 memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
486 if (st->codec->codec_type == CODEC_TYPE_AUDIO && audio_stream_copy)
488 else if (st->codec->codec_type == CODEC_TYPE_VIDEO && video_stream_copy)
491 if(!st->codec->thread_count)
492 st->codec->thread_count = 1;
493 if(st->codec->thread_count>1)
494 avcodec_thread_init(st->codec, st->codec->thread_count);
496 if(st->codec->flags & CODEC_FLAG_BITEXACT)
501 s->timestamp = av_gettime();
503 av_close_input_file(ic);
508 get_sync_ipts(const AVOutputStream *ost)
510 const AVInputStream *ist = ost->sync_ist;
511 return (double)(ist->pts - start_time)/AV_TIME_BASE;
514 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
518 AVPacket new_pkt= *pkt;
519 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
520 &new_pkt.data, &new_pkt.size,
521 pkt->data, pkt->size,
522 pkt->flags & PKT_FLAG_KEY);
525 new_pkt.destruct= av_destruct_packet;
527 fprintf(stderr, "%s failed for stream %d, codec %s",
528 bsfc->filter->name, pkt->stream_index,
529 avctx->codec ? avctx->codec->name : "copy");
539 ret= av_interleaved_write_frame(s, pkt);
541 print_error("av_interleaved_write_frame()", ret);
546 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
548 static void do_audio_out(AVFormatContext *s,
551 unsigned char *buf, int size)
554 const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
556 int size_out, frame_bytes, ret;
557 AVCodecContext *enc= ost->st->codec;
558 AVCodecContext *dec= ist->st->codec;
559 int osize= av_get_bits_per_sample_format(enc->sample_fmt)/8;
560 int isize= av_get_bits_per_sample_format(dec->sample_fmt)/8;
562 /* SC: dynamic allocation of buffers */
564 audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
566 audio_out = av_malloc(audio_out_size);
567 if (!audio_buf || !audio_out)
568 return; /* Should signal an error ! */
570 if (enc->channels != dec->channels)
571 ost->audio_resample = 1;
573 if (ost->audio_resample && !ost->resample) {
574 if (dec->sample_fmt != SAMPLE_FMT_S16)
575 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
576 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
577 enc->sample_rate, dec->sample_rate,
578 enc->sample_fmt, dec->sample_fmt,
580 if (!ost->resample) {
581 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
582 dec->channels, dec->sample_rate,
583 enc->channels, enc->sample_rate);
588 #define MAKE_SFMT_PAIR(a,b) ((a)+SAMPLE_FMT_NB*(b))
589 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
590 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
592 audio_out2 = av_malloc(audio_out_size);
595 if (ost->reformat_ctx)
596 av_audio_convert_free(ost->reformat_ctx);
597 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
598 dec->sample_fmt, 1, NULL, 0);
599 if (!ost->reformat_ctx) {
600 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
601 avcodec_get_sample_fmt_name(dec->sample_fmt),
602 avcodec_get_sample_fmt_name(enc->sample_fmt));
605 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
608 if(audio_sync_method){
609 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
610 - av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2);
611 double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
612 int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
614 //FIXME resample delay
615 if(fabs(delta) > 50){
616 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
618 byte_delta= FFMAX(byte_delta, -size);
622 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
627 static uint8_t *input_tmp= NULL;
628 input_tmp= av_realloc(input_tmp, byte_delta + size);
630 if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
633 byte_delta= MAX_AUDIO_PACKET_SIZE - size;
635 memset(input_tmp, 0, byte_delta);
636 memcpy(input_tmp + byte_delta, buf, size);
640 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
642 }else if(audio_sync_method>1){
643 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
644 assert(ost->audio_resample);
646 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
647 // 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));
648 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
652 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
653 - av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
655 if (ost->audio_resample) {
657 size_out = audio_resample(ost->resample,
658 (short *)buftmp, (short *)buf,
659 size / (ist->st->codec->channels * isize));
660 size_out = size_out * enc->channels * osize;
666 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
667 const void *ibuf[6]= {buftmp};
668 void *obuf[6]= {audio_out2};
669 int istride[6]= {isize};
670 int ostride[6]= {osize};
671 int len= size_out/istride[0];
672 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
673 printf("av_audio_convert() failed\n");
679 size_out = len*osize;
682 /* now encode as many frames as possible */
683 if (enc->frame_size > 1) {
684 /* output resampled raw samples */
685 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
686 fprintf(stderr, "av_fifo_realloc2() failed\n");
689 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
691 frame_bytes = enc->frame_size * osize * enc->channels;
693 while (av_fifo_size(ost->fifo) >= frame_bytes) {
695 av_init_packet(&pkt);
697 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
699 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
701 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
704 fprintf(stderr, "Audio encoding failed\n");
708 pkt.stream_index= ost->index;
711 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
712 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
713 pkt.flags |= PKT_FLAG_KEY;
714 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
716 ost->sync_opts += enc->frame_size;
720 int coded_bps = av_get_bits_per_sample(enc->codec->id)/8;
721 av_init_packet(&pkt);
723 ost->sync_opts += size_out / (osize * enc->channels);
725 /* output a pcm frame */
726 /* determine the size of the coded buffer */
729 size_out *= coded_bps;
731 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
732 ret = avcodec_encode_audio(enc, audio_out, size_out,
735 fprintf(stderr, "Audio encoding failed\n");
739 pkt.stream_index= ost->index;
742 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
743 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
744 pkt.flags |= PKT_FLAG_KEY;
745 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
749 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
753 AVPicture picture_tmp;
756 dec = ist->st->codec;
758 /* deinterlace : must be done before any resize */
759 if (do_deinterlace) {
762 /* create temporary picture */
763 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
764 buf = av_malloc(size);
768 picture2 = &picture_tmp;
769 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
772 if(avpicture_deinterlace(picture2, picture,
773 dec->pix_fmt, dec->width, dec->height) < 0) {
774 /* if error, do not deinterlace */
775 fprintf(stderr, "Deinterlacing failed\n");
781 av_picture_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
787 if (picture != picture2)
788 *picture = *picture2;
792 /* we begin to correct av delay at this threshold */
793 #define AV_DELAY_MAX 0.100
795 static void do_subtitle_out(AVFormatContext *s,
801 static uint8_t *subtitle_out = NULL;
802 int subtitle_out_max_size = 65536;
803 int subtitle_out_size, nb, i;
807 if (pts == AV_NOPTS_VALUE) {
808 fprintf(stderr, "Subtitle packets must have a pts\n");
814 enc = ost->st->codec;
817 subtitle_out = av_malloc(subtitle_out_max_size);
820 /* Note: DVB subtitle need one packet to draw them and one other
821 packet to clear them */
822 /* XXX: signal it in the codec context ? */
823 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
828 for(i = 0; i < nb; i++) {
829 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
830 subtitle_out_max_size, sub);
832 av_init_packet(&pkt);
833 pkt.stream_index = ost->index;
834 pkt.data = subtitle_out;
835 pkt.size = subtitle_out_size;
836 pkt.pts = av_rescale_q(pts, ist->st->time_base, ost->st->time_base);
837 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
838 /* XXX: the pts correction is handled here. Maybe handling
839 it in the codec would be better */
841 pkt.pts += 90 * sub->start_display_time;
843 pkt.pts += 90 * sub->end_display_time;
845 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
849 static int bit_buffer_size= 1024*256;
850 static uint8_t *bit_buffer= NULL;
852 static void do_video_out(AVFormatContext *s,
858 int nb_frames, i, ret;
859 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
860 AVFrame picture_crop_temp, picture_pad_temp;
861 AVCodecContext *enc, *dec;
863 avcodec_get_frame_defaults(&picture_crop_temp);
864 avcodec_get_frame_defaults(&picture_pad_temp);
866 enc = ost->st->codec;
867 dec = ist->st->codec;
869 /* by default, we output a single frame */
874 if(video_sync_method>0 || (video_sync_method && av_q2d(enc->time_base) > 0.001)){
876 vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
877 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
880 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
884 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
885 }else if (vdelta > 1.1)
886 nb_frames = lrintf(vdelta);
887 //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);
891 fprintf(stderr, "*** drop!\n");
892 }else if (nb_frames > 1) {
893 nb_frames_dup += nb_frames;
895 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
898 ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
900 nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
904 if (ost->video_crop) {
905 if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
906 fprintf(stderr, "error cropping picture\n");
911 formatted_picture = &picture_crop_temp;
913 formatted_picture = in_picture;
916 final_picture = formatted_picture;
917 padding_src = formatted_picture;
918 resampling_dst = &ost->pict_tmp;
919 if (ost->video_pad) {
920 final_picture = &ost->pict_tmp;
921 if (ost->video_resample) {
922 if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
923 fprintf(stderr, "error padding picture\n");
928 resampling_dst = &picture_pad_temp;
932 if (ost->video_resample) {
934 final_picture = &ost->pict_tmp;
935 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
936 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
939 if (ost->video_pad) {
940 av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
941 enc->height, enc->width, enc->pix_fmt,
942 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
945 /* duplicates frame if needed */
946 for(i=0;i<nb_frames;i++) {
948 av_init_packet(&pkt);
949 pkt.stream_index= ost->index;
951 if (s->oformat->flags & AVFMT_RAWPICTURE) {
952 /* raw pictures are written as AVPicture structure to
953 avoid any copies. We support temorarily the older
955 AVFrame* old_frame = enc->coded_frame;
956 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
957 pkt.data= (uint8_t *)final_picture;
958 pkt.size= sizeof(AVPicture);
959 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
960 pkt.flags |= PKT_FLAG_KEY;
962 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
963 enc->coded_frame = old_frame;
967 big_picture= *final_picture;
968 /* better than nothing: use input picture interlaced
970 big_picture.interlaced_frame = in_picture->interlaced_frame;
971 if(avcodec_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
972 if(top_field_first == -1)
973 big_picture.top_field_first = in_picture->top_field_first;
975 big_picture.top_field_first = top_field_first;
978 /* handles sameq here. This is not correct because it may
979 not be a global option */
981 big_picture.quality = ist->st->quality;
983 big_picture.quality = ost->st->quality;
985 big_picture.pict_type = 0;
986 // big_picture.pts = AV_NOPTS_VALUE;
987 big_picture.pts= ost->sync_opts;
988 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
989 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
990 ret = avcodec_encode_video(enc,
991 bit_buffer, bit_buffer_size,
994 fprintf(stderr, "Video encoding failed\n");
997 //enc->frame_number = enc->real_pict_num;
999 pkt.data= bit_buffer;
1001 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1002 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1003 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1004 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1005 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1007 if(enc->coded_frame->key_frame)
1008 pkt.flags |= PKT_FLAG_KEY;
1009 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1012 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
1013 // enc->frame_number-1, enc->real_pict_num, ret,
1015 /* if two pass, output log */
1016 if (ost->logfile && enc->stats_out) {
1017 fprintf(ost->logfile, "%s", enc->stats_out);
1022 ost->frame_number++;
1026 static double psnr(double d){
1027 return -10.0*log(d)/log(10.0);
1030 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1033 AVCodecContext *enc;
1035 double ti1, bitrate, avg_bitrate;
1037 /* this is executed just the first time do_video_stats is called */
1039 vstats_file = fopen(vstats_filename, "w");
1046 enc = ost->st->codec;
1047 if (enc->codec_type == CODEC_TYPE_VIDEO) {
1048 frame_number = ost->frame_number;
1049 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1050 if (enc->flags&CODEC_FLAG_PSNR)
1051 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1053 fprintf(vstats_file,"f_size= %6d ", frame_size);
1054 /* compute pts value */
1055 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1059 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1060 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1061 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1062 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1063 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1067 static void print_report(AVFormatContext **output_files,
1068 AVOutputStream **ost_table, int nb_ostreams,
1072 AVOutputStream *ost;
1073 AVFormatContext *oc;
1075 AVCodecContext *enc;
1076 int frame_number, vid, i;
1077 double bitrate, ti1, pts;
1078 static int64_t last_time = -1;
1079 static int qp_histogram[52];
1081 if (!is_last_report) {
1083 /* display the report every 0.5 seconds */
1084 cur_time = av_gettime();
1085 if (last_time == -1) {
1086 last_time = cur_time;
1089 if ((cur_time - last_time) < 500000)
1091 last_time = cur_time;
1095 oc = output_files[0];
1097 total_size = url_fsize(oc->pb);
1098 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1099 total_size= url_ftell(oc->pb);
1104 for(i=0;i<nb_ostreams;i++) {
1106 enc = ost->st->codec;
1107 if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1108 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1109 !ost->st->stream_copy ?
1110 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1112 if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1113 float t = (av_gettime()-timer_start) / 1000000.0;
1115 frame_number = ost->frame_number;
1116 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1117 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1118 !ost->st->stream_copy ?
1119 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1121 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1124 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1125 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1128 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1130 if (enc->flags&CODEC_FLAG_PSNR){
1132 double error, error_sum=0;
1133 double scale, scale_sum=0;
1134 char type[3]= {'Y','U','V'};
1135 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1138 error= enc->error[j];
1139 scale= enc->width*enc->height*255.0*255.0*frame_number;
1141 error= enc->coded_frame->error[j];
1142 scale= enc->width*enc->height*255.0*255.0;
1147 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1149 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1153 /* compute min output value */
1154 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1155 if ((pts < ti1) && (pts > 0))
1161 if (verbose || is_last_report) {
1162 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1164 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1165 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1166 (double)total_size / 1024, ti1, bitrate);
1169 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1170 nb_frames_dup, nb_frames_drop);
1173 fprintf(stderr, "%s \r", buf);
1178 if (is_last_report && verbose >= 0){
1179 int64_t raw= audio_size + video_size + extra_size;
1180 fprintf(stderr, "\n");
1181 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1185 100.0*(total_size - raw)/raw
1190 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1191 static int output_packet(AVInputStream *ist, int ist_index,
1192 AVOutputStream **ost_table, int nb_ostreams,
1193 const AVPacket *pkt)
1195 AVFormatContext *os;
1196 AVOutputStream *ost;
1199 int data_size, got_picture;
1201 void *buffer_to_free;
1202 static unsigned int samples_size= 0;
1203 AVSubtitle subtitle, *subtitle_to_free;
1207 if(ist->next_pts == AV_NOPTS_VALUE)
1208 ist->next_pts= ist->pts;
1212 av_init_packet(&avpkt);
1220 if(pkt->dts != AV_NOPTS_VALUE)
1221 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1223 //while we have more to decode or while the decoder did output something on EOF
1224 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1226 ist->pts= ist->next_pts;
1228 if(avpkt.size && avpkt.size != pkt->size && verbose>0)
1229 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1231 /* decode the packet if needed */
1232 data_buf = NULL; /* fail safe */
1234 subtitle_to_free = NULL;
1235 if (ist->decoding_needed) {
1236 switch(ist->st->codec->codec_type) {
1237 case CODEC_TYPE_AUDIO:{
1238 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1239 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1241 samples= av_malloc(samples_size);
1243 data_size= samples_size;
1244 /* XXX: could avoid copy if PCM 16 bits with same
1245 endianness as CPU */
1246 ret = avcodec_decode_audio3(ist->st->codec, samples, &data_size,
1252 /* Some bug in mpeg audio decoder gives */
1253 /* data_size < 0, it seems they are overflows */
1254 if (data_size <= 0) {
1255 /* no audio frame */
1258 data_buf = (uint8_t *)samples;
1259 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1260 (ist->st->codec->sample_rate * ist->st->codec->channels);
1262 case CODEC_TYPE_VIDEO:
1263 data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1264 /* XXX: allocate picture correctly */
1265 avcodec_get_frame_defaults(&picture);
1266 ret = avcodec_decode_video2(ist->st->codec,
1267 &picture, &got_picture, &avpkt);
1268 if (picture.key_frame)
1270 ist->st->quality= picture.quality;
1274 /* no picture yet */
1275 goto discard_packet;
1277 if (ist->st->codec->time_base.num != 0) {
1278 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1279 ist->next_pts += ((int64_t)AV_TIME_BASE *
1280 ist->st->codec->time_base.num * ticks) /
1281 ist->st->codec->time_base.den;
1285 case CODEC_TYPE_SUBTITLE:
1286 ret = avcodec_decode_subtitle2(ist->st->codec,
1287 &subtitle, &got_subtitle, &avpkt);
1290 if (!got_subtitle) {
1291 goto discard_packet;
1293 subtitle_to_free = &subtitle;
1300 switch(ist->st->codec->codec_type) {
1301 case CODEC_TYPE_AUDIO:
1302 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1303 ist->st->codec->sample_rate;
1305 case CODEC_TYPE_VIDEO:
1306 if (ist->st->codec->time_base.num != 0) {
1307 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1308 ist->next_pts += ((int64_t)AV_TIME_BASE *
1309 ist->st->codec->time_base.num * ticks) /
1310 ist->st->codec->time_base.den;
1314 data_buf = avpkt.data;
1315 data_size = avpkt.size;
1320 buffer_to_free = NULL;
1321 if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1322 pre_process_video_frame(ist, (AVPicture *)&picture,
1326 // preprocess audio (volume)
1327 if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
1328 if (audio_volume != 256) {
1331 for(i=0;i<(data_size / sizeof(short));i++) {
1332 int v = ((*volp) * audio_volume + 128) >> 8;
1333 if (v < -32768) v = -32768;
1334 if (v > 32767) v = 32767;
1340 /* frame rate emulation */
1342 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1343 int64_t now = av_gettime() - ist->start;
1348 /* if output time reached then transcode raw format,
1349 encode packets and output them */
1350 if (start_time == 0 || ist->pts >= start_time)
1351 for(i=0;i<nb_ostreams;i++) {
1355 if (ost->source_index == ist_index) {
1356 os = output_files[ost->file_index];
1359 printf("%d: got pts=%0.3f %0.3f\n", i,
1360 (double)pkt->pts / AV_TIME_BASE,
1361 ((double)ist->pts / AV_TIME_BASE) -
1362 ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1364 /* set the input output pts pairs */
1365 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1367 if (ost->encoding_needed) {
1368 switch(ost->st->codec->codec_type) {
1369 case CODEC_TYPE_AUDIO:
1370 do_audio_out(os, ost, ist, data_buf, data_size);
1372 case CODEC_TYPE_VIDEO:
1373 do_video_out(os, ost, ist, &picture, &frame_size);
1374 if (vstats_filename && frame_size)
1375 do_video_stats(os, ost, frame_size);
1377 case CODEC_TYPE_SUBTITLE:
1378 do_subtitle_out(os, ost, ist, &subtitle,
1385 AVFrame avframe; //FIXME/XXX remove this
1387 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1389 av_init_packet(&opkt);
1391 if ((!ost->frame_number && !(pkt->flags & PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1394 /* no reencoding needed : output the packet directly */
1395 /* force the input stream PTS */
1397 avcodec_get_frame_defaults(&avframe);
1398 ost->st->codec->coded_frame= &avframe;
1399 avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
1401 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
1402 audio_size += data_size;
1403 else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
1404 video_size += data_size;
1408 opkt.stream_index= ost->index;
1409 if(pkt->pts != AV_NOPTS_VALUE)
1410 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1412 opkt.pts= AV_NOPTS_VALUE;
1414 if (pkt->dts == AV_NOPTS_VALUE)
1415 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1417 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1418 opkt.dts -= ost_tb_start_time;
1420 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1421 opkt.flags= pkt->flags;
1423 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1424 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
1425 opkt.destruct= av_destruct_packet;
1427 write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][opkt.stream_index]);
1428 ost->st->codec->frame_number++;
1429 ost->frame_number++;
1430 av_free_packet(&opkt);
1434 av_free(buffer_to_free);
1435 /* XXX: allocate the subtitles in the codec ? */
1436 if (subtitle_to_free) {
1437 if (subtitle_to_free->rects != NULL) {
1438 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1439 av_freep(&subtitle_to_free->rects[i]->pict.data[0]);
1440 av_freep(&subtitle_to_free->rects[i]->pict.data[1]);
1441 av_freep(&subtitle_to_free->rects[i]);
1443 av_freep(&subtitle_to_free->rects);
1445 subtitle_to_free->num_rects = 0;
1446 subtitle_to_free = NULL;
1453 for(i=0;i<nb_ostreams;i++) {
1455 if (ost->source_index == ist_index) {
1456 AVCodecContext *enc= ost->st->codec;
1457 os = output_files[ost->file_index];
1459 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1461 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1464 if (ost->encoding_needed) {
1468 av_init_packet(&pkt);
1469 pkt.stream_index= ost->index;
1471 switch(ost->st->codec->codec_type) {
1472 case CODEC_TYPE_AUDIO:
1473 fifo_bytes = av_fifo_size(ost->fifo);
1475 /* encode any samples remaining in fifo */
1476 if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1477 int osize = av_get_bits_per_sample_format(enc->sample_fmt) >> 3;
1478 int fs_tmp = enc->frame_size;
1479 enc->frame_size = fifo_bytes / (osize * enc->channels);
1480 av_fifo_generic_read(ost->fifo, samples, fifo_bytes, NULL);
1481 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1482 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1483 ost->st->time_base.num, enc->sample_rate);
1484 enc->frame_size = fs_tmp;
1487 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1490 fprintf(stderr, "Audio encoding failed\n");
1494 pkt.flags |= PKT_FLAG_KEY;
1496 case CODEC_TYPE_VIDEO:
1497 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1499 fprintf(stderr, "Video encoding failed\n");
1503 if(enc->coded_frame && enc->coded_frame->key_frame)
1504 pkt.flags |= PKT_FLAG_KEY;
1505 if (ost->logfile && enc->stats_out) {
1506 fprintf(ost->logfile, "%s", enc->stats_out);
1515 pkt.data= bit_buffer;
1517 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1518 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1519 write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1531 static void print_sdp(AVFormatContext **avc, int n)
1535 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1536 printf("SDP:\n%s\n", sdp);
1540 static int stream_index_from_inputs(AVFormatContext **input_files,
1542 AVInputFile *file_table,
1543 AVInputStream **ist_table,
1544 enum CodecType type,
1548 for(z=0; z<nb_input_files; z++) {
1549 AVFormatContext *ic = input_files[z];
1550 for(p=0; p<ic->nb_programs; p++) {
1551 AVProgram *program = ic->programs[p];
1552 if(program->id != programid)
1554 for(q=0; q<program->nb_stream_indexes; q++) {
1555 int sidx = program->stream_index[q];
1556 int ris = file_table[z].ist_index + sidx;
1557 if(ist_table[ris]->discard && ic->streams[sidx]->codec->codec_type == type)
1567 timespec_subtract (struct timespec *result,
1571 /* Perform the carry for the later subtraction by updating Y. */
1572 if (x->tv_nsec < y->tv_nsec) {
1573 int num_sec = (y->tv_nsec - x->tv_nsec) / 1000000000 + 1;
1574 y->tv_nsec -= 1000000000 * num_sec;
1575 y->tv_sec += num_sec;
1577 if (x->tv_nsec - y->tv_nsec > 1000000000) {
1578 int num_sec = (x->tv_nsec - y->tv_nsec) / 1000000000;
1579 y->tv_nsec += 1000000000 * num_sec;
1580 y->tv_sec -= num_sec;
1583 /* Compute the time remaining to wait.
1584 `tv_nsec' is certainly positive. */
1585 result->tv_sec = x->tv_sec - y->tv_sec;
1586 result->tv_nsec = x->tv_nsec - y->tv_nsec;
1588 /* Return 1 if result is negative. */
1589 return x->tv_sec < y->tv_sec;
1592 #ifdef CONFIG_FFMPEG_WITH_FRSH
1593 frsh_vres_id_t disk_vres;
1594 frsh_contract_t cpu_contract;
1595 frsh_contract_t disk_contract;
1601 static struct timespec start = {0,0};
1602 struct timespec end, d;
1603 static int f = -1; /* number interframe intevals elapsed */
1605 static double ifi_avg=0, ifi_var=0;
1607 clock_gettime(CLOCK_MONOTONIC, &end);
1608 timespec_subtract(&d, &end, &start);
1610 goto out; /* First run */
1611 ifi = (double)d.tv_sec + 1e-9*d.tv_nsec;
1612 #define SQ(x) ((x)*(x))
1613 ifi_var = ifi_var*(f-1)/f + (double)(f-1)/SQ(f)*SQ(ifi-ifi_avg);
1614 ifi_avg = ifi_avg*(f-1)/f + (double)ifi/f;
1615 printf("%5d: interframe interval = 1/%5.2lf s avg=1/%.2f stddev=1/%3.2f\n",
1616 f, 1/ifi, 1/ifi_avg, 1/sqrt(ifi_var));
1618 #ifdef CONFIG_FFMPEG_WITH_FRSH
1619 if (renegotiate == f) {
1620 frsh_contract_renegotiate_sync(&disk_contract, disk_vres);
1621 frsh_contract_renegotiate_sync(&disk_contract, disk_vres);
1629 * The following code is the main loop of the file converter
1631 static int av_encode(AVFormatContext **output_files,
1632 int nb_output_files,
1633 AVFormatContext **input_files,
1635 AVStreamMap *stream_maps, int nb_stream_maps)
1637 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1638 AVFormatContext *is, *os;
1639 AVCodecContext *codec, *icodec;
1640 AVOutputStream *ost, **ost_table = NULL;
1641 AVInputStream *ist, **ist_table = NULL;
1642 AVInputFile *file_table;
1646 uint8_t no_packet[MAX_FILES]={0};
1647 int no_packet_count=0;
1649 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1653 /* input stream init */
1655 for(i=0;i<nb_input_files;i++) {
1656 is = input_files[i];
1657 file_table[i].ist_index = j;
1658 file_table[i].nb_streams = is->nb_streams;
1659 j += is->nb_streams;
1663 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1667 for(i=0;i<nb_istreams;i++) {
1668 ist = av_mallocz(sizeof(AVInputStream));
1674 for(i=0;i<nb_input_files;i++) {
1675 is = input_files[i];
1676 for(k=0;k<is->nb_streams;k++) {
1677 ist = ist_table[j++];
1678 ist->st = is->streams[k];
1679 ist->file_index = i;
1681 ist->discard = 1; /* the stream is discarded by default
1685 ist->start = av_gettime();
1690 /* output stream init */
1692 for(i=0;i<nb_output_files;i++) {
1693 os = output_files[i];
1694 if (!os->nb_streams) {
1695 dump_format(output_files[i], i, output_files[i]->filename, 1);
1696 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1699 nb_ostreams += os->nb_streams;
1701 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1702 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1706 /* Sanity check the mapping args -- do the input files & streams exist? */
1707 for(i=0;i<nb_stream_maps;i++) {
1708 int fi = stream_maps[i].file_index;
1709 int si = stream_maps[i].stream_index;
1711 if (fi < 0 || fi > nb_input_files - 1 ||
1712 si < 0 || si > file_table[fi].nb_streams - 1) {
1713 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1716 fi = stream_maps[i].sync_file_index;
1717 si = stream_maps[i].sync_stream_index;
1718 if (fi < 0 || fi > nb_input_files - 1 ||
1719 si < 0 || si > file_table[fi].nb_streams - 1) {
1720 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1725 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1728 for(i=0;i<nb_ostreams;i++) {
1729 ost = av_mallocz(sizeof(AVOutputStream));
1736 for(k=0;k<nb_output_files;k++) {
1737 os = output_files[k];
1738 for(i=0;i<os->nb_streams;i++,n++) {
1741 ost->file_index = k;
1743 ost->st = os->streams[i];
1744 if (nb_stream_maps > 0) {
1745 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
1746 stream_maps[n].stream_index;
1748 /* Sanity check that the stream types match */
1749 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1750 int i= ost->file_index;
1751 dump_format(output_files[i], i, output_files[i]->filename, 1);
1752 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1753 stream_maps[n].file_index, stream_maps[n].stream_index,
1754 ost->file_index, ost->index);
1761 j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid);
1763 ost->source_index = j;
1767 /* get corresponding input stream index : we select the first one with the right type */
1769 for(j=0;j<nb_istreams;j++) {
1772 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1773 ost->source_index = j;
1781 if(! opt_programid) {
1782 /* try again and reuse existing stream */
1783 for(j=0;j<nb_istreams;j++) {
1785 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1786 ost->source_index = j;
1792 int i= ost->file_index;
1793 dump_format(output_files[i], i, output_files[i]->filename, 1);
1794 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1795 ost->file_index, ost->index);
1800 ist = ist_table[ost->source_index];
1802 ost->sync_ist = (nb_stream_maps > 0) ?
1803 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
1804 stream_maps[n].sync_stream_index] : ist;
1808 /* for each output stream, we compute the right encoding parameters */
1809 for(i=0;i<nb_ostreams;i++) {
1810 AVMetadataTag *lang;
1812 os = output_files[ost->file_index];
1813 ist = ist_table[ost->source_index];
1815 codec = ost->st->codec;
1816 icodec = ist->st->codec;
1818 if ((lang=av_metadata_get(ist->st->metadata, "language", NULL, 0))
1819 && !av_metadata_get(ost->st->metadata, "language", NULL, 0))
1820 av_metadata_set(&ost->st->metadata, "language", lang->value);
1822 ost->st->disposition = ist->st->disposition;
1823 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1824 codec->chroma_sample_location = icodec->chroma_sample_location;
1826 if (ost->st->stream_copy) {
1827 /* if stream_copy is selected, no need to decode or encode */
1828 codec->codec_id = icodec->codec_id;
1829 codec->codec_type = icodec->codec_type;
1831 if(!codec->codec_tag){
1832 if( !os->oformat->codec_tag
1833 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) > 0
1834 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1835 codec->codec_tag = icodec->codec_tag;
1838 codec->bit_rate = icodec->bit_rate;
1839 codec->extradata= icodec->extradata;
1840 codec->extradata_size= icodec->extradata_size;
1841 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){
1842 codec->time_base = icodec->time_base;
1843 codec->time_base.num *= icodec->ticks_per_frame;
1845 codec->time_base = ist->st->time_base;
1846 switch(codec->codec_type) {
1847 case CODEC_TYPE_AUDIO:
1848 if(audio_volume != 256) {
1849 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1852 codec->channel_layout = icodec->channel_layout;
1853 codec->sample_rate = icodec->sample_rate;
1854 codec->channels = icodec->channels;
1855 codec->frame_size = icodec->frame_size;
1856 codec->block_align= icodec->block_align;
1857 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1858 codec->block_align= 0;
1859 if(codec->codec_id == CODEC_ID_AC3)
1860 codec->block_align= 0;
1862 case CODEC_TYPE_VIDEO:
1863 codec->pix_fmt = icodec->pix_fmt;
1864 codec->width = icodec->width;
1865 codec->height = icodec->height;
1866 codec->has_b_frames = icodec->has_b_frames;
1868 case CODEC_TYPE_SUBTITLE:
1869 codec->width = icodec->width;
1870 codec->height = icodec->height;
1876 switch(codec->codec_type) {
1877 case CODEC_TYPE_AUDIO:
1878 ost->fifo= av_fifo_alloc(1024);
1881 ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
1882 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1883 icodec->request_channels = codec->channels;
1884 ist->decoding_needed = 1;
1885 ost->encoding_needed = 1;
1887 case CODEC_TYPE_VIDEO:
1888 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1889 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1890 ost->video_resample = ((codec->width != icodec->width -
1891 (frame_leftBand + frame_rightBand) +
1892 (frame_padleft + frame_padright)) ||
1893 (codec->height != icodec->height -
1894 (frame_topBand + frame_bottomBand) +
1895 (frame_padtop + frame_padbottom)) ||
1896 (codec->pix_fmt != icodec->pix_fmt));
1897 if (ost->video_crop) {
1898 ost->topBand = frame_topBand;
1899 ost->leftBand = frame_leftBand;
1901 if (ost->video_pad) {
1902 ost->padtop = frame_padtop;
1903 ost->padleft = frame_padleft;
1904 ost->padbottom = frame_padbottom;
1905 ost->padright = frame_padright;
1906 if (!ost->video_resample) {
1907 avcodec_get_frame_defaults(&ost->pict_tmp);
1908 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1909 codec->width, codec->height))
1913 if (ost->video_resample) {
1914 avcodec_get_frame_defaults(&ost->pict_tmp);
1915 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1916 codec->width, codec->height)) {
1917 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1920 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1921 ost->img_resample_ctx = sws_getContext(
1922 icodec->width - (frame_leftBand + frame_rightBand),
1923 icodec->height - (frame_topBand + frame_bottomBand),
1925 codec->width - (frame_padleft + frame_padright),
1926 codec->height - (frame_padtop + frame_padbottom),
1928 sws_flags, NULL, NULL, NULL);
1929 if (ost->img_resample_ctx == NULL) {
1930 fprintf(stderr, "Cannot get resampling context\n");
1933 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1934 codec->bits_per_raw_sample= 0;
1936 ost->encoding_needed = 1;
1937 ist->decoding_needed = 1;
1939 case CODEC_TYPE_SUBTITLE:
1940 ost->encoding_needed = 1;
1941 ist->decoding_needed = 1;
1948 if (ost->encoding_needed &&
1949 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1950 char logfilename[1024];
1955 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1956 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
1958 if (codec->flags & CODEC_FLAG_PASS1) {
1959 f = fopen(logfilename, "w");
1961 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
1966 /* read the log file */
1967 f = fopen(logfilename, "r");
1969 fprintf(stderr, "Cannot read log file '%s' for pass-2 encoding: %s\n", logfilename, strerror(errno));
1972 fseek(f, 0, SEEK_END);
1974 fseek(f, 0, SEEK_SET);
1975 logbuffer = av_malloc(size + 1);
1977 fprintf(stderr, "Could not allocate log buffer\n");
1980 size = fread(logbuffer, 1, size, f);
1982 logbuffer[size] = '\0';
1983 codec->stats_in = logbuffer;
1987 if(codec->codec_type == CODEC_TYPE_VIDEO){
1988 int size= codec->width * codec->height;
1989 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
1994 bit_buffer = av_malloc(bit_buffer_size);
1996 ret = AVERROR(ENOMEM);
2000 /* open each encoder */
2001 for(i=0;i<nb_ostreams;i++) {
2003 if (ost->encoding_needed) {
2004 AVCodec *codec = output_codecs[i];
2006 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2008 snprintf(error, sizeof(error), "Unsupported codec for output stream #%d.%d",
2009 ost->file_index, ost->index);
2010 ret = AVERROR(EINVAL);
2013 if (avcodec_open(ost->st->codec, codec) < 0) {
2014 snprintf(error, sizeof(error), "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2015 ost->file_index, ost->index);
2016 ret = AVERROR(EINVAL);
2019 extra_size += ost->st->codec->extradata_size;
2023 /* open each decoder */
2024 for(i=0;i<nb_istreams;i++) {
2026 if (ist->decoding_needed) {
2027 AVCodec *codec = input_codecs[i];
2029 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2031 snprintf(error, sizeof(error), "Unsupported codec (id=%d) for input stream #%d.%d",
2032 ist->st->codec->codec_id, ist->file_index, ist->index);
2033 ret = AVERROR(EINVAL);
2036 if (avcodec_open(ist->st->codec, codec) < 0) {
2037 snprintf(error, sizeof(error), "Error while opening codec for input stream #%d.%d",
2038 ist->file_index, ist->index);
2039 ret = AVERROR(EINVAL);
2042 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
2043 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2048 for(i=0;i<nb_istreams;i++) {
2051 ist->next_pts = AV_NOPTS_VALUE;
2055 /* set meta data information from input file if required */
2056 for (i=0;i<nb_meta_data_maps;i++) {
2057 AVFormatContext *out_file;
2058 AVFormatContext *in_file;
2059 AVMetadataTag *mtag;
2061 int out_file_index = meta_data_maps[i].out_file;
2062 int in_file_index = meta_data_maps[i].in_file;
2063 if (out_file_index < 0 || out_file_index >= nb_output_files) {
2064 snprintf(error, sizeof(error), "Invalid output file index %d map_meta_data(%d,%d)",
2065 out_file_index, out_file_index, in_file_index);
2066 ret = AVERROR(EINVAL);
2069 if (in_file_index < 0 || in_file_index >= nb_input_files) {
2070 snprintf(error, sizeof(error), "Invalid input file index %d map_meta_data(%d,%d)",
2071 in_file_index, out_file_index, in_file_index);
2072 ret = AVERROR(EINVAL);
2076 out_file = output_files[out_file_index];
2077 in_file = input_files[in_file_index];
2081 while((mtag=av_metadata_get(in_file->metadata, "", mtag, AV_METADATA_IGNORE_SUFFIX)))
2082 av_metadata_set(&out_file->metadata, mtag->key, mtag->value);
2083 av_metadata_conv(out_file, out_file->oformat->metadata_conv,
2084 in_file->iformat->metadata_conv);
2087 /* open files and write file headers */
2088 for(i=0;i<nb_output_files;i++) {
2089 os = output_files[i];
2090 if (av_write_header(os) < 0) {
2091 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2092 ret = AVERROR(EINVAL);
2095 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2101 /* dump the file output parameters - cannot be done before in case
2103 for(i=0;i<nb_output_files;i++) {
2104 dump_format(output_files[i], i, output_files[i]->filename, 1);
2107 /* dump the stream mapping */
2109 fprintf(stderr, "Stream mapping:\n");
2110 for(i=0;i<nb_ostreams;i++) {
2112 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2113 ist_table[ost->source_index]->file_index,
2114 ist_table[ost->source_index]->index,
2117 if (ost->sync_ist != ist_table[ost->source_index])
2118 fprintf(stderr, " [sync #%d.%d]",
2119 ost->sync_ist->file_index,
2120 ost->sync_ist->index);
2121 fprintf(stderr, "\n");
2126 fprintf(stderr, "%s\n", error);
2131 print_sdp(output_files, nb_output_files);
2134 if (!using_stdin && verbose >= 0) {
2135 fprintf(stderr, "Press [q] to stop encoding\n");
2136 url_set_interrupt_cb(decode_interrupt_cb);
2140 timer_start = av_gettime();
2142 for(; received_sigterm == 0;) {
2143 int file_index, ist_index;
2151 /* if 'q' pressed, exits */
2155 /* read_key() returns 0 on EOF */
2161 /* select the stream that we must read now by looking at the
2162 smallest output pts */
2164 for(i=0;i<nb_ostreams;i++) {
2167 os = output_files[ost->file_index];
2168 ist = ist_table[ost->source_index];
2169 if(no_packet[ist->file_index])
2171 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
2172 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
2174 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2175 ipts = (double)ist->pts;
2176 if (!file_table[ist->file_index].eof_reached){
2177 if(ipts < ipts_min) {
2179 if(input_sync ) file_index = ist->file_index;
2181 if(opts < opts_min) {
2183 if(!input_sync) file_index = ist->file_index;
2186 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2191 /* if none, if is finished */
2192 if (file_index < 0) {
2193 if(no_packet_count){
2195 memset(no_packet, 0, sizeof(no_packet));
2202 /* finish if recording time exhausted */
2203 if (opts_min >= (recording_time / 1000000.0))
2206 /* finish if limit size exhausted */
2207 if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
2210 /* read a frame from it and output it in the fifo */
2211 is = input_files[file_index];
2212 ret= av_read_frame(is, &pkt);
2213 if(ret == AVERROR(EAGAIN)){
2214 no_packet[file_index]=1;
2219 file_table[file_index].eof_reached = 1;
2227 memset(no_packet, 0, sizeof(no_packet));
2230 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2232 /* the following test is needed in case new streams appear
2233 dynamically in stream : we ignore them */
2234 if (pkt.stream_index >= file_table[file_index].nb_streams)
2235 goto discard_packet;
2236 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2237 ist = ist_table[ist_index];
2239 goto discard_packet;
2241 if (pkt.dts != AV_NOPTS_VALUE)
2242 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2243 if (pkt.pts != AV_NOPTS_VALUE)
2244 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2246 if(input_files_ts_scale[file_index][pkt.stream_index]){
2247 if(pkt.pts != AV_NOPTS_VALUE)
2248 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2249 if(pkt.dts != AV_NOPTS_VALUE)
2250 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2253 //av_log(NULL, AV_LOG_ERROR, "timestamp=%"PRId64" %"PRId64"\n", pkt.pts, pkt.dts);
2256 // 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);
2257 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2258 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2259 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2260 int64_t delta= pkt_dts - ist->next_pts;
2261 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2262 input_files_ts_offset[ist->file_index]-= delta;
2264 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2265 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2266 if(pkt.pts != AV_NOPTS_VALUE)
2267 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2271 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2272 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2275 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2276 ist->file_index, ist->index);
2279 av_free_packet(&pkt);
2286 av_free_packet(&pkt);
2288 /* dump report by using the output first video and audio streams */
2289 //print_report(output_files, ost_table, nb_ostreams, 0);
2292 /* at the end of stream, we must flush the decoder buffers */
2293 for(i=0;i<nb_istreams;i++) {
2295 if (ist->decoding_needed) {
2296 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2302 /* write the trailer if needed and close file */
2303 for(i=0;i<nb_output_files;i++) {
2304 os = output_files[i];
2305 av_write_trailer(os);
2308 /* dump report by using the first video and audio streams */
2309 print_report(output_files, ost_table, nb_ostreams, 1);
2311 /* close each encoder */
2312 for(i=0;i<nb_ostreams;i++) {
2314 if (ost->encoding_needed) {
2315 av_freep(&ost->st->codec->stats_in);
2316 avcodec_close(ost->st->codec);
2320 /* close each decoder */
2321 for(i=0;i<nb_istreams;i++) {
2323 if (ist->decoding_needed) {
2324 avcodec_close(ist->st->codec);
2332 av_freep(&bit_buffer);
2333 av_free(file_table);
2336 for(i=0;i<nb_istreams;i++) {
2343 for(i=0;i<nb_ostreams;i++) {
2347 fclose(ost->logfile);
2348 ost->logfile = NULL;
2350 av_fifo_free(ost->fifo); /* works even if fifo is not
2351 initialized but set to zero */
2352 av_free(ost->pict_tmp.data[0]);
2353 if (ost->video_resample)
2354 sws_freeContext(ost->img_resample_ctx);
2356 audio_resample_close(ost->resample);
2357 if (ost->reformat_ctx)
2358 av_audio_convert_free(ost->reformat_ctx);
2368 int file_read(const char *filename)
2371 unsigned char buffer[1024];
2374 if (url_open(&h, filename, O_RDONLY) < 0) {
2375 printf("could not open '%s'\n", filename);
2379 len = url_read(h, buffer, sizeof(buffer));
2382 for(i=0;i<len;i++) putchar(buffer[i]);
2389 static void opt_format(const char *arg)
2391 /* compatibility stuff for pgmyuv */
2392 if (!strcmp(arg, "pgmyuv")) {
2393 pgmyuv_compatibility_hack=1;
2394 // opt_image_format(arg);
2396 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2399 file_iformat = av_find_input_format(arg);
2400 file_oformat = guess_format(arg, NULL, NULL);
2401 if (!file_iformat && !file_oformat) {
2402 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2407 static void opt_video_rc_override_string(const char *arg)
2409 video_rc_override_string = arg;
2412 static int opt_me_threshold(const char *opt, const char *arg)
2414 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2418 static int opt_loglevel(const char *opt, const char *arg)
2420 int level = parse_number_or_die(opt, arg, OPT_INT, INT_MIN, INT_MAX);
2421 av_log_set_level(level);
2425 static int opt_verbose(const char *opt, const char *arg)
2427 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2431 static int opt_frame_rate(const char *opt, const char *arg)
2433 if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2434 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2440 static int opt_bitrate(const char *opt, const char *arg)
2442 int codec_type = opt[0]=='a' ? CODEC_TYPE_AUDIO : CODEC_TYPE_VIDEO;
2444 opt_default(opt, arg);
2446 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2447 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2452 static void opt_frame_crop_top(const char *arg)
2454 frame_topBand = atoi(arg);
2455 if (frame_topBand < 0) {
2456 fprintf(stderr, "Incorrect top crop size\n");
2459 if ((frame_topBand % 2) != 0) {
2460 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2463 if ((frame_topBand) >= 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_topBand;
2470 static void opt_frame_crop_bottom(const char *arg)
2472 frame_bottomBand = atoi(arg);
2473 if (frame_bottomBand < 0) {
2474 fprintf(stderr, "Incorrect bottom crop size\n");
2477 if ((frame_bottomBand % 2) != 0) {
2478 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2481 if ((frame_bottomBand) >= frame_height){
2482 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2485 frame_height -= frame_bottomBand;
2488 static void opt_frame_crop_left(const char *arg)
2490 frame_leftBand = atoi(arg);
2491 if (frame_leftBand < 0) {
2492 fprintf(stderr, "Incorrect left crop size\n");
2495 if ((frame_leftBand % 2) != 0) {
2496 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2499 if ((frame_leftBand) >= 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_leftBand;
2506 static void opt_frame_crop_right(const char *arg)
2508 frame_rightBand = atoi(arg);
2509 if (frame_rightBand < 0) {
2510 fprintf(stderr, "Incorrect right crop size\n");
2513 if ((frame_rightBand % 2) != 0) {
2514 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2517 if ((frame_rightBand) >= frame_width){
2518 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2521 frame_width -= frame_rightBand;
2524 static void opt_frame_size(const char *arg)
2526 if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
2527 fprintf(stderr, "Incorrect frame size\n");
2530 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2531 fprintf(stderr, "Frame size must be a multiple of 2\n");
2537 #define SCALEBITS 10
2538 #define ONE_HALF (1 << (SCALEBITS - 1))
2539 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2541 #define RGB_TO_Y(r, g, b) \
2542 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2543 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2545 #define RGB_TO_U(r1, g1, b1, shift)\
2546 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2547 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2549 #define RGB_TO_V(r1, g1, b1, shift)\
2550 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2551 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2553 static void opt_pad_color(const char *arg) {
2554 /* Input is expected to be six hex digits similar to
2555 how colors are expressed in html tags (but without the #) */
2556 int rgb = strtol(arg, NULL, 16);
2560 g = ((rgb >> 8) & 255);
2563 padcolor[0] = RGB_TO_Y(r,g,b);
2564 padcolor[1] = RGB_TO_U(r,g,b,0);
2565 padcolor[2] = RGB_TO_V(r,g,b,0);
2568 static void opt_frame_pad_top(const char *arg)
2570 frame_padtop = atoi(arg);
2571 if (frame_padtop < 0) {
2572 fprintf(stderr, "Incorrect top pad size\n");
2575 if ((frame_padtop % 2) != 0) {
2576 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2581 static void opt_frame_pad_bottom(const char *arg)
2583 frame_padbottom = atoi(arg);
2584 if (frame_padbottom < 0) {
2585 fprintf(stderr, "Incorrect bottom pad size\n");
2588 if ((frame_padbottom % 2) != 0) {
2589 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2595 static void opt_frame_pad_left(const char *arg)
2597 frame_padleft = atoi(arg);
2598 if (frame_padleft < 0) {
2599 fprintf(stderr, "Incorrect left pad size\n");
2602 if ((frame_padleft % 2) != 0) {
2603 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2609 static void opt_frame_pad_right(const char *arg)
2611 frame_padright = atoi(arg);
2612 if (frame_padright < 0) {
2613 fprintf(stderr, "Incorrect right pad size\n");
2616 if ((frame_padright % 2) != 0) {
2617 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2622 static void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts)
2626 for (i=-1; i < nb_fmts; i++) {
2627 get_fmt_string (fmt_str, sizeof(fmt_str), i);
2628 fprintf(stdout, "%s\n", fmt_str);
2632 static void opt_frame_pix_fmt(const char *arg)
2634 if (strcmp(arg, "list")) {
2635 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2636 if (frame_pix_fmt == PIX_FMT_NONE) {
2637 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2641 list_fmts(avcodec_pix_fmt_string, PIX_FMT_NB);
2646 static void opt_frame_aspect_ratio(const char *arg)
2653 p = strchr(arg, ':');
2655 x = strtol(arg, &end, 10);
2657 y = strtol(end+1, &end, 10);
2659 ar = (double)x / (double)y;
2661 ar = strtod(arg, NULL);
2664 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2667 frame_aspect_ratio = ar;
2670 static int opt_metadata(const char *opt, const char *arg)
2672 char *mid= strchr(arg, '=');
2675 fprintf(stderr, "Missing =\n");
2681 metadata= av_realloc(metadata, sizeof(*metadata)*metadata_count);
2682 metadata[metadata_count-1].key = av_strdup(arg);
2683 metadata[metadata_count-1].value= av_strdup(mid);
2688 static void opt_qscale(const char *arg)
2690 video_qscale = atof(arg);
2691 if (video_qscale <= 0 ||
2692 video_qscale > 255) {
2693 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2698 static void opt_top_field_first(const char *arg)
2700 top_field_first= atoi(arg);
2703 static int opt_thread_count(const char *opt, const char *arg)
2705 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2708 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2713 static void opt_audio_sample_fmt(const char *arg)
2715 if (strcmp(arg, "list"))
2716 audio_sample_fmt = avcodec_get_sample_fmt(arg);
2718 list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
2723 static int opt_audio_rate(const char *opt, const char *arg)
2725 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2729 static int opt_audio_channels(const char *opt, const char *arg)
2731 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2735 static void opt_video_channel(const char *arg)
2737 video_channel = strtol(arg, NULL, 0);
2740 static void opt_video_standard(const char *arg)
2742 video_standard = av_strdup(arg);
2745 static void opt_codec(int *pstream_copy, char **pcodec_name,
2746 int codec_type, const char *arg)
2748 av_freep(pcodec_name);
2749 if (!strcmp(arg, "copy")) {
2752 *pcodec_name = av_strdup(arg);
2756 static void opt_audio_codec(const char *arg)
2758 opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg);
2761 static void opt_audio_tag(const char *arg)
2764 audio_codec_tag= strtol(arg, &tail, 0);
2767 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2770 static void opt_video_tag(const char *arg)
2773 video_codec_tag= strtol(arg, &tail, 0);
2776 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2779 static void opt_video_codec(const char *arg)
2781 opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg);
2784 static void opt_subtitle_codec(const char *arg)
2786 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
2789 static void opt_subtitle_tag(const char *arg)
2792 subtitle_codec_tag= strtol(arg, &tail, 0);
2795 subtitle_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2798 static void opt_map(const char *arg)
2803 m = &stream_maps[nb_stream_maps++];
2805 m->file_index = strtol(arg, &p, 0);
2809 m->stream_index = strtol(p, &p, 0);
2812 m->sync_file_index = strtol(p, &p, 0);
2815 m->sync_stream_index = strtol(p, &p, 0);
2817 m->sync_file_index = m->file_index;
2818 m->sync_stream_index = m->stream_index;
2822 static void opt_map_meta_data(const char *arg)
2827 m = &meta_data_maps[nb_meta_data_maps++];
2829 m->out_file = strtol(arg, &p, 0);
2833 m->in_file = strtol(p, &p, 0);
2836 static void opt_input_ts_scale(const char *arg)
2838 unsigned int stream;
2842 stream = strtol(arg, &p, 0);
2845 scale= strtod(p, &p);
2847 if(stream >= MAX_STREAMS)
2850 input_files_ts_scale[nb_input_files][stream]= scale;
2853 static int opt_recording_time(const char *opt, const char *arg)
2855 recording_time = parse_time_or_die(opt, arg, 1);
2859 static int opt_start_time(const char *opt, const char *arg)
2861 start_time = parse_time_or_die(opt, arg, 1);
2865 static int opt_rec_timestamp(const char *opt, const char *arg)
2867 rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
2871 static int opt_input_ts_offset(const char *opt, const char *arg)
2873 input_ts_offset = parse_time_or_die(opt, arg, 1);
2877 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
2879 const char *codec_string = encoder ? "encoder" : "decoder";
2883 return CODEC_ID_NONE;
2885 avcodec_find_encoder_by_name(name) :
2886 avcodec_find_decoder_by_name(name);
2888 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
2891 if(codec->type != type) {
2892 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
2898 static void opt_contract_label(const char *label)
2900 contract_label = label;
2903 static void opt_input_file(const char *filename)
2905 AVFormatContext *ic;
2906 AVFormatParameters params, *ap = ¶ms;
2907 int err, i, ret, rfps, rfps_base;
2910 if (!strcmp(filename, "-"))
2913 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2914 !strcmp(filename, "/dev/stdin");
2916 /* get default parameters from command line */
2917 ic = avformat_alloc_context();
2919 memset(ap, 0, sizeof(*ap));
2920 ap->prealloced_context = 1;
2921 ap->sample_rate = audio_sample_rate;
2922 ap->channels = audio_channels;
2923 ap->time_base.den = frame_rate.num;
2924 ap->time_base.num = frame_rate.den;
2925 ap->width = frame_width + frame_padleft + frame_padright;
2926 ap->height = frame_height + frame_padtop + frame_padbottom;
2927 ap->pix_fmt = frame_pix_fmt;
2928 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
2929 ap->channel = video_channel;
2930 ap->standard = video_standard;
2931 ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0);
2932 ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0);
2933 if(pgmyuv_compatibility_hack)
2934 ap->video_codec_id= CODEC_ID_PGMYUV;
2936 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
2938 ic->video_codec_id = find_codec_or_die(video_codec_name , CODEC_TYPE_VIDEO , 0);
2939 ic->audio_codec_id = find_codec_or_die(audio_codec_name , CODEC_TYPE_AUDIO , 0);
2940 ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 0);
2941 ic->flags |= AVFMT_FLAG_NONBLOCK;
2943 /* open the input file with generic libav function */
2944 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2946 print_error(filename, err);
2951 for(i=0; i<ic->nb_programs; i++)
2952 if(ic->programs[i]->id != opt_programid)
2953 ic->programs[i]->discard = AVDISCARD_ALL;
2956 ic->loop_input = loop_input;
2958 /* If not enough info to get the stream parameters, we decode the
2959 first frames to get it. (used in mpeg case for example) */
2960 ret = av_find_stream_info(ic);
2961 if (ret < 0 && verbose >= 0) {
2962 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2966 timestamp = start_time;
2967 /* add the stream start time */
2968 if (ic->start_time != AV_NOPTS_VALUE)
2969 timestamp += ic->start_time;
2971 /* if seeking requested, we execute it */
2972 if (start_time != 0) {
2973 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2975 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2976 filename, (double)timestamp / AV_TIME_BASE);
2978 /* reset seek info */
2982 /* update the current parameters so that they match the one of the input stream */
2983 for(i=0;i<ic->nb_streams;i++) {
2984 AVCodecContext *enc = ic->streams[i]->codec;
2986 avcodec_thread_init(enc, thread_count);
2987 enc->thread_count= thread_count;
2988 switch(enc->codec_type) {
2989 case CODEC_TYPE_AUDIO:
2990 set_context_opts(enc, avcodec_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2991 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2992 channel_layout = enc->channel_layout;
2993 audio_channels = enc->channels;
2994 audio_sample_rate = enc->sample_rate;
2995 audio_sample_fmt = enc->sample_fmt;
2996 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(audio_codec_name);
2998 ic->streams[i]->discard= AVDISCARD_ALL;
3000 case CODEC_TYPE_VIDEO:
3001 set_context_opts(enc, avcodec_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
3002 frame_height = enc->height;
3003 frame_width = enc->width;
3004 if(ic->streams[i]->sample_aspect_ratio.num)
3005 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3007 frame_aspect_ratio=av_q2d(enc->sample_aspect_ratio);
3008 frame_aspect_ratio *= (float) enc->width / enc->height;
3009 frame_pix_fmt = enc->pix_fmt;
3010 rfps = ic->streams[i]->r_frame_rate.num;
3011 rfps_base = ic->streams[i]->r_frame_rate.den;
3012 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
3014 enc->debug |= FF_DEBUG_MV;
3016 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
3019 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3020 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
3022 (float)rfps / rfps_base, rfps, rfps_base);
3024 /* update the current frame rate to match the stream frame rate */
3025 frame_rate.num = rfps;
3026 frame_rate.den = rfps_base;
3028 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(video_codec_name);
3030 ic->streams[i]->discard= AVDISCARD_ALL;
3031 else if(video_discard)
3032 ic->streams[i]->discard= video_discard;
3034 case CODEC_TYPE_DATA:
3036 case CODEC_TYPE_SUBTITLE:
3037 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(subtitle_codec_name);
3038 if(subtitle_disable)
3039 ic->streams[i]->discard = AVDISCARD_ALL;
3041 case CODEC_TYPE_ATTACHMENT:
3042 case CODEC_TYPE_UNKNOWN:
3050 input_files[nb_input_files] = ic;
3051 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3052 /* dump the file content */
3054 dump_format(ic, nb_input_files, filename, 0);
3057 file_iformat = NULL;
3058 file_oformat = NULL;
3062 av_freep(&video_codec_name);
3063 av_freep(&audio_codec_name);
3064 av_freep(&subtitle_codec_name);
3067 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3068 int *has_subtitle_ptr)
3070 int has_video, has_audio, has_subtitle, i, j;
3071 AVFormatContext *ic;
3076 for(j=0;j<nb_input_files;j++) {
3077 ic = input_files[j];
3078 for(i=0;i<ic->nb_streams;i++) {
3079 AVCodecContext *enc = ic->streams[i]->codec;
3080 switch(enc->codec_type) {
3081 case CODEC_TYPE_AUDIO:
3084 case CODEC_TYPE_VIDEO:
3087 case CODEC_TYPE_SUBTITLE:
3090 case CODEC_TYPE_DATA:
3091 case CODEC_TYPE_ATTACHMENT:
3092 case CODEC_TYPE_UNKNOWN:
3099 *has_video_ptr = has_video;
3100 *has_audio_ptr = has_audio;
3101 *has_subtitle_ptr = has_subtitle;
3104 static void new_video_stream(AVFormatContext *oc)
3107 AVCodecContext *video_enc;
3110 st = av_new_stream(oc, oc->nb_streams);
3112 fprintf(stderr, "Could not alloc stream\n");
3115 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
3116 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
3117 video_bitstream_filters= NULL;
3120 avcodec_thread_init(st->codec, thread_count);
3122 video_enc = st->codec;
3125 video_enc->codec_tag= video_codec_tag;
3127 if( (video_global_header&1)
3128 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3129 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3130 avcodec_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3132 if(video_global_header&2){
3133 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3134 avcodec_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3137 if (video_stream_copy) {
3138 st->stream_copy = 1;
3139 video_enc->codec_type = CODEC_TYPE_VIDEO;
3140 video_enc->sample_aspect_ratio =
3141 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3146 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3148 if (video_codec_name) {
3149 codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
3150 codec = avcodec_find_encoder_by_name(video_codec_name);
3151 output_codecs[nb_ocodecs] = codec;
3153 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
3154 codec = avcodec_find_encoder(codec_id);
3157 video_enc->codec_id = codec_id;
3159 set_context_opts(video_enc, avcodec_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3161 if (codec && codec->supported_framerates && !force_fps)
3162 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3163 video_enc->time_base.den = fps.num;
3164 video_enc->time_base.num = fps.den;
3166 video_enc->width = frame_width + frame_padright + frame_padleft;
3167 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3168 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3169 video_enc->pix_fmt = frame_pix_fmt;
3170 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3172 if(codec && codec->pix_fmts){
3173 const enum PixelFormat *p= codec->pix_fmts;
3175 if(*p == video_enc->pix_fmt)
3179 video_enc->pix_fmt = codec->pix_fmts[0];
3183 video_enc->gop_size = 0;
3184 if (video_qscale || same_quality) {
3185 video_enc->flags |= CODEC_FLAG_QSCALE;
3186 video_enc->global_quality=
3187 st->quality = FF_QP2LAMBDA * video_qscale;
3191 video_enc->intra_matrix = intra_matrix;
3193 video_enc->inter_matrix = inter_matrix;
3195 video_enc->thread_count = thread_count;
3196 p= video_rc_override_string;
3199 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3201 fprintf(stderr, "error parsing rc_override\n");
3204 video_enc->rc_override=
3205 av_realloc(video_enc->rc_override,
3206 sizeof(RcOverride)*(i+1));
3207 video_enc->rc_override[i].start_frame= start;
3208 video_enc->rc_override[i].end_frame = end;
3210 video_enc->rc_override[i].qscale= q;
3211 video_enc->rc_override[i].quality_factor= 1.0;
3214 video_enc->rc_override[i].qscale= 0;
3215 video_enc->rc_override[i].quality_factor= -q/100.0;
3220 video_enc->rc_override_count=i;
3221 if (!video_enc->rc_initial_buffer_occupancy)
3222 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3223 video_enc->me_threshold= me_threshold;
3224 video_enc->intra_dc_precision= intra_dc_precision - 8;
3227 video_enc->flags|= CODEC_FLAG_PSNR;
3232 video_enc->flags |= CODEC_FLAG_PASS1;
3234 video_enc->flags |= CODEC_FLAG_PASS2;
3240 /* reset some key parameters */
3242 av_freep(&video_codec_name);
3243 video_stream_copy = 0;
3246 static void new_audio_stream(AVFormatContext *oc)
3249 AVCodecContext *audio_enc;
3252 st = av_new_stream(oc, oc->nb_streams);
3254 fprintf(stderr, "Could not alloc stream\n");
3257 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
3259 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
3260 audio_bitstream_filters= NULL;
3263 avcodec_thread_init(st->codec, thread_count);
3265 audio_enc = st->codec;
3266 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3269 audio_enc->codec_tag= audio_codec_tag;
3271 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3272 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3273 avcodec_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3275 if (audio_stream_copy) {
3276 st->stream_copy = 1;
3277 audio_enc->channels = audio_channels;
3281 set_context_opts(audio_enc, avcodec_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3283 if (audio_codec_name) {
3284 codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
3285 codec = avcodec_find_encoder_by_name(audio_codec_name);
3286 output_codecs[nb_ocodecs] = codec;
3288 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3289 codec = avcodec_find_encoder(codec_id);
3291 audio_enc->codec_id = codec_id;
3293 if (audio_qscale > QSCALE_NONE) {
3294 audio_enc->flags |= CODEC_FLAG_QSCALE;
3295 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3297 audio_enc->thread_count = thread_count;
3298 audio_enc->channels = audio_channels;
3299 audio_enc->sample_fmt = audio_sample_fmt;
3300 audio_enc->channel_layout = channel_layout;
3301 if (avcodec_channel_layout_num_channels(channel_layout) != audio_channels)
3302 audio_enc->channel_layout = 0;
3304 if(codec && codec->sample_fmts){
3305 const enum SampleFormat *p= codec->sample_fmts;
3307 if(*p == audio_enc->sample_fmt)
3311 audio_enc->sample_fmt = codec->sample_fmts[0];
3315 audio_enc->sample_rate = audio_sample_rate;
3316 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3317 if (audio_language) {
3318 av_metadata_set(&st->metadata, "language", audio_language);
3319 av_free(audio_language);
3320 audio_language = NULL;
3323 /* reset some key parameters */
3325 av_freep(&audio_codec_name);
3326 audio_stream_copy = 0;
3329 static void new_subtitle_stream(AVFormatContext *oc)
3332 AVCodecContext *subtitle_enc;
3334 st = av_new_stream(oc, oc->nb_streams);
3336 fprintf(stderr, "Could not alloc stream\n");
3339 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
3341 bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
3342 subtitle_bitstream_filters= NULL;
3344 subtitle_enc = st->codec;
3345 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3347 if(subtitle_codec_tag)
3348 subtitle_enc->codec_tag= subtitle_codec_tag;
3350 if (subtitle_stream_copy) {
3351 st->stream_copy = 1;
3353 set_context_opts(avcodec_opts[CODEC_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3354 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1);
3355 output_codecs[nb_ocodecs] = avcodec_find_encoder_by_name(subtitle_codec_name);
3359 if (subtitle_language) {
3360 av_metadata_set(&st->metadata, "language", subtitle_language);
3361 av_free(subtitle_language);
3362 subtitle_language = NULL;
3365 subtitle_disable = 0;
3366 av_freep(&subtitle_codec_name);
3367 subtitle_stream_copy = 0;
3370 static void opt_new_audio_stream(void)
3372 AVFormatContext *oc;
3373 if (nb_output_files <= 0) {
3374 fprintf(stderr, "At least one output file must be specified\n");
3377 oc = output_files[nb_output_files - 1];
3378 new_audio_stream(oc);
3381 static void opt_new_video_stream(void)
3383 AVFormatContext *oc;
3384 if (nb_output_files <= 0) {
3385 fprintf(stderr, "At least one output file must be specified\n");
3388 oc = output_files[nb_output_files - 1];
3389 new_video_stream(oc);
3392 static void opt_new_subtitle_stream(void)
3394 AVFormatContext *oc;
3395 if (nb_output_files <= 0) {
3396 fprintf(stderr, "At least one output file must be specified\n");
3399 oc = output_files[nb_output_files - 1];
3400 new_subtitle_stream(oc);
3403 static void opt_output_file(const char *filename)
3405 AVFormatContext *oc;
3406 int use_video, use_audio, use_subtitle;
3407 int input_has_video, input_has_audio, input_has_subtitle;
3408 AVFormatParameters params, *ap = ¶ms;
3410 if (!strcmp(filename, "-"))
3413 oc = avformat_alloc_context();
3415 if (!file_oformat) {
3416 file_oformat = guess_format(NULL, filename, NULL);
3417 if (!file_oformat) {
3418 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3424 oc->oformat = file_oformat;
3425 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3427 if (!strcmp(file_oformat->name, "ffm") &&
3428 av_strstart(filename, "http:", NULL)) {
3429 /* special case for files sent to ffserver: we get the stream
3430 parameters from ffserver */
3431 int err = read_ffserver_streams(oc, filename);
3433 print_error(filename, err);
3437 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3438 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3439 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3441 /* disable if no corresponding type found and at least one
3443 if (nb_input_files > 0) {
3444 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3445 &input_has_subtitle);
3446 if (!input_has_video)
3448 if (!input_has_audio)
3450 if (!input_has_subtitle)
3454 /* manual disable */
3455 if (audio_disable) {
3458 if (video_disable) {
3461 if (subtitle_disable) {
3466 new_video_stream(oc);
3470 new_audio_stream(oc);
3474 new_subtitle_stream(oc);
3477 oc->timestamp = rec_timestamp;
3479 for(; metadata_count>0; metadata_count--){
3480 av_metadata_set(&oc->metadata, metadata[metadata_count-1].key,
3481 metadata[metadata_count-1].value);
3483 av_metadata_conv(oc, oc->oformat->metadata_conv, NULL);
3486 output_files[nb_output_files++] = oc;
3488 /* check filename in case of an image number is expected */
3489 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3490 if (!av_filename_number_test(oc->filename)) {
3491 print_error(oc->filename, AVERROR_NUMEXPECTED);
3496 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3497 /* test if it already exists to avoid loosing precious files */
3498 if (!file_overwrite &&
3499 (strchr(filename, ':') == NULL ||
3500 filename[1] == ':' ||
3501 av_strstart(filename, "file:", NULL))) {
3502 if (url_exist(filename)) {
3504 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3506 if (!read_yesno()) {
3507 fprintf(stderr, "Not overwriting - exiting\n");
3512 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3519 if (url_fopen(&oc->pb, filename, o_direct ? URL_RDWR|URL_DIRECT : URL_WRONLY) < 0) {
3520 fprintf(stderr, "Could not open '%s'\n", filename);
3526 for (i=0; i<0x81; i++) {
3527 put_le32(oc->pb, i);
3529 put_flush_packet(oc->pb);
3531 url_close_buf(oc->pb);
3537 memset(ap, 0, sizeof(*ap));
3538 if (av_set_parameters(oc, ap) < 0) {
3539 fprintf(stderr, "%s: Invalid encoding parameters\n",
3544 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3545 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3546 oc->loop_output = loop_output;
3547 oc->flags |= AVFMT_FLAG_NONBLOCK;
3549 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
3551 /* reset some options */
3552 file_oformat = NULL;
3553 file_iformat = NULL;
3556 /* same option as mencoder */
3557 static void opt_pass(const char *pass_str)
3560 pass = atoi(pass_str);
3561 if (pass != 1 && pass != 2) {
3562 fprintf(stderr, "pass number can be only 1 or 2\n");
3568 static int64_t getutime(void)
3571 struct rusage rusage;
3573 getrusage(RUSAGE_SELF, &rusage);
3574 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3575 #elif HAVE_GETPROCESSTIMES
3577 FILETIME c, e, k, u;
3578 proc = GetCurrentProcess();
3579 GetProcessTimes(proc, &c, &e, &k, &u);
3580 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3582 return av_gettime();
3586 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3589 const char *p = str;
3596 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3603 static void opt_inter_matrix(const char *arg)
3605 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3606 parse_matrix_coeffs(inter_matrix, arg);
3609 static void opt_intra_matrix(const char *arg)
3611 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3612 parse_matrix_coeffs(intra_matrix, arg);
3616 * Trivial log callback.
3617 * Only suitable for show_help and similar since it lacks prefix handling.
3619 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
3621 vfprintf(stdout, fmt, vl);
3624 static void show_help(void)
3626 av_log_set_callback(log_callback_help);
3627 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3628 "Hyper fast Audio and Video encoder\n");
3630 show_help_options(options, "Main options:\n",
3631 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3632 show_help_options(options, "\nAdvanced options:\n",
3633 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3635 show_help_options(options, "\nVideo options:\n",
3636 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3638 show_help_options(options, "\nAdvanced Video options:\n",
3639 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3640 OPT_VIDEO | OPT_EXPERT);
3641 show_help_options(options, "\nAudio options:\n",
3642 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3644 show_help_options(options, "\nAdvanced Audio options:\n",
3645 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3646 OPT_AUDIO | OPT_EXPERT);
3647 show_help_options(options, "\nSubtitle options:\n",
3648 OPT_SUBTITLE | OPT_GRAB,
3650 show_help_options(options, "\nAudio/Video grab options:\n",
3654 av_opt_show(avcodec_opts[0], NULL);
3656 av_opt_show(avformat_opts, NULL);
3658 av_opt_show(sws_opts, NULL);
3661 static void opt_target(const char *arg)
3664 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3666 if(!strncmp(arg, "pal-", 4)) {
3669 } else if(!strncmp(arg, "ntsc-", 5)) {
3672 } else if(!strncmp(arg, "film-", 5)) {
3677 /* Calculate FR via float to avoid int overflow */
3678 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3681 } else if((fr == 29970) || (fr == 23976)) {
3684 /* Try to determine PAL/NTSC by peeking in the input files */
3685 if(nb_input_files) {
3687 for(j = 0; j < nb_input_files; j++) {
3688 for(i = 0; i < input_files[j]->nb_streams; i++) {
3689 AVCodecContext *c = input_files[j]->streams[i]->codec;
3690 if(c->codec_type != CODEC_TYPE_VIDEO)
3692 fr = c->time_base.den * 1000 / c->time_base.num;
3696 } else if((fr == 29970) || (fr == 23976)) {
3706 if(verbose && norm >= 0)
3707 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3711 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3712 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3713 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3717 if(!strcmp(arg, "vcd")) {
3719 opt_video_codec("mpeg1video");
3720 opt_audio_codec("mp2");
3723 opt_frame_size(norm ? "352x240" : "352x288");
3724 opt_frame_rate(NULL, frame_rates[norm]);
3725 opt_default("gop", norm ? "18" : "15");
3727 opt_default("b", "1150000");
3728 opt_default("maxrate", "1150000");
3729 opt_default("minrate", "1150000");
3730 opt_default("bufsize", "327680"); // 40*1024*8;
3732 opt_default("ab", "224000");
3733 audio_sample_rate = 44100;
3736 opt_default("packetsize", "2324");
3737 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3739 /* We have to offset the PTS, so that it is consistent with the SCR.
3740 SCR starts at 36000, but the first two packs contain only padding
3741 and the first pack from the other stream, respectively, may also have
3742 been written before.
3743 So the real data starts at SCR 36000+3*1200. */
3744 mux_preload= (36000+3*1200) / 90000.0; //0.44
3745 } else if(!strcmp(arg, "svcd")) {
3747 opt_video_codec("mpeg2video");
3748 opt_audio_codec("mp2");
3751 opt_frame_size(norm ? "480x480" : "480x576");
3752 opt_frame_rate(NULL, frame_rates[norm]);
3753 opt_default("gop", norm ? "18" : "15");
3755 opt_default("b", "2040000");
3756 opt_default("maxrate", "2516000");
3757 opt_default("minrate", "0"); //1145000;
3758 opt_default("bufsize", "1835008"); //224*1024*8;
3759 opt_default("flags", "+scan_offset");
3762 opt_default("ab", "224000");
3763 audio_sample_rate = 44100;
3765 opt_default("packetsize", "2324");
3767 } else if(!strcmp(arg, "dvd")) {
3769 opt_video_codec("mpeg2video");
3770 opt_audio_codec("ac3");
3773 opt_frame_size(norm ? "720x480" : "720x576");
3774 opt_frame_rate(NULL, frame_rates[norm]);
3775 opt_default("gop", norm ? "18" : "15");
3777 opt_default("b", "6000000");
3778 opt_default("maxrate", "9000000");
3779 opt_default("minrate", "0"); //1500000;
3780 opt_default("bufsize", "1835008"); //224*1024*8;
3782 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3783 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3785 opt_default("ab", "448000");
3786 audio_sample_rate = 48000;
3788 } else if(!strncmp(arg, "dv", 2)) {
3792 opt_frame_size(norm ? "720x480" : "720x576");
3793 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3794 (norm ? "yuv411p" : "yuv420p"));
3795 opt_frame_rate(NULL, frame_rates[norm]);
3797 audio_sample_rate = 48000;
3801 fprintf(stderr, "Unknown target: %s\n", arg);
3806 static void opt_vstats_file (const char *arg)
3808 av_free (vstats_filename);
3809 vstats_filename=av_strdup (arg);
3812 static void opt_vstats (void)
3815 time_t today2 = time(NULL);
3816 struct tm *today = localtime(&today2);
3818 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3820 opt_vstats_file(filename);
3823 static int opt_bsf(const char *opt, const char *arg)
3825 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3826 AVBitStreamFilterContext **bsfp;
3829 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3833 bsfp= *opt == 'v' ? &video_bitstream_filters :
3834 *opt == 'a' ? &audio_bitstream_filters :
3835 &subtitle_bitstream_filters;
3837 bsfp= &(*bsfp)->next;
3844 static int opt_preset(const char *opt, const char *arg)
3847 char filename[1000], tmp[1000], tmp2[1000], line[1000];
3849 const char *base[2]= { getenv("HOME"),
3852 for(i=!base[0]; i<2 && !f; i++){
3853 snprintf(filename, sizeof(filename), "%s%s/%s.ffpreset", base[i], i ? "" : "/.ffmpeg", arg);
3854 f= fopen(filename, "r");
3856 char *codec_name= *opt == 'v' ? video_codec_name :
3857 *opt == 'a' ? audio_codec_name :
3858 subtitle_codec_name;
3859 snprintf(filename, sizeof(filename), "%s%s/%s-%s.ffpreset", base[i], i ? "" : "/.ffmpeg", codec_name, arg);
3860 f= fopen(filename, "r");
3863 if(!f && ((arg[0]=='.' && arg[1]=='/') || arg[0]=='/' ||
3865 av_strlcpy(filename, arg, sizeof(filename));
3866 f= fopen(filename, "r");
3870 fprintf(stderr, "File for preset '%s' not found\n", arg);
3875 int e= fscanf(f, "%999[^\n]\n", line) - 1;
3876 if(line[0] == '#' && !e)
3878 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
3880 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
3883 if(!strcmp(tmp, "acodec")){
3884 opt_audio_codec(tmp2);
3885 }else if(!strcmp(tmp, "vcodec")){
3886 opt_video_codec(tmp2);
3887 }else if(!strcmp(tmp, "scodec")){
3888 opt_subtitle_codec(tmp2);
3889 }else if(opt_default(tmp, tmp2) < 0){
3890 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
3900 static const OptionDef options[] = {
3902 { "renegotiate", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&renegotiate}, "renegotiate after several video frames", "number" },
3903 { "L", OPT_EXIT, {(void*)show_license}, "show license" },
3904 { "h", OPT_EXIT, {(void*)show_help}, "show help" },
3905 { "version", OPT_EXIT, {(void*)show_version}, "show version" },
3906 { "formats", OPT_EXIT, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3907 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3908 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3909 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3910 { "contract_label", HAS_ARG, {(void*)opt_contract_label}, "contract label", "label" },
3911 { "direct", OPT_BOOL, {(void*)&o_direct}, "write to output file using direct I/O (O_DIRECT)" },
3912 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3913 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3914 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3915 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3916 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3917 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3918 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
3919 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_rec_timestamp}, "set the timestamp ('now' to set the current time)", "time" },
3920 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
3921 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3922 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3923 "add timings for benchmarking" },
3924 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3925 "dump each input packet" },
3926 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3927 "when dumping packets, also dump the payload" },
3928 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3929 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3930 { "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)", "" },
3931 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
3932 { "loglevel", HAS_ARG | OPT_FUNC2, {(void*)opt_loglevel}, "set libav* logging level", "number" },
3933 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3934 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3935 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3936 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3937 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3938 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3939 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3940 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3941 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3942 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3943 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
3944 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
3947 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3948 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3949 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3950 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3951 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3952 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3953 { "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" },
3954 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3955 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3956 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3957 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3958 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3959 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3960 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3961 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3962 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3963 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3964 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3965 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3966 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3967 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3968 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3969 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
3970 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3971 "use same video quality as source (implies VBR)" },
3972 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3973 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
3974 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3975 "deinterlace pictures" },
3976 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3977 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
3978 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
3979 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3980 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3981 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3982 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3983 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3984 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3985 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3986 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
3989 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3990 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3991 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3992 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3993 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3994 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3995 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3996 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3997 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3998 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
3999 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4000 { "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" },
4002 /* subtitle options */
4003 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4004 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4005 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
4006 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4007 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4010 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4011 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4012 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4015 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4016 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4018 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4019 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4020 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4022 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4023 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4024 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4026 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4030 #ifdef CONFIG_FFMPEG_WITH_FRSH
4031 void *av_encode_thread(void *arg)
4034 frsh_thread_id_t thread_id;
4036 /* bind this thread to vres */
4037 thread_id = fosa_thread_self();
4038 PXW(frsh_thread_bind(disk_vres, thread_id));
4040 ret = av_encode(output_files, nb_output_files,
4041 input_files, nb_input_files,
4042 stream_maps, nb_stream_maps);
4043 return (void*)(intptr_t)ret;
4048 frsh_thread_attr_t frsh_attr;
4049 frsh_thread_id_t thread;
4050 frsh_vres_id_t cpu_vres;
4051 frsh_rel_time_t cpu_budget, cpu_period;
4053 frsh_rel_time_t disk_budget, disk_period;
4057 cpu_budget = fosa_msec_to_rel_time(5);
4058 cpu_period = fosa_msec_to_rel_time(1000/50);
4061 #define DISK_THROUGHPUT 20277LLU /* units??? probably MB/s */
4062 disk_budget = fosa_nsec_to_rel_time(1000000000LLU/*nsec/s*/ * 500000 /*bytes/s*/
4063 / (DISK_THROUGHPUT*1000000) /* bytes */); // is this correct?
4065 disk_budget = fosa_msec_to_rel_time(1);
4067 disk_period = fosa_msec_to_rel_time(1000/30);
4069 /* Contract negotiation for CPU */
4070 ret = frsh_contract_init(&cpu_contract);
4071 if (ret) PERROR_AND_EXIT(ret, "CPU:frsh_contract_init");
4073 ret = frsh_contract_set_basic_params(&cpu_contract,
4078 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_basic_params");
4079 ret = frsh_contract_set_resource_and_label(&cpu_contract,
4080 FRSH_RT_PROCESSOR, FRSH_CPU_ID_DEFAULT, contract_label);
4081 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_resource_and_label");
4083 ret = frsh_contract_negotiate(&cpu_contract, &cpu_vres);
4084 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_negotiate cpu");
4085 printf("Aqcpu vres negotiated\n");
4087 /* Contract negotiation for Disk */
4088 ret = frsh_contract_init(&disk_contract);
4089 if (ret) PERROR_AND_EXIT(ret, "DISK:frsh_contract_init");
4091 ret = frsh_contract_set_basic_params(&disk_contract,
4094 FRSH_WT_INDETERMINATE,
4096 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_basic_params");
4097 ret = frsh_contract_set_resource_and_label(&disk_contract,
4098 FRSH_RT_DISK, 0, strstr(output_files[0]->filename, "://") == NULL ?
4099 output_files[0]->filename : input_files[0]->filename);
4100 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_resource_and_label");
4102 ret = frsh_contract_negotiate(&disk_contract, &disk_vres);
4103 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_negotiate disk");
4104 printf("Disk vres negotiated\n");
4106 pthread_attr_init(&frsh_attr);
4107 ret = frsh_thread_create_and_bind(cpu_vres, &thread, &frsh_attr,
4108 av_encode_thread, (void*) NULL);
4109 if (ret) PERROR_AND_EXIT(ret, "frsh_thread_create_and_bind");
4111 pthread_join(thread.pthread_id, (void**) NULL);
4113 printf("Ending contracts\n");
4115 ret = frsh_contract_cancel(cpu_vres);
4116 ret = frsh_contract_cancel(disk_vres);
4117 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_cancel");
4119 printf("Finishing\n");
4122 #endif /* CONFIG_FFMPEG_WITH_FRSH */
4124 void flush_buffered_frames(AVFormatContext *s)
4127 while ((pktl = s->packet_buffer)) {
4128 av_free_packet(&pktl->pkt);
4129 s->packet_buffer = pktl->next;
4134 int main(int argc, char **argv)
4139 avcodec_register_all();
4140 avdevice_register_all();
4143 if(isatty(STDIN_FILENO))
4144 url_set_interrupt_cb(decode_interrupt_cb);
4146 for(i=0; i<CODEC_TYPE_NB; i++){
4147 avcodec_opts[i]= avcodec_alloc_context2(i);
4149 avformat_opts = avformat_alloc_context();
4150 sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
4154 #if CONFIG_FFMPEG_WITH_FRSH
4158 printf("FRSH initialized\n");
4163 parse_options(argc, argv, options, opt_output_file);
4165 if (nb_input_files == 0) {
4166 opt_input_file("sdp.txt");
4169 /* file converter / grab */
4170 if (nb_output_files <= 0) {
4172 opt_output_file("stream.mp4");
4175 for (i=0; i<nb_input_files; i++)
4176 flush_buffered_frames(input_files[i]);
4179 #if CONFIG_FFMPEG_WITH_FRSH
4180 if (frsh_stuff() < 0)
4183 if (av_encode(output_files, nb_output_files, input_files, nb_input_files,
4184 stream_maps, nb_stream_maps) < 0)
4187 ti = getutime() - ti;
4189 printf("bench: utime=%0.3fs\n", ti / 1000000.0);