2 * Various utilities for ffmpeg system
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 AVInputFormat *first_iformat = NULL;
25 AVOutputFormat *first_oformat = NULL;
26 AVImageFormat *first_image_format = NULL;
28 void av_register_input_format(AVInputFormat *format)
32 while (*p != NULL) p = &(*p)->next;
37 void av_register_output_format(AVOutputFormat *format)
41 while (*p != NULL) p = &(*p)->next;
46 int match_ext(const char *filename, const char *extensions)
54 ext = strrchr(filename, '.');
60 while (*p != '\0' && *p != ',')
63 if (!strcasecmp(ext1, ext))
73 AVOutputFormat *guess_format(const char *short_name, const char *filename,
74 const char *mime_type)
76 AVOutputFormat *fmt, *fmt_found;
79 /* specific test for image sequences */
80 if (!short_name && filename &&
81 filename_number_test(filename) >= 0 &&
82 guess_image_format(filename)) {
83 return guess_format("image", NULL, NULL);
86 /* find the proper file type */
92 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
94 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
96 if (filename && fmt->extensions &&
97 match_ext(filename, fmt->extensions)) {
100 if (score > score_max) {
109 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
110 const char *mime_type)
112 AVOutputFormat *fmt = guess_format(short_name, filename, mime_type);
115 AVOutputFormat *stream_fmt;
116 char stream_format_name[64];
118 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
119 stream_fmt = guess_format(stream_format_name, NULL, NULL);
128 AVInputFormat *av_find_input_format(const char *short_name)
131 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) {
132 if (!strcmp(fmt->name, short_name))
138 /* memory handling */
141 * Default packet destructor
143 static void av_destruct_packet(AVPacket *pkt)
146 pkt->data = NULL; pkt->size = 0;
150 * Allocate the payload of a packet and intialized its fields to default values.
153 * @param size wanted payload size
154 * @return 0 if OK. AVERROR_xxx otherwise.
156 int av_new_packet(AVPacket *pkt, int size)
158 void *data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
160 return AVERROR_NOMEM;
161 memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
166 pkt->destruct = av_destruct_packet;
170 /* This is a hack - the packet memory allocation stuff is broken. The
171 packet is allocated if it was not really allocated */
172 int av_dup_packet(AVPacket *pkt)
174 if (pkt->destruct != av_destruct_packet) {
176 /* we duplicate the packet and don't forget to put the padding
178 data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
180 return AVERROR_NOMEM;
182 memcpy(data, pkt->data, pkt->size);
183 memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
185 pkt->destruct = av_destruct_packet;
192 int fifo_init(FifoBuffer *f, int size)
194 f->buffer = av_malloc(size);
197 f->end = f->buffer + size;
198 f->wptr = f->rptr = f->buffer;
202 void fifo_free(FifoBuffer *f)
207 int fifo_size(FifoBuffer *f, uint8_t *rptr)
211 if (f->wptr >= rptr) {
212 size = f->wptr - rptr;
214 size = (f->end - rptr) + (f->wptr - f->buffer);
219 /* get data from the fifo (return -1 if not enough data) */
220 int fifo_read(FifoBuffer *f, uint8_t *buf, int buf_size, uint8_t **rptr_ptr)
222 uint8_t *rptr = *rptr_ptr;
225 if (f->wptr >= rptr) {
226 size = f->wptr - rptr;
228 size = (f->end - rptr) + (f->wptr - f->buffer);
233 while (buf_size > 0) {
237 memcpy(buf, rptr, len);
248 void fifo_write(FifoBuffer *f, uint8_t *buf, int size, uint8_t **wptr_ptr)
257 memcpy(wptr, buf, len);
267 /* get data from the fifo (return -1 if not enough data) */
268 int put_fifo(ByteIOContext *pb, FifoBuffer *f, int buf_size, uint8_t **rptr_ptr)
270 uint8_t *rptr = *rptr_ptr;
273 if (f->wptr >= rptr) {
274 size = f->wptr - rptr;
276 size = (f->end - rptr) + (f->wptr - f->buffer);
281 while (buf_size > 0) {
285 put_buffer(pb, rptr, len);
295 int filename_number_test(const char *filename)
300 return get_frame_filename(buf, sizeof(buf), filename, 1);
303 /* guess file format */
304 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened)
306 AVInputFormat *fmt1, *fmt;
307 int score, score_max;
311 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
312 if (!is_opened && !(fmt1->flags & AVFMT_NOFILE))
315 if (fmt1->read_probe) {
316 score = fmt1->read_probe(pd);
317 } else if (fmt1->extensions) {
318 if (match_ext(pd->filename, fmt1->extensions)) {
322 if (score > score_max) {
330 /************************************************************/
331 /* input media file */
334 * open a media file from an IO stream. 'fmt' must be specified.
337 static const char* format_to_name(void* ptr)
339 AVFormatContext* fc = (AVFormatContext*) ptr;
340 if(fc->iformat) return fc->iformat->name;
341 else if(fc->oformat) return fc->oformat->name;
345 static const AVClass av_format_context_class = { "AVFormatContext", format_to_name };
347 AVFormatContext *av_alloc_format_context(void)
350 ic = av_mallocz(sizeof(AVFormatContext));
352 ic->av_class = &av_format_context_class;
356 int av_open_input_stream(AVFormatContext **ic_ptr,
357 ByteIOContext *pb, const char *filename,
358 AVInputFormat *fmt, AVFormatParameters *ap)
363 ic = av_alloc_format_context();
371 ic->duration = AV_NOPTS_VALUE;
372 ic->start_time = AV_NOPTS_VALUE;
373 pstrcpy(ic->filename, sizeof(ic->filename), filename);
375 /* allocate private data */
376 if (fmt->priv_data_size > 0) {
377 ic->priv_data = av_mallocz(fmt->priv_data_size);
378 if (!ic->priv_data) {
383 ic->priv_data = NULL;
386 err = ic->iformat->read_header(ic, ap);
391 ic->data_offset = url_ftell(&ic->pb);
397 av_freep(&ic->priv_data);
404 #define PROBE_BUF_SIZE 2048
407 * Open a media file as input. The codec are not opened. Only the file
408 * header (if present) is read.
410 * @param ic_ptr the opened media file handle is put here
411 * @param filename filename to open.
412 * @param fmt if non NULL, force the file format to use
413 * @param buf_size optional buffer size (zero if default is OK)
414 * @param ap additionnal parameters needed when opening the file (NULL if default)
415 * @return 0 if OK. AVERROR_xxx otherwise.
417 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
420 AVFormatParameters *ap)
422 int err, must_open_file, file_opened;
423 uint8_t buf[PROBE_BUF_SIZE];
424 AVProbeData probe_data, *pd = &probe_data;
425 ByteIOContext pb1, *pb = &pb1;
430 pd->filename = filename;
435 /* guess format if no file can be opened */
436 fmt = av_probe_input_format(pd, 0);
439 /* do not open file if the format does not need it. XXX: specific
440 hack needed to handle RTSP/TCP */
442 if (fmt && (fmt->flags & AVFMT_NOFILE)) {
444 pb= NULL; //FIXME this or memset(pb, 0, sizeof(ByteIOContext)); otherwise its uninitalized
447 if (!fmt || must_open_file) {
448 /* if no file needed do not try to open one */
449 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
455 url_setbufsize(pb, buf_size);
458 /* read probe data */
459 pd->buf_size = get_buffer(pb, buf, PROBE_BUF_SIZE);
460 if (url_fseek(pb, 0, SEEK_SET) == (offset_t)-EPIPE) {
462 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
470 /* guess file format */
472 fmt = av_probe_input_format(pd, 1);
475 /* if still no format found, error */
481 /* XXX: suppress this hack for redirectors */
482 #ifdef CONFIG_NETWORK
483 if (fmt == &redir_demux) {
484 err = redir_open(ic_ptr, pb);
490 /* check filename in case of an image number is expected */
491 if (fmt->flags & AVFMT_NEEDNUMBER) {
492 if (filename_number_test(filename) < 0) {
493 err = AVERROR_NUMEXPECTED;
497 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
509 /*******************************************************/
512 * Read a transport packet from a media file. This function is
513 * absolete and should never be used. Use av_read_frame() instead.
515 * @param s media file handle
516 * @param pkt is filled
517 * @return 0 if OK. AVERROR_xxx if error.
519 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
521 return s->iformat->read_packet(s, pkt);
524 /**********************************************************/
526 /* get the number of samples of an audio frame. Return (-1) if error */
527 static int get_audio_frame_size(AVCodecContext *enc, int size)
531 if (enc->frame_size <= 1) {
532 /* specific hack for pcm codecs because no frame size is
534 switch(enc->codec_id) {
535 case CODEC_ID_PCM_S16LE:
536 case CODEC_ID_PCM_S16BE:
537 case CODEC_ID_PCM_U16LE:
538 case CODEC_ID_PCM_U16BE:
539 if (enc->channels == 0)
541 frame_size = size / (2 * enc->channels);
543 case CODEC_ID_PCM_S8:
544 case CODEC_ID_PCM_U8:
545 case CODEC_ID_PCM_MULAW:
546 case CODEC_ID_PCM_ALAW:
547 if (enc->channels == 0)
549 frame_size = size / (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;
559 frame_size = enc->frame_size;
565 /* return the frame duration in seconds, return 0 if not available */
566 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
567 AVCodecParserContext *pc, AVPacket *pkt)
573 switch(st->codec.codec_type) {
574 case CODEC_TYPE_VIDEO:
575 *pnum = st->codec.frame_rate_base;
576 *pden = st->codec.frame_rate;
577 if (pc && pc->repeat_pict) {
579 *pnum = (*pnum) * (2 + pc->repeat_pict);
582 case CODEC_TYPE_AUDIO:
583 frame_size = get_audio_frame_size(&st->codec, pkt->size);
587 *pden = st->codec.sample_rate;
594 static int64_t lsb2full(int64_t lsb, int64_t last_ts, int lsb_bits){
595 int64_t mask = lsb_bits < 64 ? (1LL<<lsb_bits)-1 : -1LL;
596 int64_t delta= last_ts - mask/2;
597 return ((lsb - delta)&mask) + delta;
600 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
601 AVCodecParserContext *pc, AVPacket *pkt)
603 int num, den, presentation_delayed;
605 /* handle wrapping */
606 if(st->cur_dts != AV_NOPTS_VALUE){
607 if(pkt->pts != AV_NOPTS_VALUE)
608 pkt->pts= lsb2full(pkt->pts, st->cur_dts, st->pts_wrap_bits);
609 if(pkt->dts != AV_NOPTS_VALUE)
610 pkt->dts= lsb2full(pkt->dts, st->cur_dts, st->pts_wrap_bits);
613 if (pkt->duration == 0) {
614 compute_frame_duration(&num, &den, st, pc, pkt);
616 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
620 /* do we have a video B frame ? */
621 presentation_delayed = 0;
622 if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
623 /* XXX: need has_b_frame, but cannot get it if the codec is
625 if ((st->codec.codec_id == CODEC_ID_MPEG1VIDEO ||
626 st->codec.codec_id == CODEC_ID_MPEG2VIDEO ||
627 st->codec.codec_id == CODEC_ID_MPEG4 ||
628 st->codec.codec_id == CODEC_ID_H264) &&
629 pc && pc->pict_type != FF_B_TYPE)
630 presentation_delayed = 1;
631 /* this may be redundant, but it shouldnt hurt */
632 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
633 presentation_delayed = 1;
636 if(st->cur_dts == AV_NOPTS_VALUE){
637 if(presentation_delayed) st->cur_dts = -pkt->duration;
638 else st->cur_dts = 0;
641 // av_log(NULL, AV_LOG_DEBUG, "IN delayed:%d pts:%lld, dts:%lld cur_dts:%lld st:%d pc:%p\n", presentation_delayed, pkt->pts, pkt->dts, st->cur_dts, pkt->stream_index, pc);
642 /* interpolate PTS and DTS if they are not present */
643 if (presentation_delayed) {
644 /* DTS = decompression time stamp */
645 /* PTS = presentation time stamp */
646 if (pkt->dts == AV_NOPTS_VALUE) {
647 /* if we know the last pts, use it */
648 if(st->last_IP_pts != AV_NOPTS_VALUE)
649 st->cur_dts = pkt->dts = st->last_IP_pts;
651 pkt->dts = st->cur_dts;
653 st->cur_dts = pkt->dts;
655 /* this is tricky: the dts must be incremented by the duration
656 of the frame we are displaying, i.e. the last I or P frame */
657 if (st->last_IP_duration == 0)
658 st->cur_dts += pkt->duration;
660 st->cur_dts += st->last_IP_duration;
661 st->last_IP_duration = pkt->duration;
662 st->last_IP_pts= pkt->pts;
663 /* cannot compute PTS if not present (we can compute it only
664 by knowing the futur */
666 /* presentation is not delayed : PTS and DTS are the same */
667 if (pkt->pts == AV_NOPTS_VALUE) {
668 if (pkt->dts == AV_NOPTS_VALUE) {
669 pkt->pts = st->cur_dts;
670 pkt->dts = st->cur_dts;
673 st->cur_dts = pkt->dts;
677 st->cur_dts = pkt->pts;
680 st->cur_dts += pkt->duration;
682 // av_log(NULL, AV_LOG_DEBUG, "OUTdelayed:%d pts:%lld, dts:%lld cur_dts:%lld\n", presentation_delayed, pkt->pts, pkt->dts, st->cur_dts);
687 /* key frame computation */
688 switch(st->codec.codec_type) {
689 case CODEC_TYPE_VIDEO:
690 if (pc->pict_type == FF_I_TYPE)
691 pkt->flags |= PKT_FLAG_KEY;
693 case CODEC_TYPE_AUDIO:
694 pkt->flags |= PKT_FLAG_KEY;
701 /* convert the packet time stamp units */
702 if(pkt->pts != AV_NOPTS_VALUE)
703 pkt->pts = av_rescale(pkt->pts, AV_TIME_BASE * (int64_t)st->time_base.num, st->time_base.den);
704 if(pkt->dts != AV_NOPTS_VALUE)
705 pkt->dts = av_rescale(pkt->dts, AV_TIME_BASE * (int64_t)st->time_base.num, st->time_base.den);
708 pkt->duration = av_rescale(pkt->duration, AV_TIME_BASE * (int64_t)st->time_base.num, st->time_base.den);
711 void av_destruct_packet_nofree(AVPacket *pkt)
713 pkt->data = NULL; pkt->size = 0;
716 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
722 /* select current input stream component */
726 /* no parsing needed: we just output the packet as is */
727 /* raw data support */
729 compute_pkt_fields(s, st, NULL, pkt);
732 } else if (s->cur_len > 0) {
733 len = av_parser_parse(st->parser, &st->codec, &pkt->data, &pkt->size,
734 s->cur_ptr, s->cur_len,
735 s->cur_pkt.pts, s->cur_pkt.dts);
736 s->cur_pkt.pts = AV_NOPTS_VALUE;
737 s->cur_pkt.dts = AV_NOPTS_VALUE;
738 /* increment read pointer */
742 /* return packet if any */
746 pkt->stream_index = st->index;
747 pkt->pts = st->parser->pts;
748 pkt->dts = st->parser->dts;
749 pkt->destruct = av_destruct_packet_nofree;
750 compute_pkt_fields(s, st, st->parser, pkt);
755 av_free_packet(&s->cur_pkt);
759 /* read next packet */
760 ret = av_read_packet(s, &s->cur_pkt);
764 /* return the last frames, if any */
765 for(i = 0; i < s->nb_streams; i++) {
768 av_parser_parse(st->parser, &st->codec,
769 &pkt->data, &pkt->size,
771 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
776 /* no more packets: really terminates parsing */
780 st = s->streams[s->cur_pkt.stream_index];
783 s->cur_ptr = s->cur_pkt.data;
784 s->cur_len = s->cur_pkt.size;
785 if (st->need_parsing && !st->parser) {
786 st->parser = av_parser_init(st->codec.codec_id);
788 /* no parser available : just output the raw packets */
789 st->need_parsing = 0;
797 * Return the next frame of a stream. The returned packet is valid
798 * until the next av_read_frame() or until av_close_input_file() and
799 * must be freed with av_free_packet. For video, the packet contains
800 * exactly one frame. For audio, it contains an integer number of
801 * frames if each frame has a known fixed size (e.g. PCM or ADPCM
802 * data). If the audio frames have a variable size (e.g. MPEG audio),
803 * then it contains one frame.
805 * pkt->pts, pkt->dts and pkt->duration are always set to correct
806 * values in AV_TIME_BASE unit (and guessed if the format cannot
807 * provided them). pkt->pts can be AV_NOPTS_VALUE if the video format
808 * has B frames, so it is better to rely on pkt->dts if you do not
809 * decompress the payload.
811 * Return 0 if OK, < 0 if error or end of file.
813 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
817 pktl = s->packet_buffer;
819 /* read packet from packet buffer, if there is data */
821 s->packet_buffer = pktl->next;
825 return av_read_frame_internal(s, pkt);
829 /* XXX: suppress the packet queue */
830 static void flush_packet_queue(AVFormatContext *s)
835 pktl = s->packet_buffer;
838 s->packet_buffer = pktl->next;
839 av_free_packet(&pktl->pkt);
844 /*******************************************************/
847 int av_find_default_stream_index(AVFormatContext *s)
852 if (s->nb_streams <= 0)
854 for(i = 0; i < s->nb_streams; i++) {
856 if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
863 /* flush the frame reader */
864 static void av_read_frame_flush(AVFormatContext *s)
869 flush_packet_queue(s);
871 /* free previous packet */
873 if (s->cur_st->parser)
874 av_free_packet(&s->cur_pkt);
881 /* for each stream, reset read state */
882 for(i = 0; i < s->nb_streams; i++) {
886 av_parser_close(st->parser);
889 st->last_IP_pts = AV_NOPTS_VALUE;
890 st->cur_dts = 0; /* we set the current DTS to an unspecified origin */
895 * add a index entry into a sorted list updateing if it is already there.
896 * @param timestamp timestamp in the timebase of the given stream
898 int av_add_index_entry(AVStream *st,
899 int64_t pos, int64_t timestamp, int distance, int flags)
901 AVIndexEntry *entries, *ie;
904 entries = av_fast_realloc(st->index_entries,
905 &st->index_entries_allocated_size,
906 (st->nb_index_entries + 1) *
907 sizeof(AVIndexEntry));
908 st->index_entries= entries;
910 if(st->nb_index_entries){
911 index= av_index_search_timestamp(st, timestamp);
914 if(ie->timestamp != timestamp){
915 if(ie->timestamp < timestamp){
916 index++; //index points to next instead of previous entry, maybe nonexistant
917 ie= &st->index_entries[index];
921 if(index != st->nb_index_entries){
922 assert(index < st->nb_index_entries);
923 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
925 st->nb_index_entries++;
927 if(ie->pos == pos && distance < ie->min_distance) //dont reduce the distance
928 distance= ie->min_distance;
931 index= st->nb_index_entries++;
936 ie->timestamp = timestamp;
937 ie->min_distance= distance;
943 /* build an index for raw streams using a parser */
944 static void av_build_index_raw(AVFormatContext *s)
946 AVPacket pkt1, *pkt = &pkt1;
951 av_read_frame_flush(s);
952 url_fseek(&s->pb, s->data_offset, SEEK_SET);
955 ret = av_read_frame(s, pkt);
958 if (pkt->stream_index == 0 && st->parser &&
959 (pkt->flags & PKT_FLAG_KEY)) {
960 int64_t dts= av_rescale(pkt->dts, st->time_base.den, AV_TIME_BASE*(int64_t)st->time_base.num);
961 av_add_index_entry(st, st->parser->frame_offset, dts,
962 0, AVINDEX_KEYFRAME);
968 /* return TRUE if we deal with a raw stream (raw codec data and
970 static int is_raw_stream(AVFormatContext *s)
974 if (s->nb_streams != 1)
977 if (!st->need_parsing)
982 /* return the largest index entry whose timestamp is <=
984 int av_index_search_timestamp(AVStream *st, int wanted_timestamp)
986 AVIndexEntry *entries= st->index_entries;
987 int nb_entries= st->nb_index_entries;
998 m = (a + b + 1) >> 1;
999 timestamp = entries[m].timestamp;
1000 if (timestamp > wanted_timestamp) {
1012 * Does a binary search using av_index_search_timestamp() and AVCodec.read_timestamp().
1013 * this isnt supposed to be called directly by a user application, but by demuxers
1014 * @param target_ts target timestamp in the time base of the given stream
1015 * @param stream_index stream number
1017 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts){
1018 AVInputFormat *avif= s->iformat;
1019 int64_t pos_min, pos_max, pos, pos_limit;
1020 int64_t ts_min, ts_max, ts;
1022 int index, no_change, i;
1025 if (stream_index < 0)
1029 av_log(s, AV_LOG_DEBUG, "read_seek: %d %lld\n", stream_index, target_ts);
1033 ts_min= AV_NOPTS_VALUE;
1034 pos_limit= -1; //gcc falsely says it may be uninitalized
1036 st= s->streams[stream_index];
1037 if(st->index_entries){
1040 index= av_index_search_timestamp(st, target_ts);
1041 e= &st->index_entries[index];
1043 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1045 ts_min= e->timestamp;
1047 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%llx dts_min=%lld\n",
1054 if(index < st->nb_index_entries){
1055 e= &st->index_entries[index];
1056 assert(e->timestamp >= target_ts);
1058 ts_max= e->timestamp;
1059 pos_limit= pos_max - e->min_distance;
1061 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%llx pos_limit=0x%llx dts_max=%lld\n",
1062 pos_max,pos_limit, ts_max);
1067 if(ts_min == AV_NOPTS_VALUE){
1068 pos_min = s->data_offset;
1069 ts_min = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1070 if (ts_min == AV_NOPTS_VALUE)
1074 if(ts_max == AV_NOPTS_VALUE){
1076 pos_max = url_filesize(url_fileno(&s->pb)) - 1;
1079 ts_max = avif->read_timestamp(s, stream_index, &pos_max, pos_max + step);
1081 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1082 if (ts_max == AV_NOPTS_VALUE)
1086 int64_t tmp_pos= pos_max + 1;
1087 int64_t tmp_ts= avif->read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1088 if(tmp_ts == AV_NOPTS_VALUE)
1097 while (pos_min < pos_limit) {
1099 av_log(s, AV_LOG_DEBUG, "pos_min=0x%llx pos_max=0x%llx dts_min=%lld dts_max=%lld\n",
1103 assert(pos_limit <= pos_max);
1106 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1107 // interpolate position (better than dichotomy)
1108 pos = (int64_t)((double)(pos_max - pos_min) *
1109 (double)(target_ts - ts_min) /
1110 (double)(ts_max - ts_min)) + pos_min - approximate_keyframe_distance;
1111 }else if(no_change==1){
1112 // bisection, if interpolation failed to change min or max pos last time
1113 pos = (pos_min + pos_limit)>>1;
1115 // linear search if bisection failed, can only happen if there are very few or no keframes between min/max
1120 else if(pos > pos_limit)
1124 ts = avif->read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1130 av_log(s, AV_LOG_DEBUG, "%Ld %Ld %Ld / %Ld %Ld %Ld target:%Ld limit:%Ld start:%Ld noc:%d\n", pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit, start_pos, no_change);
1132 assert(ts != AV_NOPTS_VALUE);
1133 if (target_ts < ts) {
1134 pos_limit = start_pos - 1;
1140 /* check if we are lucky */
1141 if (target_ts == ts)
1149 ts_min = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1151 ts_max = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1152 av_log(s, AV_LOG_DEBUG, "pos=0x%llx %lld<=%lld<=%lld\n",
1153 pos, ts_min, target_ts, ts_max);
1156 url_fseek(&s->pb, pos, SEEK_SET);
1158 ts= av_rescale(ts_min, AV_TIME_BASE*(int64_t)st->time_base.num, st->time_base.den);
1159 for(i = 0; i < s->nb_streams; i++) {
1162 st->cur_dts = av_rescale(ts, st->time_base.den, AV_TIME_BASE*(int64_t)st->time_base.num);
1168 static int av_seek_frame_generic(AVFormatContext *s,
1169 int stream_index, int64_t timestamp)
1175 if (!s->index_built) {
1176 if (is_raw_stream(s)) {
1177 av_build_index_raw(s);
1184 st = s->streams[stream_index];
1185 index = av_index_search_timestamp(st, timestamp);
1189 /* now we have found the index, we can seek */
1190 ie = &st->index_entries[index];
1191 av_read_frame_flush(s);
1192 url_fseek(&s->pb, ie->pos, SEEK_SET);
1194 timestamp= av_rescale(ie->timestamp, AV_TIME_BASE*(int64_t)st->time_base.num, st->time_base.den);
1195 for(i = 0; i < s->nb_streams; i++) {
1198 st->cur_dts = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE*(int64_t)st->time_base.num);
1205 * Seek to the key frame just before the frame at timestamp
1206 * 'timestamp' in 'stream_index'.
1207 * @param stream_index If stream_index is (-1), a default
1208 * stream is selected
1209 * @param timestamp timestamp in AV_TIME_BASE units
1210 * @return >= 0 on success
1212 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp)
1217 av_read_frame_flush(s);
1219 if(stream_index < 0){
1220 stream_index= av_find_default_stream_index(s);
1221 if(stream_index < 0)
1224 st= s->streams[stream_index];
1226 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1228 /* first, we try the format specific seek */
1229 if (s->iformat->read_seek)
1230 ret = s->iformat->read_seek(s, stream_index, timestamp);
1237 if(s->iformat->read_timestamp)
1238 return av_seek_frame_binary(s, stream_index, timestamp);
1240 return av_seek_frame_generic(s, stream_index, timestamp);
1243 /*******************************************************/
1245 /* return TRUE if the stream has accurate timings for at least one component */
1246 static int av_has_timings(AVFormatContext *ic)
1251 for(i = 0;i < ic->nb_streams; i++) {
1252 st = ic->streams[i];
1253 if (st->start_time != AV_NOPTS_VALUE &&
1254 st->duration != AV_NOPTS_VALUE)
1260 /* estimate the stream timings from the one of each components. Also
1261 compute the global bitrate if possible */
1262 static void av_update_stream_timings(AVFormatContext *ic)
1264 int64_t start_time, end_time, end_time1;
1268 start_time = MAXINT64;
1269 end_time = MININT64;
1270 for(i = 0;i < ic->nb_streams; i++) {
1271 st = ic->streams[i];
1272 if (st->start_time != AV_NOPTS_VALUE) {
1273 if (st->start_time < start_time)
1274 start_time = st->start_time;
1275 if (st->duration != AV_NOPTS_VALUE) {
1276 end_time1 = st->start_time + st->duration;
1277 if (end_time1 > end_time)
1278 end_time = end_time1;
1282 if (start_time != MAXINT64) {
1283 ic->start_time = start_time;
1284 if (end_time != MAXINT64) {
1285 ic->duration = end_time - start_time;
1286 if (ic->file_size > 0) {
1287 /* compute the bit rate */
1288 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1289 (double)ic->duration;
1296 static void fill_all_stream_timings(AVFormatContext *ic)
1301 av_update_stream_timings(ic);
1302 for(i = 0;i < ic->nb_streams; i++) {
1303 st = ic->streams[i];
1304 if (st->start_time == AV_NOPTS_VALUE) {
1305 st->start_time = ic->start_time;
1306 st->duration = ic->duration;
1311 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1313 int64_t filesize, duration;
1317 /* if bit_rate is already set, we believe it */
1318 if (ic->bit_rate == 0) {
1320 for(i=0;i<ic->nb_streams;i++) {
1321 st = ic->streams[i];
1322 bit_rate += st->codec.bit_rate;
1324 ic->bit_rate = bit_rate;
1327 /* if duration is already set, we believe it */
1328 if (ic->duration == AV_NOPTS_VALUE &&
1329 ic->bit_rate != 0 &&
1330 ic->file_size != 0) {
1331 filesize = ic->file_size;
1333 duration = (int64_t)((8 * AV_TIME_BASE * (double)filesize) / (double)ic->bit_rate);
1334 for(i = 0; i < ic->nb_streams; i++) {
1335 st = ic->streams[i];
1336 if (st->start_time == AV_NOPTS_VALUE ||
1337 st->duration == AV_NOPTS_VALUE) {
1339 st->duration = duration;
1346 #define DURATION_MAX_READ_SIZE 250000
1348 /* only usable for MPEG-PS streams */
1349 static void av_estimate_timings_from_pts(AVFormatContext *ic)
1351 AVPacket pkt1, *pkt = &pkt1;
1353 int read_size, i, ret;
1354 int64_t start_time, end_time, end_time1;
1355 int64_t filesize, offset, duration;
1357 /* free previous packet */
1358 if (ic->cur_st && ic->cur_st->parser)
1359 av_free_packet(&ic->cur_pkt);
1362 /* flush packet queue */
1363 flush_packet_queue(ic);
1365 for(i=0;i<ic->nb_streams;i++) {
1366 st = ic->streams[i];
1368 av_parser_close(st->parser);
1373 /* we read the first packets to get the first PTS (not fully
1374 accurate, but it is enough now) */
1375 url_fseek(&ic->pb, 0, SEEK_SET);
1378 if (read_size >= DURATION_MAX_READ_SIZE)
1380 /* if all info is available, we can stop */
1381 for(i = 0;i < ic->nb_streams; i++) {
1382 st = ic->streams[i];
1383 if (st->start_time == AV_NOPTS_VALUE)
1386 if (i == ic->nb_streams)
1389 ret = av_read_packet(ic, pkt);
1392 read_size += pkt->size;
1393 st = ic->streams[pkt->stream_index];
1394 if (pkt->pts != AV_NOPTS_VALUE) {
1395 if (st->start_time == AV_NOPTS_VALUE)
1396 st->start_time = av_rescale(pkt->pts, st->time_base.num * (int64_t)AV_TIME_BASE, st->time_base.den);
1398 av_free_packet(pkt);
1401 /* we compute the minimum start_time and use it as default */
1402 start_time = MAXINT64;
1403 for(i = 0; i < ic->nb_streams; i++) {
1404 st = ic->streams[i];
1405 if (st->start_time != AV_NOPTS_VALUE &&
1406 st->start_time < start_time)
1407 start_time = st->start_time;
1409 if (start_time != MAXINT64)
1410 ic->start_time = start_time;
1412 /* estimate the end time (duration) */
1413 /* XXX: may need to support wrapping */
1414 filesize = ic->file_size;
1415 offset = filesize - DURATION_MAX_READ_SIZE;
1419 url_fseek(&ic->pb, offset, SEEK_SET);
1422 if (read_size >= DURATION_MAX_READ_SIZE)
1424 /* if all info is available, we can stop */
1425 for(i = 0;i < ic->nb_streams; i++) {
1426 st = ic->streams[i];
1427 if (st->duration == AV_NOPTS_VALUE)
1430 if (i == ic->nb_streams)
1433 ret = av_read_packet(ic, pkt);
1436 read_size += pkt->size;
1437 st = ic->streams[pkt->stream_index];
1438 if (pkt->pts != AV_NOPTS_VALUE) {
1439 end_time = av_rescale(pkt->pts, st->time_base.num * (int64_t)AV_TIME_BASE, st->time_base.den);
1440 duration = end_time - st->start_time;
1442 if (st->duration == AV_NOPTS_VALUE ||
1443 st->duration < duration)
1444 st->duration = duration;
1447 av_free_packet(pkt);
1450 /* estimate total duration */
1451 end_time = MININT64;
1452 for(i = 0;i < ic->nb_streams; i++) {
1453 st = ic->streams[i];
1454 if (st->duration != AV_NOPTS_VALUE) {
1455 end_time1 = st->start_time + st->duration;
1456 if (end_time1 > end_time)
1457 end_time = end_time1;
1461 /* update start_time (new stream may have been created, so we do
1463 if (ic->start_time != AV_NOPTS_VALUE) {
1464 for(i = 0; i < ic->nb_streams; i++) {
1465 st = ic->streams[i];
1466 if (st->start_time == AV_NOPTS_VALUE)
1467 st->start_time = ic->start_time;
1471 if (end_time != MININT64) {
1472 /* put dummy values for duration if needed */
1473 for(i = 0;i < ic->nb_streams; i++) {
1474 st = ic->streams[i];
1475 if (st->duration == AV_NOPTS_VALUE &&
1476 st->start_time != AV_NOPTS_VALUE)
1477 st->duration = end_time - st->start_time;
1479 ic->duration = end_time - ic->start_time;
1482 url_fseek(&ic->pb, 0, SEEK_SET);
1485 static void av_estimate_timings(AVFormatContext *ic)
1490 /* get the file size, if possible */
1491 if (ic->iformat->flags & AVFMT_NOFILE) {
1494 h = url_fileno(&ic->pb);
1495 file_size = url_filesize(h);
1499 ic->file_size = file_size;
1501 if (ic->iformat == &mpegps_demux) {
1502 /* get accurate estimate from the PTSes */
1503 av_estimate_timings_from_pts(ic);
1504 } else if (av_has_timings(ic)) {
1505 /* at least one components has timings - we use them for all
1507 fill_all_stream_timings(ic);
1509 /* less precise: use bit rate info */
1510 av_estimate_timings_from_bit_rate(ic);
1512 av_update_stream_timings(ic);
1518 for(i = 0;i < ic->nb_streams; i++) {
1519 st = ic->streams[i];
1520 printf("%d: start_time: %0.3f duration: %0.3f\n",
1521 i, (double)st->start_time / AV_TIME_BASE,
1522 (double)st->duration / AV_TIME_BASE);
1524 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1525 (double)ic->start_time / AV_TIME_BASE,
1526 (double)ic->duration / AV_TIME_BASE,
1527 ic->bit_rate / 1000);
1532 static int has_codec_parameters(AVCodecContext *enc)
1535 switch(enc->codec_type) {
1536 case CODEC_TYPE_AUDIO:
1537 val = enc->sample_rate;
1539 case CODEC_TYPE_VIDEO:
1549 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1553 int got_picture, ret;
1556 codec = avcodec_find_decoder(st->codec.codec_id);
1559 ret = avcodec_open(&st->codec, codec);
1562 switch(st->codec.codec_type) {
1563 case CODEC_TYPE_VIDEO:
1564 ret = avcodec_decode_video(&st->codec, &picture,
1565 &got_picture, (uint8_t *)data, size);
1567 case CODEC_TYPE_AUDIO:
1568 samples = av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
1571 ret = avcodec_decode_audio(&st->codec, samples,
1572 &got_picture, (uint8_t *)data, size);
1579 avcodec_close(&st->codec);
1583 /* absolute maximum size we read until we abort */
1584 #define MAX_READ_SIZE 5000000
1586 /* maximum duration until we stop analysing the stream */
1587 #define MAX_STREAM_DURATION ((int)(AV_TIME_BASE * 1.0))
1590 * Read the beginning of a media file to get stream information. This
1591 * is useful for file formats with no headers such as MPEG. This
1592 * function also compute the real frame rate in case of mpeg2 repeat
1595 * @param ic media file handle
1596 * @return >=0 if OK. AVERROR_xxx if error.
1598 int av_find_stream_info(AVFormatContext *ic)
1600 int i, count, ret, read_size;
1602 AVPacket pkt1, *pkt;
1603 AVPacketList *pktl=NULL, **ppktl;
1607 ppktl = &ic->packet_buffer;
1609 /* check if one codec still needs to be handled */
1610 for(i=0;i<ic->nb_streams;i++) {
1611 st = ic->streams[i];
1612 if (!has_codec_parameters(&st->codec))
1615 if (i == ic->nb_streams) {
1616 /* NOTE: if the format has no header, then we need to read
1617 some packets to get most of the streams, so we cannot
1619 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1620 /* if we found the info for all the codecs, we can stop */
1625 /* we did not get all the codec info, but we read too much data */
1626 if (read_size >= MAX_READ_SIZE) {
1632 /* NOTE: a new stream can be added there if no header in file
1633 (AVFMTCTX_NOHEADER) */
1634 ret = av_read_frame_internal(ic, &pkt1);
1637 ret = -1; /* we could not have all the codec parameters before EOF */
1638 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) &&
1639 i == ic->nb_streams)
1644 pktl = av_mallocz(sizeof(AVPacketList));
1646 ret = AVERROR_NOMEM;
1650 /* add the packet in the buffered packet list */
1652 ppktl = &pktl->next;
1657 /* duplicate the packet */
1658 if (av_dup_packet(pkt) < 0) {
1659 ret = AVERROR_NOMEM;
1663 read_size += pkt->size;
1665 st = ic->streams[pkt->stream_index];
1666 st->codec_info_duration += pkt->duration;
1667 if (pkt->duration != 0)
1668 st->codec_info_nb_frames++;
1670 /* if still no information, we try to open the codec and to
1671 decompress the frame. We try to avoid that in most cases as
1672 it takes longer and uses more memory. For MPEG4, we need to
1673 decompress for Quicktime. */
1674 if (!has_codec_parameters(&st->codec) &&
1675 (st->codec.codec_id == CODEC_ID_FLV1 ||
1676 st->codec.codec_id == CODEC_ID_H264 ||
1677 st->codec.codec_id == CODEC_ID_H263 ||
1678 st->codec.codec_id == CODEC_ID_VORBIS ||
1679 st->codec.codec_id == CODEC_ID_MJPEG ||
1680 (st->codec.codec_id == CODEC_ID_MPEG4 && !st->need_parsing)))
1681 try_decode_frame(st, pkt->data, pkt->size);
1683 if (st->codec_info_duration >= MAX_STREAM_DURATION) {
1689 /* set real frame rate info */
1690 for(i=0;i<ic->nb_streams;i++) {
1691 st = ic->streams[i];
1692 if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
1693 /* compute the real frame rate for telecine */
1694 if ((st->codec.codec_id == CODEC_ID_MPEG1VIDEO ||
1695 st->codec.codec_id == CODEC_ID_MPEG2VIDEO) &&
1696 st->codec.sub_id == 2) {
1697 if (st->codec_info_nb_frames >= 20) {
1698 float coded_frame_rate, est_frame_rate;
1699 est_frame_rate = ((double)st->codec_info_nb_frames * AV_TIME_BASE) /
1700 (double)st->codec_info_duration ;
1701 coded_frame_rate = (double)st->codec.frame_rate /
1702 (double)st->codec.frame_rate_base;
1704 printf("telecine: coded_frame_rate=%0.3f est_frame_rate=%0.3f\n",
1705 coded_frame_rate, est_frame_rate);
1707 /* if we detect that it could be a telecine, we
1708 signal it. It would be better to do it at a
1709 higher level as it can change in a film */
1710 if (coded_frame_rate >= 24.97 &&
1711 (est_frame_rate >= 23.5 && est_frame_rate < 24.5)) {
1712 st->r_frame_rate = 24024;
1713 st->r_frame_rate_base = 1001;
1717 /* if no real frame rate, use the codec one */
1718 if (!st->r_frame_rate){
1719 st->r_frame_rate = st->codec.frame_rate;
1720 st->r_frame_rate_base = st->codec.frame_rate_base;
1725 av_estimate_timings(ic);
1727 /* correct DTS for b frame streams with no timestamps */
1728 for(i=0;i<ic->nb_streams;i++) {
1729 st = ic->streams[i];
1730 if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
1732 ppktl = &ic->packet_buffer;
1734 if(ppkt1->stream_index != i)
1736 if(ppkt1->pkt->dts < 0)
1738 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
1740 ppkt1->pkt->dts -= delta;
1745 st->cur_dts -= delta;
1753 /*******************************************************/
1756 * start playing a network based stream (e.g. RTSP stream) at the
1759 int av_read_play(AVFormatContext *s)
1761 if (!s->iformat->read_play)
1762 return AVERROR_NOTSUPP;
1763 return s->iformat->read_play(s);
1767 * pause a network based stream (e.g. RTSP stream). Use av_read_play()
1770 int av_read_pause(AVFormatContext *s)
1772 if (!s->iformat->read_pause)
1773 return AVERROR_NOTSUPP;
1774 return s->iformat->read_pause(s);
1778 * Close a media file (but not its codecs)
1780 * @param s media file handle
1782 void av_close_input_file(AVFormatContext *s)
1784 int i, must_open_file;
1787 /* free previous packet */
1788 if (s->cur_st && s->cur_st->parser)
1789 av_free_packet(&s->cur_pkt);
1791 if (s->iformat->read_close)
1792 s->iformat->read_close(s);
1793 for(i=0;i<s->nb_streams;i++) {
1794 /* free all data in a stream component */
1797 av_parser_close(st->parser);
1799 av_free(st->index_entries);
1802 flush_packet_queue(s);
1804 if (s->iformat->flags & AVFMT_NOFILE) {
1807 if (must_open_file) {
1810 av_freep(&s->priv_data);
1815 * Add a new stream to a media file. Can only be called in the
1816 * read_header function. If the flag AVFMTCTX_NOHEADER is in the
1817 * format context, then new streams can be added in read_packet too.
1820 * @param s media file handle
1821 * @param id file format dependent stream id
1823 AVStream *av_new_stream(AVFormatContext *s, int id)
1827 if (s->nb_streams >= MAX_STREAMS)
1830 st = av_mallocz(sizeof(AVStream));
1833 avcodec_get_context_defaults(&st->codec);
1835 /* no default bitrate if decoding */
1836 st->codec.bit_rate = 0;
1838 st->index = s->nb_streams;
1840 st->start_time = AV_NOPTS_VALUE;
1841 st->duration = AV_NOPTS_VALUE;
1842 st->cur_dts = AV_NOPTS_VALUE;
1844 /* default pts settings is MPEG like */
1845 av_set_pts_info(st, 33, 1, 90000);
1846 st->last_IP_pts = AV_NOPTS_VALUE;
1848 s->streams[s->nb_streams++] = st;
1852 /************************************************************/
1853 /* output media file */
1855 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
1859 if (s->oformat->priv_data_size > 0) {
1860 s->priv_data = av_mallocz(s->oformat->priv_data_size);
1862 return AVERROR_NOMEM;
1864 s->priv_data = NULL;
1866 if (s->oformat->set_parameters) {
1867 ret = s->oformat->set_parameters(s, ap);
1875 * allocate the stream private data and write the stream header to an
1878 * @param s media file handle
1879 * @return 0 if OK. AVERROR_xxx if error.
1881 int av_write_header(AVFormatContext *s)
1886 ret = s->oformat->write_header(s);
1890 /* init PTS generation */
1891 for(i=0;i<s->nb_streams;i++) {
1894 switch (st->codec.codec_type) {
1895 case CODEC_TYPE_AUDIO:
1896 av_frac_init(&st->pts, 0, 0,
1897 (int64_t)st->time_base.num * st->codec.sample_rate);
1899 case CODEC_TYPE_VIDEO:
1900 av_frac_init(&st->pts, 0, 0,
1901 (int64_t)st->time_base.num * st->codec.frame_rate);
1910 //FIXME merge with compute_pkt_fields
1911 static void compute_pkt_fields2(AVStream *st, AVPacket *pkt){
1912 int b_frames = FFMAX(st->codec.has_b_frames, st->codec.max_b_frames);
1913 int num, den, frame_size;
1915 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts:%lld dts:%lld cur_dts:%lld b:%d size:%d st:%d\n", pkt->pts, pkt->dts, st->cur_dts, b_frames, pkt->size, pkt->stream_index);
1917 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
1920 if(pkt->pts != AV_NOPTS_VALUE)
1921 pkt->pts = av_rescale(pkt->pts, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1922 if(pkt->dts != AV_NOPTS_VALUE)
1923 pkt->dts = av_rescale(pkt->dts, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1925 /* duration field */
1926 pkt->duration = av_rescale(pkt->duration, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1927 if (pkt->duration == 0) {
1928 compute_frame_duration(&num, &den, st, NULL, pkt);
1930 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
1934 //XXX/FIXME this is a temporary hack until all encoders output pts
1935 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !b_frames){
1937 // pkt->pts= st->cur_dts;
1938 pkt->pts= st->pts.val;
1941 //calculate dts from pts
1942 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
1944 if(st->last_IP_pts == AV_NOPTS_VALUE){
1945 st->last_IP_pts= -pkt->duration;
1947 if(st->last_IP_pts < pkt->pts){
1948 pkt->dts= st->last_IP_pts;
1949 st->last_IP_pts= pkt->pts;
1956 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%lld dts2:%lld\n", pkt->pts, pkt->dts);
1957 st->cur_dts= pkt->dts;
1958 st->pts.val= pkt->dts;
1961 switch (st->codec.codec_type) {
1962 case CODEC_TYPE_AUDIO:
1963 frame_size = get_audio_frame_size(&st->codec, pkt->size);
1965 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
1966 but it would be better if we had the real timestamps from the encoder */
1967 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
1968 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
1971 case CODEC_TYPE_VIDEO:
1972 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec.frame_rate_base);
1979 static void truncate_ts(AVStream *st, AVPacket *pkt){
1980 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
1983 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here
1985 pkt->pts &= pts_mask;
1986 pkt->dts &= pts_mask;
1990 * Write a packet to an output media file. The packet shall contain
1991 * one audio or video frame.
1993 * @param s media file handle
1994 * @param pkt the packet, which contains the stream_index, buf/buf_size, dts/pts, ...
1995 * @return < 0 if error, = 0 if OK, 1 if end of stream wanted.
1997 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2001 compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2003 truncate_ts(s->streams[pkt->stream_index], pkt);
2005 ret= s->oformat->write_packet(s, pkt);
2007 ret= url_ferror(&s->pb);
2012 * interleave_packet implementation which will interleave per DTS.
2014 static int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2015 AVPacketList *pktl, **next_point, *this_pktl;
2017 int streams[MAX_STREAMS];
2020 AVStream *st= s->streams[ pkt->stream_index];
2022 assert(pkt->destruct != av_destruct_packet); //FIXME
2024 this_pktl = av_mallocz(sizeof(AVPacketList));
2025 this_pktl->pkt= *pkt;
2026 av_dup_packet(&this_pktl->pkt);
2028 next_point = &s->packet_buffer;
2030 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2031 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2032 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2033 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2035 next_point= &(*next_point)->next;
2037 this_pktl->next= *next_point;
2038 *next_point= this_pktl;
2041 memset(streams, 0, sizeof(streams));
2042 pktl= s->packet_buffer;
2044 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%lld\n", pktl->pkt.stream_index, pktl->pkt.dts);
2045 if(streams[ pktl->pkt.stream_index ] == 0)
2047 streams[ pktl->pkt.stream_index ]++;
2051 if(s->nb_streams == stream_count || (flush && stream_count)){
2052 pktl= s->packet_buffer;
2055 s->packet_buffer= pktl->next;
2059 av_init_packet(out);
2065 * Interleaves a AVPacket correctly so it can be muxed.
2066 * @param out the interleaved packet will be output here
2067 * @param in the input packet
2068 * @param flush 1 if no further packets are available as input and all
2069 * remaining packets should be output
2070 * @return 1 if a packet was output, 0 if no packet could be output,
2071 * < 0 if an error occured
2073 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2074 if(s->oformat->interleave_packet)
2075 return s->oformat->interleave_packet(s, out, in, flush);
2077 return av_interleave_packet_per_dts(s, out, in, flush);
2081 * Writes a packet to an output media file ensuring correct interleaving.
2082 * The packet shall contain one audio or video frame.
2083 * If the packets are already correctly interleaved the application should
2084 * call av_write_frame() instead as its slightly faster, its also important
2085 * to keep in mind that completly non interleaved input will need huge amounts
2086 * of memory to interleave with this, so its prefereable to interleave at the
2089 * @param s media file handle
2090 * @param pkt the packet, which contains the stream_index, buf/buf_size, dts/pts, ...
2091 * @return < 0 if error, = 0 if OK, 1 if end of stream wanted.
2093 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2094 AVStream *st= s->streams[ pkt->stream_index];
2096 compute_pkt_fields2(st, pkt);
2098 //FIXME/XXX/HACK drop zero sized packets
2099 if(st->codec.codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2102 if(pkt->dts == AV_NOPTS_VALUE)
2107 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2108 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2111 truncate_ts(s->streams[opkt.stream_index], &opkt);
2112 ret= s->oformat->write_packet(s, &opkt);
2114 av_free_packet(&opkt);
2119 if(url_ferror(&s->pb))
2120 return url_ferror(&s->pb);
2125 * write the stream trailer to an output media file and and free the
2126 * file private data.
2128 * @param s media file handle
2129 * @return 0 if OK. AVERROR_xxx if error. */
2130 int av_write_trailer(AVFormatContext *s)
2136 ret= av_interleave_packet(s, &pkt, NULL, 1);
2137 if(ret<0) //FIXME cleanup needed for ret<0 ?
2142 truncate_ts(s->streams[pkt.stream_index], &pkt);
2143 ret= s->oformat->write_packet(s, &pkt);
2145 av_free_packet(&pkt);
2149 if(url_ferror(&s->pb))
2153 ret = s->oformat->write_trailer(s);
2156 ret=url_ferror(&s->pb);
2157 for(i=0;i<s->nb_streams;i++)
2158 av_freep(&s->streams[i]->priv_data);
2159 av_freep(&s->priv_data);
2163 /* "user interface" functions */
2165 void dump_format(AVFormatContext *ic,
2173 av_log(NULL, AV_LOG_DEBUG, "%s #%d, %s, %s '%s':\n",
2174 is_output ? "Output" : "Input",
2176 is_output ? ic->oformat->name : ic->iformat->name,
2177 is_output ? "to" : "from", url);
2179 av_log(NULL, AV_LOG_DEBUG, " Duration: ");
2180 if (ic->duration != AV_NOPTS_VALUE) {
2181 int hours, mins, secs, us;
2182 secs = ic->duration / AV_TIME_BASE;
2183 us = ic->duration % AV_TIME_BASE;
2188 av_log(NULL, AV_LOG_DEBUG, "%02d:%02d:%02d.%01d", hours, mins, secs,
2189 (10 * us) / AV_TIME_BASE);
2191 av_log(NULL, AV_LOG_DEBUG, "N/A");
2193 av_log(NULL, AV_LOG_DEBUG, ", bitrate: ");
2195 av_log(NULL, AV_LOG_DEBUG,"%d kb/s", ic->bit_rate / 1000);
2197 av_log(NULL, AV_LOG_DEBUG, "N/A");
2199 av_log(NULL, AV_LOG_DEBUG, "\n");
2201 for(i=0;i<ic->nb_streams;i++) {
2202 AVStream *st = ic->streams[i];
2203 avcodec_string(buf, sizeof(buf), &st->codec, is_output);
2204 av_log(NULL, AV_LOG_DEBUG, " Stream #%d.%d", index, i);
2205 /* the pid is an important information, so we display it */
2206 /* XXX: add a generic system */
2208 flags = ic->oformat->flags;
2210 flags = ic->iformat->flags;
2211 if (flags & AVFMT_SHOW_IDS) {
2212 av_log(NULL, AV_LOG_DEBUG, "[0x%x]", st->id);
2214 av_log(NULL, AV_LOG_DEBUG, ": %s\n", buf);
2221 int frame_rate, frame_rate_base;
2224 static AbvEntry frame_abvs[] = {
2225 { "ntsc", 720, 480, 30000, 1001 },
2226 { "pal", 720, 576, 25, 1 },
2227 { "qntsc", 352, 240, 30000, 1001 }, /* VCD compliant ntsc */
2228 { "qpal", 352, 288, 25, 1 }, /* VCD compliant pal */
2229 { "sntsc", 640, 480, 30000, 1001 }, /* square pixel ntsc */
2230 { "spal", 768, 576, 25, 1 }, /* square pixel pal */
2231 { "film", 352, 240, 24, 1 },
2232 { "ntsc-film", 352, 240, 24000, 1001 },
2233 { "sqcif", 128, 96, 0, 0 },
2234 { "qcif", 176, 144, 0, 0 },
2235 { "cif", 352, 288, 0, 0 },
2236 { "4cif", 704, 576, 0, 0 },
2239 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2242 int n = sizeof(frame_abvs) / sizeof(AbvEntry);
2244 int frame_width = 0, frame_height = 0;
2247 if (!strcmp(frame_abvs[i].abv, str)) {
2248 frame_width = frame_abvs[i].width;
2249 frame_height = frame_abvs[i].height;
2255 frame_width = strtol(p, (char **)&p, 10);
2258 frame_height = strtol(p, (char **)&p, 10);
2260 if (frame_width <= 0 || frame_height <= 0)
2262 *width_ptr = frame_width;
2263 *height_ptr = frame_height;
2267 int parse_frame_rate(int *frame_rate, int *frame_rate_base, const char *arg)
2272 /* First, we check our abbreviation table */
2273 for (i = 0; i < sizeof(frame_abvs)/sizeof(*frame_abvs); ++i)
2274 if (!strcmp(frame_abvs[i].abv, arg)) {
2275 *frame_rate = frame_abvs[i].frame_rate;
2276 *frame_rate_base = frame_abvs[i].frame_rate_base;
2280 /* Then, we try to parse it as fraction */
2281 cp = strchr(arg, '/');
2284 *frame_rate = strtol(arg, &cpp, 10);
2285 if (cpp != arg || cpp == cp)
2286 *frame_rate_base = strtol(cp+1, &cpp, 10);
2291 /* Finally we give up and parse it as double */
2292 *frame_rate_base = DEFAULT_FRAME_RATE_BASE; //FIXME use av_d2q()
2293 *frame_rate = (int)(strtod(arg, 0) * (*frame_rate_base) + 0.5);
2295 if (!*frame_rate || !*frame_rate_base)
2302 * - If not a duration:
2303 * [{YYYY-MM-DD|YYYYMMDD}]{T| }{HH[:MM[:SS[.m...]]][Z]|HH[MM[SS[.m...]]][Z]}
2304 * Time is localtime unless Z is suffixed to the end. In this case GMT
2305 * Return the date in micro seconds since 1970
2307 * HH[:MM[:SS[.m...]]]
2310 int64_t parse_date(const char *datestr, int duration)
2316 static const char *date_fmt[] = {
2320 static const char *time_fmt[] = {
2330 time_t now = time(0);
2332 len = strlen(datestr);
2334 lastch = datestr[len - 1];
2337 is_utc = (lastch == 'z' || lastch == 'Z');
2339 memset(&dt, 0, sizeof(dt));
2344 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2345 q = small_strptime(p, date_fmt[i], &dt);
2355 dt = *localtime(&now);
2357 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2362 if (*p == 'T' || *p == 't' || *p == ' ')
2365 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2366 q = small_strptime(p, time_fmt[i], &dt);
2376 q = small_strptime(p, time_fmt[0], &dt);
2378 dt.tm_sec = strtol(p, (char **)&q, 10);
2384 /* Now we have all the fields that we can get */
2389 return now * int64_t_C(1000000);
2393 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2395 dt.tm_isdst = -1; /* unknown */
2408 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2411 val += n * (*q - '0');
2415 return negative ? -t : t;
2418 /* syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. Return
2420 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2430 while (*p != '\0' && *p != '=' && *p != '&') {
2431 if ((q - tag) < sizeof(tag) - 1)
2439 while (*p != '&' && *p != '\0') {
2440 if ((q - arg) < arg_size - 1) {
2450 if (!strcmp(tag, tag1))
2459 /* Return in 'buf' the path with '%d' replaced by number. Also handles
2460 the '%0nd' format where 'n' is the total number of digits and
2461 '%%'. Return 0 if OK, and -1 if format error */
2462 int get_frame_filename(char *buf, int buf_size,
2463 const char *path, int number)
2466 char *q, buf1[20], c;
2467 int nd, len, percentd_found;
2479 while (isdigit(*p)) {
2480 nd = nd * 10 + *p++ - '0';
2483 } while (isdigit(c));
2492 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2494 if ((q - buf + len) > buf_size - 1)
2496 memcpy(q, buf1, len);
2504 if ((q - buf) < buf_size - 1)
2508 if (!percentd_found)
2518 * Print nice hexa dump of a buffer
2519 * @param f stream for output
2521 * @param size buffer size
2523 void av_hex_dump(FILE *f, uint8_t *buf, int size)
2527 for(i=0;i<size;i+=16) {
2531 fprintf(f, "%08x ", i);
2534 fprintf(f, " %02x", buf[i+j]);
2539 for(j=0;j<len;j++) {
2541 if (c < ' ' || c > '~')
2543 fprintf(f, "%c", c);
2550 * Print on 'f' a nice dump of a packet
2551 * @param f stream for output
2552 * @param pkt packet to dump
2553 * @param dump_payload true if the payload must be displayed too
2555 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
2557 fprintf(f, "stream #%d:\n", pkt->stream_index);
2558 fprintf(f, " keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
2559 fprintf(f, " duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
2560 /* DTS is _always_ valid after av_read_frame() */
2561 fprintf(f, " dts=");
2562 if (pkt->dts == AV_NOPTS_VALUE)
2565 fprintf(f, "%0.3f", (double)pkt->dts / AV_TIME_BASE);
2566 /* PTS may be not known if B frames are present */
2567 fprintf(f, " pts=");
2568 if (pkt->pts == AV_NOPTS_VALUE)
2571 fprintf(f, "%0.3f", (double)pkt->pts / AV_TIME_BASE);
2573 fprintf(f, " size=%d\n", pkt->size);
2575 av_hex_dump(f, pkt->data, pkt->size);
2578 void url_split(char *proto, int proto_size,
2579 char *authorization, int authorization_size,
2580 char *hostname, int hostname_size,
2582 char *path, int path_size,
2593 while (*p != ':' && *p != '\0') {
2594 if ((q - proto) < proto_size - 1)
2600 if (authorization_size > 0)
2601 authorization[0] = '\0';
2605 if (hostname_size > 0)
2609 char *at,*slash; // PETR: position of '@' character and '/' character
2616 at = strchr(p,'@'); // PETR: get the position of '@'
2617 slash = strchr(p,'/'); // PETR: get position of '/' - end of hostname
2618 if (at && slash && at > slash) at = NULL; // PETR: not interested in '@' behind '/'
2620 q = at ? authorization : hostname; // PETR: if '@' exists starting with auth.
2622 while ((at || *p != ':') && *p != '/' && *p != '?' && *p != '\0') { // PETR:
2623 if (*p == '@') { // PETR: passed '@'
2624 if (authorization_size > 0)
2628 } else if (!at) { // PETR: hostname
2629 if ((q - hostname) < hostname_size - 1)
2632 if ((q - authorization) < authorization_size - 1)
2637 if (hostname_size > 0)
2641 port = strtoul(p, (char **)&p, 10);
2646 pstrcpy(path, path_size, p);
2650 * Set the pts for a given stream
2652 * @param pts_wrap_bits number of bits effectively used by the pts
2653 * (used for wrap control, 33 is the value for MPEG)
2654 * @param pts_num numerator to convert to seconds (MPEG: 1)
2655 * @param pts_den denominator to convert to seconds (MPEG: 90000)
2657 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
2658 int pts_num, int pts_den)
2660 s->pts_wrap_bits = pts_wrap_bits;
2661 s->time_base.num = pts_num;
2662 s->time_base.den = pts_den;
2665 /* fraction handling */
2668 * f = val + (num / den) + 0.5. 'num' is normalized so that it is such
2669 * as 0 <= num < den.
2671 * @param f fractional number
2672 * @param val integer value
2673 * @param num must be >= 0
2674 * @param den must be >= 1
2676 void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
2688 /* set f to (val + 0.5) */
2689 void av_frac_set(AVFrac *f, int64_t val)
2692 f->num = f->den >> 1;
2696 * Fractionnal addition to f: f = f + (incr / f->den)
2698 * @param f fractional number
2699 * @param incr increment, can be positive or negative
2701 void av_frac_add(AVFrac *f, int64_t incr)
2705 num = f->num + incr;
2708 f->val += num / den;
2714 } else if (num >= den) {
2715 f->val += num / den;
2722 * register a new image format
2723 * @param img_fmt Image format descriptor
2725 void av_register_image_format(AVImageFormat *img_fmt)
2729 p = &first_image_format;
2730 while (*p != NULL) p = &(*p)->next;
2732 img_fmt->next = NULL;
2735 /* guess image format */
2736 AVImageFormat *av_probe_image_format(AVProbeData *pd)
2738 AVImageFormat *fmt1, *fmt;
2739 int score, score_max;
2743 for(fmt1 = first_image_format; fmt1 != NULL; fmt1 = fmt1->next) {
2744 if (fmt1->img_probe) {
2745 score = fmt1->img_probe(pd);
2746 if (score > score_max) {
2755 AVImageFormat *guess_image_format(const char *filename)
2757 AVImageFormat *fmt1;
2759 for(fmt1 = first_image_format; fmt1 != NULL; fmt1 = fmt1->next) {
2760 if (fmt1->extensions && match_ext(filename, fmt1->extensions))
2767 * Read an image from a stream.
2768 * @param gb byte stream containing the image
2769 * @param fmt image format, NULL if probing is required
2771 int av_read_image(ByteIOContext *pb, const char *filename,
2773 int (*alloc_cb)(void *, AVImageInfo *info), void *opaque)
2775 char buf[PROBE_BUF_SIZE];
2776 AVProbeData probe_data, *pd = &probe_data;
2781 pd->filename = filename;
2783 pos = url_ftell(pb);
2784 pd->buf_size = get_buffer(pb, buf, PROBE_BUF_SIZE);
2785 url_fseek(pb, pos, SEEK_SET);
2786 fmt = av_probe_image_format(pd);
2789 return AVERROR_NOFMT;
2790 ret = fmt->img_read(pb, alloc_cb, opaque);
2795 * Write an image to a stream.
2796 * @param pb byte stream for the image output
2797 * @param fmt image format
2798 * @param img image data and informations
2800 int av_write_image(ByteIOContext *pb, AVImageFormat *fmt, AVImageInfo *img)
2802 return fmt->img_write(pb, img);