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 /************************************************************/
297 /* input media file */
300 * Open a media file from an IO stream. 'fmt' must be specified.
302 static const char* format_to_name(void* ptr)
304 AVFormatContext* fc = (AVFormatContext*) ptr;
305 if(fc->iformat) return fc->iformat->name;
306 else if(fc->oformat) return fc->oformat->name;
310 #define OFFSET(x) offsetof(AVFormatContext,x)
311 #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
312 //these names are too long to be readable
313 #define E AV_OPT_FLAG_ENCODING_PARAM
314 #define D AV_OPT_FLAG_DECODING_PARAM
316 static const AVOption options[]={
317 {"probesize", NULL, OFFSET(probesize), FF_OPT_TYPE_INT, 32000, 32, INT_MAX, D}, /* 32000 from mpegts.c: 1.0 second at 24Mbit/s */
318 {"muxrate", "set mux rate", OFFSET(mux_rate), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
319 {"packetsize", "set packet size", OFFSET(packet_size), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
320 {"fflags", NULL, OFFSET(flags), FF_OPT_TYPE_FLAGS, DEFAULT, INT_MIN, INT_MAX, D|E, "fflags"},
321 {"ignidx", "ignore index", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_IGNIDX, INT_MIN, INT_MAX, D, "fflags"},
322 {"genpts", "generate pts", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_GENPTS, INT_MIN, INT_MAX, D, "fflags"},
323 {"track", " set the track number", OFFSET(track), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
324 {"year", "set the year", OFFSET(year), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, E},
325 {"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},
326 {"cryptokey", "decryption key", OFFSET(key), FF_OPT_TYPE_BINARY, 0, 0, 0, D},
327 {"indexmem", "max memory used for timestamp index (per stream)", OFFSET(max_index_size), FF_OPT_TYPE_INT, 1<<20, 0, INT_MAX, D},
328 {"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 */
329 {"fdebug", "print specific debug info", OFFSET(debug), FF_OPT_TYPE_FLAGS, DEFAULT, 0, INT_MAX, E|D, "fdebug"},
330 {"ts", NULL, 0, FF_OPT_TYPE_CONST, FF_FDEBUG_TS, INT_MIN, INT_MAX, E|D, "fdebug"},
338 static const AVClass av_format_context_class = { "AVFormatContext", format_to_name, options };
340 static void avformat_get_context_defaults(AVFormatContext *s)
342 memset(s, 0, sizeof(AVFormatContext));
344 s->av_class = &av_format_context_class;
346 av_opt_set_defaults(s);
349 AVFormatContext *av_alloc_format_context(void)
352 ic = av_malloc(sizeof(AVFormatContext));
354 avformat_get_context_defaults(ic);
355 ic->av_class = &av_format_context_class;
359 int av_open_input_stream(AVFormatContext **ic_ptr,
360 ByteIOContext *pb, const char *filename,
361 AVInputFormat *fmt, AVFormatParameters *ap)
365 AVFormatParameters default_ap;
369 memset(ap, 0, sizeof(default_ap));
372 if(!ap->prealloced_context)
373 ic = av_alloc_format_context();
377 err = AVERROR(ENOMEM);
382 ic->duration = AV_NOPTS_VALUE;
383 ic->start_time = AV_NOPTS_VALUE;
384 av_strlcpy(ic->filename, filename, sizeof(ic->filename));
386 /* allocate private data */
387 if (fmt->priv_data_size > 0) {
388 ic->priv_data = av_mallocz(fmt->priv_data_size);
389 if (!ic->priv_data) {
390 err = AVERROR(ENOMEM);
394 ic->priv_data = NULL;
397 err = ic->iformat->read_header(ic, ap);
401 if (pb && !ic->data_offset)
402 ic->data_offset = url_ftell(ic->pb);
409 av_freep(&ic->priv_data);
410 for(i=0;i<ic->nb_streams;i++) {
411 AVStream *st = ic->streams[i];
413 av_free(st->priv_data);
414 av_free(st->codec->extradata);
424 /** size of probe buffer, for guessing file type from file contents */
425 #define PROBE_BUF_MIN 2048
426 #define PROBE_BUF_MAX (1<<20)
428 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
431 AVFormatParameters *ap)
434 AVProbeData probe_data, *pd = &probe_data;
435 ByteIOContext *pb = NULL;
439 pd->filename = filename;
444 /* guess format if no file can be opened */
445 fmt = av_probe_input_format(pd, 0);
448 /* Do not open file if the format does not need it. XXX: specific
449 hack needed to handle RTSP/TCP */
450 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
451 /* if no file needed do not try to open one */
452 if ((err=url_fopen(&pb, filename, URL_RDONLY)) < 0) {
456 url_setbufsize(pb, buf_size);
459 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
460 int score= probe_size < PROBE_BUF_MAX ? AVPROBE_SCORE_MAX/4 : 0;
461 /* read probe data */
462 pd->buf= av_realloc(pd->buf, probe_size + AVPROBE_PADDING_SIZE);
463 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
464 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
465 if (url_fseek(pb, 0, SEEK_SET) < 0) {
467 if (url_fopen(&pb, filename, URL_RDONLY) < 0) {
473 /* guess file format */
474 fmt = av_probe_input_format2(pd, 1, &score);
479 /* if still no format found, error */
485 /* check filename in case an image number is expected */
486 if (fmt->flags & AVFMT_NEEDNUMBER) {
487 if (!av_filename_number_test(filename)) {
488 err = AVERROR_NUMEXPECTED;
492 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
505 /*******************************************************/
507 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
512 ret= s->iformat->read_packet(s, pkt);
515 st= s->streams[pkt->stream_index];
517 switch(st->codec->codec_type){
518 case CODEC_TYPE_VIDEO:
519 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
521 case CODEC_TYPE_AUDIO:
522 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
524 case CODEC_TYPE_SUBTITLE:
525 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
532 /**********************************************************/
535 * Get the number of samples of an audio frame. Return -1 on error.
537 static int get_audio_frame_size(AVCodecContext *enc, int size)
541 if(enc->codec_id == CODEC_ID_VORBIS)
544 if (enc->frame_size <= 1) {
545 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
547 if (bits_per_sample) {
548 if (enc->channels == 0)
550 frame_size = (size << 3) / (bits_per_sample * enc->channels);
552 /* used for example by ADPCM codecs */
553 if (enc->bit_rate == 0)
555 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
558 frame_size = enc->frame_size;
565 * Return the frame duration in seconds. Return 0 if not available.
567 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
568 AVCodecParserContext *pc, AVPacket *pkt)
574 switch(st->codec->codec_type) {
575 case CODEC_TYPE_VIDEO:
576 if(st->time_base.num*1000LL > st->time_base.den){
577 *pnum = st->time_base.num;
578 *pden = st->time_base.den;
579 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
580 *pnum = st->codec->time_base.num;
581 *pden = st->codec->time_base.den;
582 if (pc && pc->repeat_pict) {
584 *pnum = (*pnum) * (2 + pc->repeat_pict);
588 case CODEC_TYPE_AUDIO:
589 frame_size = get_audio_frame_size(st->codec, pkt->size);
593 *pden = st->codec->sample_rate;
600 static int is_intra_only(AVCodecContext *enc){
601 if(enc->codec_type == CODEC_TYPE_AUDIO){
603 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
604 switch(enc->codec_id){
606 case CODEC_ID_MJPEGB:
608 case CODEC_ID_RAWVIDEO:
609 case CODEC_ID_DVVIDEO:
610 case CODEC_ID_HUFFYUV:
611 case CODEC_ID_FFVHUFF:
622 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
623 int64_t dts, int64_t pts)
625 AVStream *st= s->streams[stream_index];
626 AVPacketList *pktl= s->packet_buffer;
628 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE)
631 st->first_dts= dts - st->cur_dts;
634 for(; pktl; pktl= pktl->next){
635 if(pktl->pkt.stream_index != stream_index)
637 //FIXME think more about this check
638 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
639 pktl->pkt.pts += st->first_dts;
641 if(pktl->pkt.dts != AV_NOPTS_VALUE)
642 pktl->pkt.dts += st->first_dts;
644 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
645 st->start_time= pktl->pkt.pts;
647 if (st->start_time == AV_NOPTS_VALUE)
648 st->start_time = pts;
651 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
653 AVPacketList *pktl= s->packet_buffer;
656 if(st->first_dts != AV_NOPTS_VALUE){
657 cur_dts= st->first_dts;
658 for(; pktl; pktl= pktl->next){
659 if(pktl->pkt.stream_index == pkt->stream_index){
660 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
662 cur_dts -= pkt->duration;
665 pktl= s->packet_buffer;
666 st->first_dts = cur_dts;
667 }else if(st->cur_dts)
670 for(; pktl; pktl= pktl->next){
671 if(pktl->pkt.stream_index != pkt->stream_index)
673 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
674 && !pktl->pkt.duration){
675 pktl->pkt.dts= cur_dts;
676 if(!st->codec->has_b_frames)
677 pktl->pkt.pts= cur_dts;
678 cur_dts += pkt->duration;
679 pktl->pkt.duration= pkt->duration;
683 if(st->first_dts == AV_NOPTS_VALUE)
684 st->cur_dts= cur_dts;
687 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
688 AVCodecParserContext *pc, AVPacket *pkt)
690 int num, den, presentation_delayed, delay, i;
693 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
694 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
695 pkt->dts -= 1LL<<st->pts_wrap_bits;
698 if (pkt->duration == 0) {
699 compute_frame_duration(&num, &den, st, pc, pkt);
701 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
703 if(pkt->duration != 0 && s->packet_buffer)
704 update_initial_durations(s, st, pkt);
708 /* correct timestamps with byte offset if demuxers only have timestamps
709 on packet boundaries */
710 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
711 /* this will estimate bitrate based on this frame's duration and size */
712 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
713 if(pkt->pts != AV_NOPTS_VALUE)
715 if(pkt->dts != AV_NOPTS_VALUE)
719 /* do we have a video B-frame ? */
720 delay= st->codec->has_b_frames;
721 presentation_delayed = 0;
722 /* XXX: need has_b_frame, but cannot get it if the codec is
725 pc && pc->pict_type != FF_B_TYPE)
726 presentation_delayed = 1;
727 /* This may be redundant, but it should not hurt. */
728 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
729 presentation_delayed = 1;
731 if(st->cur_dts == AV_NOPTS_VALUE){
732 st->cur_dts = 0; //FIXME maybe set it to 0 during init
735 // 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);
736 /* interpolate PTS and DTS if they are not present */
737 if(delay==0 || (delay==1 && pc)){
738 if (presentation_delayed) {
739 /* DTS = decompression timestamp */
740 /* PTS = presentation timestamp */
741 if (pkt->dts == AV_NOPTS_VALUE)
742 pkt->dts = st->last_IP_pts;
743 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
744 if (pkt->dts == AV_NOPTS_VALUE)
745 pkt->dts = st->cur_dts;
747 /* this is tricky: the dts must be incremented by the duration
748 of the frame we are displaying, i.e. the last I- or P-frame */
749 if (st->last_IP_duration == 0)
750 st->last_IP_duration = pkt->duration;
751 st->cur_dts = pkt->dts + st->last_IP_duration;
752 st->last_IP_duration = pkt->duration;
753 st->last_IP_pts= pkt->pts;
754 /* cannot compute PTS if not present (we can compute it only
755 by knowing the future */
756 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
757 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
758 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
759 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
760 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
761 pkt->pts += pkt->duration;
762 // 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);
766 /* presentation is not delayed : PTS and DTS are the same */
767 if(pkt->pts == AV_NOPTS_VALUE)
769 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
770 if(pkt->pts == AV_NOPTS_VALUE)
771 pkt->pts = st->cur_dts;
773 st->cur_dts = pkt->pts + pkt->duration;
777 if(pkt->pts != AV_NOPTS_VALUE){
778 st->pts_buffer[0]= pkt->pts;
779 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
780 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
781 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
782 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
783 if(pkt->dts == AV_NOPTS_VALUE)
784 pkt->dts= st->pts_buffer[0];
786 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
788 if(pkt->dts > st->cur_dts)
789 st->cur_dts = pkt->dts;
792 // 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);
795 if(is_intra_only(st->codec))
796 pkt->flags |= PKT_FLAG_KEY;
799 /* keyframe computation */
800 if (pc->pict_type == FF_I_TYPE)
801 pkt->flags |= PKT_FLAG_KEY;
805 void av_destruct_packet_nofree(AVPacket *pkt)
807 pkt->data = NULL; pkt->size = 0;
810 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
818 /* select current input stream component */
821 if (!st->need_parsing || !st->parser) {
822 /* no parsing needed: we just output the packet as is */
823 /* raw data support */
825 compute_pkt_fields(s, st, NULL, pkt);
828 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
829 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
830 s->cur_ptr, s->cur_len,
831 s->cur_pkt.pts, s->cur_pkt.dts);
832 s->cur_pkt.pts = AV_NOPTS_VALUE;
833 s->cur_pkt.dts = AV_NOPTS_VALUE;
834 /* increment read pointer */
838 /* return packet if any */
841 pkt->pos = s->cur_pkt.pos; // Isn't quite accurate but close.
843 pkt->stream_index = st->index;
844 pkt->pts = st->parser->pts;
845 pkt->dts = st->parser->dts;
846 pkt->destruct = av_destruct_packet_nofree;
847 compute_pkt_fields(s, st, st->parser, pkt);
849 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
850 ff_reduce_index(s, st->index);
851 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
852 0, 0, AVINDEX_KEYFRAME);
859 av_free_packet(&s->cur_pkt);
863 /* read next packet */
864 ret = av_read_packet(s, &s->cur_pkt);
866 if (ret == AVERROR(EAGAIN))
868 /* return the last frames, if any */
869 for(i = 0; i < s->nb_streams; i++) {
871 if (st->parser && st->need_parsing) {
872 av_parser_parse(st->parser, st->codec,
873 &pkt->data, &pkt->size,
875 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
880 /* no more packets: really terminate parsing */
884 if(s->cur_pkt.pts != AV_NOPTS_VALUE &&
885 s->cur_pkt.dts != AV_NOPTS_VALUE &&
886 s->cur_pkt.pts < s->cur_pkt.dts){
887 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
888 s->cur_pkt.stream_index,
892 // av_free_packet(&s->cur_pkt);
896 st = s->streams[s->cur_pkt.stream_index];
897 if(s->debug & FF_FDEBUG_TS)
898 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
899 s->cur_pkt.stream_index,
905 s->cur_ptr = s->cur_pkt.data;
906 s->cur_len = s->cur_pkt.size;
907 if (st->need_parsing && !st->parser) {
908 st->parser = av_parser_init(st->codec->codec_id);
910 /* no parser available: just output the raw packets */
911 st->need_parsing = AVSTREAM_PARSE_NONE;
912 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
913 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
915 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
916 st->parser->next_frame_offset=
917 st->parser->cur_offset= s->cur_pkt.pos;
922 if(s->debug & FF_FDEBUG_TS)
923 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
932 static AVPacket *add_to_pktbuf(AVFormatContext *s, AVPacket *pkt){
933 AVPacketList *pktl= s->packet_buffer;
934 AVPacketList **plast_pktl= &s->packet_buffer;
936 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
938 pktl = av_mallocz(sizeof(AVPacketList));
942 /* add the packet in the buffered packet list */
948 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
952 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
955 pktl = s->packet_buffer;
957 AVPacket *next_pkt= &pktl->pkt;
959 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
960 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
961 if( pktl->pkt.stream_index == next_pkt->stream_index
962 && next_pkt->dts < pktl->pkt.dts
963 && pktl->pkt.pts != pktl->pkt.dts //not b frame
964 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
965 next_pkt->pts= pktl->pkt.dts;
969 pktl = s->packet_buffer;
972 if( next_pkt->pts != AV_NOPTS_VALUE
973 || next_pkt->dts == AV_NOPTS_VALUE
975 /* read packet from packet buffer, if there is data */
977 s->packet_buffer = pktl->next;
983 int ret= av_read_frame_internal(s, pkt);
985 if(pktl && ret != AVERROR(EAGAIN)){
992 if(av_dup_packet(add_to_pktbuf(s, pkt)) < 0)
993 return AVERROR(ENOMEM);
995 assert(!s->packet_buffer);
996 return av_read_frame_internal(s, pkt);
1001 /* XXX: suppress the packet queue */
1002 static void flush_packet_queue(AVFormatContext *s)
1007 pktl = s->packet_buffer;
1010 s->packet_buffer = pktl->next;
1011 av_free_packet(&pktl->pkt);
1016 /*******************************************************/
1019 int av_find_default_stream_index(AVFormatContext *s)
1021 int first_audio_index = -1;
1025 if (s->nb_streams <= 0)
1027 for(i = 0; i < s->nb_streams; i++) {
1029 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1032 if (first_audio_index < 0 && st->codec->codec_type == CODEC_TYPE_AUDIO)
1033 first_audio_index = i;
1035 return first_audio_index >= 0 ? first_audio_index : 0;
1039 * Flush the frame reader.
1041 static void av_read_frame_flush(AVFormatContext *s)
1046 flush_packet_queue(s);
1048 /* free previous packet */
1050 if (s->cur_st->parser)
1051 av_free_packet(&s->cur_pkt);
1058 /* for each stream, reset read state */
1059 for(i = 0; i < s->nb_streams; i++) {
1063 av_parser_close(st->parser);
1066 st->last_IP_pts = AV_NOPTS_VALUE;
1067 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1071 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1074 for(i = 0; i < s->nb_streams; i++) {
1075 AVStream *st = s->streams[i];
1077 st->cur_dts = av_rescale(timestamp,
1078 st->time_base.den * (int64_t)ref_st->time_base.num,
1079 st->time_base.num * (int64_t)ref_st->time_base.den);
1083 void ff_reduce_index(AVFormatContext *s, int stream_index)
1085 AVStream *st= s->streams[stream_index];
1086 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1088 if((unsigned)st->nb_index_entries >= max_entries){
1090 for(i=0; 2*i<st->nb_index_entries; i++)
1091 st->index_entries[i]= st->index_entries[2*i];
1092 st->nb_index_entries= i;
1096 int av_add_index_entry(AVStream *st,
1097 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1099 AVIndexEntry *entries, *ie;
1102 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1105 entries = av_fast_realloc(st->index_entries,
1106 &st->index_entries_allocated_size,
1107 (st->nb_index_entries + 1) *
1108 sizeof(AVIndexEntry));
1112 st->index_entries= entries;
1114 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1117 index= st->nb_index_entries++;
1118 ie= &entries[index];
1119 assert(index==0 || ie[-1].timestamp < timestamp);
1121 ie= &entries[index];
1122 if(ie->timestamp != timestamp){
1123 if(ie->timestamp <= timestamp)
1125 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1126 st->nb_index_entries++;
1127 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1128 distance= ie->min_distance;
1132 ie->timestamp = timestamp;
1133 ie->min_distance= distance;
1140 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1143 AVIndexEntry *entries= st->index_entries;
1144 int nb_entries= st->nb_index_entries;
1153 timestamp = entries[m].timestamp;
1154 if(timestamp >= wanted_timestamp)
1156 if(timestamp <= wanted_timestamp)
1159 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1161 if(!(flags & AVSEEK_FLAG_ANY)){
1162 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1163 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1174 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1175 AVInputFormat *avif= s->iformat;
1176 int64_t pos_min, pos_max, pos, pos_limit;
1177 int64_t ts_min, ts_max, ts;
1181 if (stream_index < 0)
1185 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1189 ts_min= AV_NOPTS_VALUE;
1190 pos_limit= -1; //gcc falsely says it may be uninitialized
1192 st= s->streams[stream_index];
1193 if(st->index_entries){
1196 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()
1197 index= FFMAX(index, 0);
1198 e= &st->index_entries[index];
1200 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1202 ts_min= e->timestamp;
1204 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1211 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1212 assert(index < st->nb_index_entries);
1214 e= &st->index_entries[index];
1215 assert(e->timestamp >= target_ts);
1217 ts_max= e->timestamp;
1218 pos_limit= pos_max - e->min_distance;
1220 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1221 pos_max,pos_limit, ts_max);
1226 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1231 url_fseek(s->pb, pos, SEEK_SET);
1233 av_update_cur_dts(s, st, ts);
1238 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 )){
1240 int64_t start_pos, filesize;
1244 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1247 if(ts_min == AV_NOPTS_VALUE){
1248 pos_min = s->data_offset;
1249 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1250 if (ts_min == AV_NOPTS_VALUE)
1254 if(ts_max == AV_NOPTS_VALUE){
1256 filesize = url_fsize(s->pb);
1257 pos_max = filesize - 1;
1260 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1262 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1263 if (ts_max == AV_NOPTS_VALUE)
1267 int64_t tmp_pos= pos_max + 1;
1268 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1269 if(tmp_ts == AV_NOPTS_VALUE)
1273 if(tmp_pos >= filesize)
1279 if(ts_min > ts_max){
1281 }else if(ts_min == ts_max){
1286 while (pos_min < pos_limit) {
1288 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1292 assert(pos_limit <= pos_max);
1295 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1296 // interpolate position (better than dichotomy)
1297 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1298 + pos_min - approximate_keyframe_distance;
1299 }else if(no_change==1){
1300 // bisection, if interpolation failed to change min or max pos last time
1301 pos = (pos_min + pos_limit)>>1;
1303 /* linear search if bisection failed, can only happen if there
1304 are very few or no keyframes between min/max */
1309 else if(pos > pos_limit)
1313 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1319 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);
1321 if(ts == AV_NOPTS_VALUE){
1322 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1325 assert(ts != AV_NOPTS_VALUE);
1326 if (target_ts <= ts) {
1327 pos_limit = start_pos - 1;
1331 if (target_ts >= ts) {
1337 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1338 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1341 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1343 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1344 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1345 pos, ts_min, target_ts, ts_max);
1351 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1352 int64_t pos_min, pos_max;
1356 if (stream_index < 0)
1359 st= s->streams[stream_index];
1362 pos_min = s->data_offset;
1363 pos_max = url_fsize(s->pb) - 1;
1365 if (pos < pos_min) pos= pos_min;
1366 else if(pos > pos_max) pos= pos_max;
1368 url_fseek(s->pb, pos, SEEK_SET);
1371 av_update_cur_dts(s, st, ts);
1376 static int av_seek_frame_generic(AVFormatContext *s,
1377 int stream_index, int64_t timestamp, int flags)
1383 st = s->streams[stream_index];
1385 index = av_index_search_timestamp(st, timestamp, flags);
1387 if(index < 0 || index==st->nb_index_entries-1){
1391 if(st->nb_index_entries){
1392 assert(st->index_entries);
1393 ie= &st->index_entries[st->nb_index_entries-1];
1394 url_fseek(s->pb, ie->pos, SEEK_SET);
1395 av_update_cur_dts(s, st, ie->timestamp);
1397 url_fseek(s->pb, 0, SEEK_SET);
1400 int ret = av_read_frame(s, &pkt);
1403 av_free_packet(&pkt);
1404 if(stream_index == pkt.stream_index){
1405 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1409 index = av_index_search_timestamp(st, timestamp, flags);
1414 av_read_frame_flush(s);
1415 if (s->iformat->read_seek){
1416 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1419 ie = &st->index_entries[index];
1420 url_fseek(s->pb, ie->pos, SEEK_SET);
1422 av_update_cur_dts(s, st, ie->timestamp);
1427 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1432 av_read_frame_flush(s);
1434 if(flags & AVSEEK_FLAG_BYTE)
1435 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1437 if(stream_index < 0){
1438 stream_index= av_find_default_stream_index(s);
1439 if(stream_index < 0)
1442 st= s->streams[stream_index];
1443 /* timestamp for default must be expressed in AV_TIME_BASE units */
1444 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1446 st= s->streams[stream_index];
1448 /* first, we try the format specific seek */
1449 if (s->iformat->read_seek)
1450 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1457 if(s->iformat->read_timestamp)
1458 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1460 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1463 /*******************************************************/
1466 * Returns TRUE if the stream has accurate duration in any stream.
1468 * @return TRUE if the stream has accurate duration for at least one component.
1470 static int av_has_duration(AVFormatContext *ic)
1475 for(i = 0;i < ic->nb_streams; i++) {
1476 st = ic->streams[i];
1477 if (st->duration != AV_NOPTS_VALUE)
1484 * Estimate the stream timings from the one of each components.
1486 * Also computes the global bitrate if possible.
1488 static void av_update_stream_timings(AVFormatContext *ic)
1490 int64_t start_time, start_time1, end_time, end_time1;
1491 int64_t duration, duration1;
1495 start_time = INT64_MAX;
1496 end_time = INT64_MIN;
1497 duration = INT64_MIN;
1498 for(i = 0;i < ic->nb_streams; i++) {
1499 st = ic->streams[i];
1500 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1501 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1502 if (start_time1 < start_time)
1503 start_time = start_time1;
1504 if (st->duration != AV_NOPTS_VALUE) {
1505 end_time1 = start_time1
1506 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1507 if (end_time1 > end_time)
1508 end_time = end_time1;
1511 if (st->duration != AV_NOPTS_VALUE) {
1512 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1513 if (duration1 > duration)
1514 duration = duration1;
1517 if (start_time != INT64_MAX) {
1518 ic->start_time = start_time;
1519 if (end_time != INT64_MIN) {
1520 if (end_time - start_time > duration)
1521 duration = end_time - start_time;
1524 if (duration != INT64_MIN) {
1525 ic->duration = duration;
1526 if (ic->file_size > 0) {
1527 /* compute the bitrate */
1528 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1529 (double)ic->duration;
1534 static void fill_all_stream_timings(AVFormatContext *ic)
1539 av_update_stream_timings(ic);
1540 for(i = 0;i < ic->nb_streams; i++) {
1541 st = ic->streams[i];
1542 if (st->start_time == AV_NOPTS_VALUE) {
1543 if(ic->start_time != AV_NOPTS_VALUE)
1544 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1545 if(ic->duration != AV_NOPTS_VALUE)
1546 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1551 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1553 int64_t filesize, duration;
1557 /* if bit_rate is already set, we believe it */
1558 if (ic->bit_rate == 0) {
1560 for(i=0;i<ic->nb_streams;i++) {
1561 st = ic->streams[i];
1562 bit_rate += st->codec->bit_rate;
1564 ic->bit_rate = bit_rate;
1567 /* if duration is already set, we believe it */
1568 if (ic->duration == AV_NOPTS_VALUE &&
1569 ic->bit_rate != 0 &&
1570 ic->file_size != 0) {
1571 filesize = ic->file_size;
1573 for(i = 0; i < ic->nb_streams; i++) {
1574 st = ic->streams[i];
1575 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1576 if (st->duration == AV_NOPTS_VALUE)
1577 st->duration = duration;
1583 #define DURATION_MAX_READ_SIZE 250000
1585 /* only usable for MPEG-PS streams */
1586 static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offset)
1588 AVPacket pkt1, *pkt = &pkt1;
1590 int read_size, i, ret;
1592 int64_t filesize, offset, duration;
1594 /* free previous packet */
1595 if (ic->cur_st && ic->cur_st->parser)
1596 av_free_packet(&ic->cur_pkt);
1599 /* flush packet queue */
1600 flush_packet_queue(ic);
1602 for(i=0;i<ic->nb_streams;i++) {
1603 st = ic->streams[i];
1605 av_parser_close(st->parser);
1610 /* we read the first packets to get the first PTS (not fully
1611 accurate, but it is enough now) */
1612 url_fseek(ic->pb, 0, SEEK_SET);
1615 if (read_size >= DURATION_MAX_READ_SIZE)
1617 /* if all info is available, we can stop */
1618 for(i = 0;i < ic->nb_streams; i++) {
1619 st = ic->streams[i];
1620 if (st->start_time == AV_NOPTS_VALUE)
1623 if (i == ic->nb_streams)
1626 ret = av_read_packet(ic, pkt);
1629 read_size += pkt->size;
1630 st = ic->streams[pkt->stream_index];
1631 if (pkt->pts != AV_NOPTS_VALUE) {
1632 if (st->start_time == AV_NOPTS_VALUE)
1633 st->start_time = pkt->pts;
1635 av_free_packet(pkt);
1638 /* estimate the end time (duration) */
1639 /* XXX: may need to support wrapping */
1640 filesize = ic->file_size;
1641 offset = filesize - DURATION_MAX_READ_SIZE;
1645 url_fseek(ic->pb, offset, SEEK_SET);
1648 if (read_size >= DURATION_MAX_READ_SIZE)
1651 ret = av_read_packet(ic, pkt);
1654 read_size += pkt->size;
1655 st = ic->streams[pkt->stream_index];
1656 if (pkt->pts != AV_NOPTS_VALUE &&
1657 st->start_time != AV_NOPTS_VALUE) {
1658 end_time = pkt->pts;
1659 duration = end_time - st->start_time;
1661 if (st->duration == AV_NOPTS_VALUE ||
1662 st->duration < duration)
1663 st->duration = duration;
1666 av_free_packet(pkt);
1669 fill_all_stream_timings(ic);
1671 url_fseek(ic->pb, old_offset, SEEK_SET);
1672 for(i=0; i<ic->nb_streams; i++){
1674 st->cur_dts= st->first_dts;
1675 st->last_IP_pts = AV_NOPTS_VALUE;
1679 static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
1683 /* get the file size, if possible */
1684 if (ic->iformat->flags & AVFMT_NOFILE) {
1687 file_size = url_fsize(ic->pb);
1691 ic->file_size = file_size;
1693 if ((!strcmp(ic->iformat->name, "mpeg") ||
1694 !strcmp(ic->iformat->name, "mpegts")) &&
1695 file_size && !url_is_streamed(ic->pb)) {
1696 /* get accurate estimate from the PTSes */
1697 av_estimate_timings_from_pts(ic, old_offset);
1698 } else if (av_has_duration(ic)) {
1699 /* at least one component has timings - we use them for all
1701 fill_all_stream_timings(ic);
1703 /* less precise: use bitrate info */
1704 av_estimate_timings_from_bit_rate(ic);
1706 av_update_stream_timings(ic);
1712 for(i = 0;i < ic->nb_streams; i++) {
1713 st = ic->streams[i];
1714 printf("%d: start_time: %0.3f duration: %0.3f\n",
1715 i, (double)st->start_time / AV_TIME_BASE,
1716 (double)st->duration / AV_TIME_BASE);
1718 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1719 (double)ic->start_time / AV_TIME_BASE,
1720 (double)ic->duration / AV_TIME_BASE,
1721 ic->bit_rate / 1000);
1726 static int has_codec_parameters(AVCodecContext *enc)
1729 switch(enc->codec_type) {
1730 case CODEC_TYPE_AUDIO:
1731 val = enc->sample_rate && enc->channels;
1733 case CODEC_TYPE_VIDEO:
1734 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1740 return enc->codec_id != CODEC_ID_NONE && val != 0;
1743 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1747 int got_picture, data_size, ret=0;
1750 if(!st->codec->codec){
1751 codec = avcodec_find_decoder(st->codec->codec_id);
1754 ret = avcodec_open(st->codec, codec);
1759 if(!has_codec_parameters(st->codec)){
1760 switch(st->codec->codec_type) {
1761 case CODEC_TYPE_VIDEO:
1762 ret = avcodec_decode_video(st->codec, &picture,
1763 &got_picture, data, size);
1765 case CODEC_TYPE_AUDIO:
1766 data_size = FFMAX(size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1767 samples = av_malloc(data_size);
1770 ret = avcodec_decode_audio2(st->codec, samples,
1771 &data_size, data, size);
1782 static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score)
1785 fmt = av_probe_input_format2(pd, 1, &score);
1788 if (strncmp(fmt->name, "mp3", 3) == 0)
1789 st->codec->codec_id = CODEC_ID_MP3;
1790 else if (strncmp(fmt->name, "ac3", 3) == 0)
1791 st->codec->codec_id = CODEC_ID_AC3;
1796 unsigned int codec_get_tag(const AVCodecTag *tags, int id)
1798 while (tags->id != CODEC_ID_NONE) {
1806 enum CodecID codec_get_id(const AVCodecTag *tags, unsigned int tag)
1809 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1810 if(tag == tags[i].tag)
1813 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1814 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1815 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1816 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1817 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1820 return CODEC_ID_NONE;
1823 unsigned int av_codec_get_tag(const AVCodecTag *tags[4], enum CodecID id)
1826 for(i=0; tags && tags[i]; i++){
1827 int tag= codec_get_tag(tags[i], id);
1833 enum CodecID av_codec_get_id(const AVCodecTag *tags[4], unsigned int tag)
1836 for(i=0; tags && tags[i]; i++){
1837 enum CodecID id= codec_get_id(tags[i], tag);
1838 if(id!=CODEC_ID_NONE) return id;
1840 return CODEC_ID_NONE;
1843 static void compute_chapters_end(AVFormatContext *s)
1847 for (i=0; i+1<s->nb_chapters; i++)
1848 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
1849 assert(s->chapters[i]->start <= s->chapters[i+1]->start);
1850 assert(!av_cmp_q(s->chapters[i]->time_base, s->chapters[i+1]->time_base));
1851 s->chapters[i]->end = s->chapters[i+1]->start;
1854 if (s->nb_chapters && s->chapters[i]->end == AV_NOPTS_VALUE) {
1855 assert(s->start_time != AV_NOPTS_VALUE);
1856 assert(s->duration > 0);
1857 s->chapters[i]->end = av_rescale_q(s->start_time + s->duration,
1859 s->chapters[i]->time_base);
1863 /* absolute maximum size we read until we abort */
1864 #define MAX_READ_SIZE 5000000
1866 #define MAX_STD_TIMEBASES (60*12+5)
1867 static int get_std_framerate(int i){
1868 if(i<60*12) return i*1001;
1869 else return ((int[]){24,30,60,12,15})[i-60*12]*1000*12;
1873 * Is the time base unreliable.
1874 * This is a heuristic to balance between quick acceptance of the values in
1875 * the headers vs. some extra checks.
1876 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
1877 * MPEG-2 commonly misuses field repeat flags to store different framerates.
1878 * And there are "variable" fps files this needs to detect as well.
1880 static int tb_unreliable(AVCodecContext *c){
1881 if( c->time_base.den >= 101L*c->time_base.num
1882 || c->time_base.den < 5L*c->time_base.num
1883 /* || c->codec_tag == ff_get_fourcc("DIVX")
1884 || c->codec_tag == ff_get_fourcc("XVID")*/
1885 || c->codec_id == CODEC_ID_MPEG2VIDEO)
1890 int av_find_stream_info(AVFormatContext *ic)
1892 int i, count, ret, read_size, j;
1894 AVPacket pkt1, *pkt;
1895 int64_t last_dts[MAX_STREAMS];
1896 int duration_count[MAX_STREAMS]={0};
1897 double (*duration_error)[MAX_STD_TIMEBASES];
1898 offset_t old_offset = url_ftell(ic->pb);
1899 int64_t codec_info_duration[MAX_STREAMS]={0};
1900 int codec_info_nb_frames[MAX_STREAMS]={0};
1901 AVProbeData probe_data[MAX_STREAMS];
1902 int codec_identified[MAX_STREAMS]={0};
1904 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
1905 if (!duration_error) return AVERROR(ENOMEM);
1907 for(i=0;i<ic->nb_streams;i++) {
1908 st = ic->streams[i];
1909 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1910 /* if(!st->time_base.num)
1912 if(!st->codec->time_base.num)
1913 st->codec->time_base= st->time_base;
1915 //only for the split stuff
1917 st->parser = av_parser_init(st->codec->codec_id);
1918 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
1919 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1924 for(i=0;i<MAX_STREAMS;i++){
1925 last_dts[i]= AV_NOPTS_VALUE;
1928 memset(probe_data, 0, sizeof(probe_data));
1932 /* check if one codec still needs to be handled */
1933 for(i=0;i<ic->nb_streams;i++) {
1934 st = ic->streams[i];
1935 if (!has_codec_parameters(st->codec))
1937 /* variable fps and no guess at the real fps */
1938 if( tb_unreliable(st->codec)
1939 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1941 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1943 if(st->first_dts == AV_NOPTS_VALUE)
1946 if (i == ic->nb_streams) {
1947 /* NOTE: if the format has no header, then we need to read
1948 some packets to get most of the streams, so we cannot
1950 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1951 /* if we found the info for all the codecs, we can stop */
1956 /* we did not get all the codec info, but we read too much data */
1957 if (read_size >= MAX_READ_SIZE) {
1962 /* NOTE: a new stream can be added there if no header in file
1963 (AVFMTCTX_NOHEADER) */
1964 ret = av_read_frame_internal(ic, &pkt1);
1967 ret = -1; /* we could not have all the codec parameters before EOF */
1968 for(i=0;i<ic->nb_streams;i++) {
1969 st = ic->streams[i];
1970 if (!has_codec_parameters(st->codec)){
1972 avcodec_string(buf, sizeof(buf), st->codec, 0);
1973 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
1981 pkt= add_to_pktbuf(ic, &pkt1);
1982 if(av_dup_packet(pkt) < 0)
1983 return AVERROR(ENOMEM);
1985 read_size += pkt->size;
1987 st = ic->streams[pkt->stream_index];
1988 if(codec_info_nb_frames[st->index]>1)
1989 codec_info_duration[st->index] += pkt->duration;
1990 if (pkt->duration != 0)
1991 codec_info_nb_frames[st->index]++;
1994 int index= pkt->stream_index;
1995 int64_t last= last_dts[index];
1996 int64_t duration= pkt->dts - last;
1998 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
1999 double dur= duration * av_q2d(st->time_base);
2001 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2002 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2003 if(duration_count[index] < 2)
2004 memset(duration_error[index], 0, sizeof(*duration_error));
2005 for(i=1; i<MAX_STD_TIMEBASES; i++){
2006 int framerate= get_std_framerate(i);
2007 int ticks= lrintf(dur*framerate/(1001*12));
2008 double error= dur - ticks*1001*12/(double)framerate;
2009 duration_error[index][i] += error*error;
2011 duration_count[index]++;
2013 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
2014 last_dts[pkt->stream_index]= pkt->dts;
2016 if (st->codec->codec_id == CODEC_ID_NONE) {
2017 AVProbeData *pd = &(probe_data[st->index]);
2018 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
2019 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
2020 pd->buf_size += pkt->size;
2021 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
2024 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2025 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2027 st->codec->extradata_size= i;
2028 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2029 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2030 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2034 /* if still no information, we try to open the codec and to
2035 decompress the frame. We try to avoid that in most cases as
2036 it takes longer and uses more memory. For MPEG-4, we need to
2037 decompress for QuickTime. */
2038 if (!has_codec_parameters(st->codec) /*&&
2039 (st->codec->codec_id == CODEC_ID_FLV1 ||
2040 st->codec->codec_id == CODEC_ID_H264 ||
2041 st->codec->codec_id == CODEC_ID_H263 ||
2042 st->codec->codec_id == CODEC_ID_H261 ||
2043 st->codec->codec_id == CODEC_ID_VORBIS ||
2044 st->codec->codec_id == CODEC_ID_MJPEG ||
2045 st->codec->codec_id == CODEC_ID_PNG ||
2046 st->codec->codec_id == CODEC_ID_PAM ||
2047 st->codec->codec_id == CODEC_ID_PGM ||
2048 st->codec->codec_id == CODEC_ID_PGMYUV ||
2049 st->codec->codec_id == CODEC_ID_PBM ||
2050 st->codec->codec_id == CODEC_ID_PPM ||
2051 st->codec->codec_id == CODEC_ID_SHORTEN ||
2052 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
2053 try_decode_frame(st, pkt->data, pkt->size);
2055 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) {
2061 // close codecs which were opened in try_decode_frame()
2062 for(i=0;i<ic->nb_streams;i++) {
2063 st = ic->streams[i];
2064 if(st->codec->codec)
2065 avcodec_close(st->codec);
2067 for(i=0;i<ic->nb_streams;i++) {
2068 st = ic->streams[i];
2069 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2070 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
2071 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2073 if(duration_count[i]
2074 && tb_unreliable(st->codec) /*&&
2075 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2076 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2077 double best_error= 2*av_q2d(st->time_base);
2078 best_error= best_error*best_error*duration_count[i]*1000*12*30;
2080 for(j=1; j<MAX_STD_TIMEBASES; j++){
2081 double error= duration_error[i][j] * get_std_framerate(j);
2082 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2083 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2084 if(error < best_error){
2086 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, get_std_framerate(j), 12*1001, INT_MAX);
2091 if (!st->r_frame_rate.num){
2092 if( st->codec->time_base.den * (int64_t)st->time_base.num
2093 <= st->codec->time_base.num * (int64_t)st->time_base.den){
2094 st->r_frame_rate.num = st->codec->time_base.den;
2095 st->r_frame_rate.den = st->codec->time_base.num;
2097 st->r_frame_rate.num = st->time_base.den;
2098 st->r_frame_rate.den = st->time_base.num;
2101 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
2102 if (st->codec->codec_id == CODEC_ID_NONE && probe_data[st->index].buf_size > 0) {
2103 codec_identified[st->index] = set_codec_from_probe_data(st, &(probe_data[st->index]), 1);
2104 if (codec_identified[st->index]) {
2105 st->need_parsing = AVSTREAM_PARSE_FULL;
2108 if(!st->codec->bits_per_sample)
2109 st->codec->bits_per_sample= av_get_bits_per_sample(st->codec->codec_id);
2113 av_estimate_timings(ic, old_offset);
2115 for(i=0;i<ic->nb_streams;i++) {
2116 st = ic->streams[i];
2117 if (codec_identified[st->index])
2120 //FIXME this is a mess
2121 if(i!=ic->nb_streams){
2122 av_read_frame_flush(ic);
2123 for(i=0;i<ic->nb_streams;i++) {
2124 st = ic->streams[i];
2125 if (codec_identified[st->index]) {
2126 av_seek_frame(ic, st->index, 0.0, 0);
2128 st->cur_dts= st->first_dts;
2130 url_fseek(ic->pb, ic->data_offset, SEEK_SET);
2133 compute_chapters_end(ic);
2136 /* correct DTS for B-frame streams with no timestamps */
2137 for(i=0;i<ic->nb_streams;i++) {
2138 st = ic->streams[i];
2139 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2141 ppktl = &ic->packet_buffer;
2143 if(ppkt1->stream_index != i)
2145 if(ppkt1->pkt->dts < 0)
2147 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2149 ppkt1->pkt->dts -= delta;
2154 st->cur_dts -= delta;
2160 av_free(duration_error);
2161 for(i=0;i<MAX_STREAMS;i++){
2162 av_freep(&(probe_data[i].buf));
2168 /*******************************************************/
2170 int av_read_play(AVFormatContext *s)
2172 if (s->iformat->read_play)
2173 return s->iformat->read_play(s);
2175 return av_url_read_fpause(s->pb, 0);
2176 return AVERROR(ENOSYS);
2179 int av_read_pause(AVFormatContext *s)
2181 if (s->iformat->read_pause)
2182 return s->iformat->read_pause(s);
2184 return av_url_read_fpause(s->pb, 1);
2185 return AVERROR(ENOSYS);
2188 void av_close_input_stream(AVFormatContext *s)
2193 /* free previous packet */
2194 if (s->cur_st && s->cur_st->parser)
2195 av_free_packet(&s->cur_pkt);
2197 if (s->iformat->read_close)
2198 s->iformat->read_close(s);
2199 for(i=0;i<s->nb_streams;i++) {
2200 /* free all data in a stream component */
2203 av_parser_close(st->parser);
2205 av_free(st->index_entries);
2206 av_free(st->codec->extradata);
2208 av_free(st->filename);
2209 av_free(st->priv_data);
2212 for(i=s->nb_programs-1; i>=0; i--) {
2213 av_freep(&s->programs[i]->provider_name);
2214 av_freep(&s->programs[i]->name);
2215 av_freep(&s->programs[i]->stream_index);
2216 av_freep(&s->programs[i]);
2218 av_freep(&s->programs);
2219 flush_packet_queue(s);
2220 av_freep(&s->priv_data);
2221 while(s->nb_chapters--) {
2222 av_free(s->chapters[s->nb_chapters]->title);
2223 av_free(s->chapters[s->nb_chapters]);
2225 av_freep(&s->chapters);
2229 void av_close_input_file(AVFormatContext *s)
2231 ByteIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2232 av_close_input_stream(s);
2237 AVStream *av_new_stream(AVFormatContext *s, int id)
2242 if (s->nb_streams >= MAX_STREAMS)
2245 st = av_mallocz(sizeof(AVStream));
2249 st->codec= avcodec_alloc_context();
2251 /* no default bitrate if decoding */
2252 st->codec->bit_rate = 0;
2254 st->index = s->nb_streams;
2256 st->start_time = AV_NOPTS_VALUE;
2257 st->duration = AV_NOPTS_VALUE;
2258 st->cur_dts = AV_NOPTS_VALUE;
2259 st->first_dts = AV_NOPTS_VALUE;
2261 /* default pts setting is MPEG-like */
2262 av_set_pts_info(st, 33, 1, 90000);
2263 st->last_IP_pts = AV_NOPTS_VALUE;
2264 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2265 st->pts_buffer[i]= AV_NOPTS_VALUE;
2267 s->streams[s->nb_streams++] = st;
2271 AVProgram *av_new_program(AVFormatContext *ac, int id)
2273 AVProgram *program=NULL;
2277 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2280 for(i=0; i<ac->nb_programs; i++)
2281 if(ac->programs[i]->id == id)
2282 program = ac->programs[i];
2285 program = av_mallocz(sizeof(AVProgram));
2288 dynarray_add(&ac->programs, &ac->nb_programs, program);
2289 program->discard = AVDISCARD_NONE;
2296 void av_set_program_name(AVProgram *program, char *provider_name, char *name)
2298 assert(!provider_name == !name);
2300 av_free(program->provider_name);
2301 av_free(program-> name);
2302 program->provider_name = av_strdup(provider_name);
2303 program-> name = av_strdup( name);
2307 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2309 AVChapter *chapter = NULL;
2312 for(i=0; i<s->nb_chapters; i++)
2313 if(s->chapters[i]->id == id)
2314 chapter = s->chapters[i];
2317 chapter= av_mallocz(sizeof(AVChapter));
2320 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2322 av_free(chapter->title);
2323 chapter->title = av_strdup(title);
2325 chapter->time_base= time_base;
2326 chapter->start = start;
2332 /************************************************************/
2333 /* output media file */
2335 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2339 if (s->oformat->priv_data_size > 0) {
2340 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2342 return AVERROR(ENOMEM);
2344 s->priv_data = NULL;
2346 if (s->oformat->set_parameters) {
2347 ret = s->oformat->set_parameters(s, ap);
2354 int av_write_header(AVFormatContext *s)
2359 // some sanity checks
2360 for(i=0;i<s->nb_streams;i++) {
2363 switch (st->codec->codec_type) {
2364 case CODEC_TYPE_AUDIO:
2365 if(st->codec->sample_rate<=0){
2366 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2370 case CODEC_TYPE_VIDEO:
2371 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2372 av_log(s, AV_LOG_ERROR, "time base not set\n");
2375 if(st->codec->width<=0 || st->codec->height<=0){
2376 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2382 if(s->oformat->codec_tag){
2383 if(st->codec->codec_tag){
2385 //check that tag + id is in the table
2386 //if neither is in the table -> OK
2387 //if tag is in the table with another id -> FAIL
2388 //if id is in the table with another tag -> FAIL unless strict < ?
2390 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2394 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2395 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2397 return AVERROR(ENOMEM);
2400 if(s->oformat->write_header){
2401 ret = s->oformat->write_header(s);
2406 /* init PTS generation */
2407 for(i=0;i<s->nb_streams;i++) {
2408 int64_t den = AV_NOPTS_VALUE;
2411 switch (st->codec->codec_type) {
2412 case CODEC_TYPE_AUDIO:
2413 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2415 case CODEC_TYPE_VIDEO:
2416 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2421 if (den != AV_NOPTS_VALUE) {
2423 return AVERROR_INVALIDDATA;
2424 av_frac_init(&st->pts, 0, 0, den);
2430 //FIXME merge with compute_pkt_fields
2431 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2432 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2433 int num, den, frame_size, i;
2435 // 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);
2437 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2440 /* duration field */
2441 if (pkt->duration == 0) {
2442 compute_frame_duration(&num, &den, st, NULL, pkt);
2444 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2448 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2451 //XXX/FIXME this is a temporary hack until all encoders output pts
2452 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2454 // pkt->pts= st->cur_dts;
2455 pkt->pts= st->pts.val;
2458 //calculate dts from pts
2459 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2460 st->pts_buffer[0]= pkt->pts;
2461 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2462 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2463 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2464 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2466 pkt->dts= st->pts_buffer[0];
2469 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2470 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2473 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2474 av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n");
2478 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2479 st->cur_dts= pkt->dts;
2480 st->pts.val= pkt->dts;
2483 switch (st->codec->codec_type) {
2484 case CODEC_TYPE_AUDIO:
2485 frame_size = get_audio_frame_size(st->codec, pkt->size);
2487 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2488 likely equal to the encoder delay, but it would be better if we
2489 had the real timestamps from the encoder */
2490 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2491 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2494 case CODEC_TYPE_VIDEO:
2495 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2503 static void truncate_ts(AVStream *st, AVPacket *pkt){
2504 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2507 // pkt->dts= 0; //this happens for low_delay=0 and B-frames, FIXME, needs further investigation about what we should do here
2509 if (pkt->pts != AV_NOPTS_VALUE)
2510 pkt->pts &= pts_mask;
2511 if (pkt->dts != AV_NOPTS_VALUE)
2512 pkt->dts &= pts_mask;
2515 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2517 int ret = compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2519 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2522 truncate_ts(s->streams[pkt->stream_index], pkt);
2524 ret= s->oformat->write_packet(s, pkt);
2526 ret= url_ferror(s->pb);
2530 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2531 AVPacketList *pktl, **next_point, *this_pktl;
2533 int streams[MAX_STREAMS];
2536 AVStream *st= s->streams[ pkt->stream_index];
2538 // assert(pkt->destruct != av_destruct_packet); //FIXME
2540 this_pktl = av_mallocz(sizeof(AVPacketList));
2541 this_pktl->pkt= *pkt;
2542 if(pkt->destruct == av_destruct_packet)
2543 pkt->destruct= NULL; // not shared -> must keep original from being freed
2545 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2547 next_point = &s->packet_buffer;
2549 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2550 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2551 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2552 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2554 next_point= &(*next_point)->next;
2556 this_pktl->next= *next_point;
2557 *next_point= this_pktl;
2560 memset(streams, 0, sizeof(streams));
2561 pktl= s->packet_buffer;
2563 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2564 if(streams[ pktl->pkt.stream_index ] == 0)
2566 streams[ pktl->pkt.stream_index ]++;
2570 if(stream_count && (s->nb_streams == stream_count || flush)){
2571 pktl= s->packet_buffer;
2574 s->packet_buffer= pktl->next;
2578 av_init_packet(out);
2584 * Interleaves an AVPacket correctly so it can be muxed.
2585 * @param out the interleaved packet will be output here
2586 * @param in the input packet
2587 * @param flush 1 if no further packets are available as input and all
2588 * remaining packets should be output
2589 * @return 1 if a packet was output, 0 if no packet could be output,
2590 * < 0 if an error occurred
2592 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2593 if(s->oformat->interleave_packet)
2594 return s->oformat->interleave_packet(s, out, in, flush);
2596 return av_interleave_packet_per_dts(s, out, in, flush);
2599 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2600 AVStream *st= s->streams[ pkt->stream_index];
2602 //FIXME/XXX/HACK drop zero sized packets
2603 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2606 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2607 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2610 if(pkt->dts == AV_NOPTS_VALUE)
2615 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2616 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2619 truncate_ts(s->streams[opkt.stream_index], &opkt);
2620 ret= s->oformat->write_packet(s, &opkt);
2622 av_free_packet(&opkt);
2627 if(url_ferror(s->pb))
2628 return url_ferror(s->pb);
2632 int av_write_trailer(AVFormatContext *s)
2638 ret= av_interleave_packet(s, &pkt, NULL, 1);
2639 if(ret<0) //FIXME cleanup needed for ret<0 ?
2644 truncate_ts(s->streams[pkt.stream_index], &pkt);
2645 ret= s->oformat->write_packet(s, &pkt);
2647 av_free_packet(&pkt);
2651 if(url_ferror(s->pb))
2655 if(s->oformat->write_trailer)
2656 ret = s->oformat->write_trailer(s);
2659 ret=url_ferror(s->pb);
2660 for(i=0;i<s->nb_streams;i++)
2661 av_freep(&s->streams[i]->priv_data);
2662 av_freep(&s->priv_data);
2666 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
2669 AVProgram *program=NULL;
2672 for(i=0; i<ac->nb_programs; i++){
2673 if(ac->programs[i]->id != progid)
2675 program = ac->programs[i];
2676 for(j=0; j<program->nb_stream_indexes; j++)
2677 if(program->stream_index[j] == idx)
2680 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
2683 program->stream_index = tmp;
2684 program->stream_index[program->nb_stream_indexes++] = idx;
2689 /* "user interface" functions */
2690 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
2693 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
2694 AVStream *st = ic->streams[i];
2695 int g = ff_gcd(st->time_base.num, st->time_base.den);
2696 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2697 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2698 /* the pid is an important information, so we display it */
2699 /* XXX: add a generic system */
2700 if (flags & AVFMT_SHOW_IDS)
2701 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2702 if (strlen(st->language) > 0)
2703 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2704 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2705 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2706 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2707 if(st->r_frame_rate.den && st->r_frame_rate.num)
2708 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(r)", av_q2d(st->r_frame_rate));
2709 /* else if(st->time_base.den && st->time_base.num)
2710 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(m)", 1/av_q2d(st->time_base));*/
2712 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(c)", 1/av_q2d(st->codec->time_base));
2714 av_log(NULL, AV_LOG_INFO, "\n");
2717 void dump_format(AVFormatContext *ic,
2724 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2725 is_output ? "Output" : "Input",
2727 is_output ? ic->oformat->name : ic->iformat->name,
2728 is_output ? "to" : "from", url);
2730 av_log(NULL, AV_LOG_INFO, " Duration: ");
2731 if (ic->duration != AV_NOPTS_VALUE) {
2732 int hours, mins, secs, us;
2733 secs = ic->duration / AV_TIME_BASE;
2734 us = ic->duration % AV_TIME_BASE;
2739 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
2740 (100 * us) / AV_TIME_BASE);
2742 av_log(NULL, AV_LOG_INFO, "N/A");
2744 if (ic->start_time != AV_NOPTS_VALUE) {
2746 av_log(NULL, AV_LOG_INFO, ", start: ");
2747 secs = ic->start_time / AV_TIME_BASE;
2748 us = ic->start_time % AV_TIME_BASE;
2749 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2750 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2752 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2754 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2756 av_log(NULL, AV_LOG_INFO, "N/A");
2758 av_log(NULL, AV_LOG_INFO, "\n");
2760 if(ic->nb_programs) {
2762 for(j=0; j<ic->nb_programs; j++) {
2763 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
2764 ic->programs[j]->name ? ic->programs[j]->name : "");
2765 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++)
2766 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
2769 for(i=0;i<ic->nb_streams;i++)
2770 dump_stream_format(ic, i, index, is_output);
2773 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2775 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2778 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2780 AVRational frame_rate;
2781 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2782 *frame_rate_num= frame_rate.num;
2783 *frame_rate_den= frame_rate.den;
2788 * Gets the current time in microseconds.
2790 int64_t av_gettime(void)
2793 gettimeofday(&tv,NULL);
2794 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
2797 int64_t parse_date(const char *datestr, int duration)
2803 static const char *date_fmt[] = {
2807 static const char *time_fmt[] = {
2817 time_t now = time(0);
2819 len = strlen(datestr);
2821 lastch = datestr[len - 1];
2824 is_utc = (lastch == 'z' || lastch == 'Z');
2826 memset(&dt, 0, sizeof(dt));
2831 /* parse the year-month-day part */
2832 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2833 q = small_strptime(p, date_fmt[i], &dt);
2839 /* if the year-month-day part is missing, then take the
2840 * current year-month-day time */
2845 dt = *localtime(&now);
2847 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2852 if (*p == 'T' || *p == 't' || *p == ' ')
2855 /* parse the hour-minute-second part */
2856 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2857 q = small_strptime(p, time_fmt[i], &dt);
2863 /* parse datestr as a duration */
2868 /* parse datestr as HH:MM:SS */
2869 q = small_strptime(p, time_fmt[0], &dt);
2871 /* parse datestr as S+ */
2872 dt.tm_sec = strtol(p, (char **)&q, 10);
2874 /* the parsing didn't succeed */
2881 /* Now we have all the fields that we can get */
2887 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2889 dt.tm_isdst = -1; /* unknown */
2899 /* parse the .m... part */
2903 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2906 val += n * (*q - '0');
2910 return negative ? -t : t;
2913 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2923 while (*p != '\0' && *p != '=' && *p != '&') {
2924 if ((q - tag) < sizeof(tag) - 1)
2932 while (*p != '&' && *p != '\0') {
2933 if ((q - arg) < arg_size - 1) {
2943 if (!strcmp(tag, tag1))
2952 int av_get_frame_filename(char *buf, int buf_size,
2953 const char *path, int number)
2956 char *q, buf1[20], c;
2957 int nd, len, percentd_found;
2969 while (isdigit(*p)) {
2970 nd = nd * 10 + *p++ - '0';
2973 } while (isdigit(c));
2982 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2984 if ((q - buf + len) > buf_size - 1)
2986 memcpy(q, buf1, len);
2994 if ((q - buf) < buf_size - 1)
2998 if (!percentd_found)
3007 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3010 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3012 for(i=0;i<size;i+=16) {
3019 PRINT(" %02x", buf[i+j]);
3024 for(j=0;j<len;j++) {
3026 if (c < ' ' || c > '~')
3035 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3037 hex_dump_internal(NULL, f, 0, buf, size);
3040 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3042 hex_dump_internal(avcl, NULL, level, buf, size);
3045 //FIXME needs to know the time_base
3046 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
3048 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3049 PRINT("stream #%d:\n", pkt->stream_index);
3050 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
3051 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
3052 /* DTS is _always_ valid after av_read_frame() */
3054 if (pkt->dts == AV_NOPTS_VALUE)
3057 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
3058 /* PTS may not be known if B-frames are present. */
3060 if (pkt->pts == AV_NOPTS_VALUE)
3063 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
3065 PRINT(" size=%d\n", pkt->size);
3068 av_hex_dump(f, pkt->data, pkt->size);
3071 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3073 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
3076 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3078 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
3081 void url_split(char *proto, int proto_size,
3082 char *authorization, int authorization_size,
3083 char *hostname, int hostname_size,
3085 char *path, int path_size,
3088 const char *p, *ls, *at, *col, *brk;
3090 if (port_ptr) *port_ptr = -1;
3091 if (proto_size > 0) proto[0] = 0;
3092 if (authorization_size > 0) authorization[0] = 0;
3093 if (hostname_size > 0) hostname[0] = 0;
3094 if (path_size > 0) path[0] = 0;
3096 /* parse protocol */
3097 if ((p = strchr(url, ':'))) {
3098 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3103 /* no protocol means plain filename */
3104 av_strlcpy(path, url, path_size);
3108 /* separate path from hostname */
3109 ls = strchr(p, '/');
3111 ls = strchr(p, '?');
3113 av_strlcpy(path, ls, path_size);
3115 ls = &p[strlen(p)]; // XXX
3117 /* the rest is hostname, use that to parse auth/port */
3119 /* authorization (user[:pass]@hostname) */
3120 if ((at = strchr(p, '@')) && at < ls) {
3121 av_strlcpy(authorization, p,
3122 FFMIN(authorization_size, at + 1 - p));
3123 p = at + 1; /* skip '@' */
3126 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3128 av_strlcpy(hostname, p + 1,
3129 FFMIN(hostname_size, brk - p));
3130 if (brk[1] == ':' && port_ptr)
3131 *port_ptr = atoi(brk + 2);
3132 } else if ((col = strchr(p, ':')) && col < ls) {
3133 av_strlcpy(hostname, p,
3134 FFMIN(col + 1 - p, hostname_size));
3135 if (port_ptr) *port_ptr = atoi(col + 1);
3137 av_strlcpy(hostname, p,
3138 FFMIN(ls + 1 - p, hostname_size));
3142 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3143 int pts_num, int pts_den)
3145 s->pts_wrap_bits = pts_wrap_bits;
3146 s->time_base.num = pts_num;
3147 s->time_base.den = pts_den;
3150 /* fraction handling */
3153 * f = val + (num / den) + 0.5.
3155 * 'num' is normalized so that it is such as 0 <= num < den.
3157 * @param f fractional number
3158 * @param val integer value
3159 * @param num must be >= 0
3160 * @param den must be >= 1
3162 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
3175 * Fractional addition to f: f = f + (incr / f->den).
3177 * @param f fractional number
3178 * @param incr increment, can be positive or negative
3180 static void av_frac_add(AVFrac *f, int64_t incr)
3184 num = f->num + incr;
3187 f->val += num / den;
3193 } else if (num >= den) {
3194 f->val += num / den;