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_vres_id_t cpu_vres;
1595 frsh_contract_t cpu_contract;
1596 frsh_contract_t disk_contract;
1602 static struct timespec start = {0,0};
1603 struct timespec end, d;
1604 static int f = -1; /* number interframe intevals elapsed */
1606 static double ifi_avg=0, ifi_var=0;
1608 clock_gettime(CLOCK_MONOTONIC, &end);
1609 timespec_subtract(&d, &end, &start);
1611 goto out; /* First run */
1612 ifi = (double)d.tv_sec + 1e-9*d.tv_nsec;
1613 #define SQ(x) ((x)*(x))
1614 ifi_var = ifi_var*(f-1)/f + (double)(f-1)/SQ(f)*SQ(ifi-ifi_avg);
1615 ifi_avg = ifi_avg*(f-1)/f + (double)ifi/f;
1616 printf("%5d: interframe interval = 1/%5.2lf s avg=1/%.2f stddev=1/%3.2f\n",
1617 f, 1/ifi, 1/ifi_avg, 1/sqrt(ifi_var));
1619 #ifdef CONFIG_FFMPEG_WITH_FRSH
1620 if (renegotiate == f) {
1621 frsh_contract_renegotiate_sync(&cpu_contract, cpu_vres);
1622 frsh_contract_renegotiate_sync(&disk_contract, disk_vres);
1630 * The following code is the main loop of the file converter
1632 static int av_encode(AVFormatContext **output_files,
1633 int nb_output_files,
1634 AVFormatContext **input_files,
1636 AVStreamMap *stream_maps, int nb_stream_maps)
1638 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1639 AVFormatContext *is, *os;
1640 AVCodecContext *codec, *icodec;
1641 AVOutputStream *ost, **ost_table = NULL;
1642 AVInputStream *ist, **ist_table = NULL;
1643 AVInputFile *file_table;
1647 uint8_t no_packet[MAX_FILES]={0};
1648 int no_packet_count=0;
1650 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1654 /* input stream init */
1656 for(i=0;i<nb_input_files;i++) {
1657 is = input_files[i];
1658 file_table[i].ist_index = j;
1659 file_table[i].nb_streams = is->nb_streams;
1660 j += is->nb_streams;
1664 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1668 for(i=0;i<nb_istreams;i++) {
1669 ist = av_mallocz(sizeof(AVInputStream));
1675 for(i=0;i<nb_input_files;i++) {
1676 is = input_files[i];
1677 for(k=0;k<is->nb_streams;k++) {
1678 ist = ist_table[j++];
1679 ist->st = is->streams[k];
1680 ist->file_index = i;
1682 ist->discard = 1; /* the stream is discarded by default
1686 ist->start = av_gettime();
1691 /* output stream init */
1693 for(i=0;i<nb_output_files;i++) {
1694 os = output_files[i];
1695 if (!os->nb_streams) {
1696 dump_format(output_files[i], i, output_files[i]->filename, 1);
1697 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1700 nb_ostreams += os->nb_streams;
1702 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1703 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1707 /* Sanity check the mapping args -- do the input files & streams exist? */
1708 for(i=0;i<nb_stream_maps;i++) {
1709 int fi = stream_maps[i].file_index;
1710 int si = stream_maps[i].stream_index;
1712 if (fi < 0 || fi > nb_input_files - 1 ||
1713 si < 0 || si > file_table[fi].nb_streams - 1) {
1714 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1717 fi = stream_maps[i].sync_file_index;
1718 si = stream_maps[i].sync_stream_index;
1719 if (fi < 0 || fi > nb_input_files - 1 ||
1720 si < 0 || si > file_table[fi].nb_streams - 1) {
1721 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1726 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1729 for(i=0;i<nb_ostreams;i++) {
1730 ost = av_mallocz(sizeof(AVOutputStream));
1737 for(k=0;k<nb_output_files;k++) {
1738 os = output_files[k];
1739 for(i=0;i<os->nb_streams;i++,n++) {
1742 ost->file_index = k;
1744 ost->st = os->streams[i];
1745 if (nb_stream_maps > 0) {
1746 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
1747 stream_maps[n].stream_index;
1749 /* Sanity check that the stream types match */
1750 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1751 int i= ost->file_index;
1752 dump_format(output_files[i], i, output_files[i]->filename, 1);
1753 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1754 stream_maps[n].file_index, stream_maps[n].stream_index,
1755 ost->file_index, ost->index);
1762 j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid);
1764 ost->source_index = j;
1768 /* get corresponding input stream index : we select the first one with the right type */
1770 for(j=0;j<nb_istreams;j++) {
1773 ist->st->codec->codec_type == ost->st->codec->codec_type) {
1774 ost->source_index = j;
1782 if(! opt_programid) {
1783 /* try again and reuse existing stream */
1784 for(j=0;j<nb_istreams;j++) {
1786 if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
1787 ost->source_index = j;
1793 int i= ost->file_index;
1794 dump_format(output_files[i], i, output_files[i]->filename, 1);
1795 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
1796 ost->file_index, ost->index);
1801 ist = ist_table[ost->source_index];
1803 ost->sync_ist = (nb_stream_maps > 0) ?
1804 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
1805 stream_maps[n].sync_stream_index] : ist;
1809 /* for each output stream, we compute the right encoding parameters */
1810 for(i=0;i<nb_ostreams;i++) {
1811 AVMetadataTag *lang;
1813 os = output_files[ost->file_index];
1814 ist = ist_table[ost->source_index];
1816 codec = ost->st->codec;
1817 icodec = ist->st->codec;
1819 if ((lang=av_metadata_get(ist->st->metadata, "language", NULL, 0))
1820 && !av_metadata_get(ost->st->metadata, "language", NULL, 0))
1821 av_metadata_set(&ost->st->metadata, "language", lang->value);
1823 ost->st->disposition = ist->st->disposition;
1824 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1825 codec->chroma_sample_location = icodec->chroma_sample_location;
1827 if (ost->st->stream_copy) {
1828 /* if stream_copy is selected, no need to decode or encode */
1829 codec->codec_id = icodec->codec_id;
1830 codec->codec_type = icodec->codec_type;
1832 if(!codec->codec_tag){
1833 if( !os->oformat->codec_tag
1834 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) > 0
1835 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1836 codec->codec_tag = icodec->codec_tag;
1839 codec->bit_rate = icodec->bit_rate;
1840 codec->extradata= icodec->extradata;
1841 codec->extradata_size= icodec->extradata_size;
1842 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){
1843 codec->time_base = icodec->time_base;
1844 codec->time_base.num *= icodec->ticks_per_frame;
1846 codec->time_base = ist->st->time_base;
1847 switch(codec->codec_type) {
1848 case CODEC_TYPE_AUDIO:
1849 if(audio_volume != 256) {
1850 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1853 codec->channel_layout = icodec->channel_layout;
1854 codec->sample_rate = icodec->sample_rate;
1855 codec->channels = icodec->channels;
1856 codec->frame_size = icodec->frame_size;
1857 codec->block_align= icodec->block_align;
1858 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1859 codec->block_align= 0;
1860 if(codec->codec_id == CODEC_ID_AC3)
1861 codec->block_align= 0;
1863 case CODEC_TYPE_VIDEO:
1864 codec->pix_fmt = icodec->pix_fmt;
1865 codec->width = icodec->width;
1866 codec->height = icodec->height;
1867 codec->has_b_frames = icodec->has_b_frames;
1869 case CODEC_TYPE_SUBTITLE:
1870 codec->width = icodec->width;
1871 codec->height = icodec->height;
1877 switch(codec->codec_type) {
1878 case CODEC_TYPE_AUDIO:
1879 ost->fifo= av_fifo_alloc(1024);
1882 ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
1883 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1884 icodec->request_channels = codec->channels;
1885 ist->decoding_needed = 1;
1886 ost->encoding_needed = 1;
1888 case CODEC_TYPE_VIDEO:
1889 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
1890 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
1891 ost->video_resample = ((codec->width != icodec->width -
1892 (frame_leftBand + frame_rightBand) +
1893 (frame_padleft + frame_padright)) ||
1894 (codec->height != icodec->height -
1895 (frame_topBand + frame_bottomBand) +
1896 (frame_padtop + frame_padbottom)) ||
1897 (codec->pix_fmt != icodec->pix_fmt));
1898 if (ost->video_crop) {
1899 ost->topBand = frame_topBand;
1900 ost->leftBand = frame_leftBand;
1902 if (ost->video_pad) {
1903 ost->padtop = frame_padtop;
1904 ost->padleft = frame_padleft;
1905 ost->padbottom = frame_padbottom;
1906 ost->padright = frame_padright;
1907 if (!ost->video_resample) {
1908 avcodec_get_frame_defaults(&ost->pict_tmp);
1909 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1910 codec->width, codec->height))
1914 if (ost->video_resample) {
1915 avcodec_get_frame_defaults(&ost->pict_tmp);
1916 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1917 codec->width, codec->height)) {
1918 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1921 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1922 ost->img_resample_ctx = sws_getContext(
1923 icodec->width - (frame_leftBand + frame_rightBand),
1924 icodec->height - (frame_topBand + frame_bottomBand),
1926 codec->width - (frame_padleft + frame_padright),
1927 codec->height - (frame_padtop + frame_padbottom),
1929 sws_flags, NULL, NULL, NULL);
1930 if (ost->img_resample_ctx == NULL) {
1931 fprintf(stderr, "Cannot get resampling context\n");
1934 ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
1935 codec->bits_per_raw_sample= 0;
1937 ost->encoding_needed = 1;
1938 ist->decoding_needed = 1;
1940 case CODEC_TYPE_SUBTITLE:
1941 ost->encoding_needed = 1;
1942 ist->decoding_needed = 1;
1949 if (ost->encoding_needed &&
1950 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
1951 char logfilename[1024];
1956 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1957 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
1959 if (codec->flags & CODEC_FLAG_PASS1) {
1960 f = fopen(logfilename, "w");
1962 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
1967 /* read the log file */
1968 f = fopen(logfilename, "r");
1970 fprintf(stderr, "Cannot read log file '%s' for pass-2 encoding: %s\n", logfilename, strerror(errno));
1973 fseek(f, 0, SEEK_END);
1975 fseek(f, 0, SEEK_SET);
1976 logbuffer = av_malloc(size + 1);
1978 fprintf(stderr, "Could not allocate log buffer\n");
1981 size = fread(logbuffer, 1, size, f);
1983 logbuffer[size] = '\0';
1984 codec->stats_in = logbuffer;
1988 if(codec->codec_type == CODEC_TYPE_VIDEO){
1989 int size= codec->width * codec->height;
1990 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
1995 bit_buffer = av_malloc(bit_buffer_size);
1997 ret = AVERROR(ENOMEM);
2001 /* open each encoder */
2002 for(i=0;i<nb_ostreams;i++) {
2004 if (ost->encoding_needed) {
2005 AVCodec *codec = output_codecs[i];
2007 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2009 snprintf(error, sizeof(error), "Unsupported codec for output stream #%d.%d",
2010 ost->file_index, ost->index);
2011 ret = AVERROR(EINVAL);
2014 if (avcodec_open(ost->st->codec, codec) < 0) {
2015 snprintf(error, sizeof(error), "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2016 ost->file_index, ost->index);
2017 ret = AVERROR(EINVAL);
2020 extra_size += ost->st->codec->extradata_size;
2024 /* open each decoder */
2025 for(i=0;i<nb_istreams;i++) {
2027 if (ist->decoding_needed) {
2028 AVCodec *codec = input_codecs[i];
2030 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2032 snprintf(error, sizeof(error), "Unsupported codec (id=%d) for input stream #%d.%d",
2033 ist->st->codec->codec_id, ist->file_index, ist->index);
2034 ret = AVERROR(EINVAL);
2037 if (avcodec_open(ist->st->codec, codec) < 0) {
2038 snprintf(error, sizeof(error), "Error while opening codec for input stream #%d.%d",
2039 ist->file_index, ist->index);
2040 ret = AVERROR(EINVAL);
2043 //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
2044 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2049 for(i=0;i<nb_istreams;i++) {
2052 ist->next_pts = AV_NOPTS_VALUE;
2056 /* set meta data information from input file if required */
2057 for (i=0;i<nb_meta_data_maps;i++) {
2058 AVFormatContext *out_file;
2059 AVFormatContext *in_file;
2060 AVMetadataTag *mtag;
2062 int out_file_index = meta_data_maps[i].out_file;
2063 int in_file_index = meta_data_maps[i].in_file;
2064 if (out_file_index < 0 || out_file_index >= nb_output_files) {
2065 snprintf(error, sizeof(error), "Invalid output file index %d map_meta_data(%d,%d)",
2066 out_file_index, out_file_index, in_file_index);
2067 ret = AVERROR(EINVAL);
2070 if (in_file_index < 0 || in_file_index >= nb_input_files) {
2071 snprintf(error, sizeof(error), "Invalid input file index %d map_meta_data(%d,%d)",
2072 in_file_index, out_file_index, in_file_index);
2073 ret = AVERROR(EINVAL);
2077 out_file = output_files[out_file_index];
2078 in_file = input_files[in_file_index];
2082 while((mtag=av_metadata_get(in_file->metadata, "", mtag, AV_METADATA_IGNORE_SUFFIX)))
2083 av_metadata_set(&out_file->metadata, mtag->key, mtag->value);
2084 av_metadata_conv(out_file, out_file->oformat->metadata_conv,
2085 in_file->iformat->metadata_conv);
2088 /* open files and write file headers */
2089 for(i=0;i<nb_output_files;i++) {
2090 os = output_files[i];
2091 if (av_write_header(os) < 0) {
2092 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2093 ret = AVERROR(EINVAL);
2096 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2102 /* dump the file output parameters - cannot be done before in case
2104 for(i=0;i<nb_output_files;i++) {
2105 dump_format(output_files[i], i, output_files[i]->filename, 1);
2108 /* dump the stream mapping */
2110 fprintf(stderr, "Stream mapping:\n");
2111 for(i=0;i<nb_ostreams;i++) {
2113 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2114 ist_table[ost->source_index]->file_index,
2115 ist_table[ost->source_index]->index,
2118 if (ost->sync_ist != ist_table[ost->source_index])
2119 fprintf(stderr, " [sync #%d.%d]",
2120 ost->sync_ist->file_index,
2121 ost->sync_ist->index);
2122 fprintf(stderr, "\n");
2127 fprintf(stderr, "%s\n", error);
2132 print_sdp(output_files, nb_output_files);
2135 if (!using_stdin && verbose >= 0) {
2136 fprintf(stderr, "Press [q] to stop encoding\n");
2137 url_set_interrupt_cb(decode_interrupt_cb);
2141 timer_start = av_gettime();
2143 for(; received_sigterm == 0;) {
2144 int file_index, ist_index;
2152 /* if 'q' pressed, exits */
2156 /* read_key() returns 0 on EOF */
2162 /* select the stream that we must read now by looking at the
2163 smallest output pts */
2165 for(i=0;i<nb_ostreams;i++) {
2168 os = output_files[ost->file_index];
2169 ist = ist_table[ost->source_index];
2170 if(no_packet[ist->file_index])
2172 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
2173 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
2175 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2176 ipts = (double)ist->pts;
2177 if (!file_table[ist->file_index].eof_reached){
2178 if(ipts < ipts_min) {
2180 if(input_sync ) file_index = ist->file_index;
2182 if(opts < opts_min) {
2184 if(!input_sync) file_index = ist->file_index;
2187 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2192 /* if none, if is finished */
2193 if (file_index < 0) {
2194 if(no_packet_count){
2196 memset(no_packet, 0, sizeof(no_packet));
2203 /* finish if recording time exhausted */
2204 if (opts_min >= (recording_time / 1000000.0))
2207 /* finish if limit size exhausted */
2208 if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
2211 /* read a frame from it and output it in the fifo */
2212 is = input_files[file_index];
2213 ret= av_read_frame(is, &pkt);
2214 if(ret == AVERROR(EAGAIN)){
2215 no_packet[file_index]=1;
2220 file_table[file_index].eof_reached = 1;
2228 memset(no_packet, 0, sizeof(no_packet));
2231 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2233 /* the following test is needed in case new streams appear
2234 dynamically in stream : we ignore them */
2235 if (pkt.stream_index >= file_table[file_index].nb_streams)
2236 goto discard_packet;
2237 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2238 ist = ist_table[ist_index];
2240 goto discard_packet;
2242 if (pkt.dts != AV_NOPTS_VALUE)
2243 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2244 if (pkt.pts != AV_NOPTS_VALUE)
2245 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2247 if(input_files_ts_scale[file_index][pkt.stream_index]){
2248 if(pkt.pts != AV_NOPTS_VALUE)
2249 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2250 if(pkt.dts != AV_NOPTS_VALUE)
2251 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2254 //av_log(NULL, AV_LOG_ERROR, "timestamp=%"PRId64" %"PRId64"\n", pkt.pts, pkt.dts);
2257 // 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);
2258 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2259 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2260 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2261 int64_t delta= pkt_dts - ist->next_pts;
2262 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2263 input_files_ts_offset[ist->file_index]-= delta;
2265 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2266 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2267 if(pkt.pts != AV_NOPTS_VALUE)
2268 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2272 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2273 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2276 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2277 ist->file_index, ist->index);
2280 av_free_packet(&pkt);
2287 av_free_packet(&pkt);
2289 /* dump report by using the output first video and audio streams */
2290 //print_report(output_files, ost_table, nb_ostreams, 0);
2293 /* at the end of stream, we must flush the decoder buffers */
2294 for(i=0;i<nb_istreams;i++) {
2296 if (ist->decoding_needed) {
2297 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2303 /* write the trailer if needed and close file */
2304 for(i=0;i<nb_output_files;i++) {
2305 os = output_files[i];
2306 av_write_trailer(os);
2309 /* dump report by using the first video and audio streams */
2310 print_report(output_files, ost_table, nb_ostreams, 1);
2312 /* close each encoder */
2313 for(i=0;i<nb_ostreams;i++) {
2315 if (ost->encoding_needed) {
2316 av_freep(&ost->st->codec->stats_in);
2317 avcodec_close(ost->st->codec);
2321 /* close each decoder */
2322 for(i=0;i<nb_istreams;i++) {
2324 if (ist->decoding_needed) {
2325 avcodec_close(ist->st->codec);
2333 av_freep(&bit_buffer);
2334 av_free(file_table);
2337 for(i=0;i<nb_istreams;i++) {
2344 for(i=0;i<nb_ostreams;i++) {
2348 fclose(ost->logfile);
2349 ost->logfile = NULL;
2351 av_fifo_free(ost->fifo); /* works even if fifo is not
2352 initialized but set to zero */
2353 av_free(ost->pict_tmp.data[0]);
2354 if (ost->video_resample)
2355 sws_freeContext(ost->img_resample_ctx);
2357 audio_resample_close(ost->resample);
2358 if (ost->reformat_ctx)
2359 av_audio_convert_free(ost->reformat_ctx);
2369 int file_read(const char *filename)
2372 unsigned char buffer[1024];
2375 if (url_open(&h, filename, O_RDONLY) < 0) {
2376 printf("could not open '%s'\n", filename);
2380 len = url_read(h, buffer, sizeof(buffer));
2383 for(i=0;i<len;i++) putchar(buffer[i]);
2390 static void opt_format(const char *arg)
2392 /* compatibility stuff for pgmyuv */
2393 if (!strcmp(arg, "pgmyuv")) {
2394 pgmyuv_compatibility_hack=1;
2395 // opt_image_format(arg);
2397 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2400 file_iformat = av_find_input_format(arg);
2401 file_oformat = guess_format(arg, NULL, NULL);
2402 if (!file_iformat && !file_oformat) {
2403 fprintf(stderr, "Unknown input or output format: %s\n", arg);
2408 static void opt_video_rc_override_string(const char *arg)
2410 video_rc_override_string = arg;
2413 static int opt_me_threshold(const char *opt, const char *arg)
2415 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2419 static int opt_loglevel(const char *opt, const char *arg)
2421 int level = parse_number_or_die(opt, arg, OPT_INT, INT_MIN, INT_MAX);
2422 av_log_set_level(level);
2426 static int opt_verbose(const char *opt, const char *arg)
2428 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2432 static int opt_frame_rate(const char *opt, const char *arg)
2434 if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2435 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2441 static int opt_bitrate(const char *opt, const char *arg)
2443 int codec_type = opt[0]=='a' ? CODEC_TYPE_AUDIO : CODEC_TYPE_VIDEO;
2445 opt_default(opt, arg);
2447 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2448 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2453 static void opt_frame_crop_top(const char *arg)
2455 frame_topBand = atoi(arg);
2456 if (frame_topBand < 0) {
2457 fprintf(stderr, "Incorrect top crop size\n");
2460 if ((frame_topBand % 2) != 0) {
2461 fprintf(stderr, "Top crop size must be a multiple of 2\n");
2464 if ((frame_topBand) >= frame_height){
2465 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2468 frame_height -= frame_topBand;
2471 static void opt_frame_crop_bottom(const char *arg)
2473 frame_bottomBand = atoi(arg);
2474 if (frame_bottomBand < 0) {
2475 fprintf(stderr, "Incorrect bottom crop size\n");
2478 if ((frame_bottomBand % 2) != 0) {
2479 fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2482 if ((frame_bottomBand) >= frame_height){
2483 fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2486 frame_height -= frame_bottomBand;
2489 static void opt_frame_crop_left(const char *arg)
2491 frame_leftBand = atoi(arg);
2492 if (frame_leftBand < 0) {
2493 fprintf(stderr, "Incorrect left crop size\n");
2496 if ((frame_leftBand % 2) != 0) {
2497 fprintf(stderr, "Left crop size must be a multiple of 2\n");
2500 if ((frame_leftBand) >= frame_width){
2501 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2504 frame_width -= frame_leftBand;
2507 static void opt_frame_crop_right(const char *arg)
2509 frame_rightBand = atoi(arg);
2510 if (frame_rightBand < 0) {
2511 fprintf(stderr, "Incorrect right crop size\n");
2514 if ((frame_rightBand % 2) != 0) {
2515 fprintf(stderr, "Right crop size must be a multiple of 2\n");
2518 if ((frame_rightBand) >= frame_width){
2519 fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2522 frame_width -= frame_rightBand;
2525 static void opt_frame_size(const char *arg)
2527 if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
2528 fprintf(stderr, "Incorrect frame size\n");
2531 if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
2532 fprintf(stderr, "Frame size must be a multiple of 2\n");
2538 #define SCALEBITS 10
2539 #define ONE_HALF (1 << (SCALEBITS - 1))
2540 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2542 #define RGB_TO_Y(r, g, b) \
2543 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
2544 FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
2546 #define RGB_TO_U(r1, g1, b1, shift)\
2547 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + \
2548 FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2550 #define RGB_TO_V(r1, g1, b1, shift)\
2551 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
2552 FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
2554 static void opt_pad_color(const char *arg) {
2555 /* Input is expected to be six hex digits similar to
2556 how colors are expressed in html tags (but without the #) */
2557 int rgb = strtol(arg, NULL, 16);
2561 g = ((rgb >> 8) & 255);
2564 padcolor[0] = RGB_TO_Y(r,g,b);
2565 padcolor[1] = RGB_TO_U(r,g,b,0);
2566 padcolor[2] = RGB_TO_V(r,g,b,0);
2569 static void opt_frame_pad_top(const char *arg)
2571 frame_padtop = atoi(arg);
2572 if (frame_padtop < 0) {
2573 fprintf(stderr, "Incorrect top pad size\n");
2576 if ((frame_padtop % 2) != 0) {
2577 fprintf(stderr, "Top pad size must be a multiple of 2\n");
2582 static void opt_frame_pad_bottom(const char *arg)
2584 frame_padbottom = atoi(arg);
2585 if (frame_padbottom < 0) {
2586 fprintf(stderr, "Incorrect bottom pad size\n");
2589 if ((frame_padbottom % 2) != 0) {
2590 fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
2596 static void opt_frame_pad_left(const char *arg)
2598 frame_padleft = atoi(arg);
2599 if (frame_padleft < 0) {
2600 fprintf(stderr, "Incorrect left pad size\n");
2603 if ((frame_padleft % 2) != 0) {
2604 fprintf(stderr, "Left pad size must be a multiple of 2\n");
2610 static void opt_frame_pad_right(const char *arg)
2612 frame_padright = atoi(arg);
2613 if (frame_padright < 0) {
2614 fprintf(stderr, "Incorrect right pad size\n");
2617 if ((frame_padright % 2) != 0) {
2618 fprintf(stderr, "Right pad size must be a multiple of 2\n");
2623 static void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts)
2627 for (i=-1; i < nb_fmts; i++) {
2628 get_fmt_string (fmt_str, sizeof(fmt_str), i);
2629 fprintf(stdout, "%s\n", fmt_str);
2633 static void opt_frame_pix_fmt(const char *arg)
2635 if (strcmp(arg, "list")) {
2636 frame_pix_fmt = avcodec_get_pix_fmt(arg);
2637 if (frame_pix_fmt == PIX_FMT_NONE) {
2638 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2642 list_fmts(avcodec_pix_fmt_string, PIX_FMT_NB);
2647 static void opt_frame_aspect_ratio(const char *arg)
2654 p = strchr(arg, ':');
2656 x = strtol(arg, &end, 10);
2658 y = strtol(end+1, &end, 10);
2660 ar = (double)x / (double)y;
2662 ar = strtod(arg, NULL);
2665 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2668 frame_aspect_ratio = ar;
2671 static int opt_metadata(const char *opt, const char *arg)
2673 char *mid= strchr(arg, '=');
2676 fprintf(stderr, "Missing =\n");
2682 metadata= av_realloc(metadata, sizeof(*metadata)*metadata_count);
2683 metadata[metadata_count-1].key = av_strdup(arg);
2684 metadata[metadata_count-1].value= av_strdup(mid);
2689 static void opt_qscale(const char *arg)
2691 video_qscale = atof(arg);
2692 if (video_qscale <= 0 ||
2693 video_qscale > 255) {
2694 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2699 static void opt_top_field_first(const char *arg)
2701 top_field_first= atoi(arg);
2704 static int opt_thread_count(const char *opt, const char *arg)
2706 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2709 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2714 static void opt_audio_sample_fmt(const char *arg)
2716 if (strcmp(arg, "list"))
2717 audio_sample_fmt = avcodec_get_sample_fmt(arg);
2719 list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
2724 static int opt_audio_rate(const char *opt, const char *arg)
2726 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2730 static int opt_audio_channels(const char *opt, const char *arg)
2732 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2736 static void opt_video_channel(const char *arg)
2738 video_channel = strtol(arg, NULL, 0);
2741 static void opt_video_standard(const char *arg)
2743 video_standard = av_strdup(arg);
2746 static void opt_codec(int *pstream_copy, char **pcodec_name,
2747 int codec_type, const char *arg)
2749 av_freep(pcodec_name);
2750 if (!strcmp(arg, "copy")) {
2753 *pcodec_name = av_strdup(arg);
2757 static void opt_audio_codec(const char *arg)
2759 opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg);
2762 static void opt_audio_tag(const char *arg)
2765 audio_codec_tag= strtol(arg, &tail, 0);
2768 audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2771 static void opt_video_tag(const char *arg)
2774 video_codec_tag= strtol(arg, &tail, 0);
2777 video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2780 static void opt_video_codec(const char *arg)
2782 opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg);
2785 static void opt_subtitle_codec(const char *arg)
2787 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
2790 static void opt_subtitle_tag(const char *arg)
2793 subtitle_codec_tag= strtol(arg, &tail, 0);
2796 subtitle_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2799 static void opt_map(const char *arg)
2804 m = &stream_maps[nb_stream_maps++];
2806 m->file_index = strtol(arg, &p, 0);
2810 m->stream_index = strtol(p, &p, 0);
2813 m->sync_file_index = strtol(p, &p, 0);
2816 m->sync_stream_index = strtol(p, &p, 0);
2818 m->sync_file_index = m->file_index;
2819 m->sync_stream_index = m->stream_index;
2823 static void opt_map_meta_data(const char *arg)
2828 m = &meta_data_maps[nb_meta_data_maps++];
2830 m->out_file = strtol(arg, &p, 0);
2834 m->in_file = strtol(p, &p, 0);
2837 static void opt_input_ts_scale(const char *arg)
2839 unsigned int stream;
2843 stream = strtol(arg, &p, 0);
2846 scale= strtod(p, &p);
2848 if(stream >= MAX_STREAMS)
2851 input_files_ts_scale[nb_input_files][stream]= scale;
2854 static int opt_recording_time(const char *opt, const char *arg)
2856 recording_time = parse_time_or_die(opt, arg, 1);
2860 static int opt_start_time(const char *opt, const char *arg)
2862 start_time = parse_time_or_die(opt, arg, 1);
2866 static int opt_rec_timestamp(const char *opt, const char *arg)
2868 rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
2872 static int opt_input_ts_offset(const char *opt, const char *arg)
2874 input_ts_offset = parse_time_or_die(opt, arg, 1);
2878 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
2880 const char *codec_string = encoder ? "encoder" : "decoder";
2884 return CODEC_ID_NONE;
2886 avcodec_find_encoder_by_name(name) :
2887 avcodec_find_decoder_by_name(name);
2889 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
2892 if(codec->type != type) {
2893 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
2899 static void opt_contract_label(const char *label)
2901 contract_label = label;
2904 static void opt_input_file(const char *filename)
2906 AVFormatContext *ic;
2907 AVFormatParameters params, *ap = ¶ms;
2908 int err, i, ret, rfps, rfps_base;
2911 if (!strcmp(filename, "-"))
2914 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2915 !strcmp(filename, "/dev/stdin");
2917 /* get default parameters from command line */
2918 ic = avformat_alloc_context();
2920 memset(ap, 0, sizeof(*ap));
2921 ap->prealloced_context = 1;
2922 ap->sample_rate = audio_sample_rate;
2923 ap->channels = audio_channels;
2924 ap->time_base.den = frame_rate.num;
2925 ap->time_base.num = frame_rate.den;
2926 ap->width = frame_width + frame_padleft + frame_padright;
2927 ap->height = frame_height + frame_padtop + frame_padbottom;
2928 ap->pix_fmt = frame_pix_fmt;
2929 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
2930 ap->channel = video_channel;
2931 ap->standard = video_standard;
2932 ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0);
2933 ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0);
2934 if(pgmyuv_compatibility_hack)
2935 ap->video_codec_id= CODEC_ID_PGMYUV;
2937 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
2939 ic->video_codec_id = find_codec_or_die(video_codec_name , CODEC_TYPE_VIDEO , 0);
2940 ic->audio_codec_id = find_codec_or_die(audio_codec_name , CODEC_TYPE_AUDIO , 0);
2941 ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 0);
2942 ic->flags |= AVFMT_FLAG_NONBLOCK;
2944 /* open the input file with generic libav function */
2945 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
2947 print_error(filename, err);
2952 for(i=0; i<ic->nb_programs; i++)
2953 if(ic->programs[i]->id != opt_programid)
2954 ic->programs[i]->discard = AVDISCARD_ALL;
2957 ic->loop_input = loop_input;
2959 /* If not enough info to get the stream parameters, we decode the
2960 first frames to get it. (used in mpeg case for example) */
2961 ret = av_find_stream_info(ic);
2962 if (ret < 0 && verbose >= 0) {
2963 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2967 timestamp = start_time;
2968 /* add the stream start time */
2969 if (ic->start_time != AV_NOPTS_VALUE)
2970 timestamp += ic->start_time;
2972 /* if seeking requested, we execute it */
2973 if (start_time != 0) {
2974 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2976 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2977 filename, (double)timestamp / AV_TIME_BASE);
2979 /* reset seek info */
2983 /* update the current parameters so that they match the one of the input stream */
2984 for(i=0;i<ic->nb_streams;i++) {
2985 AVCodecContext *enc = ic->streams[i]->codec;
2987 avcodec_thread_init(enc, thread_count);
2988 enc->thread_count= thread_count;
2989 switch(enc->codec_type) {
2990 case CODEC_TYPE_AUDIO:
2991 set_context_opts(enc, avcodec_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2992 //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2993 channel_layout = enc->channel_layout;
2994 audio_channels = enc->channels;
2995 audio_sample_rate = enc->sample_rate;
2996 audio_sample_fmt = enc->sample_fmt;
2997 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(audio_codec_name);
2999 ic->streams[i]->discard= AVDISCARD_ALL;
3001 case CODEC_TYPE_VIDEO:
3002 set_context_opts(enc, avcodec_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
3003 frame_height = enc->height;
3004 frame_width = enc->width;
3005 if(ic->streams[i]->sample_aspect_ratio.num)
3006 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3008 frame_aspect_ratio=av_q2d(enc->sample_aspect_ratio);
3009 frame_aspect_ratio *= (float) enc->width / enc->height;
3010 frame_pix_fmt = enc->pix_fmt;
3011 rfps = ic->streams[i]->r_frame_rate.num;
3012 rfps_base = ic->streams[i]->r_frame_rate.den;
3013 if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
3015 enc->debug |= FF_DEBUG_MV;
3017 if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
3020 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3021 i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
3023 (float)rfps / rfps_base, rfps, rfps_base);
3025 /* update the current frame rate to match the stream frame rate */
3026 frame_rate.num = rfps;
3027 frame_rate.den = rfps_base;
3029 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(video_codec_name);
3031 ic->streams[i]->discard= AVDISCARD_ALL;
3032 else if(video_discard)
3033 ic->streams[i]->discard= video_discard;
3035 case CODEC_TYPE_DATA:
3037 case CODEC_TYPE_SUBTITLE:
3038 input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(subtitle_codec_name);
3039 if(subtitle_disable)
3040 ic->streams[i]->discard = AVDISCARD_ALL;
3042 case CODEC_TYPE_ATTACHMENT:
3043 case CODEC_TYPE_UNKNOWN:
3051 input_files[nb_input_files] = ic;
3052 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3053 /* dump the file content */
3055 dump_format(ic, nb_input_files, filename, 0);
3058 file_iformat = NULL;
3059 file_oformat = NULL;
3063 av_freep(&video_codec_name);
3064 av_freep(&audio_codec_name);
3065 av_freep(&subtitle_codec_name);
3068 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3069 int *has_subtitle_ptr)
3071 int has_video, has_audio, has_subtitle, i, j;
3072 AVFormatContext *ic;
3077 for(j=0;j<nb_input_files;j++) {
3078 ic = input_files[j];
3079 for(i=0;i<ic->nb_streams;i++) {
3080 AVCodecContext *enc = ic->streams[i]->codec;
3081 switch(enc->codec_type) {
3082 case CODEC_TYPE_AUDIO:
3085 case CODEC_TYPE_VIDEO:
3088 case CODEC_TYPE_SUBTITLE:
3091 case CODEC_TYPE_DATA:
3092 case CODEC_TYPE_ATTACHMENT:
3093 case CODEC_TYPE_UNKNOWN:
3100 *has_video_ptr = has_video;
3101 *has_audio_ptr = has_audio;
3102 *has_subtitle_ptr = has_subtitle;
3105 static void new_video_stream(AVFormatContext *oc)
3108 AVCodecContext *video_enc;
3111 st = av_new_stream(oc, oc->nb_streams);
3113 fprintf(stderr, "Could not alloc stream\n");
3116 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
3117 bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
3118 video_bitstream_filters= NULL;
3121 avcodec_thread_init(st->codec, thread_count);
3123 video_enc = st->codec;
3126 video_enc->codec_tag= video_codec_tag;
3128 if( (video_global_header&1)
3129 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3130 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3131 avcodec_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3133 if(video_global_header&2){
3134 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3135 avcodec_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3138 if (video_stream_copy) {
3139 st->stream_copy = 1;
3140 video_enc->codec_type = CODEC_TYPE_VIDEO;
3141 video_enc->sample_aspect_ratio =
3142 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3147 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3149 if (video_codec_name) {
3150 codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
3151 codec = avcodec_find_encoder_by_name(video_codec_name);
3152 output_codecs[nb_ocodecs] = codec;
3154 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
3155 codec = avcodec_find_encoder(codec_id);
3158 video_enc->codec_id = codec_id;
3160 set_context_opts(video_enc, avcodec_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3162 if (codec && codec->supported_framerates && !force_fps)
3163 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3164 video_enc->time_base.den = fps.num;
3165 video_enc->time_base.num = fps.den;
3167 video_enc->width = frame_width + frame_padright + frame_padleft;
3168 video_enc->height = frame_height + frame_padtop + frame_padbottom;
3169 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3170 video_enc->pix_fmt = frame_pix_fmt;
3171 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3173 if(codec && codec->pix_fmts){
3174 const enum PixelFormat *p= codec->pix_fmts;
3176 if(*p == video_enc->pix_fmt)
3180 video_enc->pix_fmt = codec->pix_fmts[0];
3184 video_enc->gop_size = 0;
3185 if (video_qscale || same_quality) {
3186 video_enc->flags |= CODEC_FLAG_QSCALE;
3187 video_enc->global_quality=
3188 st->quality = FF_QP2LAMBDA * video_qscale;
3192 video_enc->intra_matrix = intra_matrix;
3194 video_enc->inter_matrix = inter_matrix;
3196 video_enc->thread_count = thread_count;
3197 p= video_rc_override_string;
3200 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3202 fprintf(stderr, "error parsing rc_override\n");
3205 video_enc->rc_override=
3206 av_realloc(video_enc->rc_override,
3207 sizeof(RcOverride)*(i+1));
3208 video_enc->rc_override[i].start_frame= start;
3209 video_enc->rc_override[i].end_frame = end;
3211 video_enc->rc_override[i].qscale= q;
3212 video_enc->rc_override[i].quality_factor= 1.0;
3215 video_enc->rc_override[i].qscale= 0;
3216 video_enc->rc_override[i].quality_factor= -q/100.0;
3221 video_enc->rc_override_count=i;
3222 if (!video_enc->rc_initial_buffer_occupancy)
3223 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3224 video_enc->me_threshold= me_threshold;
3225 video_enc->intra_dc_precision= intra_dc_precision - 8;
3228 video_enc->flags|= CODEC_FLAG_PSNR;
3233 video_enc->flags |= CODEC_FLAG_PASS1;
3235 video_enc->flags |= CODEC_FLAG_PASS2;
3241 /* reset some key parameters */
3243 av_freep(&video_codec_name);
3244 video_stream_copy = 0;
3247 static void new_audio_stream(AVFormatContext *oc)
3250 AVCodecContext *audio_enc;
3253 st = av_new_stream(oc, oc->nb_streams);
3255 fprintf(stderr, "Could not alloc stream\n");
3258 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
3260 bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
3261 audio_bitstream_filters= NULL;
3264 avcodec_thread_init(st->codec, thread_count);
3266 audio_enc = st->codec;
3267 audio_enc->codec_type = CODEC_TYPE_AUDIO;
3270 audio_enc->codec_tag= audio_codec_tag;
3272 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3273 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3274 avcodec_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3276 if (audio_stream_copy) {
3277 st->stream_copy = 1;
3278 audio_enc->channels = audio_channels;
3282 set_context_opts(audio_enc, avcodec_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3284 if (audio_codec_name) {
3285 codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
3286 codec = avcodec_find_encoder_by_name(audio_codec_name);
3287 output_codecs[nb_ocodecs] = codec;
3289 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3290 codec = avcodec_find_encoder(codec_id);
3292 audio_enc->codec_id = codec_id;
3294 if (audio_qscale > QSCALE_NONE) {
3295 audio_enc->flags |= CODEC_FLAG_QSCALE;
3296 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3298 audio_enc->thread_count = thread_count;
3299 audio_enc->channels = audio_channels;
3300 audio_enc->sample_fmt = audio_sample_fmt;
3301 audio_enc->channel_layout = channel_layout;
3302 if (avcodec_channel_layout_num_channels(channel_layout) != audio_channels)
3303 audio_enc->channel_layout = 0;
3305 if(codec && codec->sample_fmts){
3306 const enum SampleFormat *p= codec->sample_fmts;
3308 if(*p == audio_enc->sample_fmt)
3312 audio_enc->sample_fmt = codec->sample_fmts[0];
3316 audio_enc->sample_rate = audio_sample_rate;
3317 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3318 if (audio_language) {
3319 av_metadata_set(&st->metadata, "language", audio_language);
3320 av_free(audio_language);
3321 audio_language = NULL;
3324 /* reset some key parameters */
3326 av_freep(&audio_codec_name);
3327 audio_stream_copy = 0;
3330 static void new_subtitle_stream(AVFormatContext *oc)
3333 AVCodecContext *subtitle_enc;
3335 st = av_new_stream(oc, oc->nb_streams);
3337 fprintf(stderr, "Could not alloc stream\n");
3340 avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
3342 bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
3343 subtitle_bitstream_filters= NULL;
3345 subtitle_enc = st->codec;
3346 subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3348 if(subtitle_codec_tag)
3349 subtitle_enc->codec_tag= subtitle_codec_tag;
3351 if (subtitle_stream_copy) {
3352 st->stream_copy = 1;
3354 set_context_opts(avcodec_opts[CODEC_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3355 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1);
3356 output_codecs[nb_ocodecs] = avcodec_find_encoder_by_name(subtitle_codec_name);
3360 if (subtitle_language) {
3361 av_metadata_set(&st->metadata, "language", subtitle_language);
3362 av_free(subtitle_language);
3363 subtitle_language = NULL;
3366 subtitle_disable = 0;
3367 av_freep(&subtitle_codec_name);
3368 subtitle_stream_copy = 0;
3371 static void opt_new_audio_stream(void)
3373 AVFormatContext *oc;
3374 if (nb_output_files <= 0) {
3375 fprintf(stderr, "At least one output file must be specified\n");
3378 oc = output_files[nb_output_files - 1];
3379 new_audio_stream(oc);
3382 static void opt_new_video_stream(void)
3384 AVFormatContext *oc;
3385 if (nb_output_files <= 0) {
3386 fprintf(stderr, "At least one output file must be specified\n");
3389 oc = output_files[nb_output_files - 1];
3390 new_video_stream(oc);
3393 static void opt_new_subtitle_stream(void)
3395 AVFormatContext *oc;
3396 if (nb_output_files <= 0) {
3397 fprintf(stderr, "At least one output file must be specified\n");
3400 oc = output_files[nb_output_files - 1];
3401 new_subtitle_stream(oc);
3404 static void opt_output_file(const char *filename)
3406 AVFormatContext *oc;
3407 int use_video, use_audio, use_subtitle;
3408 int input_has_video, input_has_audio, input_has_subtitle;
3409 AVFormatParameters params, *ap = ¶ms;
3411 if (!strcmp(filename, "-"))
3414 oc = avformat_alloc_context();
3416 if (!file_oformat) {
3417 file_oformat = guess_format(NULL, filename, NULL);
3418 if (!file_oformat) {
3419 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3425 oc->oformat = file_oformat;
3426 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3428 if (!strcmp(file_oformat->name, "ffm") &&
3429 av_strstart(filename, "http:", NULL)) {
3430 /* special case for files sent to ffserver: we get the stream
3431 parameters from ffserver */
3432 int err = read_ffserver_streams(oc, filename);
3434 print_error(filename, err);
3438 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3439 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3440 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3442 /* disable if no corresponding type found and at least one
3444 if (nb_input_files > 0) {
3445 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3446 &input_has_subtitle);
3447 if (!input_has_video)
3449 if (!input_has_audio)
3451 if (!input_has_subtitle)
3455 /* manual disable */
3456 if (audio_disable) {
3459 if (video_disable) {
3462 if (subtitle_disable) {
3467 new_video_stream(oc);
3471 new_audio_stream(oc);
3475 new_subtitle_stream(oc);
3478 oc->timestamp = rec_timestamp;
3480 for(; metadata_count>0; metadata_count--){
3481 av_metadata_set(&oc->metadata, metadata[metadata_count-1].key,
3482 metadata[metadata_count-1].value);
3484 av_metadata_conv(oc, oc->oformat->metadata_conv, NULL);
3487 output_files[nb_output_files++] = oc;
3489 /* check filename in case of an image number is expected */
3490 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3491 if (!av_filename_number_test(oc->filename)) {
3492 print_error(oc->filename, AVERROR_NUMEXPECTED);
3497 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3498 /* test if it already exists to avoid loosing precious files */
3499 if (!file_overwrite &&
3500 (strchr(filename, ':') == NULL ||
3501 filename[1] == ':' ||
3502 av_strstart(filename, "file:", NULL))) {
3503 if (url_exist(filename)) {
3505 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3507 if (!read_yesno()) {
3508 fprintf(stderr, "Not overwriting - exiting\n");
3513 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3520 if (url_fopen(&oc->pb, filename, o_direct ? URL_RDWR|URL_DIRECT : URL_WRONLY) < 0) {
3521 fprintf(stderr, "Could not open '%s'\n", filename);
3527 for (i=0; i<0x81; i++) {
3528 put_le32(oc->pb, i);
3530 put_flush_packet(oc->pb);
3532 url_close_buf(oc->pb);
3538 memset(ap, 0, sizeof(*ap));
3539 if (av_set_parameters(oc, ap) < 0) {
3540 fprintf(stderr, "%s: Invalid encoding parameters\n",
3545 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3546 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3547 oc->loop_output = loop_output;
3548 oc->flags |= AVFMT_FLAG_NONBLOCK;
3550 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
3552 /* reset some options */
3553 file_oformat = NULL;
3554 file_iformat = NULL;
3557 /* same option as mencoder */
3558 static void opt_pass(const char *pass_str)
3561 pass = atoi(pass_str);
3562 if (pass != 1 && pass != 2) {
3563 fprintf(stderr, "pass number can be only 1 or 2\n");
3569 static int64_t getutime(void)
3572 struct rusage rusage;
3574 getrusage(RUSAGE_SELF, &rusage);
3575 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3576 #elif HAVE_GETPROCESSTIMES
3578 FILETIME c, e, k, u;
3579 proc = GetCurrentProcess();
3580 GetProcessTimes(proc, &c, &e, &k, &u);
3581 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3583 return av_gettime();
3587 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3590 const char *p = str;
3597 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3604 static void opt_inter_matrix(const char *arg)
3606 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3607 parse_matrix_coeffs(inter_matrix, arg);
3610 static void opt_intra_matrix(const char *arg)
3612 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3613 parse_matrix_coeffs(intra_matrix, arg);
3617 * Trivial log callback.
3618 * Only suitable for show_help and similar since it lacks prefix handling.
3620 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
3622 vfprintf(stdout, fmt, vl);
3625 static void show_help(void)
3627 av_log_set_callback(log_callback_help);
3628 printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
3629 "Hyper fast Audio and Video encoder\n");
3631 show_help_options(options, "Main options:\n",
3632 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3633 show_help_options(options, "\nAdvanced options:\n",
3634 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3636 show_help_options(options, "\nVideo options:\n",
3637 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3639 show_help_options(options, "\nAdvanced Video options:\n",
3640 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3641 OPT_VIDEO | OPT_EXPERT);
3642 show_help_options(options, "\nAudio options:\n",
3643 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3645 show_help_options(options, "\nAdvanced Audio options:\n",
3646 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3647 OPT_AUDIO | OPT_EXPERT);
3648 show_help_options(options, "\nSubtitle options:\n",
3649 OPT_SUBTITLE | OPT_GRAB,
3651 show_help_options(options, "\nAudio/Video grab options:\n",
3655 av_opt_show(avcodec_opts[0], NULL);
3657 av_opt_show(avformat_opts, NULL);
3659 av_opt_show(sws_opts, NULL);
3662 static void opt_target(const char *arg)
3665 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3667 if(!strncmp(arg, "pal-", 4)) {
3670 } else if(!strncmp(arg, "ntsc-", 5)) {
3673 } else if(!strncmp(arg, "film-", 5)) {
3678 /* Calculate FR via float to avoid int overflow */
3679 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3682 } else if((fr == 29970) || (fr == 23976)) {
3685 /* Try to determine PAL/NTSC by peeking in the input files */
3686 if(nb_input_files) {
3688 for(j = 0; j < nb_input_files; j++) {
3689 for(i = 0; i < input_files[j]->nb_streams; i++) {
3690 AVCodecContext *c = input_files[j]->streams[i]->codec;
3691 if(c->codec_type != CODEC_TYPE_VIDEO)
3693 fr = c->time_base.den * 1000 / c->time_base.num;
3697 } else if((fr == 29970) || (fr == 23976)) {
3707 if(verbose && norm >= 0)
3708 fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3712 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3713 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3714 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3718 if(!strcmp(arg, "vcd")) {
3720 opt_video_codec("mpeg1video");
3721 opt_audio_codec("mp2");
3724 opt_frame_size(norm ? "352x240" : "352x288");
3725 opt_frame_rate(NULL, frame_rates[norm]);
3726 opt_default("gop", norm ? "18" : "15");
3728 opt_default("b", "1150000");
3729 opt_default("maxrate", "1150000");
3730 opt_default("minrate", "1150000");
3731 opt_default("bufsize", "327680"); // 40*1024*8;
3733 opt_default("ab", "224000");
3734 audio_sample_rate = 44100;
3737 opt_default("packetsize", "2324");
3738 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3740 /* We have to offset the PTS, so that it is consistent with the SCR.
3741 SCR starts at 36000, but the first two packs contain only padding
3742 and the first pack from the other stream, respectively, may also have
3743 been written before.
3744 So the real data starts at SCR 36000+3*1200. */
3745 mux_preload= (36000+3*1200) / 90000.0; //0.44
3746 } else if(!strcmp(arg, "svcd")) {
3748 opt_video_codec("mpeg2video");
3749 opt_audio_codec("mp2");
3752 opt_frame_size(norm ? "480x480" : "480x576");
3753 opt_frame_rate(NULL, frame_rates[norm]);
3754 opt_default("gop", norm ? "18" : "15");
3756 opt_default("b", "2040000");
3757 opt_default("maxrate", "2516000");
3758 opt_default("minrate", "0"); //1145000;
3759 opt_default("bufsize", "1835008"); //224*1024*8;
3760 opt_default("flags", "+scan_offset");
3763 opt_default("ab", "224000");
3764 audio_sample_rate = 44100;
3766 opt_default("packetsize", "2324");
3768 } else if(!strcmp(arg, "dvd")) {
3770 opt_video_codec("mpeg2video");
3771 opt_audio_codec("ac3");
3774 opt_frame_size(norm ? "720x480" : "720x576");
3775 opt_frame_rate(NULL, frame_rates[norm]);
3776 opt_default("gop", norm ? "18" : "15");
3778 opt_default("b", "6000000");
3779 opt_default("maxrate", "9000000");
3780 opt_default("minrate", "0"); //1500000;
3781 opt_default("bufsize", "1835008"); //224*1024*8;
3783 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3784 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3786 opt_default("ab", "448000");
3787 audio_sample_rate = 48000;
3789 } else if(!strncmp(arg, "dv", 2)) {
3793 opt_frame_size(norm ? "720x480" : "720x576");
3794 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3795 (norm ? "yuv411p" : "yuv420p"));
3796 opt_frame_rate(NULL, frame_rates[norm]);
3798 audio_sample_rate = 48000;
3802 fprintf(stderr, "Unknown target: %s\n", arg);
3807 static void opt_vstats_file (const char *arg)
3809 av_free (vstats_filename);
3810 vstats_filename=av_strdup (arg);
3813 static void opt_vstats (void)
3816 time_t today2 = time(NULL);
3817 struct tm *today = localtime(&today2);
3819 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3821 opt_vstats_file(filename);
3824 static int opt_bsf(const char *opt, const char *arg)
3826 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3827 AVBitStreamFilterContext **bsfp;
3830 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3834 bsfp= *opt == 'v' ? &video_bitstream_filters :
3835 *opt == 'a' ? &audio_bitstream_filters :
3836 &subtitle_bitstream_filters;
3838 bsfp= &(*bsfp)->next;
3845 static int opt_preset(const char *opt, const char *arg)
3848 char filename[1000], tmp[1000], tmp2[1000], line[1000];
3850 const char *base[2]= { getenv("HOME"),
3853 for(i=!base[0]; i<2 && !f; i++){
3854 snprintf(filename, sizeof(filename), "%s%s/%s.ffpreset", base[i], i ? "" : "/.ffmpeg", arg);
3855 f= fopen(filename, "r");
3857 char *codec_name= *opt == 'v' ? video_codec_name :
3858 *opt == 'a' ? audio_codec_name :
3859 subtitle_codec_name;
3860 snprintf(filename, sizeof(filename), "%s%s/%s-%s.ffpreset", base[i], i ? "" : "/.ffmpeg", codec_name, arg);
3861 f= fopen(filename, "r");
3864 if(!f && ((arg[0]=='.' && arg[1]=='/') || arg[0]=='/' ||
3866 av_strlcpy(filename, arg, sizeof(filename));
3867 f= fopen(filename, "r");
3871 fprintf(stderr, "File for preset '%s' not found\n", arg);
3876 int e= fscanf(f, "%999[^\n]\n", line) - 1;
3877 if(line[0] == '#' && !e)
3879 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
3881 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
3884 if(!strcmp(tmp, "acodec")){
3885 opt_audio_codec(tmp2);
3886 }else if(!strcmp(tmp, "vcodec")){
3887 opt_video_codec(tmp2);
3888 }else if(!strcmp(tmp, "scodec")){
3889 opt_subtitle_codec(tmp2);
3890 }else if(opt_default(tmp, tmp2) < 0){
3891 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
3901 static const OptionDef options[] = {
3903 { "renegotiate", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&renegotiate}, "renegotiate after several video frames", "number" },
3904 { "L", OPT_EXIT, {(void*)show_license}, "show license" },
3905 { "h", OPT_EXIT, {(void*)show_help}, "show help" },
3906 { "version", OPT_EXIT, {(void*)show_version}, "show version" },
3907 { "formats", OPT_EXIT, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
3908 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
3909 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
3910 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3911 { "contract_label", HAS_ARG, {(void*)opt_contract_label}, "contract label", "label" },
3912 { "direct", OPT_BOOL, {(void*)&o_direct}, "write to output file using direct I/O (O_DIRECT)" },
3913 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3914 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3915 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3916 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3917 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3918 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3919 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
3920 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_rec_timestamp}, "set the timestamp ('now' to set the current time)", "time" },
3921 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
3922 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3923 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3924 "add timings for benchmarking" },
3925 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3926 "dump each input packet" },
3927 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3928 "when dumping packets, also dump the payload" },
3929 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3930 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3931 { "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)", "" },
3932 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
3933 { "loglevel", HAS_ARG | OPT_FUNC2, {(void*)opt_loglevel}, "set libav* logging level", "number" },
3934 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3935 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3936 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3937 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3938 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3939 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3940 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3941 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3942 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3943 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3944 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
3945 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
3948 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3949 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3950 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3951 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3952 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
3953 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3954 { "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" },
3955 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
3956 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
3957 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
3958 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3959 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
3960 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
3961 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
3962 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
3963 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3964 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
3965 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
3966 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3967 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
3968 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3969 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3970 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
3971 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3972 "use same video quality as source (implies VBR)" },
3973 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
3974 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
3975 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3976 "deinterlace pictures" },
3977 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3978 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
3979 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
3980 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
3981 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
3982 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3983 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3984 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3985 { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3986 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3987 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
3990 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3991 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3992 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3993 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
3994 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3995 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
3996 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3997 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3998 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3999 { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
4000 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4001 { "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" },
4003 /* subtitle options */
4004 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4005 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4006 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
4007 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4008 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4011 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4012 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4013 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4016 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4017 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4019 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4020 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4021 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4023 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4024 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4025 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4027 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4031 #ifdef CONFIG_FFMPEG_WITH_FRSH
4032 void *av_encode_thread(void *arg)
4035 frsh_thread_id_t thread_id;
4037 /* bind this thread to vres */
4038 thread_id = fosa_thread_self();
4039 PXW(frsh_thread_bind(disk_vres, thread_id));
4041 ret = av_encode(output_files, nb_output_files,
4042 input_files, nb_input_files,
4043 stream_maps, nb_stream_maps);
4044 return (void*)(intptr_t)ret;
4049 frsh_thread_attr_t frsh_attr;
4050 frsh_thread_id_t thread;
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/30);
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);