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 if (ic->iformat->read_header) {
398 err = ic->iformat->read_header(ic, ap);
403 if (pb && !ic->data_offset)
404 ic->data_offset = url_ftell(ic->pb);
411 av_freep(&ic->priv_data);
412 for(i=0;i<ic->nb_streams;i++) {
413 AVStream *st = ic->streams[i];
415 av_free(st->priv_data);
416 av_free(st->codec->extradata);
426 /** size of probe buffer, for guessing file type from file contents */
427 #define PROBE_BUF_MIN 2048
428 #define PROBE_BUF_MAX (1<<20)
430 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
433 AVFormatParameters *ap)
436 AVProbeData probe_data, *pd = &probe_data;
437 ByteIOContext *pb = NULL;
441 pd->filename = filename;
446 /* guess format if no file can be opened */
447 fmt = av_probe_input_format(pd, 0);
450 /* Do not open file if the format does not need it. XXX: specific
451 hack needed to handle RTSP/TCP */
452 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
453 /* if no file needed do not try to open one */
454 if ((err=url_fopen(&pb, filename, URL_RDONLY)) < 0) {
458 url_setbufsize(pb, buf_size);
461 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
462 int score= probe_size < PROBE_BUF_MAX ? AVPROBE_SCORE_MAX/4 : 0;
463 /* read probe data */
464 pd->buf= av_realloc(pd->buf, probe_size + AVPROBE_PADDING_SIZE);
465 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
466 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
467 if (url_fseek(pb, 0, SEEK_SET) < 0) {
469 if (url_fopen(&pb, filename, URL_RDONLY) < 0) {
475 /* guess file format */
476 fmt = av_probe_input_format2(pd, 1, &score);
481 /* if still no format found, error */
487 /* check filename in case an image number is expected */
488 if (fmt->flags & AVFMT_NEEDNUMBER) {
489 if (!av_filename_number_test(filename)) {
490 err = AVERROR_NUMEXPECTED;
494 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
507 /*******************************************************/
509 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
514 ret= s->iformat->read_packet(s, pkt);
517 st= s->streams[pkt->stream_index];
519 switch(st->codec->codec_type){
520 case CODEC_TYPE_VIDEO:
521 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
523 case CODEC_TYPE_AUDIO:
524 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
526 case CODEC_TYPE_SUBTITLE:
527 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
534 /**********************************************************/
537 * Get the number of samples of an audio frame. Return -1 on error.
539 static int get_audio_frame_size(AVCodecContext *enc, int size)
543 if(enc->codec_id == CODEC_ID_VORBIS)
546 if (enc->frame_size <= 1) {
547 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
549 if (bits_per_sample) {
550 if (enc->channels == 0)
552 frame_size = (size << 3) / (bits_per_sample * enc->channels);
554 /* used for example by ADPCM codecs */
555 if (enc->bit_rate == 0)
557 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
560 frame_size = enc->frame_size;
567 * Return the frame duration in seconds. Return 0 if not available.
569 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
570 AVCodecParserContext *pc, AVPacket *pkt)
576 switch(st->codec->codec_type) {
577 case CODEC_TYPE_VIDEO:
578 if(st->time_base.num*1000LL > st->time_base.den){
579 *pnum = st->time_base.num;
580 *pden = st->time_base.den;
581 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
582 *pnum = st->codec->time_base.num;
583 *pden = st->codec->time_base.den;
584 if (pc && pc->repeat_pict) {
586 *pnum = (*pnum) * (2 + pc->repeat_pict);
590 case CODEC_TYPE_AUDIO:
591 frame_size = get_audio_frame_size(st->codec, pkt->size);
595 *pden = st->codec->sample_rate;
602 static int is_intra_only(AVCodecContext *enc){
603 if(enc->codec_type == CODEC_TYPE_AUDIO){
605 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
606 switch(enc->codec_id){
608 case CODEC_ID_MJPEGB:
610 case CODEC_ID_RAWVIDEO:
611 case CODEC_ID_DVVIDEO:
612 case CODEC_ID_HUFFYUV:
613 case CODEC_ID_FFVHUFF:
624 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
625 int64_t dts, int64_t pts)
627 AVStream *st= s->streams[stream_index];
628 AVPacketList *pktl= s->packet_buffer;
630 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
633 st->first_dts= dts - st->cur_dts;
636 for(; pktl; pktl= pktl->next){
637 if(pktl->pkt.stream_index != stream_index)
639 //FIXME think more about this check
640 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
641 pktl->pkt.pts += st->first_dts;
643 if(pktl->pkt.dts != AV_NOPTS_VALUE)
644 pktl->pkt.dts += st->first_dts;
646 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
647 st->start_time= pktl->pkt.pts;
649 if (st->start_time == AV_NOPTS_VALUE)
650 st->start_time = pts;
653 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
655 AVPacketList *pktl= s->packet_buffer;
658 if(st->first_dts != AV_NOPTS_VALUE){
659 cur_dts= st->first_dts;
660 for(; pktl; pktl= pktl->next){
661 if(pktl->pkt.stream_index == pkt->stream_index){
662 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
664 cur_dts -= pkt->duration;
667 pktl= s->packet_buffer;
668 st->first_dts = cur_dts;
669 }else if(st->cur_dts)
672 for(; pktl; pktl= pktl->next){
673 if(pktl->pkt.stream_index != pkt->stream_index)
675 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
676 && !pktl->pkt.duration){
677 pktl->pkt.dts= cur_dts;
678 if(!st->codec->has_b_frames)
679 pktl->pkt.pts= cur_dts;
680 cur_dts += pkt->duration;
681 pktl->pkt.duration= pkt->duration;
685 if(st->first_dts == AV_NOPTS_VALUE)
686 st->cur_dts= cur_dts;
689 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
690 AVCodecParserContext *pc, AVPacket *pkt)
692 int num, den, presentation_delayed, delay, i;
695 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
696 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
697 pkt->dts -= 1LL<<st->pts_wrap_bits;
700 if (pkt->duration == 0) {
701 compute_frame_duration(&num, &den, st, pc, pkt);
703 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
705 if(pkt->duration != 0 && s->packet_buffer)
706 update_initial_durations(s, st, pkt);
710 /* correct timestamps with byte offset if demuxers only have timestamps
711 on packet boundaries */
712 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
713 /* this will estimate bitrate based on this frame's duration and size */
714 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
715 if(pkt->pts != AV_NOPTS_VALUE)
717 if(pkt->dts != AV_NOPTS_VALUE)
721 /* do we have a video B-frame ? */
722 delay= st->codec->has_b_frames;
723 presentation_delayed = 0;
724 /* XXX: need has_b_frame, but cannot get it if the codec is
727 pc && pc->pict_type != FF_B_TYPE)
728 presentation_delayed = 1;
729 /* This may be redundant, but it should not hurt. */
730 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
731 presentation_delayed = 1;
733 // 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);
734 /* interpolate PTS and DTS if they are not present */
735 if(delay==0 || (delay==1 && pc)){
736 if (presentation_delayed) {
737 /* DTS = decompression timestamp */
738 /* PTS = presentation timestamp */
739 if (pkt->dts == AV_NOPTS_VALUE)
740 pkt->dts = st->last_IP_pts;
741 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
742 if (pkt->dts == AV_NOPTS_VALUE)
743 pkt->dts = st->cur_dts;
745 /* this is tricky: the dts must be incremented by the duration
746 of the frame we are displaying, i.e. the last I- or P-frame */
747 if (st->last_IP_duration == 0)
748 st->last_IP_duration = pkt->duration;
749 if(pkt->dts != AV_NOPTS_VALUE)
750 st->cur_dts = pkt->dts + st->last_IP_duration;
751 st->last_IP_duration = pkt->duration;
752 st->last_IP_pts= pkt->pts;
753 /* cannot compute PTS if not present (we can compute it only
754 by knowing the future */
755 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
756 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
757 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
758 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
759 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
760 pkt->pts += pkt->duration;
761 // 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);
765 /* presentation is not delayed : PTS and DTS are the same */
766 if(pkt->pts == AV_NOPTS_VALUE)
768 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
769 if(pkt->pts == AV_NOPTS_VALUE)
770 pkt->pts = st->cur_dts;
772 if(pkt->pts != AV_NOPTS_VALUE)
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, flags=%d\n",
899 s->cur_pkt.stream_index,
906 s->cur_ptr = s->cur_pkt.data;
907 s->cur_len = s->cur_pkt.size;
908 if (st->need_parsing && !st->parser) {
909 st->parser = av_parser_init(st->codec->codec_id);
911 /* no parser available: just output the raw packets */
912 st->need_parsing = AVSTREAM_PARSE_NONE;
913 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
914 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
916 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
917 st->parser->next_frame_offset=
918 st->parser->cur_offset= s->cur_pkt.pos;
923 if(s->debug & FF_FDEBUG_TS)
924 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, flags=%d\n",
934 static AVPacket *add_to_pktbuf(AVFormatContext *s, AVPacket *pkt){
935 AVPacketList *pktl= s->packet_buffer;
936 AVPacketList **plast_pktl= &s->packet_buffer;
938 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
940 pktl = av_mallocz(sizeof(AVPacketList));
944 /* add the packet in the buffered packet list */
950 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
954 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
957 pktl = s->packet_buffer;
959 AVPacket *next_pkt= &pktl->pkt;
961 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
962 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
963 if( pktl->pkt.stream_index == next_pkt->stream_index
964 && next_pkt->dts < pktl->pkt.dts
965 && pktl->pkt.pts != pktl->pkt.dts //not b frame
966 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
967 next_pkt->pts= pktl->pkt.dts;
971 pktl = s->packet_buffer;
974 if( next_pkt->pts != AV_NOPTS_VALUE
975 || next_pkt->dts == AV_NOPTS_VALUE
977 /* read packet from packet buffer, if there is data */
979 s->packet_buffer = pktl->next;
985 int ret= av_read_frame_internal(s, pkt);
987 if(pktl && ret != AVERROR(EAGAIN)){
994 if(av_dup_packet(add_to_pktbuf(s, pkt)) < 0)
995 return AVERROR(ENOMEM);
997 assert(!s->packet_buffer);
998 return av_read_frame_internal(s, pkt);
1003 /* XXX: suppress the packet queue */
1004 static void flush_packet_queue(AVFormatContext *s)
1009 pktl = s->packet_buffer;
1012 s->packet_buffer = pktl->next;
1013 av_free_packet(&pktl->pkt);
1018 /*******************************************************/
1021 int av_find_default_stream_index(AVFormatContext *s)
1023 int first_audio_index = -1;
1027 if (s->nb_streams <= 0)
1029 for(i = 0; i < s->nb_streams; i++) {
1031 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1034 if (first_audio_index < 0 && st->codec->codec_type == CODEC_TYPE_AUDIO)
1035 first_audio_index = i;
1037 return first_audio_index >= 0 ? first_audio_index : 0;
1041 * Flush the frame reader.
1043 static void av_read_frame_flush(AVFormatContext *s)
1048 flush_packet_queue(s);
1050 /* free previous packet */
1052 if (s->cur_st->parser)
1053 av_free_packet(&s->cur_pkt);
1060 /* for each stream, reset read state */
1061 for(i = 0; i < s->nb_streams; i++) {
1065 av_parser_close(st->parser);
1068 st->last_IP_pts = AV_NOPTS_VALUE;
1069 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1073 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1076 for(i = 0; i < s->nb_streams; i++) {
1077 AVStream *st = s->streams[i];
1079 st->cur_dts = av_rescale(timestamp,
1080 st->time_base.den * (int64_t)ref_st->time_base.num,
1081 st->time_base.num * (int64_t)ref_st->time_base.den);
1085 void ff_reduce_index(AVFormatContext *s, int stream_index)
1087 AVStream *st= s->streams[stream_index];
1088 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1090 if((unsigned)st->nb_index_entries >= max_entries){
1092 for(i=0; 2*i<st->nb_index_entries; i++)
1093 st->index_entries[i]= st->index_entries[2*i];
1094 st->nb_index_entries= i;
1098 int av_add_index_entry(AVStream *st,
1099 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1101 AVIndexEntry *entries, *ie;
1104 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1107 entries = av_fast_realloc(st->index_entries,
1108 &st->index_entries_allocated_size,
1109 (st->nb_index_entries + 1) *
1110 sizeof(AVIndexEntry));
1114 st->index_entries= entries;
1116 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1119 index= st->nb_index_entries++;
1120 ie= &entries[index];
1121 assert(index==0 || ie[-1].timestamp < timestamp);
1123 ie= &entries[index];
1124 if(ie->timestamp != timestamp){
1125 if(ie->timestamp <= timestamp)
1127 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1128 st->nb_index_entries++;
1129 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1130 distance= ie->min_distance;
1134 ie->timestamp = timestamp;
1135 ie->min_distance= distance;
1142 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1145 AVIndexEntry *entries= st->index_entries;
1146 int nb_entries= st->nb_index_entries;
1155 timestamp = entries[m].timestamp;
1156 if(timestamp >= wanted_timestamp)
1158 if(timestamp <= wanted_timestamp)
1161 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1163 if(!(flags & AVSEEK_FLAG_ANY)){
1164 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1165 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1176 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1177 AVInputFormat *avif= s->iformat;
1178 int64_t pos_min, pos_max, pos, pos_limit;
1179 int64_t ts_min, ts_max, ts;
1183 if (stream_index < 0)
1187 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1191 ts_min= AV_NOPTS_VALUE;
1192 pos_limit= -1; //gcc falsely says it may be uninitialized
1194 st= s->streams[stream_index];
1195 if(st->index_entries){
1198 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()
1199 index= FFMAX(index, 0);
1200 e= &st->index_entries[index];
1202 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1204 ts_min= e->timestamp;
1206 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1213 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1214 assert(index < st->nb_index_entries);
1216 e= &st->index_entries[index];
1217 assert(e->timestamp >= target_ts);
1219 ts_max= e->timestamp;
1220 pos_limit= pos_max - e->min_distance;
1222 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1223 pos_max,pos_limit, ts_max);
1228 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1233 url_fseek(s->pb, pos, SEEK_SET);
1235 av_update_cur_dts(s, st, ts);
1240 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 )){
1242 int64_t start_pos, filesize;
1246 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1249 if(ts_min == AV_NOPTS_VALUE){
1250 pos_min = s->data_offset;
1251 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1252 if (ts_min == AV_NOPTS_VALUE)
1256 if(ts_max == AV_NOPTS_VALUE){
1258 filesize = url_fsize(s->pb);
1259 pos_max = filesize - 1;
1262 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1264 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1265 if (ts_max == AV_NOPTS_VALUE)
1269 int64_t tmp_pos= pos_max + 1;
1270 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1271 if(tmp_ts == AV_NOPTS_VALUE)
1275 if(tmp_pos >= filesize)
1281 if(ts_min > ts_max){
1283 }else if(ts_min == ts_max){
1288 while (pos_min < pos_limit) {
1290 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1294 assert(pos_limit <= pos_max);
1297 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1298 // interpolate position (better than dichotomy)
1299 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1300 + pos_min - approximate_keyframe_distance;
1301 }else if(no_change==1){
1302 // bisection, if interpolation failed to change min or max pos last time
1303 pos = (pos_min + pos_limit)>>1;
1305 /* linear search if bisection failed, can only happen if there
1306 are very few or no keyframes between min/max */
1311 else if(pos > pos_limit)
1315 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1321 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);
1323 if(ts == AV_NOPTS_VALUE){
1324 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1327 assert(ts != AV_NOPTS_VALUE);
1328 if (target_ts <= ts) {
1329 pos_limit = start_pos - 1;
1333 if (target_ts >= ts) {
1339 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1340 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1343 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1345 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1346 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1347 pos, ts_min, target_ts, ts_max);
1353 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1354 int64_t pos_min, pos_max;
1358 if (stream_index < 0)
1361 st= s->streams[stream_index];
1364 pos_min = s->data_offset;
1365 pos_max = url_fsize(s->pb) - 1;
1367 if (pos < pos_min) pos= pos_min;
1368 else if(pos > pos_max) pos= pos_max;
1370 url_fseek(s->pb, pos, SEEK_SET);
1373 av_update_cur_dts(s, st, ts);
1378 static int av_seek_frame_generic(AVFormatContext *s,
1379 int stream_index, int64_t timestamp, int flags)
1385 st = s->streams[stream_index];
1387 index = av_index_search_timestamp(st, timestamp, flags);
1389 if(index < 0 || index==st->nb_index_entries-1){
1393 if(st->nb_index_entries){
1394 assert(st->index_entries);
1395 ie= &st->index_entries[st->nb_index_entries-1];
1396 url_fseek(s->pb, ie->pos, SEEK_SET);
1397 av_update_cur_dts(s, st, ie->timestamp);
1399 url_fseek(s->pb, 0, SEEK_SET);
1402 int ret = av_read_frame(s, &pkt);
1405 av_free_packet(&pkt);
1406 if(stream_index == pkt.stream_index){
1407 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1411 index = av_index_search_timestamp(st, timestamp, flags);
1416 av_read_frame_flush(s);
1417 if (s->iformat->read_seek){
1418 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1421 ie = &st->index_entries[index];
1422 url_fseek(s->pb, ie->pos, SEEK_SET);
1424 av_update_cur_dts(s, st, ie->timestamp);
1429 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1434 av_read_frame_flush(s);
1436 if(flags & AVSEEK_FLAG_BYTE)
1437 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1439 if(stream_index < 0){
1440 stream_index= av_find_default_stream_index(s);
1441 if(stream_index < 0)
1444 st= s->streams[stream_index];
1445 /* timestamp for default must be expressed in AV_TIME_BASE units */
1446 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1448 st= s->streams[stream_index];
1450 /* first, we try the format specific seek */
1451 if (s->iformat->read_seek)
1452 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1459 if(s->iformat->read_timestamp)
1460 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1462 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1465 /*******************************************************/
1468 * Returns TRUE if the stream has accurate duration in any stream.
1470 * @return TRUE if the stream has accurate duration for at least one component.
1472 static int av_has_duration(AVFormatContext *ic)
1477 for(i = 0;i < ic->nb_streams; i++) {
1478 st = ic->streams[i];
1479 if (st->duration != AV_NOPTS_VALUE)
1486 * Estimate the stream timings from the one of each components.
1488 * Also computes the global bitrate if possible.
1490 static void av_update_stream_timings(AVFormatContext *ic)
1492 int64_t start_time, start_time1, end_time, end_time1;
1493 int64_t duration, duration1;
1497 start_time = INT64_MAX;
1498 end_time = INT64_MIN;
1499 duration = INT64_MIN;
1500 for(i = 0;i < ic->nb_streams; i++) {
1501 st = ic->streams[i];
1502 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1503 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1504 if (start_time1 < start_time)
1505 start_time = start_time1;
1506 if (st->duration != AV_NOPTS_VALUE) {
1507 end_time1 = start_time1
1508 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1509 if (end_time1 > end_time)
1510 end_time = end_time1;
1513 if (st->duration != AV_NOPTS_VALUE) {
1514 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1515 if (duration1 > duration)
1516 duration = duration1;
1519 if (start_time != INT64_MAX) {
1520 ic->start_time = start_time;
1521 if (end_time != INT64_MIN) {
1522 if (end_time - start_time > duration)
1523 duration = end_time - start_time;
1526 if (duration != INT64_MIN) {
1527 ic->duration = duration;
1528 if (ic->file_size > 0) {
1529 /* compute the bitrate */
1530 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1531 (double)ic->duration;
1536 static void fill_all_stream_timings(AVFormatContext *ic)
1541 av_update_stream_timings(ic);
1542 for(i = 0;i < ic->nb_streams; i++) {
1543 st = ic->streams[i];
1544 if (st->start_time == AV_NOPTS_VALUE) {
1545 if(ic->start_time != AV_NOPTS_VALUE)
1546 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1547 if(ic->duration != AV_NOPTS_VALUE)
1548 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1553 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1555 int64_t filesize, duration;
1559 /* if bit_rate is already set, we believe it */
1560 if (ic->bit_rate == 0) {
1562 for(i=0;i<ic->nb_streams;i++) {
1563 st = ic->streams[i];
1564 bit_rate += st->codec->bit_rate;
1566 ic->bit_rate = bit_rate;
1569 /* if duration is already set, we believe it */
1570 if (ic->duration == AV_NOPTS_VALUE &&
1571 ic->bit_rate != 0 &&
1572 ic->file_size != 0) {
1573 filesize = ic->file_size;
1575 for(i = 0; i < ic->nb_streams; i++) {
1576 st = ic->streams[i];
1577 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1578 if (st->duration == AV_NOPTS_VALUE)
1579 st->duration = duration;
1585 #define DURATION_MAX_READ_SIZE 250000
1587 /* only usable for MPEG-PS streams */
1588 static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offset)
1590 AVPacket pkt1, *pkt = &pkt1;
1592 int read_size, i, ret;
1594 int64_t filesize, offset, duration;
1596 /* free previous packet */
1597 if (ic->cur_st && ic->cur_st->parser)
1598 av_free_packet(&ic->cur_pkt);
1601 /* flush packet queue */
1602 flush_packet_queue(ic);
1604 for(i=0;i<ic->nb_streams;i++) {
1605 st = ic->streams[i];
1607 av_parser_close(st->parser);
1612 /* we read the first packets to get the first PTS (not fully
1613 accurate, but it is enough now) */
1614 url_fseek(ic->pb, 0, SEEK_SET);
1617 if (read_size >= DURATION_MAX_READ_SIZE)
1619 /* if all info is available, we can stop */
1620 for(i = 0;i < ic->nb_streams; i++) {
1621 st = ic->streams[i];
1622 if (st->start_time == AV_NOPTS_VALUE)
1625 if (i == ic->nb_streams)
1628 ret = av_read_packet(ic, pkt);
1631 read_size += pkt->size;
1632 st = ic->streams[pkt->stream_index];
1633 if (pkt->pts != AV_NOPTS_VALUE) {
1634 if (st->start_time == AV_NOPTS_VALUE)
1635 st->start_time = pkt->pts;
1637 av_free_packet(pkt);
1640 /* estimate the end time (duration) */
1641 /* XXX: may need to support wrapping */
1642 filesize = ic->file_size;
1643 offset = filesize - DURATION_MAX_READ_SIZE;
1647 url_fseek(ic->pb, offset, SEEK_SET);
1650 if (read_size >= DURATION_MAX_READ_SIZE)
1653 ret = av_read_packet(ic, pkt);
1656 read_size += pkt->size;
1657 st = ic->streams[pkt->stream_index];
1658 if (pkt->pts != AV_NOPTS_VALUE &&
1659 st->start_time != AV_NOPTS_VALUE) {
1660 end_time = pkt->pts;
1661 duration = end_time - st->start_time;
1663 if (st->duration == AV_NOPTS_VALUE ||
1664 st->duration < duration)
1665 st->duration = duration;
1668 av_free_packet(pkt);
1671 fill_all_stream_timings(ic);
1673 url_fseek(ic->pb, old_offset, SEEK_SET);
1674 for(i=0; i<ic->nb_streams; i++){
1676 st->cur_dts= st->first_dts;
1677 st->last_IP_pts = AV_NOPTS_VALUE;
1681 static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
1685 /* get the file size, if possible */
1686 if (ic->iformat->flags & AVFMT_NOFILE) {
1689 file_size = url_fsize(ic->pb);
1693 ic->file_size = file_size;
1695 if ((!strcmp(ic->iformat->name, "mpeg") ||
1696 !strcmp(ic->iformat->name, "mpegts")) &&
1697 file_size && !url_is_streamed(ic->pb)) {
1698 /* get accurate estimate from the PTSes */
1699 av_estimate_timings_from_pts(ic, old_offset);
1700 } else if (av_has_duration(ic)) {
1701 /* at least one component has timings - we use them for all
1703 fill_all_stream_timings(ic);
1705 /* less precise: use bitrate info */
1706 av_estimate_timings_from_bit_rate(ic);
1708 av_update_stream_timings(ic);
1714 for(i = 0;i < ic->nb_streams; i++) {
1715 st = ic->streams[i];
1716 printf("%d: start_time: %0.3f duration: %0.3f\n",
1717 i, (double)st->start_time / AV_TIME_BASE,
1718 (double)st->duration / AV_TIME_BASE);
1720 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1721 (double)ic->start_time / AV_TIME_BASE,
1722 (double)ic->duration / AV_TIME_BASE,
1723 ic->bit_rate / 1000);
1728 static int has_codec_parameters(AVCodecContext *enc)
1731 switch(enc->codec_type) {
1732 case CODEC_TYPE_AUDIO:
1733 val = enc->sample_rate && enc->channels;
1734 if(!enc->frame_size &&
1735 (enc->codec_id == CODEC_ID_VORBIS ||
1736 enc->codec_id == CODEC_ID_AAC))
1739 case CODEC_TYPE_VIDEO:
1740 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1746 return enc->codec_id != CODEC_ID_NONE && val != 0;
1749 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1753 int got_picture, data_size, ret=0;
1756 if(!st->codec->codec){
1757 codec = avcodec_find_decoder(st->codec->codec_id);
1760 ret = avcodec_open(st->codec, codec);
1765 if(!has_codec_parameters(st->codec)){
1766 switch(st->codec->codec_type) {
1767 case CODEC_TYPE_VIDEO:
1768 ret = avcodec_decode_video(st->codec, &picture,
1769 &got_picture, data, size);
1771 case CODEC_TYPE_AUDIO:
1772 data_size = FFMAX(size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1773 samples = av_malloc(data_size);
1776 ret = avcodec_decode_audio2(st->codec, samples,
1777 &data_size, data, size);
1788 static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score)
1791 fmt = av_probe_input_format2(pd, 1, &score);
1794 if (strncmp(fmt->name, "mp3", 3) == 0)
1795 st->codec->codec_id = CODEC_ID_MP3;
1796 else if (strncmp(fmt->name, "ac3", 3) == 0)
1797 st->codec->codec_id = CODEC_ID_AC3;
1802 unsigned int codec_get_tag(const AVCodecTag *tags, int id)
1804 while (tags->id != CODEC_ID_NONE) {
1812 enum CodecID codec_get_id(const AVCodecTag *tags, unsigned int tag)
1815 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1816 if(tag == tags[i].tag)
1819 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1820 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1821 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1822 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1823 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1826 return CODEC_ID_NONE;
1829 unsigned int av_codec_get_tag(const AVCodecTag *tags[4], enum CodecID id)
1832 for(i=0; tags && tags[i]; i++){
1833 int tag= codec_get_tag(tags[i], id);
1839 enum CodecID av_codec_get_id(const AVCodecTag *tags[4], unsigned int tag)
1842 for(i=0; tags && tags[i]; i++){
1843 enum CodecID id= codec_get_id(tags[i], tag);
1844 if(id!=CODEC_ID_NONE) return id;
1846 return CODEC_ID_NONE;
1849 static void compute_chapters_end(AVFormatContext *s)
1853 for (i=0; i+1<s->nb_chapters; i++)
1854 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
1855 assert(s->chapters[i]->start <= s->chapters[i+1]->start);
1856 assert(!av_cmp_q(s->chapters[i]->time_base, s->chapters[i+1]->time_base));
1857 s->chapters[i]->end = s->chapters[i+1]->start;
1860 if (s->nb_chapters && s->chapters[i]->end == AV_NOPTS_VALUE) {
1861 assert(s->start_time != AV_NOPTS_VALUE);
1862 assert(s->duration > 0);
1863 s->chapters[i]->end = av_rescale_q(s->start_time + s->duration,
1865 s->chapters[i]->time_base);
1869 /* absolute maximum size we read until we abort */
1870 #define MAX_READ_SIZE 5000000
1872 #define MAX_STD_TIMEBASES (60*12+5)
1873 static int get_std_framerate(int i){
1874 if(i<60*12) return i*1001;
1875 else return ((int[]){24,30,60,12,15})[i-60*12]*1000*12;
1879 * Is the time base unreliable.
1880 * This is a heuristic to balance between quick acceptance of the values in
1881 * the headers vs. some extra checks.
1882 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
1883 * MPEG-2 commonly misuses field repeat flags to store different framerates.
1884 * And there are "variable" fps files this needs to detect as well.
1886 static int tb_unreliable(AVCodecContext *c){
1887 if( c->time_base.den >= 101L*c->time_base.num
1888 || c->time_base.den < 5L*c->time_base.num
1889 /* || c->codec_tag == ff_get_fourcc("DIVX")
1890 || c->codec_tag == ff_get_fourcc("XVID")*/
1891 || c->codec_id == CODEC_ID_MPEG2VIDEO)
1896 int av_find_stream_info(AVFormatContext *ic)
1898 int i, count, ret, read_size, j;
1900 AVPacket pkt1, *pkt;
1901 int64_t last_dts[MAX_STREAMS];
1902 int duration_count[MAX_STREAMS]={0};
1903 double (*duration_error)[MAX_STD_TIMEBASES];
1904 offset_t old_offset = url_ftell(ic->pb);
1905 int64_t codec_info_duration[MAX_STREAMS]={0};
1906 int codec_info_nb_frames[MAX_STREAMS]={0};
1907 AVProbeData probe_data[MAX_STREAMS];
1908 int codec_identified[MAX_STREAMS]={0};
1910 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
1911 if (!duration_error) return AVERROR(ENOMEM);
1913 for(i=0;i<ic->nb_streams;i++) {
1914 st = ic->streams[i];
1915 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1916 /* if(!st->time_base.num)
1918 if(!st->codec->time_base.num)
1919 st->codec->time_base= st->time_base;
1921 //only for the split stuff
1923 st->parser = av_parser_init(st->codec->codec_id);
1924 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
1925 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1930 for(i=0;i<MAX_STREAMS;i++){
1931 last_dts[i]= AV_NOPTS_VALUE;
1934 memset(probe_data, 0, sizeof(probe_data));
1938 /* check if one codec still needs to be handled */
1939 for(i=0;i<ic->nb_streams;i++) {
1940 st = ic->streams[i];
1941 if (!has_codec_parameters(st->codec))
1943 /* variable fps and no guess at the real fps */
1944 if( tb_unreliable(st->codec)
1945 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1947 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1949 if(st->first_dts == AV_NOPTS_VALUE)
1952 if (i == ic->nb_streams) {
1953 /* NOTE: if the format has no header, then we need to read
1954 some packets to get most of the streams, so we cannot
1956 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1957 /* if we found the info for all the codecs, we can stop */
1962 /* we did not get all the codec info, but we read too much data */
1963 if (read_size >= MAX_READ_SIZE) {
1968 /* NOTE: a new stream can be added there if no header in file
1969 (AVFMTCTX_NOHEADER) */
1970 ret = av_read_frame_internal(ic, &pkt1);
1973 ret = -1; /* we could not have all the codec parameters before EOF */
1974 for(i=0;i<ic->nb_streams;i++) {
1975 st = ic->streams[i];
1976 if (!has_codec_parameters(st->codec)){
1978 avcodec_string(buf, sizeof(buf), st->codec, 0);
1979 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
1987 pkt= add_to_pktbuf(ic, &pkt1);
1988 if(av_dup_packet(pkt) < 0)
1989 return AVERROR(ENOMEM);
1991 read_size += pkt->size;
1993 st = ic->streams[pkt->stream_index];
1994 if(codec_info_nb_frames[st->index]>1)
1995 codec_info_duration[st->index] += pkt->duration;
1996 if (pkt->duration != 0)
1997 codec_info_nb_frames[st->index]++;
2000 int index= pkt->stream_index;
2001 int64_t last= last_dts[index];
2002 int64_t duration= pkt->dts - last;
2004 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2005 double dur= duration * av_q2d(st->time_base);
2007 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2008 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2009 if(duration_count[index] < 2)
2010 memset(duration_error[index], 0, sizeof(*duration_error));
2011 for(i=1; i<MAX_STD_TIMEBASES; i++){
2012 int framerate= get_std_framerate(i);
2013 int ticks= lrintf(dur*framerate/(1001*12));
2014 double error= dur - ticks*1001*12/(double)framerate;
2015 duration_error[index][i] += error*error;
2017 duration_count[index]++;
2019 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
2020 last_dts[pkt->stream_index]= pkt->dts;
2022 if (st->codec->codec_id == CODEC_ID_NONE) {
2023 AVProbeData *pd = &(probe_data[st->index]);
2024 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
2025 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
2026 pd->buf_size += pkt->size;
2027 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
2030 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2031 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2033 st->codec->extradata_size= i;
2034 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2035 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2036 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2040 /* if still no information, we try to open the codec and to
2041 decompress the frame. We try to avoid that in most cases as
2042 it takes longer and uses more memory. For MPEG-4, we need to
2043 decompress for QuickTime. */
2044 if (!has_codec_parameters(st->codec) /*&&
2045 (st->codec->codec_id == CODEC_ID_FLV1 ||
2046 st->codec->codec_id == CODEC_ID_H264 ||
2047 st->codec->codec_id == CODEC_ID_H263 ||
2048 st->codec->codec_id == CODEC_ID_H261 ||
2049 st->codec->codec_id == CODEC_ID_VORBIS ||
2050 st->codec->codec_id == CODEC_ID_MJPEG ||
2051 st->codec->codec_id == CODEC_ID_PNG ||
2052 st->codec->codec_id == CODEC_ID_PAM ||
2053 st->codec->codec_id == CODEC_ID_PGM ||
2054 st->codec->codec_id == CODEC_ID_PGMYUV ||
2055 st->codec->codec_id == CODEC_ID_PBM ||
2056 st->codec->codec_id == CODEC_ID_PPM ||
2057 st->codec->codec_id == CODEC_ID_SHORTEN ||
2058 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
2059 try_decode_frame(st, pkt->data, pkt->size);
2061 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) {
2067 // close codecs which were opened in try_decode_frame()
2068 for(i=0;i<ic->nb_streams;i++) {
2069 st = ic->streams[i];
2070 if(st->codec->codec)
2071 avcodec_close(st->codec);
2073 for(i=0;i<ic->nb_streams;i++) {
2074 st = ic->streams[i];
2075 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2076 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
2077 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2079 if(duration_count[i]
2080 && tb_unreliable(st->codec) /*&&
2081 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2082 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2083 double best_error= 2*av_q2d(st->time_base);
2084 best_error= best_error*best_error*duration_count[i]*1000*12*30;
2086 for(j=1; j<MAX_STD_TIMEBASES; j++){
2087 double error= duration_error[i][j] * get_std_framerate(j);
2088 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2089 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2090 if(error < best_error){
2092 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, get_std_framerate(j), 12*1001, INT_MAX);
2097 if (!st->r_frame_rate.num){
2098 if( st->codec->time_base.den * (int64_t)st->time_base.num
2099 <= st->codec->time_base.num * (int64_t)st->time_base.den){
2100 st->r_frame_rate.num = st->codec->time_base.den;
2101 st->r_frame_rate.den = st->codec->time_base.num;
2103 st->r_frame_rate.num = st->time_base.den;
2104 st->r_frame_rate.den = st->time_base.num;
2107 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
2108 if (st->codec->codec_id == CODEC_ID_NONE && probe_data[st->index].buf_size > 0) {
2109 codec_identified[st->index] = set_codec_from_probe_data(st, &(probe_data[st->index]), 1);
2110 if (codec_identified[st->index]) {
2111 st->need_parsing = AVSTREAM_PARSE_FULL;
2114 if(!st->codec->bits_per_sample)
2115 st->codec->bits_per_sample= av_get_bits_per_sample(st->codec->codec_id);
2119 av_estimate_timings(ic, old_offset);
2121 for(i=0;i<ic->nb_streams;i++) {
2122 st = ic->streams[i];
2123 if (codec_identified[st->index])
2126 //FIXME this is a mess
2127 if(i!=ic->nb_streams){
2128 av_read_frame_flush(ic);
2129 for(i=0;i<ic->nb_streams;i++) {
2130 st = ic->streams[i];
2131 if (codec_identified[st->index]) {
2132 av_seek_frame(ic, st->index, 0.0, 0);
2134 st->cur_dts= st->first_dts;
2136 url_fseek(ic->pb, ic->data_offset, SEEK_SET);
2139 compute_chapters_end(ic);
2142 /* correct DTS for B-frame streams with no timestamps */
2143 for(i=0;i<ic->nb_streams;i++) {
2144 st = ic->streams[i];
2145 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2147 ppktl = &ic->packet_buffer;
2149 if(ppkt1->stream_index != i)
2151 if(ppkt1->pkt->dts < 0)
2153 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2155 ppkt1->pkt->dts -= delta;
2160 st->cur_dts -= delta;
2166 av_free(duration_error);
2167 for(i=0;i<MAX_STREAMS;i++){
2168 av_freep(&(probe_data[i].buf));
2174 /*******************************************************/
2176 int av_read_play(AVFormatContext *s)
2178 if (s->iformat->read_play)
2179 return s->iformat->read_play(s);
2181 return av_url_read_fpause(s->pb, 0);
2182 return AVERROR(ENOSYS);
2185 int av_read_pause(AVFormatContext *s)
2187 if (s->iformat->read_pause)
2188 return s->iformat->read_pause(s);
2190 return av_url_read_fpause(s->pb, 1);
2191 return AVERROR(ENOSYS);
2194 void av_close_input_stream(AVFormatContext *s)
2199 /* free previous packet */
2200 if (s->cur_st && s->cur_st->parser)
2201 av_free_packet(&s->cur_pkt);
2203 if (s->iformat->read_close)
2204 s->iformat->read_close(s);
2205 for(i=0;i<s->nb_streams;i++) {
2206 /* free all data in a stream component */
2209 av_parser_close(st->parser);
2211 av_free(st->index_entries);
2212 av_free(st->codec->extradata);
2214 av_free(st->filename);
2215 av_free(st->priv_data);
2218 for(i=s->nb_programs-1; i>=0; i--) {
2219 av_freep(&s->programs[i]->provider_name);
2220 av_freep(&s->programs[i]->name);
2221 av_freep(&s->programs[i]->stream_index);
2222 av_freep(&s->programs[i]);
2224 av_freep(&s->programs);
2225 flush_packet_queue(s);
2226 av_freep(&s->priv_data);
2227 while(s->nb_chapters--) {
2228 av_free(s->chapters[s->nb_chapters]->title);
2229 av_free(s->chapters[s->nb_chapters]);
2231 av_freep(&s->chapters);
2235 void av_close_input_file(AVFormatContext *s)
2237 ByteIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2238 av_close_input_stream(s);
2243 AVStream *av_new_stream(AVFormatContext *s, int id)
2248 if (s->nb_streams >= MAX_STREAMS)
2251 st = av_mallocz(sizeof(AVStream));
2255 st->codec= avcodec_alloc_context();
2257 /* no default bitrate if decoding */
2258 st->codec->bit_rate = 0;
2260 st->index = s->nb_streams;
2262 st->start_time = AV_NOPTS_VALUE;
2263 st->duration = AV_NOPTS_VALUE;
2264 /* we set the current DTS to 0 so that formats without any timestamps
2265 but durations get some timestamps, formats with some unknown
2266 timestamps have their first few packets buffered and the
2267 timestamps corrected before they are returned to the user */
2269 st->first_dts = AV_NOPTS_VALUE;
2271 /* default pts setting is MPEG-like */
2272 av_set_pts_info(st, 33, 1, 90000);
2273 st->last_IP_pts = AV_NOPTS_VALUE;
2274 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2275 st->pts_buffer[i]= AV_NOPTS_VALUE;
2277 s->streams[s->nb_streams++] = st;
2281 AVProgram *av_new_program(AVFormatContext *ac, int id)
2283 AVProgram *program=NULL;
2287 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2290 for(i=0; i<ac->nb_programs; i++)
2291 if(ac->programs[i]->id == id)
2292 program = ac->programs[i];
2295 program = av_mallocz(sizeof(AVProgram));
2298 dynarray_add(&ac->programs, &ac->nb_programs, program);
2299 program->discard = AVDISCARD_NONE;
2306 void av_set_program_name(AVProgram *program, char *provider_name, char *name)
2308 assert(!provider_name == !name);
2310 av_free(program->provider_name);
2311 av_free(program-> name);
2312 program->provider_name = av_strdup(provider_name);
2313 program-> name = av_strdup( name);
2317 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2319 AVChapter *chapter = NULL;
2322 for(i=0; i<s->nb_chapters; i++)
2323 if(s->chapters[i]->id == id)
2324 chapter = s->chapters[i];
2327 chapter= av_mallocz(sizeof(AVChapter));
2330 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2332 av_free(chapter->title);
2333 chapter->title = av_strdup(title);
2335 chapter->time_base= time_base;
2336 chapter->start = start;
2342 /************************************************************/
2343 /* output media file */
2345 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2349 if (s->oformat->priv_data_size > 0) {
2350 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2352 return AVERROR(ENOMEM);
2354 s->priv_data = NULL;
2356 if (s->oformat->set_parameters) {
2357 ret = s->oformat->set_parameters(s, ap);
2364 int av_write_header(AVFormatContext *s)
2369 // some sanity checks
2370 for(i=0;i<s->nb_streams;i++) {
2373 switch (st->codec->codec_type) {
2374 case CODEC_TYPE_AUDIO:
2375 if(st->codec->sample_rate<=0){
2376 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2380 case CODEC_TYPE_VIDEO:
2381 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2382 av_log(s, AV_LOG_ERROR, "time base not set\n");
2385 if(st->codec->width<=0 || st->codec->height<=0){
2386 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2392 if(s->oformat->codec_tag){
2393 if(st->codec->codec_tag){
2395 //check that tag + id is in the table
2396 //if neither is in the table -> OK
2397 //if tag is in the table with another id -> FAIL
2398 //if id is in the table with another tag -> FAIL unless strict < ?
2400 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2404 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2405 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2407 return AVERROR(ENOMEM);
2410 if(s->oformat->write_header){
2411 ret = s->oformat->write_header(s);
2416 /* init PTS generation */
2417 for(i=0;i<s->nb_streams;i++) {
2418 int64_t den = AV_NOPTS_VALUE;
2421 switch (st->codec->codec_type) {
2422 case CODEC_TYPE_AUDIO:
2423 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2425 case CODEC_TYPE_VIDEO:
2426 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2431 if (den != AV_NOPTS_VALUE) {
2433 return AVERROR_INVALIDDATA;
2434 av_frac_init(&st->pts, 0, 0, den);
2440 //FIXME merge with compute_pkt_fields
2441 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2442 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2443 int num, den, frame_size, i;
2445 // 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);
2447 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2450 /* duration field */
2451 if (pkt->duration == 0) {
2452 compute_frame_duration(&num, &den, st, NULL, pkt);
2454 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2458 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2461 //XXX/FIXME this is a temporary hack until all encoders output pts
2462 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2464 // pkt->pts= st->cur_dts;
2465 pkt->pts= st->pts.val;
2468 //calculate dts from pts
2469 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2470 st->pts_buffer[0]= pkt->pts;
2471 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2472 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2473 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2474 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2476 pkt->dts= st->pts_buffer[0];
2479 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2480 av_log(st->codec, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2483 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2484 av_log(st->codec, AV_LOG_ERROR, "error, pts < dts\n");
2488 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2489 st->cur_dts= pkt->dts;
2490 st->pts.val= pkt->dts;
2493 switch (st->codec->codec_type) {
2494 case CODEC_TYPE_AUDIO:
2495 frame_size = get_audio_frame_size(st->codec, pkt->size);
2497 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2498 likely equal to the encoder delay, but it would be better if we
2499 had the real timestamps from the encoder */
2500 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2501 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2504 case CODEC_TYPE_VIDEO:
2505 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2513 static void truncate_ts(AVStream *st, AVPacket *pkt){
2514 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2517 // pkt->dts= 0; //this happens for low_delay=0 and B-frames, FIXME, needs further investigation about what we should do here
2519 if (pkt->pts != AV_NOPTS_VALUE)
2520 pkt->pts &= pts_mask;
2521 if (pkt->dts != AV_NOPTS_VALUE)
2522 pkt->dts &= pts_mask;
2525 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2527 int ret = compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2529 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2532 truncate_ts(s->streams[pkt->stream_index], pkt);
2534 ret= s->oformat->write_packet(s, pkt);
2536 ret= url_ferror(s->pb);
2540 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2541 AVPacketList *pktl, **next_point, *this_pktl;
2543 int streams[MAX_STREAMS];
2546 AVStream *st= s->streams[ pkt->stream_index];
2548 // assert(pkt->destruct != av_destruct_packet); //FIXME
2550 this_pktl = av_mallocz(sizeof(AVPacketList));
2551 this_pktl->pkt= *pkt;
2552 if(pkt->destruct == av_destruct_packet)
2553 pkt->destruct= NULL; // not shared -> must keep original from being freed
2555 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2557 next_point = &s->packet_buffer;
2559 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2560 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2561 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2562 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2564 next_point= &(*next_point)->next;
2566 this_pktl->next= *next_point;
2567 *next_point= this_pktl;
2570 memset(streams, 0, sizeof(streams));
2571 pktl= s->packet_buffer;
2573 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2574 if(streams[ pktl->pkt.stream_index ] == 0)
2576 streams[ pktl->pkt.stream_index ]++;
2580 if(stream_count && (s->nb_streams == stream_count || flush)){
2581 pktl= s->packet_buffer;
2584 s->packet_buffer= pktl->next;
2588 av_init_packet(out);
2594 * Interleaves an AVPacket correctly so it can be muxed.
2595 * @param out the interleaved packet will be output here
2596 * @param in the input packet
2597 * @param flush 1 if no further packets are available as input and all
2598 * remaining packets should be output
2599 * @return 1 if a packet was output, 0 if no packet could be output,
2600 * < 0 if an error occurred
2602 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2603 if(s->oformat->interleave_packet)
2604 return s->oformat->interleave_packet(s, out, in, flush);
2606 return av_interleave_packet_per_dts(s, out, in, flush);
2609 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2610 AVStream *st= s->streams[ pkt->stream_index];
2612 //FIXME/XXX/HACK drop zero sized packets
2613 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2616 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2617 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2620 if(pkt->dts == AV_NOPTS_VALUE)
2625 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2626 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2629 truncate_ts(s->streams[opkt.stream_index], &opkt);
2630 ret= s->oformat->write_packet(s, &opkt);
2632 av_free_packet(&opkt);
2637 if(url_ferror(s->pb))
2638 return url_ferror(s->pb);
2642 int av_write_trailer(AVFormatContext *s)
2648 ret= av_interleave_packet(s, &pkt, NULL, 1);
2649 if(ret<0) //FIXME cleanup needed for ret<0 ?
2654 truncate_ts(s->streams[pkt.stream_index], &pkt);
2655 ret= s->oformat->write_packet(s, &pkt);
2657 av_free_packet(&pkt);
2661 if(url_ferror(s->pb))
2665 if(s->oformat->write_trailer)
2666 ret = s->oformat->write_trailer(s);
2669 ret=url_ferror(s->pb);
2670 for(i=0;i<s->nb_streams;i++)
2671 av_freep(&s->streams[i]->priv_data);
2672 av_freep(&s->priv_data);
2676 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
2679 AVProgram *program=NULL;
2682 for(i=0; i<ac->nb_programs; i++){
2683 if(ac->programs[i]->id != progid)
2685 program = ac->programs[i];
2686 for(j=0; j<program->nb_stream_indexes; j++)
2687 if(program->stream_index[j] == idx)
2690 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
2693 program->stream_index = tmp;
2694 program->stream_index[program->nb_stream_indexes++] = idx;
2699 /* "user interface" functions */
2700 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
2703 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
2704 AVStream *st = ic->streams[i];
2705 int g = ff_gcd(st->time_base.num, st->time_base.den);
2706 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2707 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2708 /* the pid is an important information, so we display it */
2709 /* XXX: add a generic system */
2710 if (flags & AVFMT_SHOW_IDS)
2711 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2712 if (strlen(st->language) > 0)
2713 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2714 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2715 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2716 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2717 if(st->r_frame_rate.den && st->r_frame_rate.num)
2718 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(r)", av_q2d(st->r_frame_rate));
2719 /* else if(st->time_base.den && st->time_base.num)
2720 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(m)", 1/av_q2d(st->time_base));*/
2722 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(c)", 1/av_q2d(st->codec->time_base));
2724 av_log(NULL, AV_LOG_INFO, "\n");
2727 void dump_format(AVFormatContext *ic,
2734 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2735 is_output ? "Output" : "Input",
2737 is_output ? ic->oformat->name : ic->iformat->name,
2738 is_output ? "to" : "from", url);
2740 av_log(NULL, AV_LOG_INFO, " Duration: ");
2741 if (ic->duration != AV_NOPTS_VALUE) {
2742 int hours, mins, secs, us;
2743 secs = ic->duration / AV_TIME_BASE;
2744 us = ic->duration % AV_TIME_BASE;
2749 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
2750 (100 * us) / AV_TIME_BASE);
2752 av_log(NULL, AV_LOG_INFO, "N/A");
2754 if (ic->start_time != AV_NOPTS_VALUE) {
2756 av_log(NULL, AV_LOG_INFO, ", start: ");
2757 secs = ic->start_time / AV_TIME_BASE;
2758 us = ic->start_time % AV_TIME_BASE;
2759 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2760 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2762 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2764 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2766 av_log(NULL, AV_LOG_INFO, "N/A");
2768 av_log(NULL, AV_LOG_INFO, "\n");
2770 if(ic->nb_programs) {
2772 for(j=0; j<ic->nb_programs; j++) {
2773 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
2774 ic->programs[j]->name ? ic->programs[j]->name : "");
2775 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++)
2776 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
2779 for(i=0;i<ic->nb_streams;i++)
2780 dump_stream_format(ic, i, index, is_output);
2783 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2785 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2788 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2790 AVRational frame_rate;
2791 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2792 *frame_rate_num= frame_rate.num;
2793 *frame_rate_den= frame_rate.den;
2798 * Gets the current time in microseconds.
2800 int64_t av_gettime(void)
2803 gettimeofday(&tv,NULL);
2804 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
2807 int64_t parse_date(const char *datestr, int duration)
2813 static const char *date_fmt[] = {
2817 static const char *time_fmt[] = {
2827 time_t now = time(0);
2829 len = strlen(datestr);
2831 lastch = datestr[len - 1];
2834 is_utc = (lastch == 'z' || lastch == 'Z');
2836 memset(&dt, 0, sizeof(dt));
2841 /* parse the year-month-day part */
2842 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2843 q = small_strptime(p, date_fmt[i], &dt);
2849 /* if the year-month-day part is missing, then take the
2850 * current year-month-day time */
2855 dt = *localtime(&now);
2857 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2862 if (*p == 'T' || *p == 't' || *p == ' ')
2865 /* parse the hour-minute-second part */
2866 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2867 q = small_strptime(p, time_fmt[i], &dt);
2873 /* parse datestr as a duration */
2878 /* parse datestr as HH:MM:SS */
2879 q = small_strptime(p, time_fmt[0], &dt);
2881 /* parse datestr as S+ */
2882 dt.tm_sec = strtol(p, (char **)&q, 10);
2884 /* the parsing didn't succeed */
2891 /* Now we have all the fields that we can get */
2897 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2899 dt.tm_isdst = -1; /* unknown */
2909 /* parse the .m... part */
2913 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2916 val += n * (*q - '0');
2920 return negative ? -t : t;
2923 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2933 while (*p != '\0' && *p != '=' && *p != '&') {
2934 if ((q - tag) < sizeof(tag) - 1)
2942 while (*p != '&' && *p != '\0') {
2943 if ((q - arg) < arg_size - 1) {
2953 if (!strcmp(tag, tag1))
2962 int av_get_frame_filename(char *buf, int buf_size,
2963 const char *path, int number)
2966 char *q, buf1[20], c;
2967 int nd, len, percentd_found;
2979 while (isdigit(*p)) {
2980 nd = nd * 10 + *p++ - '0';
2983 } while (isdigit(c));
2992 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2994 if ((q - buf + len) > buf_size - 1)
2996 memcpy(q, buf1, len);
3004 if ((q - buf) < buf_size - 1)
3008 if (!percentd_found)
3017 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3020 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3022 for(i=0;i<size;i+=16) {
3029 PRINT(" %02x", buf[i+j]);
3034 for(j=0;j<len;j++) {
3036 if (c < ' ' || c > '~')
3045 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3047 hex_dump_internal(NULL, f, 0, buf, size);
3050 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3052 hex_dump_internal(avcl, NULL, level, buf, size);
3055 //FIXME needs to know the time_base
3056 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
3058 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3059 PRINT("stream #%d:\n", pkt->stream_index);
3060 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
3061 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
3062 /* DTS is _always_ valid after av_read_frame() */
3064 if (pkt->dts == AV_NOPTS_VALUE)
3067 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
3068 /* PTS may not be known if B-frames are present. */
3070 if (pkt->pts == AV_NOPTS_VALUE)
3073 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
3075 PRINT(" size=%d\n", pkt->size);
3078 av_hex_dump(f, pkt->data, pkt->size);
3081 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3083 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
3086 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3088 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
3091 void url_split(char *proto, int proto_size,
3092 char *authorization, int authorization_size,
3093 char *hostname, int hostname_size,
3095 char *path, int path_size,
3098 const char *p, *ls, *at, *col, *brk;
3100 if (port_ptr) *port_ptr = -1;
3101 if (proto_size > 0) proto[0] = 0;
3102 if (authorization_size > 0) authorization[0] = 0;
3103 if (hostname_size > 0) hostname[0] = 0;
3104 if (path_size > 0) path[0] = 0;
3106 /* parse protocol */
3107 if ((p = strchr(url, ':'))) {
3108 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3113 /* no protocol means plain filename */
3114 av_strlcpy(path, url, path_size);
3118 /* separate path from hostname */
3119 ls = strchr(p, '/');
3121 ls = strchr(p, '?');
3123 av_strlcpy(path, ls, path_size);
3125 ls = &p[strlen(p)]; // XXX
3127 /* the rest is hostname, use that to parse auth/port */
3129 /* authorization (user[:pass]@hostname) */
3130 if ((at = strchr(p, '@')) && at < ls) {
3131 av_strlcpy(authorization, p,
3132 FFMIN(authorization_size, at + 1 - p));
3133 p = at + 1; /* skip '@' */
3136 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3138 av_strlcpy(hostname, p + 1,
3139 FFMIN(hostname_size, brk - p));
3140 if (brk[1] == ':' && port_ptr)
3141 *port_ptr = atoi(brk + 2);
3142 } else if ((col = strchr(p, ':')) && col < ls) {
3143 av_strlcpy(hostname, p,
3144 FFMIN(col + 1 - p, hostname_size));
3145 if (port_ptr) *port_ptr = atoi(col + 1);
3147 av_strlcpy(hostname, p,
3148 FFMIN(ls + 1 - p, hostname_size));
3152 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3153 int pts_num, int pts_den)
3155 s->pts_wrap_bits = pts_wrap_bits;
3156 s->time_base.num = pts_num;
3157 s->time_base.den = pts_den;
3160 /* fraction handling */
3163 * f = val + (num / den) + 0.5.
3165 * 'num' is normalized so that it is such as 0 <= num < den.
3167 * @param f fractional number
3168 * @param val integer value
3169 * @param num must be >= 0
3170 * @param den must be >= 1
3172 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
3185 * Fractional addition to f: f = f + (incr / f->den).
3187 * @param f fractional number
3188 * @param incr increment, can be positive or negative
3190 static void av_frac_add(AVFrac *f, int64_t incr)
3194 num = f->num + incr;
3197 f->val += num / den;
3203 } else if (num >= den) {
3204 f->val += num / den;