2 * various utility functions for use within FFmpeg
3 * Copyright (c) 2000, 2001, 2002 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 #include "libavcodec/opt.h"
23 #include "libavutil/avstring.h"
32 * @file libavformat/utils.c
33 * various utility functions for use within FFmpeg
36 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den);
37 static void av_frac_add(AVFrac *f, int64_t incr);
39 /** head of registered input format linked list */
40 AVInputFormat *first_iformat = NULL;
41 /** head of registered output format linked list */
42 AVOutputFormat *first_oformat = NULL;
44 AVInputFormat *av_iformat_next(AVInputFormat *f)
47 else return first_iformat;
50 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
53 else return first_oformat;
56 void av_register_input_format(AVInputFormat *format)
60 while (*p != NULL) p = &(*p)->next;
65 void av_register_output_format(AVOutputFormat *format)
69 while (*p != NULL) p = &(*p)->next;
74 int match_ext(const char *filename, const char *extensions)
82 ext = strrchr(filename, '.');
88 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
91 if (!strcasecmp(ext1, ext))
101 AVOutputFormat *guess_format(const char *short_name, const char *filename,
102 const char *mime_type)
104 AVOutputFormat *fmt, *fmt_found;
105 int score_max, score;
107 /* specific test for image sequences */
108 #ifdef CONFIG_IMAGE2_MUXER
109 if (!short_name && filename &&
110 av_filename_number_test(filename) &&
111 av_guess_image2_codec(filename) != CODEC_ID_NONE) {
112 return guess_format("image2", NULL, NULL);
115 /* Find the proper file type. */
119 while (fmt != NULL) {
121 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
123 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
125 if (filename && fmt->extensions &&
126 match_ext(filename, fmt->extensions)) {
129 if (score > score_max) {
138 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
139 const char *mime_type)
141 AVOutputFormat *fmt = guess_format(short_name, filename, mime_type);
144 AVOutputFormat *stream_fmt;
145 char stream_format_name[64];
147 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
148 stream_fmt = guess_format(stream_format_name, NULL, NULL);
157 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
158 const char *filename, const char *mime_type, enum CodecType type){
159 if(type == CODEC_TYPE_VIDEO){
160 enum CodecID codec_id= CODEC_ID_NONE;
162 #ifdef CONFIG_IMAGE2_MUXER
163 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
164 codec_id= av_guess_image2_codec(filename);
167 if(codec_id == CODEC_ID_NONE)
168 codec_id= fmt->video_codec;
170 }else if(type == CODEC_TYPE_AUDIO)
171 return fmt->audio_codec;
173 return CODEC_ID_NONE;
176 AVInputFormat *av_find_input_format(const char *short_name)
179 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) {
180 if (!strcmp(fmt->name, short_name))
186 /* memory handling */
188 void av_destruct_packet(AVPacket *pkt)
191 pkt->data = NULL; pkt->size = 0;
194 void av_init_packet(AVPacket *pkt)
196 pkt->pts = AV_NOPTS_VALUE;
197 pkt->dts = AV_NOPTS_VALUE;
201 pkt->stream_index = 0;
202 pkt->destruct= av_destruct_packet_nofree;
205 int av_new_packet(AVPacket *pkt, int size)
208 if((unsigned)size > (unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE)
209 return AVERROR(ENOMEM);
210 data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
212 return AVERROR(ENOMEM);
213 memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
218 pkt->destruct = av_destruct_packet;
222 int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size)
224 int ret= av_new_packet(pkt, size);
229 pkt->pos= url_ftell(s);
231 ret= get_buffer(s, pkt->data, size);
240 int av_dup_packet(AVPacket *pkt)
242 if (pkt->destruct != av_destruct_packet) {
244 /* We duplicate the packet and don't forget to add the padding again. */
245 if((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE)
246 return AVERROR(ENOMEM);
247 data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
249 return AVERROR(ENOMEM);
251 memcpy(data, pkt->data, pkt->size);
252 memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
254 pkt->destruct = av_destruct_packet;
259 int av_filename_number_test(const char *filename)
262 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
265 static AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
267 AVInputFormat *fmt1, *fmt;
271 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
272 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
275 if (fmt1->read_probe) {
276 score = fmt1->read_probe(pd);
277 } else if (fmt1->extensions) {
278 if (match_ext(pd->filename, fmt1->extensions)) {
282 if (score > *score_max) {
285 }else if (score == *score_max)
291 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
293 return av_probe_input_format2(pd, is_opened, &score);
296 static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score)
299 fmt = av_probe_input_format2(pd, 1, &score);
302 if (!strcmp(fmt->name, "mp3"))
303 st->codec->codec_id = CODEC_ID_MP3;
304 else if (!strcmp(fmt->name, "ac3"))
305 st->codec->codec_id = CODEC_ID_AC3;
306 else if (!strcmp(fmt->name, "mpegvideo"))
307 st->codec->codec_id = CODEC_ID_MPEG2VIDEO;
308 else if (!strcmp(fmt->name, "h264"))
309 st->codec->codec_id = CODEC_ID_H264;
314 /************************************************************/
315 /* input media file */
318 * Open a media file from an IO stream. 'fmt' must be specified.
320 static const char* format_to_name(void* ptr)
322 AVFormatContext* fc = (AVFormatContext*) ptr;
323 if(fc->iformat) return fc->iformat->name;
324 else if(fc->oformat) return fc->oformat->name;
328 #define OFFSET(x) offsetof(AVFormatContext,x)
329 #define DEFAULT 0 //should be NAN but it does not work as it is not a constant in glibc as required by ANSI/ISO C
330 //these names are too long to be readable
331 #define E AV_OPT_FLAG_ENCODING_PARAM
332 #define D AV_OPT_FLAG_DECODING_PARAM
334 static const AVOption options[]={
335 {"probesize", NULL, OFFSET(probesize), FF_OPT_TYPE_INT, 32000, 32, INT_MAX, D}, /* 32000 from mpegts.c: 1.0 second at 24Mbit/s */
336 {"muxrate", "set mux rate", OFFSET(mux_rate), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
337 {"packetsize", "set packet size", OFFSET(packet_size), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
338 {"fflags", NULL, OFFSET(flags), FF_OPT_TYPE_FLAGS, DEFAULT, INT_MIN, INT_MAX, D|E, "fflags"},
339 {"ignidx", "ignore index", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_IGNIDX, INT_MIN, INT_MAX, D, "fflags"},
340 {"genpts", "generate pts", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_GENPTS, INT_MIN, INT_MAX, D, "fflags"},
341 {"track", " set the track number", OFFSET(track), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
342 {"year", "set the year", OFFSET(year), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, E},
343 {"analyzeduration", "how many microseconds are analyzed to estimate duration", OFFSET(max_analyze_duration), FF_OPT_TYPE_INT, 3*AV_TIME_BASE, 0, INT_MAX, D},
344 {"cryptokey", "decryption key", OFFSET(key), FF_OPT_TYPE_BINARY, 0, 0, 0, D},
345 {"indexmem", "max memory used for timestamp index (per stream)", OFFSET(max_index_size), FF_OPT_TYPE_INT, 1<<20, 0, INT_MAX, D},
346 {"rtbufsize", "max memory used for buffering real-time frames", OFFSET(max_picture_buffer), FF_OPT_TYPE_INT, 3041280, 0, INT_MAX, D}, /* defaults to 1s of 15fps 352x288 YUYV422 video */
347 {"fdebug", "print specific debug info", OFFSET(debug), FF_OPT_TYPE_FLAGS, DEFAULT, 0, INT_MAX, E|D, "fdebug"},
348 {"ts", NULL, 0, FF_OPT_TYPE_CONST, FF_FDEBUG_TS, INT_MIN, INT_MAX, E|D, "fdebug"},
356 static const AVClass av_format_context_class = { "AVFormatContext", format_to_name, options };
358 static void avformat_get_context_defaults(AVFormatContext *s)
360 memset(s, 0, sizeof(AVFormatContext));
362 s->av_class = &av_format_context_class;
364 av_opt_set_defaults(s);
367 AVFormatContext *av_alloc_format_context(void)
370 ic = av_malloc(sizeof(AVFormatContext));
372 avformat_get_context_defaults(ic);
373 ic->av_class = &av_format_context_class;
377 int av_open_input_stream(AVFormatContext **ic_ptr,
378 ByteIOContext *pb, const char *filename,
379 AVInputFormat *fmt, AVFormatParameters *ap)
383 AVFormatParameters default_ap;
387 memset(ap, 0, sizeof(default_ap));
390 if(!ap->prealloced_context)
391 ic = av_alloc_format_context();
395 err = AVERROR(ENOMEM);
400 ic->duration = AV_NOPTS_VALUE;
401 ic->start_time = AV_NOPTS_VALUE;
402 av_strlcpy(ic->filename, filename, sizeof(ic->filename));
404 /* allocate private data */
405 if (fmt->priv_data_size > 0) {
406 ic->priv_data = av_mallocz(fmt->priv_data_size);
407 if (!ic->priv_data) {
408 err = AVERROR(ENOMEM);
412 ic->priv_data = NULL;
415 if (ic->iformat->read_header) {
416 err = ic->iformat->read_header(ic, ap);
421 if (pb && !ic->data_offset)
422 ic->data_offset = url_ftell(ic->pb);
429 av_freep(&ic->priv_data);
430 for(i=0;i<ic->nb_streams;i++) {
431 AVStream *st = ic->streams[i];
433 av_free(st->priv_data);
434 av_free(st->codec->extradata);
444 /** size of probe buffer, for guessing file type from file contents */
445 #define PROBE_BUF_MIN 2048
446 #define PROBE_BUF_MAX (1<<20)
448 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
451 AVFormatParameters *ap)
454 AVProbeData probe_data, *pd = &probe_data;
455 ByteIOContext *pb = NULL;
459 pd->filename = filename;
464 /* guess format if no file can be opened */
465 fmt = av_probe_input_format(pd, 0);
468 /* Do not open file if the format does not need it. XXX: specific
469 hack needed to handle RTSP/TCP */
470 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
471 /* if no file needed do not try to open one */
472 if ((err=url_fopen(&pb, filename, URL_RDONLY)) < 0) {
476 url_setbufsize(pb, buf_size);
479 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
480 int score= probe_size < PROBE_BUF_MAX ? AVPROBE_SCORE_MAX/4 : 0;
481 /* read probe data */
482 pd->buf= av_realloc(pd->buf, probe_size + AVPROBE_PADDING_SIZE);
483 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
484 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
485 if (url_fseek(pb, 0, SEEK_SET) < 0) {
487 if (url_fopen(&pb, filename, URL_RDONLY) < 0) {
493 /* guess file format */
494 fmt = av_probe_input_format2(pd, 1, &score);
499 /* if still no format found, error */
505 /* check filename in case an image number is expected */
506 if (fmt->flags & AVFMT_NEEDNUMBER) {
507 if (!av_filename_number_test(filename)) {
508 err = AVERROR_NUMEXPECTED;
512 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
525 /*******************************************************/
527 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
528 AVPacketList **plast_pktl){
529 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
534 (*plast_pktl)->next = pktl;
536 *packet_buffer = pktl;
538 /* add the packet in the buffered packet list */
544 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
550 AVPacketList *pktl = s->raw_packet_buffer;
554 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE){
555 s->raw_packet_buffer = pktl->next;
562 ret= s->iformat->read_packet(s, pkt);
565 st= s->streams[pkt->stream_index];
567 switch(st->codec->codec_type){
568 case CODEC_TYPE_VIDEO:
569 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
571 case CODEC_TYPE_AUDIO:
572 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
574 case CODEC_TYPE_SUBTITLE:
575 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
579 if(!pktl && st->codec->codec_id!=CODEC_ID_PROBE)
582 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
584 if(st->codec->codec_id == CODEC_ID_PROBE){
585 AVProbeData *pd = &st->probe_data;
587 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
588 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
589 pd->buf_size += pkt->size;
590 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
592 if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
593 set_codec_from_probe_data(st, pd, 1);
594 if(st->codec->codec_id != CODEC_ID_PROBE){
603 /**********************************************************/
606 * Get the number of samples of an audio frame. Return -1 on error.
608 static int get_audio_frame_size(AVCodecContext *enc, int size)
612 if(enc->codec_id == CODEC_ID_VORBIS)
615 if (enc->frame_size <= 1) {
616 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
618 if (bits_per_sample) {
619 if (enc->channels == 0)
621 frame_size = (size << 3) / (bits_per_sample * enc->channels);
623 /* used for example by ADPCM codecs */
624 if (enc->bit_rate == 0)
626 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
629 frame_size = enc->frame_size;
636 * Return the frame duration in seconds. Return 0 if not available.
638 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
639 AVCodecParserContext *pc, AVPacket *pkt)
645 switch(st->codec->codec_type) {
646 case CODEC_TYPE_VIDEO:
647 if(st->time_base.num*1000LL > st->time_base.den){
648 *pnum = st->time_base.num;
649 *pden = st->time_base.den;
650 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
651 *pnum = st->codec->time_base.num;
652 *pden = st->codec->time_base.den;
653 if (pc && pc->repeat_pict) {
655 *pnum = (*pnum) * (2 + pc->repeat_pict);
659 case CODEC_TYPE_AUDIO:
660 frame_size = get_audio_frame_size(st->codec, pkt->size);
664 *pden = st->codec->sample_rate;
671 static int is_intra_only(AVCodecContext *enc){
672 if(enc->codec_type == CODEC_TYPE_AUDIO){
674 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
675 switch(enc->codec_id){
677 case CODEC_ID_MJPEGB:
679 case CODEC_ID_RAWVIDEO:
680 case CODEC_ID_DVVIDEO:
681 case CODEC_ID_HUFFYUV:
682 case CODEC_ID_FFVHUFF:
693 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
694 int64_t dts, int64_t pts)
696 AVStream *st= s->streams[stream_index];
697 AVPacketList *pktl= s->packet_buffer;
699 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
702 st->first_dts= dts - st->cur_dts;
705 for(; pktl; pktl= pktl->next){
706 if(pktl->pkt.stream_index != stream_index)
708 //FIXME think more about this check
709 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
710 pktl->pkt.pts += st->first_dts;
712 if(pktl->pkt.dts != AV_NOPTS_VALUE)
713 pktl->pkt.dts += st->first_dts;
715 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
716 st->start_time= pktl->pkt.pts;
718 if (st->start_time == AV_NOPTS_VALUE)
719 st->start_time = pts;
722 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
724 AVPacketList *pktl= s->packet_buffer;
727 if(st->first_dts != AV_NOPTS_VALUE){
728 cur_dts= st->first_dts;
729 for(; pktl; pktl= pktl->next){
730 if(pktl->pkt.stream_index == pkt->stream_index){
731 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
733 cur_dts -= pkt->duration;
736 pktl= s->packet_buffer;
737 st->first_dts = cur_dts;
738 }else if(st->cur_dts)
741 for(; pktl; pktl= pktl->next){
742 if(pktl->pkt.stream_index != pkt->stream_index)
744 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
745 && !pktl->pkt.duration){
746 pktl->pkt.dts= cur_dts;
747 if(!st->codec->has_b_frames)
748 pktl->pkt.pts= cur_dts;
749 cur_dts += pkt->duration;
750 pktl->pkt.duration= pkt->duration;
754 if(st->first_dts == AV_NOPTS_VALUE)
755 st->cur_dts= cur_dts;
758 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
759 AVCodecParserContext *pc, AVPacket *pkt)
761 int num, den, presentation_delayed, delay, i;
764 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
765 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
766 pkt->dts -= 1LL<<st->pts_wrap_bits;
769 if (pkt->duration == 0) {
770 compute_frame_duration(&num, &den, st, pc, pkt);
772 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
774 if(pkt->duration != 0 && s->packet_buffer)
775 update_initial_durations(s, st, pkt);
779 /* correct timestamps with byte offset if demuxers only have timestamps
780 on packet boundaries */
781 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
782 /* this will estimate bitrate based on this frame's duration and size */
783 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
784 if(pkt->pts != AV_NOPTS_VALUE)
786 if(pkt->dts != AV_NOPTS_VALUE)
790 /* do we have a video B-frame ? */
791 delay= st->codec->has_b_frames;
792 presentation_delayed = 0;
793 /* XXX: need has_b_frame, but cannot get it if the codec is
796 pc && pc->pict_type != FF_B_TYPE)
797 presentation_delayed = 1;
798 /* This may be redundant, but it should not hurt. */
799 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
800 presentation_delayed = 1;
802 // av_log(NULL, AV_LOG_DEBUG, "IN delayed:%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64" st:%d pc:%p\n", presentation_delayed, pkt->pts, pkt->dts, st->cur_dts, pkt->stream_index, pc);
803 /* interpolate PTS and DTS if they are not present */
804 if(delay==0 || (delay==1 && pc)){
805 if (presentation_delayed) {
806 /* DTS = decompression timestamp */
807 /* PTS = presentation timestamp */
808 if (pkt->dts == AV_NOPTS_VALUE)
809 pkt->dts = st->last_IP_pts;
810 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
811 if (pkt->dts == AV_NOPTS_VALUE)
812 pkt->dts = st->cur_dts;
814 /* this is tricky: the dts must be incremented by the duration
815 of the frame we are displaying, i.e. the last I- or P-frame */
816 if (st->last_IP_duration == 0)
817 st->last_IP_duration = pkt->duration;
818 if(pkt->dts != AV_NOPTS_VALUE)
819 st->cur_dts = pkt->dts + st->last_IP_duration;
820 st->last_IP_duration = pkt->duration;
821 st->last_IP_pts= pkt->pts;
822 /* cannot compute PTS if not present (we can compute it only
823 by knowing the future */
824 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
825 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
826 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
827 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
828 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
829 pkt->pts += pkt->duration;
830 // av_log(NULL, AV_LOG_DEBUG, "id:%d old:%"PRId64" new:%"PRId64" dur:%d cur:%"PRId64" size:%d\n", pkt->stream_index, old_diff, new_diff, pkt->duration, st->cur_dts, pkt->size);
834 /* presentation is not delayed : PTS and DTS are the same */
835 if(pkt->pts == AV_NOPTS_VALUE)
837 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
838 if(pkt->pts == AV_NOPTS_VALUE)
839 pkt->pts = st->cur_dts;
841 if(pkt->pts != AV_NOPTS_VALUE)
842 st->cur_dts = pkt->pts + pkt->duration;
846 if(pkt->pts != AV_NOPTS_VALUE){
847 st->pts_buffer[0]= pkt->pts;
848 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
849 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
850 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
851 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
852 if(pkt->dts == AV_NOPTS_VALUE)
853 pkt->dts= st->pts_buffer[0];
855 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
857 if(pkt->dts > st->cur_dts)
858 st->cur_dts = pkt->dts;
861 // av_log(NULL, AV_LOG_ERROR, "OUTdelayed:%d/%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64"\n", presentation_delayed, delay, pkt->pts, pkt->dts, st->cur_dts);
864 if(is_intra_only(st->codec))
865 pkt->flags |= PKT_FLAG_KEY;
868 /* keyframe computation */
869 if (pc->pict_type == FF_I_TYPE)
870 pkt->flags |= PKT_FLAG_KEY;
874 void av_destruct_packet_nofree(AVPacket *pkt)
876 pkt->data = NULL; pkt->size = 0;
879 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
887 /* select current input stream component */
890 if (!st->need_parsing || !st->parser) {
891 /* no parsing needed: we just output the packet as is */
892 /* raw data support */
894 compute_pkt_fields(s, st, NULL, pkt);
897 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
898 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
899 s->cur_ptr, s->cur_len,
900 s->cur_pkt.pts, s->cur_pkt.dts);
901 s->cur_pkt.pts = AV_NOPTS_VALUE;
902 s->cur_pkt.dts = AV_NOPTS_VALUE;
903 /* increment read pointer */
907 /* return packet if any */
910 pkt->pos = s->cur_pkt.pos; // Isn't quite accurate but close.
912 pkt->stream_index = st->index;
913 pkt->pts = st->parser->pts;
914 pkt->dts = st->parser->dts;
915 pkt->destruct = av_destruct_packet_nofree;
916 compute_pkt_fields(s, st, st->parser, pkt);
918 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
919 ff_reduce_index(s, st->index);
920 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
921 0, 0, AVINDEX_KEYFRAME);
928 av_free_packet(&s->cur_pkt);
932 /* read next packet */
933 ret = av_read_packet(s, &s->cur_pkt);
935 if (ret == AVERROR(EAGAIN))
937 /* return the last frames, if any */
938 for(i = 0; i < s->nb_streams; i++) {
940 if (st->parser && st->need_parsing) {
941 av_parser_parse(st->parser, st->codec,
942 &pkt->data, &pkt->size,
944 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
949 /* no more packets: really terminate parsing */
953 if(s->cur_pkt.pts != AV_NOPTS_VALUE &&
954 s->cur_pkt.dts != AV_NOPTS_VALUE &&
955 s->cur_pkt.pts < s->cur_pkt.dts){
956 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
957 s->cur_pkt.stream_index,
961 // av_free_packet(&s->cur_pkt);
965 st = s->streams[s->cur_pkt.stream_index];
966 if(s->debug & FF_FDEBUG_TS)
967 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, flags=%d\n",
968 s->cur_pkt.stream_index,
975 s->cur_ptr = s->cur_pkt.data;
976 s->cur_len = s->cur_pkt.size;
977 if (st->need_parsing && !st->parser) {
978 st->parser = av_parser_init(st->codec->codec_id);
980 /* no parser available: just output the raw packets */
981 st->need_parsing = AVSTREAM_PARSE_NONE;
982 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
983 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
985 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
986 st->parser->next_frame_offset=
987 st->parser->cur_offset= s->cur_pkt.pos;
992 if(s->debug & FF_FDEBUG_TS)
993 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, flags=%d\n",
1003 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1007 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1010 pktl = s->packet_buffer;
1012 AVPacket *next_pkt= &pktl->pkt;
1014 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1015 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1016 if( pktl->pkt.stream_index == next_pkt->stream_index
1017 && next_pkt->dts < pktl->pkt.dts
1018 && pktl->pkt.pts != pktl->pkt.dts //not b frame
1019 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
1020 next_pkt->pts= pktl->pkt.dts;
1024 pktl = s->packet_buffer;
1027 if( next_pkt->pts != AV_NOPTS_VALUE
1028 || next_pkt->dts == AV_NOPTS_VALUE
1030 /* read packet from packet buffer, if there is data */
1032 s->packet_buffer = pktl->next;
1038 int ret= av_read_frame_internal(s, pkt);
1040 if(pktl && ret != AVERROR(EAGAIN)){
1047 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1048 &s->packet_buffer_end)) < 0)
1049 return AVERROR(ENOMEM);
1051 assert(!s->packet_buffer);
1052 return av_read_frame_internal(s, pkt);
1057 /* XXX: suppress the packet queue */
1058 static void flush_packet_queue(AVFormatContext *s)
1063 pktl = s->packet_buffer;
1066 s->packet_buffer = pktl->next;
1067 av_free_packet(&pktl->pkt);
1072 /*******************************************************/
1075 int av_find_default_stream_index(AVFormatContext *s)
1077 int first_audio_index = -1;
1081 if (s->nb_streams <= 0)
1083 for(i = 0; i < s->nb_streams; i++) {
1085 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1088 if (first_audio_index < 0 && st->codec->codec_type == CODEC_TYPE_AUDIO)
1089 first_audio_index = i;
1091 return first_audio_index >= 0 ? first_audio_index : 0;
1095 * Flush the frame reader.
1097 static void av_read_frame_flush(AVFormatContext *s)
1102 flush_packet_queue(s);
1104 /* free previous packet */
1106 if (s->cur_st->parser)
1107 av_free_packet(&s->cur_pkt);
1114 /* for each stream, reset read state */
1115 for(i = 0; i < s->nb_streams; i++) {
1119 av_parser_close(st->parser);
1122 st->last_IP_pts = AV_NOPTS_VALUE;
1123 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1127 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1130 for(i = 0; i < s->nb_streams; i++) {
1131 AVStream *st = s->streams[i];
1133 st->cur_dts = av_rescale(timestamp,
1134 st->time_base.den * (int64_t)ref_st->time_base.num,
1135 st->time_base.num * (int64_t)ref_st->time_base.den);
1139 void ff_reduce_index(AVFormatContext *s, int stream_index)
1141 AVStream *st= s->streams[stream_index];
1142 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1144 if((unsigned)st->nb_index_entries >= max_entries){
1146 for(i=0; 2*i<st->nb_index_entries; i++)
1147 st->index_entries[i]= st->index_entries[2*i];
1148 st->nb_index_entries= i;
1152 int av_add_index_entry(AVStream *st,
1153 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1155 AVIndexEntry *entries, *ie;
1158 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1161 entries = av_fast_realloc(st->index_entries,
1162 &st->index_entries_allocated_size,
1163 (st->nb_index_entries + 1) *
1164 sizeof(AVIndexEntry));
1168 st->index_entries= entries;
1170 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1173 index= st->nb_index_entries++;
1174 ie= &entries[index];
1175 assert(index==0 || ie[-1].timestamp < timestamp);
1177 ie= &entries[index];
1178 if(ie->timestamp != timestamp){
1179 if(ie->timestamp <= timestamp)
1181 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1182 st->nb_index_entries++;
1183 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1184 distance= ie->min_distance;
1188 ie->timestamp = timestamp;
1189 ie->min_distance= distance;
1196 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1199 AVIndexEntry *entries= st->index_entries;
1200 int nb_entries= st->nb_index_entries;
1209 timestamp = entries[m].timestamp;
1210 if(timestamp >= wanted_timestamp)
1212 if(timestamp <= wanted_timestamp)
1215 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1217 if(!(flags & AVSEEK_FLAG_ANY)){
1218 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1219 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1230 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1231 AVInputFormat *avif= s->iformat;
1232 int64_t pos_min, pos_max, pos, pos_limit;
1233 int64_t ts_min, ts_max, ts;
1237 if (stream_index < 0)
1241 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1245 ts_min= AV_NOPTS_VALUE;
1246 pos_limit= -1; //gcc falsely says it may be uninitialized
1248 st= s->streams[stream_index];
1249 if(st->index_entries){
1252 index= av_index_search_timestamp(st, target_ts, flags | AVSEEK_FLAG_BACKWARD); //FIXME whole func must be checked for non-keyframe entries in index case, especially read_timestamp()
1253 index= FFMAX(index, 0);
1254 e= &st->index_entries[index];
1256 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1258 ts_min= e->timestamp;
1260 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1267 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1268 assert(index < st->nb_index_entries);
1270 e= &st->index_entries[index];
1271 assert(e->timestamp >= target_ts);
1273 ts_max= e->timestamp;
1274 pos_limit= pos_max - e->min_distance;
1276 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1277 pos_max,pos_limit, ts_max);
1282 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1287 url_fseek(s->pb, pos, SEEK_SET);
1289 av_update_cur_dts(s, st, ts);
1294 int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, int64_t pos_min, int64_t pos_max, int64_t pos_limit, int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret, int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t )){
1296 int64_t start_pos, filesize;
1300 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1303 if(ts_min == AV_NOPTS_VALUE){
1304 pos_min = s->data_offset;
1305 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1306 if (ts_min == AV_NOPTS_VALUE)
1310 if(ts_max == AV_NOPTS_VALUE){
1312 filesize = url_fsize(s->pb);
1313 pos_max = filesize - 1;
1316 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1318 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1319 if (ts_max == AV_NOPTS_VALUE)
1323 int64_t tmp_pos= pos_max + 1;
1324 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1325 if(tmp_ts == AV_NOPTS_VALUE)
1329 if(tmp_pos >= filesize)
1335 if(ts_min > ts_max){
1337 }else if(ts_min == ts_max){
1342 while (pos_min < pos_limit) {
1344 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1348 assert(pos_limit <= pos_max);
1351 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1352 // interpolate position (better than dichotomy)
1353 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1354 + pos_min - approximate_keyframe_distance;
1355 }else if(no_change==1){
1356 // bisection, if interpolation failed to change min or max pos last time
1357 pos = (pos_min + pos_limit)>>1;
1359 /* linear search if bisection failed, can only happen if there
1360 are very few or no keyframes between min/max */
1365 else if(pos > pos_limit)
1369 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1375 av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n", pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit, start_pos, no_change);
1377 if(ts == AV_NOPTS_VALUE){
1378 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1381 assert(ts != AV_NOPTS_VALUE);
1382 if (target_ts <= ts) {
1383 pos_limit = start_pos - 1;
1387 if (target_ts >= ts) {
1393 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1394 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1397 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1399 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1400 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1401 pos, ts_min, target_ts, ts_max);
1407 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1408 int64_t pos_min, pos_max;
1412 if (stream_index < 0)
1415 st= s->streams[stream_index];
1418 pos_min = s->data_offset;
1419 pos_max = url_fsize(s->pb) - 1;
1421 if (pos < pos_min) pos= pos_min;
1422 else if(pos > pos_max) pos= pos_max;
1424 url_fseek(s->pb, pos, SEEK_SET);
1427 av_update_cur_dts(s, st, ts);
1432 static int av_seek_frame_generic(AVFormatContext *s,
1433 int stream_index, int64_t timestamp, int flags)
1439 st = s->streams[stream_index];
1441 index = av_index_search_timestamp(st, timestamp, flags);
1443 if(index < 0 || index==st->nb_index_entries-1){
1447 if(st->nb_index_entries){
1448 assert(st->index_entries);
1449 ie= &st->index_entries[st->nb_index_entries-1];
1450 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1452 av_update_cur_dts(s, st, ie->timestamp);
1454 if ((ret = url_fseek(s->pb, 0, SEEK_SET)) < 0)
1458 int ret = av_read_frame(s, &pkt);
1461 av_free_packet(&pkt);
1462 if(stream_index == pkt.stream_index){
1463 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1467 index = av_index_search_timestamp(st, timestamp, flags);
1472 av_read_frame_flush(s);
1473 if (s->iformat->read_seek){
1474 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1477 ie = &st->index_entries[index];
1478 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1480 av_update_cur_dts(s, st, ie->timestamp);
1485 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1490 av_read_frame_flush(s);
1492 if(flags & AVSEEK_FLAG_BYTE)
1493 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1495 if(stream_index < 0){
1496 stream_index= av_find_default_stream_index(s);
1497 if(stream_index < 0)
1500 st= s->streams[stream_index];
1501 /* timestamp for default must be expressed in AV_TIME_BASE units */
1502 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1504 st= s->streams[stream_index];
1506 /* first, we try the format specific seek */
1507 if (s->iformat->read_seek)
1508 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1515 if(s->iformat->read_timestamp)
1516 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1518 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1521 /*******************************************************/
1524 * Returns TRUE if the stream has accurate duration in any stream.
1526 * @return TRUE if the stream has accurate duration for at least one component.
1528 static int av_has_duration(AVFormatContext *ic)
1533 for(i = 0;i < ic->nb_streams; i++) {
1534 st = ic->streams[i];
1535 if (st->duration != AV_NOPTS_VALUE)
1542 * Estimate the stream timings from the one of each components.
1544 * Also computes the global bitrate if possible.
1546 static void av_update_stream_timings(AVFormatContext *ic)
1548 int64_t start_time, start_time1, end_time, end_time1;
1549 int64_t duration, duration1;
1553 start_time = INT64_MAX;
1554 end_time = INT64_MIN;
1555 duration = INT64_MIN;
1556 for(i = 0;i < ic->nb_streams; i++) {
1557 st = ic->streams[i];
1558 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1559 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1560 if (start_time1 < start_time)
1561 start_time = start_time1;
1562 if (st->duration != AV_NOPTS_VALUE) {
1563 end_time1 = start_time1
1564 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1565 if (end_time1 > end_time)
1566 end_time = end_time1;
1569 if (st->duration != AV_NOPTS_VALUE) {
1570 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1571 if (duration1 > duration)
1572 duration = duration1;
1575 if (start_time != INT64_MAX) {
1576 ic->start_time = start_time;
1577 if (end_time != INT64_MIN) {
1578 if (end_time - start_time > duration)
1579 duration = end_time - start_time;
1582 if (duration != INT64_MIN) {
1583 ic->duration = duration;
1584 if (ic->file_size > 0) {
1585 /* compute the bitrate */
1586 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1587 (double)ic->duration;
1592 static void fill_all_stream_timings(AVFormatContext *ic)
1597 av_update_stream_timings(ic);
1598 for(i = 0;i < ic->nb_streams; i++) {
1599 st = ic->streams[i];
1600 if (st->start_time == AV_NOPTS_VALUE) {
1601 if(ic->start_time != AV_NOPTS_VALUE)
1602 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1603 if(ic->duration != AV_NOPTS_VALUE)
1604 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1609 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1611 int64_t filesize, duration;
1615 /* if bit_rate is already set, we believe it */
1616 if (ic->bit_rate == 0) {
1618 for(i=0;i<ic->nb_streams;i++) {
1619 st = ic->streams[i];
1620 bit_rate += st->codec->bit_rate;
1622 ic->bit_rate = bit_rate;
1625 /* if duration is already set, we believe it */
1626 if (ic->duration == AV_NOPTS_VALUE &&
1627 ic->bit_rate != 0 &&
1628 ic->file_size != 0) {
1629 filesize = ic->file_size;
1631 for(i = 0; i < ic->nb_streams; i++) {
1632 st = ic->streams[i];
1633 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1634 if (st->duration == AV_NOPTS_VALUE)
1635 st->duration = duration;
1641 #define DURATION_MAX_READ_SIZE 250000
1643 /* only usable for MPEG-PS streams */
1644 static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offset)
1646 AVPacket pkt1, *pkt = &pkt1;
1648 int read_size, i, ret;
1650 int64_t filesize, offset, duration;
1652 /* free previous packet */
1653 if (ic->cur_st && ic->cur_st->parser)
1654 av_free_packet(&ic->cur_pkt);
1657 /* flush packet queue */
1658 flush_packet_queue(ic);
1660 for(i=0;i<ic->nb_streams;i++) {
1661 st = ic->streams[i];
1663 av_parser_close(st->parser);
1668 /* we read the first packets to get the first PTS (not fully
1669 accurate, but it is enough now) */
1670 url_fseek(ic->pb, 0, SEEK_SET);
1673 if (read_size >= DURATION_MAX_READ_SIZE)
1675 /* if all info is available, we can stop */
1676 for(i = 0;i < ic->nb_streams; i++) {
1677 st = ic->streams[i];
1678 if (st->start_time == AV_NOPTS_VALUE)
1681 if (i == ic->nb_streams)
1684 ret = av_read_packet(ic, pkt);
1687 read_size += pkt->size;
1688 st = ic->streams[pkt->stream_index];
1689 if (pkt->pts != AV_NOPTS_VALUE) {
1690 if (st->start_time == AV_NOPTS_VALUE)
1691 st->start_time = pkt->pts;
1693 av_free_packet(pkt);
1696 /* estimate the end time (duration) */
1697 /* XXX: may need to support wrapping */
1698 filesize = ic->file_size;
1699 offset = filesize - DURATION_MAX_READ_SIZE;
1703 url_fseek(ic->pb, offset, SEEK_SET);
1706 if (read_size >= DURATION_MAX_READ_SIZE)
1709 ret = av_read_packet(ic, pkt);
1712 read_size += pkt->size;
1713 st = ic->streams[pkt->stream_index];
1714 if (pkt->pts != AV_NOPTS_VALUE &&
1715 st->start_time != AV_NOPTS_VALUE) {
1716 end_time = pkt->pts;
1717 duration = end_time - st->start_time;
1719 if (st->duration == AV_NOPTS_VALUE ||
1720 st->duration < duration)
1721 st->duration = duration;
1724 av_free_packet(pkt);
1727 fill_all_stream_timings(ic);
1729 url_fseek(ic->pb, old_offset, SEEK_SET);
1730 for(i=0; i<ic->nb_streams; i++){
1732 st->cur_dts= st->first_dts;
1733 st->last_IP_pts = AV_NOPTS_VALUE;
1737 static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
1741 /* get the file size, if possible */
1742 if (ic->iformat->flags & AVFMT_NOFILE) {
1745 file_size = url_fsize(ic->pb);
1749 ic->file_size = file_size;
1751 if ((!strcmp(ic->iformat->name, "mpeg") ||
1752 !strcmp(ic->iformat->name, "mpegts")) &&
1753 file_size && !url_is_streamed(ic->pb)) {
1754 /* get accurate estimate from the PTSes */
1755 av_estimate_timings_from_pts(ic, old_offset);
1756 } else if (av_has_duration(ic)) {
1757 /* at least one component has timings - we use them for all
1759 fill_all_stream_timings(ic);
1761 /* less precise: use bitrate info */
1762 av_estimate_timings_from_bit_rate(ic);
1764 av_update_stream_timings(ic);
1770 for(i = 0;i < ic->nb_streams; i++) {
1771 st = ic->streams[i];
1772 printf("%d: start_time: %0.3f duration: %0.3f\n",
1773 i, (double)st->start_time / AV_TIME_BASE,
1774 (double)st->duration / AV_TIME_BASE);
1776 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1777 (double)ic->start_time / AV_TIME_BASE,
1778 (double)ic->duration / AV_TIME_BASE,
1779 ic->bit_rate / 1000);
1784 static int has_codec_parameters(AVCodecContext *enc)
1787 switch(enc->codec_type) {
1788 case CODEC_TYPE_AUDIO:
1789 val = enc->sample_rate && enc->channels;
1790 if(!enc->frame_size &&
1791 (enc->codec_id == CODEC_ID_VORBIS ||
1792 enc->codec_id == CODEC_ID_AAC))
1795 case CODEC_TYPE_VIDEO:
1796 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1802 return enc->codec_id != CODEC_ID_NONE && val != 0;
1805 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1809 int got_picture, data_size, ret=0;
1812 if(!st->codec->codec){
1813 codec = avcodec_find_decoder(st->codec->codec_id);
1816 ret = avcodec_open(st->codec, codec);
1821 if(!has_codec_parameters(st->codec)){
1822 switch(st->codec->codec_type) {
1823 case CODEC_TYPE_VIDEO:
1824 ret = avcodec_decode_video(st->codec, &picture,
1825 &got_picture, data, size);
1827 case CODEC_TYPE_AUDIO:
1828 data_size = FFMAX(size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1829 samples = av_malloc(data_size);
1832 ret = avcodec_decode_audio2(st->codec, samples,
1833 &data_size, data, size);
1844 unsigned int codec_get_tag(const AVCodecTag *tags, int id)
1846 while (tags->id != CODEC_ID_NONE) {
1854 enum CodecID codec_get_id(const AVCodecTag *tags, unsigned int tag)
1857 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1858 if(tag == tags[i].tag)
1861 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1862 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1863 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1864 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1865 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1868 return CODEC_ID_NONE;
1871 unsigned int av_codec_get_tag(const AVCodecTag *tags[4], enum CodecID id)
1874 for(i=0; tags && tags[i]; i++){
1875 int tag= codec_get_tag(tags[i], id);
1881 enum CodecID av_codec_get_id(const AVCodecTag *tags[4], unsigned int tag)
1884 for(i=0; tags && tags[i]; i++){
1885 enum CodecID id= codec_get_id(tags[i], tag);
1886 if(id!=CODEC_ID_NONE) return id;
1888 return CODEC_ID_NONE;
1891 static void compute_chapters_end(AVFormatContext *s)
1895 for (i=0; i+1<s->nb_chapters; i++)
1896 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
1897 assert(s->chapters[i]->start <= s->chapters[i+1]->start);
1898 assert(!av_cmp_q(s->chapters[i]->time_base, s->chapters[i+1]->time_base));
1899 s->chapters[i]->end = s->chapters[i+1]->start;
1902 if (s->nb_chapters && s->chapters[i]->end == AV_NOPTS_VALUE) {
1903 assert(s->start_time != AV_NOPTS_VALUE);
1904 assert(s->duration > 0);
1905 s->chapters[i]->end = av_rescale_q(s->start_time + s->duration,
1907 s->chapters[i]->time_base);
1911 /* absolute maximum size we read until we abort */
1912 #define MAX_READ_SIZE 5000000
1914 #define MAX_STD_TIMEBASES (60*12+5)
1915 static int get_std_framerate(int i){
1916 if(i<60*12) return i*1001;
1917 else return ((int[]){24,30,60,12,15})[i-60*12]*1000*12;
1921 * Is the time base unreliable.
1922 * This is a heuristic to balance between quick acceptance of the values in
1923 * the headers vs. some extra checks.
1924 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
1925 * MPEG-2 commonly misuses field repeat flags to store different framerates.
1926 * And there are "variable" fps files this needs to detect as well.
1928 static int tb_unreliable(AVCodecContext *c){
1929 if( c->time_base.den >= 101L*c->time_base.num
1930 || c->time_base.den < 5L*c->time_base.num
1931 /* || c->codec_tag == ff_get_fourcc("DIVX")
1932 || c->codec_tag == ff_get_fourcc("XVID")*/
1933 || c->codec_id == CODEC_ID_MPEG2VIDEO)
1938 int av_find_stream_info(AVFormatContext *ic)
1940 int i, count, ret, read_size, j;
1942 AVPacket pkt1, *pkt;
1943 int64_t last_dts[MAX_STREAMS];
1944 int duration_count[MAX_STREAMS]={0};
1945 double (*duration_error)[MAX_STD_TIMEBASES];
1946 offset_t old_offset = url_ftell(ic->pb);
1947 int64_t codec_info_duration[MAX_STREAMS]={0};
1948 int codec_info_nb_frames[MAX_STREAMS]={0};
1950 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
1951 if (!duration_error) return AVERROR(ENOMEM);
1953 for(i=0;i<ic->nb_streams;i++) {
1954 st = ic->streams[i];
1955 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1956 /* if(!st->time_base.num)
1958 if(!st->codec->time_base.num)
1959 st->codec->time_base= st->time_base;
1961 //only for the split stuff
1963 st->parser = av_parser_init(st->codec->codec_id);
1964 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
1965 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1970 for(i=0;i<MAX_STREAMS;i++){
1971 last_dts[i]= AV_NOPTS_VALUE;
1977 /* check if one codec still needs to be handled */
1978 for(i=0;i<ic->nb_streams;i++) {
1979 st = ic->streams[i];
1980 if (!has_codec_parameters(st->codec))
1982 /* variable fps and no guess at the real fps */
1983 if( tb_unreliable(st->codec)
1984 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1986 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1988 if(st->first_dts == AV_NOPTS_VALUE)
1991 if (i == ic->nb_streams) {
1992 /* NOTE: if the format has no header, then we need to read
1993 some packets to get most of the streams, so we cannot
1995 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1996 /* if we found the info for all the codecs, we can stop */
2001 /* we did not get all the codec info, but we read too much data */
2002 if (read_size >= MAX_READ_SIZE) {
2007 /* NOTE: a new stream can be added there if no header in file
2008 (AVFMTCTX_NOHEADER) */
2009 ret = av_read_frame_internal(ic, &pkt1);
2012 ret = -1; /* we could not have all the codec parameters before EOF */
2013 for(i=0;i<ic->nb_streams;i++) {
2014 st = ic->streams[i];
2015 if (!has_codec_parameters(st->codec)){
2017 avcodec_string(buf, sizeof(buf), st->codec, 0);
2018 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
2026 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2027 if(av_dup_packet(pkt) < 0) {
2028 av_free(duration_error);
2029 return AVERROR(ENOMEM);
2032 read_size += pkt->size;
2034 st = ic->streams[pkt->stream_index];
2035 if(codec_info_nb_frames[st->index]>1)
2036 codec_info_duration[st->index] += pkt->duration;
2037 if (pkt->duration != 0)
2038 codec_info_nb_frames[st->index]++;
2041 int index= pkt->stream_index;
2042 int64_t last= last_dts[index];
2043 int64_t duration= pkt->dts - last;
2045 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2046 double dur= duration * av_q2d(st->time_base);
2048 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2049 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2050 if(duration_count[index] < 2)
2051 memset(duration_error[index], 0, sizeof(*duration_error));
2052 for(i=1; i<MAX_STD_TIMEBASES; i++){
2053 int framerate= get_std_framerate(i);
2054 int ticks= lrintf(dur*framerate/(1001*12));
2055 double error= dur - ticks*1001*12/(double)framerate;
2056 duration_error[index][i] += error*error;
2058 duration_count[index]++;
2060 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
2061 last_dts[pkt->stream_index]= pkt->dts;
2063 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2064 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2066 st->codec->extradata_size= i;
2067 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2068 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2069 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2073 /* if still no information, we try to open the codec and to
2074 decompress the frame. We try to avoid that in most cases as
2075 it takes longer and uses more memory. For MPEG-4, we need to
2076 decompress for QuickTime. */
2077 if (!has_codec_parameters(st->codec) /*&&
2078 (st->codec->codec_id == CODEC_ID_FLV1 ||
2079 st->codec->codec_id == CODEC_ID_H264 ||
2080 st->codec->codec_id == CODEC_ID_H263 ||
2081 st->codec->codec_id == CODEC_ID_H261 ||
2082 st->codec->codec_id == CODEC_ID_VORBIS ||
2083 st->codec->codec_id == CODEC_ID_MJPEG ||
2084 st->codec->codec_id == CODEC_ID_PNG ||
2085 st->codec->codec_id == CODEC_ID_PAM ||
2086 st->codec->codec_id == CODEC_ID_PGM ||
2087 st->codec->codec_id == CODEC_ID_PGMYUV ||
2088 st->codec->codec_id == CODEC_ID_PBM ||
2089 st->codec->codec_id == CODEC_ID_PPM ||
2090 st->codec->codec_id == CODEC_ID_SHORTEN ||
2091 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
2092 try_decode_frame(st, pkt->data, pkt->size);
2094 if (st->time_base.den > 0 && av_rescale_q(codec_info_duration[st->index], st->time_base, AV_TIME_BASE_Q) >= ic->max_analyze_duration) {
2100 // close codecs which were opened in try_decode_frame()
2101 for(i=0;i<ic->nb_streams;i++) {
2102 st = ic->streams[i];
2103 if(st->codec->codec)
2104 avcodec_close(st->codec);
2106 for(i=0;i<ic->nb_streams;i++) {
2107 st = ic->streams[i];
2108 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2109 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
2110 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2112 if(duration_count[i]
2113 && tb_unreliable(st->codec) /*&&
2114 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2115 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2116 double best_error= 2*av_q2d(st->time_base);
2117 best_error= best_error*best_error*duration_count[i]*1000*12*30;
2119 for(j=1; j<MAX_STD_TIMEBASES; j++){
2120 double error= duration_error[i][j] * get_std_framerate(j);
2121 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2122 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2123 if(error < best_error){
2125 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, get_std_framerate(j), 12*1001, INT_MAX);
2130 if (!st->r_frame_rate.num){
2131 if( st->codec->time_base.den * (int64_t)st->time_base.num
2132 <= st->codec->time_base.num * (int64_t)st->time_base.den){
2133 st->r_frame_rate.num = st->codec->time_base.den;
2134 st->r_frame_rate.den = st->codec->time_base.num;
2136 st->r_frame_rate.num = st->time_base.den;
2137 st->r_frame_rate.den = st->time_base.num;
2140 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
2141 if(!st->codec->bits_per_sample)
2142 st->codec->bits_per_sample= av_get_bits_per_sample(st->codec->codec_id);
2146 av_estimate_timings(ic, old_offset);
2148 compute_chapters_end(ic);
2151 /* correct DTS for B-frame streams with no timestamps */
2152 for(i=0;i<ic->nb_streams;i++) {
2153 st = ic->streams[i];
2154 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2156 ppktl = &ic->packet_buffer;
2158 if(ppkt1->stream_index != i)
2160 if(ppkt1->pkt->dts < 0)
2162 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2164 ppkt1->pkt->dts -= delta;
2169 st->cur_dts -= delta;
2175 av_free(duration_error);
2180 /*******************************************************/
2182 int av_read_play(AVFormatContext *s)
2184 if (s->iformat->read_play)
2185 return s->iformat->read_play(s);
2187 return av_url_read_fpause(s->pb, 0);
2188 return AVERROR(ENOSYS);
2191 int av_read_pause(AVFormatContext *s)
2193 if (s->iformat->read_pause)
2194 return s->iformat->read_pause(s);
2196 return av_url_read_fpause(s->pb, 1);
2197 return AVERROR(ENOSYS);
2200 void av_close_input_stream(AVFormatContext *s)
2205 /* free previous packet */
2206 if (s->cur_st && s->cur_st->parser)
2207 av_free_packet(&s->cur_pkt);
2209 if (s->iformat->read_close)
2210 s->iformat->read_close(s);
2211 for(i=0;i<s->nb_streams;i++) {
2212 /* free all data in a stream component */
2215 av_parser_close(st->parser);
2217 av_free(st->index_entries);
2218 av_free(st->codec->extradata);
2220 av_free(st->filename);
2221 av_free(st->priv_data);
2224 for(i=s->nb_programs-1; i>=0; i--) {
2225 av_freep(&s->programs[i]->provider_name);
2226 av_freep(&s->programs[i]->name);
2227 av_freep(&s->programs[i]->stream_index);
2228 av_freep(&s->programs[i]);
2230 av_freep(&s->programs);
2231 flush_packet_queue(s);
2232 av_freep(&s->priv_data);
2233 while(s->nb_chapters--) {
2234 av_free(s->chapters[s->nb_chapters]->title);
2235 av_free(s->chapters[s->nb_chapters]);
2237 av_freep(&s->chapters);
2241 void av_close_input_file(AVFormatContext *s)
2243 ByteIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2244 av_close_input_stream(s);
2249 AVStream *av_new_stream(AVFormatContext *s, int id)
2254 if (s->nb_streams >= MAX_STREAMS)
2257 st = av_mallocz(sizeof(AVStream));
2261 st->codec= avcodec_alloc_context();
2263 /* no default bitrate if decoding */
2264 st->codec->bit_rate = 0;
2266 st->index = s->nb_streams;
2268 st->start_time = AV_NOPTS_VALUE;
2269 st->duration = AV_NOPTS_VALUE;
2270 /* we set the current DTS to 0 so that formats without any timestamps
2271 but durations get some timestamps, formats with some unknown
2272 timestamps have their first few packets buffered and the
2273 timestamps corrected before they are returned to the user */
2275 st->first_dts = AV_NOPTS_VALUE;
2277 /* default pts setting is MPEG-like */
2278 av_set_pts_info(st, 33, 1, 90000);
2279 st->last_IP_pts = AV_NOPTS_VALUE;
2280 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2281 st->pts_buffer[i]= AV_NOPTS_VALUE;
2283 s->streams[s->nb_streams++] = st;
2287 AVProgram *av_new_program(AVFormatContext *ac, int id)
2289 AVProgram *program=NULL;
2293 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2296 for(i=0; i<ac->nb_programs; i++)
2297 if(ac->programs[i]->id == id)
2298 program = ac->programs[i];
2301 program = av_mallocz(sizeof(AVProgram));
2304 dynarray_add(&ac->programs, &ac->nb_programs, program);
2305 program->discard = AVDISCARD_NONE;
2312 void av_set_program_name(AVProgram *program, char *provider_name, char *name)
2314 assert(!provider_name == !name);
2316 av_free(program->provider_name);
2317 av_free(program-> name);
2318 program->provider_name = av_strdup(provider_name);
2319 program-> name = av_strdup( name);
2323 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2325 AVChapter *chapter = NULL;
2328 for(i=0; i<s->nb_chapters; i++)
2329 if(s->chapters[i]->id == id)
2330 chapter = s->chapters[i];
2333 chapter= av_mallocz(sizeof(AVChapter));
2336 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2338 av_free(chapter->title);
2339 chapter->title = av_strdup(title);
2341 chapter->time_base= time_base;
2342 chapter->start = start;
2348 /************************************************************/
2349 /* output media file */
2351 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2355 if (s->oformat->priv_data_size > 0) {
2356 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2358 return AVERROR(ENOMEM);
2360 s->priv_data = NULL;
2362 if (s->oformat->set_parameters) {
2363 ret = s->oformat->set_parameters(s, ap);
2370 int av_write_header(AVFormatContext *s)
2375 // some sanity checks
2376 for(i=0;i<s->nb_streams;i++) {
2379 switch (st->codec->codec_type) {
2380 case CODEC_TYPE_AUDIO:
2381 if(st->codec->sample_rate<=0){
2382 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2386 case CODEC_TYPE_VIDEO:
2387 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2388 av_log(s, AV_LOG_ERROR, "time base not set\n");
2391 if(st->codec->width<=0 || st->codec->height<=0){
2392 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2398 if(s->oformat->codec_tag){
2399 if(st->codec->codec_tag){
2401 //check that tag + id is in the table
2402 //if neither is in the table -> OK
2403 //if tag is in the table with another id -> FAIL
2404 //if id is in the table with another tag -> FAIL unless strict < ?
2406 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2410 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2411 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2413 return AVERROR(ENOMEM);
2416 if(s->oformat->write_header){
2417 ret = s->oformat->write_header(s);
2422 /* init PTS generation */
2423 for(i=0;i<s->nb_streams;i++) {
2424 int64_t den = AV_NOPTS_VALUE;
2427 switch (st->codec->codec_type) {
2428 case CODEC_TYPE_AUDIO:
2429 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2431 case CODEC_TYPE_VIDEO:
2432 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2437 if (den != AV_NOPTS_VALUE) {
2439 return AVERROR_INVALIDDATA;
2440 av_frac_init(&st->pts, 0, 0, den);
2446 //FIXME merge with compute_pkt_fields
2447 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2448 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2449 int num, den, frame_size, i;
2451 // av_log(st->codec, AV_LOG_DEBUG, "av_write_frame: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n", pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
2453 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2456 /* duration field */
2457 if (pkt->duration == 0) {
2458 compute_frame_duration(&num, &den, st, NULL, pkt);
2460 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2464 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2467 //XXX/FIXME this is a temporary hack until all encoders output pts
2468 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2470 // pkt->pts= st->cur_dts;
2471 pkt->pts= st->pts.val;
2474 //calculate dts from pts
2475 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2476 st->pts_buffer[0]= pkt->pts;
2477 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2478 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2479 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2480 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2482 pkt->dts= st->pts_buffer[0];
2485 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2486 av_log(st->codec, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2489 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2490 av_log(st->codec, AV_LOG_ERROR, "error, pts < dts\n");
2494 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2495 st->cur_dts= pkt->dts;
2496 st->pts.val= pkt->dts;
2499 switch (st->codec->codec_type) {
2500 case CODEC_TYPE_AUDIO:
2501 frame_size = get_audio_frame_size(st->codec, pkt->size);
2503 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2504 likely equal to the encoder delay, but it would be better if we
2505 had the real timestamps from the encoder */
2506 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2507 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2510 case CODEC_TYPE_VIDEO:
2511 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2519 static void truncate_ts(AVStream *st, AVPacket *pkt){
2520 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2523 // pkt->dts= 0; //this happens for low_delay=0 and B-frames, FIXME, needs further investigation about what we should do here
2525 if (pkt->pts != AV_NOPTS_VALUE)
2526 pkt->pts &= pts_mask;
2527 if (pkt->dts != AV_NOPTS_VALUE)
2528 pkt->dts &= pts_mask;
2531 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2533 int ret = compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2535 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2538 truncate_ts(s->streams[pkt->stream_index], pkt);
2540 ret= s->oformat->write_packet(s, pkt);
2542 ret= url_ferror(s->pb);
2546 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2547 AVPacketList *pktl, **next_point, *this_pktl;
2549 int streams[MAX_STREAMS];
2552 AVStream *st= s->streams[ pkt->stream_index];
2554 // assert(pkt->destruct != av_destruct_packet); //FIXME
2556 this_pktl = av_mallocz(sizeof(AVPacketList));
2557 this_pktl->pkt= *pkt;
2558 if(pkt->destruct == av_destruct_packet)
2559 pkt->destruct= NULL; // not shared -> must keep original from being freed
2561 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2563 next_point = &s->packet_buffer;
2565 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2566 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2567 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2568 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2570 next_point= &(*next_point)->next;
2572 this_pktl->next= *next_point;
2573 *next_point= this_pktl;
2576 memset(streams, 0, sizeof(streams));
2577 pktl= s->packet_buffer;
2579 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2580 if(streams[ pktl->pkt.stream_index ] == 0)
2582 streams[ pktl->pkt.stream_index ]++;
2586 if(stream_count && (s->nb_streams == stream_count || flush)){
2587 pktl= s->packet_buffer;
2590 s->packet_buffer= pktl->next;
2594 av_init_packet(out);
2600 * Interleaves an AVPacket correctly so it can be muxed.
2601 * @param out the interleaved packet will be output here
2602 * @param in the input packet
2603 * @param flush 1 if no further packets are available as input and all
2604 * remaining packets should be output
2605 * @return 1 if a packet was output, 0 if no packet could be output,
2606 * < 0 if an error occurred
2608 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2609 if(s->oformat->interleave_packet)
2610 return s->oformat->interleave_packet(s, out, in, flush);
2612 return av_interleave_packet_per_dts(s, out, in, flush);
2615 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2616 AVStream *st= s->streams[ pkt->stream_index];
2618 //FIXME/XXX/HACK drop zero sized packets
2619 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2622 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2623 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2626 if(pkt->dts == AV_NOPTS_VALUE)
2631 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2632 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2635 truncate_ts(s->streams[opkt.stream_index], &opkt);
2636 ret= s->oformat->write_packet(s, &opkt);
2638 av_free_packet(&opkt);
2643 if(url_ferror(s->pb))
2644 return url_ferror(s->pb);
2648 int av_write_trailer(AVFormatContext *s)
2654 ret= av_interleave_packet(s, &pkt, NULL, 1);
2655 if(ret<0) //FIXME cleanup needed for ret<0 ?
2660 truncate_ts(s->streams[pkt.stream_index], &pkt);
2661 ret= s->oformat->write_packet(s, &pkt);
2663 av_free_packet(&pkt);
2667 if(url_ferror(s->pb))
2671 if(s->oformat->write_trailer)
2672 ret = s->oformat->write_trailer(s);
2675 ret=url_ferror(s->pb);
2676 for(i=0;i<s->nb_streams;i++)
2677 av_freep(&s->streams[i]->priv_data);
2678 av_freep(&s->priv_data);
2682 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
2685 AVProgram *program=NULL;
2688 for(i=0; i<ac->nb_programs; i++){
2689 if(ac->programs[i]->id != progid)
2691 program = ac->programs[i];
2692 for(j=0; j<program->nb_stream_indexes; j++)
2693 if(program->stream_index[j] == idx)
2696 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
2699 program->stream_index = tmp;
2700 program->stream_index[program->nb_stream_indexes++] = idx;
2705 /* "user interface" functions */
2706 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
2709 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
2710 AVStream *st = ic->streams[i];
2711 int g = ff_gcd(st->time_base.num, st->time_base.den);
2712 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2713 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2714 /* the pid is an important information, so we display it */
2715 /* XXX: add a generic system */
2716 if (flags & AVFMT_SHOW_IDS)
2717 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2718 if (strlen(st->language) > 0)
2719 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2720 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2721 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2722 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2723 if(st->r_frame_rate.den && st->r_frame_rate.num)
2724 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(r)", av_q2d(st->r_frame_rate));
2725 /* else if(st->time_base.den && st->time_base.num)
2726 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(m)", 1/av_q2d(st->time_base));*/
2728 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(c)", 1/av_q2d(st->codec->time_base));
2730 av_log(NULL, AV_LOG_INFO, "\n");
2733 void dump_format(AVFormatContext *ic,
2740 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2741 is_output ? "Output" : "Input",
2743 is_output ? ic->oformat->name : ic->iformat->name,
2744 is_output ? "to" : "from", url);
2746 av_log(NULL, AV_LOG_INFO, " Duration: ");
2747 if (ic->duration != AV_NOPTS_VALUE) {
2748 int hours, mins, secs, us;
2749 secs = ic->duration / AV_TIME_BASE;
2750 us = ic->duration % AV_TIME_BASE;
2755 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
2756 (100 * us) / AV_TIME_BASE);
2758 av_log(NULL, AV_LOG_INFO, "N/A");
2760 if (ic->start_time != AV_NOPTS_VALUE) {
2762 av_log(NULL, AV_LOG_INFO, ", start: ");
2763 secs = ic->start_time / AV_TIME_BASE;
2764 us = ic->start_time % AV_TIME_BASE;
2765 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2766 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2768 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2770 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2772 av_log(NULL, AV_LOG_INFO, "N/A");
2774 av_log(NULL, AV_LOG_INFO, "\n");
2776 if(ic->nb_programs) {
2778 for(j=0; j<ic->nb_programs; j++) {
2779 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
2780 ic->programs[j]->name ? ic->programs[j]->name : "");
2781 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++)
2782 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
2785 for(i=0;i<ic->nb_streams;i++)
2786 dump_stream_format(ic, i, index, is_output);
2789 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2791 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2794 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2796 AVRational frame_rate;
2797 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2798 *frame_rate_num= frame_rate.num;
2799 *frame_rate_den= frame_rate.den;
2804 * Gets the current time in microseconds.
2806 int64_t av_gettime(void)
2809 gettimeofday(&tv,NULL);
2810 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
2813 int64_t parse_date(const char *datestr, int duration)
2819 static const char *date_fmt[] = {
2823 static const char *time_fmt[] = {
2833 time_t now = time(0);
2835 len = strlen(datestr);
2837 lastch = datestr[len - 1];
2840 is_utc = (lastch == 'z' || lastch == 'Z');
2842 memset(&dt, 0, sizeof(dt));
2847 /* parse the year-month-day part */
2848 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2849 q = small_strptime(p, date_fmt[i], &dt);
2855 /* if the year-month-day part is missing, then take the
2856 * current year-month-day time */
2861 dt = *localtime(&now);
2863 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2868 if (*p == 'T' || *p == 't' || *p == ' ')
2871 /* parse the hour-minute-second part */
2872 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2873 q = small_strptime(p, time_fmt[i], &dt);
2879 /* parse datestr as a duration */
2884 /* parse datestr as HH:MM:SS */
2885 q = small_strptime(p, time_fmt[0], &dt);
2887 /* parse datestr as S+ */
2888 dt.tm_sec = strtol(p, (char **)&q, 10);
2890 /* the parsing didn't succeed */
2897 /* Now we have all the fields that we can get */
2903 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2905 dt.tm_isdst = -1; /* unknown */
2915 /* parse the .m... part */
2919 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2922 val += n * (*q - '0');
2926 return negative ? -t : t;
2929 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2939 while (*p != '\0' && *p != '=' && *p != '&') {
2940 if ((q - tag) < sizeof(tag) - 1)
2948 while (*p != '&' && *p != '\0') {
2949 if ((q - arg) < arg_size - 1) {
2959 if (!strcmp(tag, tag1))
2968 int av_get_frame_filename(char *buf, int buf_size,
2969 const char *path, int number)
2972 char *q, buf1[20], c;
2973 int nd, len, percentd_found;
2985 while (isdigit(*p)) {
2986 nd = nd * 10 + *p++ - '0';
2989 } while (isdigit(c));
2998 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3000 if ((q - buf + len) > buf_size - 1)
3002 memcpy(q, buf1, len);
3010 if ((q - buf) < buf_size - 1)
3014 if (!percentd_found)
3023 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3026 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3028 for(i=0;i<size;i+=16) {
3035 PRINT(" %02x", buf[i+j]);
3040 for(j=0;j<len;j++) {
3042 if (c < ' ' || c > '~')
3051 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3053 hex_dump_internal(NULL, f, 0, buf, size);
3056 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3058 hex_dump_internal(avcl, NULL, level, buf, size);
3061 //FIXME needs to know the time_base
3062 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
3064 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3065 PRINT("stream #%d:\n", pkt->stream_index);
3066 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
3067 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
3068 /* DTS is _always_ valid after av_read_frame() */
3070 if (pkt->dts == AV_NOPTS_VALUE)
3073 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
3074 /* PTS may not be known if B-frames are present. */
3076 if (pkt->pts == AV_NOPTS_VALUE)
3079 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
3081 PRINT(" size=%d\n", pkt->size);
3084 av_hex_dump(f, pkt->data, pkt->size);
3087 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3089 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
3092 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3094 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
3097 void url_split(char *proto, int proto_size,
3098 char *authorization, int authorization_size,
3099 char *hostname, int hostname_size,
3101 char *path, int path_size,
3104 const char *p, *ls, *at, *col, *brk;
3106 if (port_ptr) *port_ptr = -1;
3107 if (proto_size > 0) proto[0] = 0;
3108 if (authorization_size > 0) authorization[0] = 0;
3109 if (hostname_size > 0) hostname[0] = 0;
3110 if (path_size > 0) path[0] = 0;
3112 /* parse protocol */
3113 if ((p = strchr(url, ':'))) {
3114 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3119 /* no protocol means plain filename */
3120 av_strlcpy(path, url, path_size);
3124 /* separate path from hostname */
3125 ls = strchr(p, '/');
3127 ls = strchr(p, '?');
3129 av_strlcpy(path, ls, path_size);
3131 ls = &p[strlen(p)]; // XXX
3133 /* the rest is hostname, use that to parse auth/port */
3135 /* authorization (user[:pass]@hostname) */
3136 if ((at = strchr(p, '@')) && at < ls) {
3137 av_strlcpy(authorization, p,
3138 FFMIN(authorization_size, at + 1 - p));
3139 p = at + 1; /* skip '@' */
3142 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3144 av_strlcpy(hostname, p + 1,
3145 FFMIN(hostname_size, brk - p));
3146 if (brk[1] == ':' && port_ptr)
3147 *port_ptr = atoi(brk + 2);
3148 } else if ((col = strchr(p, ':')) && col < ls) {
3149 av_strlcpy(hostname, p,
3150 FFMIN(col + 1 - p, hostname_size));
3151 if (port_ptr) *port_ptr = atoi(col + 1);
3153 av_strlcpy(hostname, p,
3154 FFMIN(ls + 1 - p, hostname_size));
3158 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3159 int pts_num, int pts_den)
3161 unsigned int gcd= ff_gcd(pts_num, pts_den);
3162 s->pts_wrap_bits = pts_wrap_bits;
3163 s->time_base.num = pts_num/gcd;
3164 s->time_base.den = pts_den/gcd;
3167 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, gcd);
3170 /* fraction handling */
3173 * f = val + (num / den) + 0.5.
3175 * 'num' is normalized so that it is such as 0 <= num < den.
3177 * @param f fractional number
3178 * @param val integer value
3179 * @param num must be >= 0
3180 * @param den must be >= 1
3182 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
3195 * Fractional addition to f: f = f + (incr / f->den).
3197 * @param f fractional number
3198 * @param incr increment, can be positive or negative
3200 static void av_frac_add(AVFrac *f, int64_t incr)
3204 num = f->num + incr;
3207 f->val += num / den;
3213 } else if (num >= den) {
3214 f->val += num / den;