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 != ',' && q-ext1<sizeof(ext1)-1)
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 av_guess_image2_codec(filename) != CODEC_ID_NONE) {
83 return guess_format("image2", NULL, NULL);
85 if (!short_name && filename &&
86 filename_number_test(filename) >= 0 &&
87 guess_image_format(filename)) {
88 return guess_format("image", NULL, NULL);
91 /* find the proper file type */
97 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
99 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
101 if (filename && fmt->extensions &&
102 match_ext(filename, fmt->extensions)) {
105 if (score > score_max) {
114 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
115 const char *mime_type)
117 AVOutputFormat *fmt = guess_format(short_name, filename, mime_type);
120 AVOutputFormat *stream_fmt;
121 char stream_format_name[64];
123 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
124 stream_fmt = guess_format(stream_format_name, NULL, NULL);
134 * guesses the codec id based upon muxer and filename.
136 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
137 const char *filename, const char *mime_type, enum CodecType type){
138 if(type == CODEC_TYPE_VIDEO){
139 enum CodecID codec_id= CODEC_ID_NONE;
141 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
142 codec_id= av_guess_image2_codec(filename);
144 if(codec_id == CODEC_ID_NONE)
145 codec_id= fmt->video_codec;
147 }else if(type == CODEC_TYPE_AUDIO)
148 return fmt->audio_codec;
150 return CODEC_ID_NONE;
153 AVInputFormat *av_find_input_format(const char *short_name)
156 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) {
157 if (!strcmp(fmt->name, short_name))
163 /* memory handling */
166 * Default packet destructor
168 static void av_destruct_packet(AVPacket *pkt)
171 pkt->data = NULL; pkt->size = 0;
175 * Allocate the payload of a packet and intialized its fields to default values.
178 * @param size wanted payload size
179 * @return 0 if OK. AVERROR_xxx otherwise.
181 int av_new_packet(AVPacket *pkt, int size)
184 if((unsigned)size > (unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE)
185 return AVERROR_NOMEM;
186 data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
188 return AVERROR_NOMEM;
189 memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
194 pkt->destruct = av_destruct_packet;
198 /* This is a hack - the packet memory allocation stuff is broken. The
199 packet is allocated if it was not really allocated */
200 int av_dup_packet(AVPacket *pkt)
202 if (pkt->destruct != av_destruct_packet) {
204 /* we duplicate the packet and don't forget to put the padding
206 if((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE)
207 return AVERROR_NOMEM;
208 data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
210 return AVERROR_NOMEM;
212 memcpy(data, pkt->data, pkt->size);
213 memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
215 pkt->destruct = av_destruct_packet;
222 int fifo_init(FifoBuffer *f, int size)
224 f->buffer = av_malloc(size);
227 f->end = f->buffer + size;
228 f->wptr = f->rptr = f->buffer;
232 void fifo_free(FifoBuffer *f)
237 int fifo_size(FifoBuffer *f, uint8_t *rptr)
244 if (f->wptr >= rptr) {
245 size = f->wptr - rptr;
247 size = (f->end - rptr) + (f->wptr - f->buffer);
252 /* get data from the fifo (return -1 if not enough data) */
253 int fifo_read(FifoBuffer *f, uint8_t *buf, int buf_size, uint8_t **rptr_ptr)
262 if (f->wptr >= rptr) {
263 size = f->wptr - rptr;
265 size = (f->end - rptr) + (f->wptr - f->buffer);
270 while (buf_size > 0) {
274 memcpy(buf, rptr, len);
285 void fifo_realloc(FifoBuffer *f, unsigned int new_size){
286 unsigned int old_size= f->end - f->buffer;
288 if(old_size < new_size){
289 uint8_t *old= f->buffer;
291 f->buffer= av_realloc(f->buffer, new_size);
293 f->rptr += f->buffer - old;
294 f->wptr += f->buffer - old;
296 if(f->wptr < f->rptr){
297 memmove(f->rptr + new_size - old_size, f->rptr, f->buffer + old_size - f->rptr);
298 f->rptr += new_size - old_size;
300 f->end= f->buffer + new_size;
304 void fifo_write(FifoBuffer *f, uint8_t *buf, int size, uint8_t **wptr_ptr)
317 memcpy(wptr, buf, len);
327 /* get data from the fifo (return -1 if not enough data) */
328 int put_fifo(ByteIOContext *pb, FifoBuffer *f, int buf_size, uint8_t **rptr_ptr)
330 uint8_t *rptr = *rptr_ptr;
333 if (f->wptr >= rptr) {
334 size = f->wptr - rptr;
336 size = (f->end - rptr) + (f->wptr - f->buffer);
341 while (buf_size > 0) {
345 put_buffer(pb, rptr, len);
355 int filename_number_test(const char *filename)
360 return get_frame_filename(buf, sizeof(buf), filename, 1);
363 /* guess file format */
364 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened)
366 AVInputFormat *fmt1, *fmt;
367 int score, score_max;
371 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
372 if (!is_opened && !(fmt1->flags & AVFMT_NOFILE))
375 if (fmt1->read_probe) {
376 score = fmt1->read_probe(pd);
377 } else if (fmt1->extensions) {
378 if (match_ext(pd->filename, fmt1->extensions)) {
382 if (score > score_max) {
390 /************************************************************/
391 /* input media file */
394 * open a media file from an IO stream. 'fmt' must be specified.
397 static const char* format_to_name(void* ptr)
399 AVFormatContext* fc = (AVFormatContext*) ptr;
400 if(fc->iformat) return fc->iformat->name;
401 else if(fc->oformat) return fc->oformat->name;
405 static const AVClass av_format_context_class = { "AVFormatContext", format_to_name };
407 AVFormatContext *av_alloc_format_context(void)
410 ic = av_mallocz(sizeof(AVFormatContext));
412 ic->av_class = &av_format_context_class;
416 int av_open_input_stream(AVFormatContext **ic_ptr,
417 ByteIOContext *pb, const char *filename,
418 AVInputFormat *fmt, AVFormatParameters *ap)
423 ic = av_alloc_format_context();
431 ic->duration = AV_NOPTS_VALUE;
432 ic->start_time = AV_NOPTS_VALUE;
433 pstrcpy(ic->filename, sizeof(ic->filename), filename);
435 /* allocate private data */
436 if (fmt->priv_data_size > 0) {
437 ic->priv_data = av_mallocz(fmt->priv_data_size);
438 if (!ic->priv_data) {
443 ic->priv_data = NULL;
446 err = ic->iformat->read_header(ic, ap);
451 ic->data_offset = url_ftell(&ic->pb);
457 av_freep(&ic->priv_data);
464 #define PROBE_BUF_SIZE 2048
467 * Open a media file as input. The codec are not opened. Only the file
468 * header (if present) is read.
470 * @param ic_ptr the opened media file handle is put here
471 * @param filename filename to open.
472 * @param fmt if non NULL, force the file format to use
473 * @param buf_size optional buffer size (zero if default is OK)
474 * @param ap additionnal parameters needed when opening the file (NULL if default)
475 * @return 0 if OK. AVERROR_xxx otherwise.
477 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
480 AVFormatParameters *ap)
482 int err, must_open_file, file_opened;
483 uint8_t buf[PROBE_BUF_SIZE];
484 AVProbeData probe_data, *pd = &probe_data;
485 ByteIOContext pb1, *pb = &pb1;
490 pd->filename = filename;
495 /* guess format if no file can be opened */
496 fmt = av_probe_input_format(pd, 0);
499 /* do not open file if the format does not need it. XXX: specific
500 hack needed to handle RTSP/TCP */
502 if (fmt && (fmt->flags & AVFMT_NOFILE)) {
504 pb= NULL; //FIXME this or memset(pb, 0, sizeof(ByteIOContext)); otherwise its uninitalized
507 if (!fmt || must_open_file) {
508 /* if no file needed do not try to open one */
509 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
515 url_setbufsize(pb, buf_size);
518 /* read probe data */
519 pd->buf_size = get_buffer(pb, buf, PROBE_BUF_SIZE);
520 if (url_fseek(pb, 0, SEEK_SET) == (offset_t)-EPIPE) {
522 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
530 /* guess file format */
532 fmt = av_probe_input_format(pd, 1);
535 /* if still no format found, error */
541 /* XXX: suppress this hack for redirectors */
542 #ifdef CONFIG_NETWORK
543 if (fmt == &redir_demux) {
544 err = redir_open(ic_ptr, pb);
550 /* check filename in case of an image number is expected */
551 if (fmt->flags & AVFMT_NEEDNUMBER) {
552 if (filename_number_test(filename) < 0) {
553 err = AVERROR_NUMEXPECTED;
557 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
569 /*******************************************************/
572 * Read a transport packet from a media file. This function is
573 * absolete and should never be used. Use av_read_frame() instead.
575 * @param s media file handle
576 * @param pkt is filled
577 * @return 0 if OK. AVERROR_xxx if error.
579 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
581 return s->iformat->read_packet(s, pkt);
584 /**********************************************************/
586 /* get the number of samples of an audio frame. Return (-1) if error */
587 static int get_audio_frame_size(AVCodecContext *enc, int size)
591 if (enc->frame_size <= 1) {
592 /* specific hack for pcm codecs because no frame size is
594 switch(enc->codec_id) {
595 case CODEC_ID_PCM_S16LE:
596 case CODEC_ID_PCM_S16BE:
597 case CODEC_ID_PCM_U16LE:
598 case CODEC_ID_PCM_U16BE:
599 if (enc->channels == 0)
601 frame_size = size / (2 * enc->channels);
603 case CODEC_ID_PCM_S8:
604 case CODEC_ID_PCM_U8:
605 case CODEC_ID_PCM_MULAW:
606 case CODEC_ID_PCM_ALAW:
607 if (enc->channels == 0)
609 frame_size = size / (enc->channels);
612 /* used for example by ADPCM codecs */
613 if (enc->bit_rate == 0)
615 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
619 frame_size = enc->frame_size;
625 /* return the frame duration in seconds, return 0 if not available */
626 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
627 AVCodecParserContext *pc, AVPacket *pkt)
633 switch(st->codec.codec_type) {
634 case CODEC_TYPE_VIDEO:
635 *pnum = st->codec.frame_rate_base;
636 *pden = st->codec.frame_rate;
637 if (pc && pc->repeat_pict) {
639 *pnum = (*pnum) * (2 + pc->repeat_pict);
642 case CODEC_TYPE_AUDIO:
643 frame_size = get_audio_frame_size(&st->codec, pkt->size);
647 *pden = st->codec.sample_rate;
654 static int is_intra_only(AVCodecContext *enc){
655 if(enc->codec_type == CODEC_TYPE_AUDIO){
657 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
658 switch(enc->codec_id){
660 case CODEC_ID_MJPEGB:
662 case CODEC_ID_RAWVIDEO:
663 case CODEC_ID_DVVIDEO:
664 case CODEC_ID_HUFFYUV:
665 case CODEC_ID_FFVHUFF:
676 static int64_t lsb2full(int64_t lsb, int64_t last_ts, int lsb_bits){
677 int64_t mask = lsb_bits < 64 ? (1LL<<lsb_bits)-1 : -1LL;
678 int64_t delta= last_ts - mask/2;
679 return ((lsb - delta)&mask) + delta;
682 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
683 AVCodecParserContext *pc, AVPacket *pkt)
685 int num, den, presentation_delayed;
687 /* handle wrapping */
688 if(st->cur_dts != AV_NOPTS_VALUE){
689 if(pkt->pts != AV_NOPTS_VALUE)
690 pkt->pts= lsb2full(pkt->pts, st->cur_dts, st->pts_wrap_bits);
691 if(pkt->dts != AV_NOPTS_VALUE)
692 pkt->dts= lsb2full(pkt->dts, st->cur_dts, st->pts_wrap_bits);
695 if (pkt->duration == 0) {
696 compute_frame_duration(&num, &den, st, pc, pkt);
698 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
702 if(is_intra_only(&st->codec))
703 pkt->flags |= PKT_FLAG_KEY;
705 /* do we have a video B frame ? */
706 presentation_delayed = 0;
707 if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
708 /* XXX: need has_b_frame, but cannot get it if the codec is
710 if (( st->codec.codec_id == CODEC_ID_H264
711 || st->codec.has_b_frames) &&
712 pc && pc->pict_type != FF_B_TYPE)
713 presentation_delayed = 1;
714 /* this may be redundant, but it shouldnt hurt */
715 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
716 presentation_delayed = 1;
719 if(st->cur_dts == AV_NOPTS_VALUE){
720 if(presentation_delayed) st->cur_dts = -pkt->duration;
721 else st->cur_dts = 0;
724 // 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);
725 /* interpolate PTS and DTS if they are not present */
726 if (presentation_delayed) {
727 /* DTS = decompression time stamp */
728 /* PTS = presentation time stamp */
729 if (pkt->dts == AV_NOPTS_VALUE) {
730 /* if we know the last pts, use it */
731 if(st->last_IP_pts != AV_NOPTS_VALUE)
732 st->cur_dts = pkt->dts = st->last_IP_pts;
734 pkt->dts = st->cur_dts;
736 st->cur_dts = pkt->dts;
738 /* this is tricky: the dts must be incremented by the duration
739 of the frame we are displaying, i.e. the last I or P frame */
740 if (st->last_IP_duration == 0)
741 st->cur_dts += pkt->duration;
743 st->cur_dts += st->last_IP_duration;
744 st->last_IP_duration = pkt->duration;
745 st->last_IP_pts= pkt->pts;
746 /* cannot compute PTS if not present (we can compute it only
747 by knowing the futur */
749 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
750 int64_t old_diff= ABS(st->cur_dts - pkt->duration - pkt->pts);
751 int64_t new_diff= ABS(st->cur_dts - pkt->pts);
752 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
753 pkt->pts += pkt->duration;
754 // av_log(NULL, AV_LOG_DEBUG, "id:%d old:%Ld new:%Ld dur:%d cur:%Ld size:%d\n", pkt->stream_index, old_diff, new_diff, pkt->duration, st->cur_dts, pkt->size);
758 /* presentation is not delayed : PTS and DTS are the same */
759 if (pkt->pts == AV_NOPTS_VALUE) {
760 if (pkt->dts == AV_NOPTS_VALUE) {
761 pkt->pts = st->cur_dts;
762 pkt->dts = st->cur_dts;
765 st->cur_dts = pkt->dts;
769 st->cur_dts = pkt->pts;
772 st->cur_dts += pkt->duration;
774 // 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);
779 /* key frame computation */
780 switch(st->codec.codec_type) {
781 case CODEC_TYPE_VIDEO:
782 if (pc->pict_type == FF_I_TYPE)
783 pkt->flags |= PKT_FLAG_KEY;
785 case CODEC_TYPE_AUDIO:
786 pkt->flags |= PKT_FLAG_KEY;
793 /* convert the packet time stamp units */
794 if(pkt->pts != AV_NOPTS_VALUE)
795 pkt->pts = av_rescale(pkt->pts, AV_TIME_BASE * (int64_t)st->time_base.num, st->time_base.den);
796 if(pkt->dts != AV_NOPTS_VALUE)
797 pkt->dts = av_rescale(pkt->dts, AV_TIME_BASE * (int64_t)st->time_base.num, st->time_base.den);
800 pkt->duration = av_rescale(pkt->duration, AV_TIME_BASE * (int64_t)st->time_base.num, st->time_base.den);
803 void av_destruct_packet_nofree(AVPacket *pkt)
805 pkt->data = NULL; pkt->size = 0;
808 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
814 /* select current input stream component */
818 /* no parsing needed: we just output the packet as is */
819 /* raw data support */
821 compute_pkt_fields(s, st, NULL, pkt);
824 } else if (s->cur_len > 0) {
825 len = av_parser_parse(st->parser, &st->codec, &pkt->data, &pkt->size,
826 s->cur_ptr, s->cur_len,
827 s->cur_pkt.pts, s->cur_pkt.dts);
828 s->cur_pkt.pts = AV_NOPTS_VALUE;
829 s->cur_pkt.dts = AV_NOPTS_VALUE;
830 /* increment read pointer */
834 /* return packet if any */
838 pkt->stream_index = st->index;
839 pkt->pts = st->parser->pts;
840 pkt->dts = st->parser->dts;
841 pkt->destruct = av_destruct_packet_nofree;
842 compute_pkt_fields(s, st, st->parser, pkt);
847 av_free_packet(&s->cur_pkt);
851 /* read next packet */
852 ret = av_read_packet(s, &s->cur_pkt);
856 /* return the last frames, if any */
857 for(i = 0; i < s->nb_streams; i++) {
860 av_parser_parse(st->parser, &st->codec,
861 &pkt->data, &pkt->size,
863 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
868 /* no more packets: really terminates parsing */
872 st = s->streams[s->cur_pkt.stream_index];
875 s->cur_ptr = s->cur_pkt.data;
876 s->cur_len = s->cur_pkt.size;
877 if (st->need_parsing && !st->parser) {
878 st->parser = av_parser_init(st->codec.codec_id);
880 /* no parser available : just output the raw packets */
881 st->need_parsing = 0;
889 * Return the next frame of a stream. The returned packet is valid
890 * until the next av_read_frame() or until av_close_input_file() and
891 * must be freed with av_free_packet. For video, the packet contains
892 * exactly one frame. For audio, it contains an integer number of
893 * frames if each frame has a known fixed size (e.g. PCM or ADPCM
894 * data). If the audio frames have a variable size (e.g. MPEG audio),
895 * then it contains one frame.
897 * pkt->pts, pkt->dts and pkt->duration are always set to correct
898 * values in AV_TIME_BASE unit (and guessed if the format cannot
899 * provided them). pkt->pts can be AV_NOPTS_VALUE if the video format
900 * has B frames, so it is better to rely on pkt->dts if you do not
901 * decompress the payload.
903 * Return 0 if OK, < 0 if error or end of file.
905 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
909 pktl = s->packet_buffer;
911 /* read packet from packet buffer, if there is data */
913 s->packet_buffer = pktl->next;
917 return av_read_frame_internal(s, pkt);
921 /* XXX: suppress the packet queue */
922 static void flush_packet_queue(AVFormatContext *s)
927 pktl = s->packet_buffer;
930 s->packet_buffer = pktl->next;
931 av_free_packet(&pktl->pkt);
936 /*******************************************************/
939 int av_find_default_stream_index(AVFormatContext *s)
944 if (s->nb_streams <= 0)
946 for(i = 0; i < s->nb_streams; i++) {
948 if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
955 /* flush the frame reader */
956 static void av_read_frame_flush(AVFormatContext *s)
961 flush_packet_queue(s);
963 /* free previous packet */
965 if (s->cur_st->parser)
966 av_free_packet(&s->cur_pkt);
973 /* for each stream, reset read state */
974 for(i = 0; i < s->nb_streams; i++) {
978 av_parser_close(st->parser);
981 st->last_IP_pts = AV_NOPTS_VALUE;
982 st->cur_dts = 0; /* we set the current DTS to an unspecified origin */
987 * updates cur_dts of all streams based on given timestamp and AVStream.
988 * stream ref_st unchanged, others set cur_dts in their native timebase
989 * only needed for timestamp wrapping or if (dts not set and pts!=dts)
990 * @param timestamp new dts expressed in time_base of param ref_st
991 * @param ref_st reference stream giving time_base of param timestamp
993 static void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
996 for(i = 0; i < s->nb_streams; i++) {
997 AVStream *st = s->streams[i];
999 st->cur_dts = av_rescale(timestamp,
1000 st->time_base.den * (int64_t)ref_st->time_base.num,
1001 st->time_base.num * (int64_t)ref_st->time_base.den);
1006 * add a index entry into a sorted list updateing if it is already there.
1007 * @param timestamp timestamp in the timebase of the given stream
1009 int av_add_index_entry(AVStream *st,
1010 int64_t pos, int64_t timestamp, int distance, int flags)
1012 AVIndexEntry *entries, *ie;
1015 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1018 entries = av_fast_realloc(st->index_entries,
1019 &st->index_entries_allocated_size,
1020 (st->nb_index_entries + 1) *
1021 sizeof(AVIndexEntry));
1025 st->index_entries= entries;
1027 index= av_index_search_timestamp(st, timestamp, 0);
1030 index= st->nb_index_entries++;
1031 ie= &entries[index];
1032 assert(index==0 || ie[-1].timestamp < timestamp);
1034 ie= &entries[index];
1035 if(ie->timestamp != timestamp){
1036 if(ie->timestamp <= timestamp)
1038 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1039 st->nb_index_entries++;
1040 }else if(ie->pos == pos && distance < ie->min_distance) //dont reduce the distance
1041 distance= ie->min_distance;
1045 ie->timestamp = timestamp;
1046 ie->min_distance= distance;
1052 /* build an index for raw streams using a parser */
1053 static void av_build_index_raw(AVFormatContext *s)
1055 AVPacket pkt1, *pkt = &pkt1;
1060 av_read_frame_flush(s);
1061 url_fseek(&s->pb, s->data_offset, SEEK_SET);
1064 ret = av_read_frame(s, pkt);
1067 if (pkt->stream_index == 0 && st->parser &&
1068 (pkt->flags & PKT_FLAG_KEY)) {
1069 int64_t dts= av_rescale(pkt->dts, st->time_base.den, AV_TIME_BASE*(int64_t)st->time_base.num);
1070 av_add_index_entry(st, st->parser->frame_offset, dts,
1071 0, AVINDEX_KEYFRAME);
1073 av_free_packet(pkt);
1077 /* return TRUE if we deal with a raw stream (raw codec data and
1079 static int is_raw_stream(AVFormatContext *s)
1083 if (s->nb_streams != 1)
1086 if (!st->need_parsing)
1092 * gets the index for a specific timestamp.
1093 * @param backward if non zero then the returned index will correspond to
1094 * the timestamp which is <= the requested one, if backward is 0
1095 * then it will be >=
1096 * @return < 0 if no such timestamp could be found
1098 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1101 AVIndexEntry *entries= st->index_entries;
1102 int nb_entries= st->nb_index_entries;
1111 timestamp = entries[m].timestamp;
1112 if(timestamp >= wanted_timestamp)
1114 if(timestamp <= wanted_timestamp)
1117 m= backward ? a : b;
1127 * Does a binary search using av_index_search_timestamp() and AVCodec.read_timestamp().
1128 * this isnt supposed to be called directly by a user application, but by demuxers
1129 * @param target_ts target timestamp in the time base of the given stream
1130 * @param stream_index stream number
1132 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1133 AVInputFormat *avif= s->iformat;
1134 int64_t pos_min, pos_max, pos, pos_limit;
1135 int64_t ts_min, ts_max, ts;
1137 int index, no_change;
1140 if (stream_index < 0)
1144 av_log(s, AV_LOG_DEBUG, "read_seek: %d %lld\n", stream_index, target_ts);
1148 ts_min= AV_NOPTS_VALUE;
1149 pos_limit= -1; //gcc falsely says it may be uninitalized
1151 st= s->streams[stream_index];
1152 if(st->index_entries){
1155 index= av_index_search_timestamp(st, target_ts, 1);
1156 index= FFMAX(index, 0);
1157 e= &st->index_entries[index];
1159 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1161 ts_min= e->timestamp;
1163 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%llx dts_min=%lld\n",
1170 if(index < st->nb_index_entries){
1171 e= &st->index_entries[index];
1172 assert(e->timestamp >= target_ts);
1174 ts_max= e->timestamp;
1175 pos_limit= pos_max - e->min_distance;
1177 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%llx pos_limit=0x%llx dts_max=%lld\n",
1178 pos_max,pos_limit, ts_max);
1183 if(ts_min == AV_NOPTS_VALUE){
1184 pos_min = s->data_offset;
1185 ts_min = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1186 if (ts_min == AV_NOPTS_VALUE)
1190 if(ts_max == AV_NOPTS_VALUE){
1192 pos_max = url_filesize(url_fileno(&s->pb)) - 1;
1195 ts_max = avif->read_timestamp(s, stream_index, &pos_max, pos_max + step);
1197 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1198 if (ts_max == AV_NOPTS_VALUE)
1202 int64_t tmp_pos= pos_max + 1;
1203 int64_t tmp_ts= avif->read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1204 if(tmp_ts == AV_NOPTS_VALUE)
1213 while (pos_min < pos_limit) {
1215 av_log(s, AV_LOG_DEBUG, "pos_min=0x%llx pos_max=0x%llx dts_min=%lld dts_max=%lld\n",
1219 assert(pos_limit <= pos_max);
1222 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1223 // interpolate position (better than dichotomy)
1224 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1225 + pos_min - approximate_keyframe_distance;
1226 }else if(no_change==1){
1227 // bisection, if interpolation failed to change min or max pos last time
1228 pos = (pos_min + pos_limit)>>1;
1230 // linear search if bisection failed, can only happen if there are very few or no keframes between min/max
1235 else if(pos > pos_limit)
1239 ts = avif->read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1245 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);
1247 assert(ts != AV_NOPTS_VALUE);
1248 if (target_ts <= ts) {
1249 pos_limit = start_pos - 1;
1253 if (target_ts >= ts) {
1259 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1260 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1263 ts_min = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1265 ts_max = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1266 av_log(s, AV_LOG_DEBUG, "pos=0x%llx %lld<=%lld<=%lld\n",
1267 pos, ts_min, target_ts, ts_max);
1270 url_fseek(&s->pb, pos, SEEK_SET);
1272 av_update_cur_dts(s, st, ts);
1277 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1278 AVInputFormat *avif= s->iformat;
1279 int64_t pos_min, pos_max;
1283 if (stream_index < 0)
1286 st= s->streams[stream_index];
1289 pos_min = s->data_offset;
1290 pos_max = url_filesize(url_fileno(&s->pb)) - 1;
1292 if (pos < pos_min) pos= pos_min;
1293 else if(pos > pos_max) pos= pos_max;
1295 url_fseek(&s->pb, pos, SEEK_SET);
1298 av_update_cur_dts(s, st, ts);
1303 static int av_seek_frame_generic(AVFormatContext *s,
1304 int stream_index, int64_t timestamp, int flags)
1310 if (!s->index_built) {
1311 if (is_raw_stream(s)) {
1312 av_build_index_raw(s);
1319 st = s->streams[stream_index];
1320 index = av_index_search_timestamp(st, timestamp, flags & AVSEEK_FLAG_BACKWARD);
1324 /* now we have found the index, we can seek */
1325 ie = &st->index_entries[index];
1326 av_read_frame_flush(s);
1327 url_fseek(&s->pb, ie->pos, SEEK_SET);
1329 av_update_cur_dts(s, st, ie->timestamp);
1335 * Seek to the key frame at timestamp.
1336 * 'timestamp' in 'stream_index'.
1337 * @param stream_index If stream_index is (-1), a default
1338 * stream is selected, and timestamp is automatically converted
1339 * from AV_TIME_BASE units to the stream specific time_base.
1340 * @param timestamp timestamp in AVStream.time_base units
1341 * @param flags flags which select direction and seeking mode
1342 * @return >= 0 on success
1344 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1349 av_read_frame_flush(s);
1351 if(flags & AVSEEK_FLAG_BYTE)
1352 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1354 if(stream_index < 0){
1355 stream_index= av_find_default_stream_index(s);
1356 if(stream_index < 0)
1359 st= s->streams[stream_index];
1360 /* timestamp for default must be expressed in AV_TIME_BASE units */
1361 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1363 st= s->streams[stream_index];
1365 /* first, we try the format specific seek */
1366 if (s->iformat->read_seek)
1367 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1374 if(s->iformat->read_timestamp)
1375 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1377 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1380 /*******************************************************/
1382 /* return TRUE if the stream has accurate timings for at least one component */
1383 static int av_has_timings(AVFormatContext *ic)
1388 for(i = 0;i < ic->nb_streams; i++) {
1389 st = ic->streams[i];
1390 if (st->start_time != AV_NOPTS_VALUE &&
1391 st->duration != AV_NOPTS_VALUE)
1397 /* estimate the stream timings from the one of each components. Also
1398 compute the global bitrate if possible */
1399 static void av_update_stream_timings(AVFormatContext *ic)
1401 int64_t start_time, end_time, end_time1;
1405 start_time = MAXINT64;
1406 end_time = MININT64;
1407 for(i = 0;i < ic->nb_streams; i++) {
1408 st = ic->streams[i];
1409 if (st->start_time != AV_NOPTS_VALUE) {
1410 if (st->start_time < start_time)
1411 start_time = st->start_time;
1412 if (st->duration != AV_NOPTS_VALUE) {
1413 end_time1 = st->start_time + st->duration;
1414 if (end_time1 > end_time)
1415 end_time = end_time1;
1419 if (start_time != MAXINT64) {
1420 ic->start_time = start_time;
1421 if (end_time != MAXINT64) {
1422 ic->duration = end_time - start_time;
1423 if (ic->file_size > 0) {
1424 /* compute the bit rate */
1425 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1426 (double)ic->duration;
1433 static void fill_all_stream_timings(AVFormatContext *ic)
1438 av_update_stream_timings(ic);
1439 for(i = 0;i < ic->nb_streams; i++) {
1440 st = ic->streams[i];
1441 if (st->start_time == AV_NOPTS_VALUE) {
1442 st->start_time = ic->start_time;
1443 st->duration = ic->duration;
1448 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1450 int64_t filesize, duration;
1454 /* if bit_rate is already set, we believe it */
1455 if (ic->bit_rate == 0) {
1457 for(i=0;i<ic->nb_streams;i++) {
1458 st = ic->streams[i];
1459 bit_rate += st->codec.bit_rate;
1461 ic->bit_rate = bit_rate;
1464 /* if duration is already set, we believe it */
1465 if (ic->duration == AV_NOPTS_VALUE &&
1466 ic->bit_rate != 0 &&
1467 ic->file_size != 0) {
1468 filesize = ic->file_size;
1470 duration = (int64_t)((8 * AV_TIME_BASE * (double)filesize) / (double)ic->bit_rate);
1471 for(i = 0; i < ic->nb_streams; i++) {
1472 st = ic->streams[i];
1473 if (st->start_time == AV_NOPTS_VALUE ||
1474 st->duration == AV_NOPTS_VALUE) {
1476 st->duration = duration;
1483 #define DURATION_MAX_READ_SIZE 250000
1485 /* only usable for MPEG-PS streams */
1486 static void av_estimate_timings_from_pts(AVFormatContext *ic)
1488 AVPacket pkt1, *pkt = &pkt1;
1490 int read_size, i, ret;
1491 int64_t start_time, end_time, end_time1;
1492 int64_t filesize, offset, duration;
1494 /* free previous packet */
1495 if (ic->cur_st && ic->cur_st->parser)
1496 av_free_packet(&ic->cur_pkt);
1499 /* flush packet queue */
1500 flush_packet_queue(ic);
1502 for(i=0;i<ic->nb_streams;i++) {
1503 st = ic->streams[i];
1505 av_parser_close(st->parser);
1510 /* we read the first packets to get the first PTS (not fully
1511 accurate, but it is enough now) */
1512 url_fseek(&ic->pb, 0, SEEK_SET);
1515 if (read_size >= DURATION_MAX_READ_SIZE)
1517 /* if all info is available, we can stop */
1518 for(i = 0;i < ic->nb_streams; i++) {
1519 st = ic->streams[i];
1520 if (st->start_time == AV_NOPTS_VALUE)
1523 if (i == ic->nb_streams)
1526 ret = av_read_packet(ic, pkt);
1529 read_size += pkt->size;
1530 st = ic->streams[pkt->stream_index];
1531 if (pkt->pts != AV_NOPTS_VALUE) {
1532 if (st->start_time == AV_NOPTS_VALUE)
1533 st->start_time = av_rescale(pkt->pts, st->time_base.num * (int64_t)AV_TIME_BASE, st->time_base.den);
1535 av_free_packet(pkt);
1538 /* we compute the minimum start_time and use it as default */
1539 start_time = MAXINT64;
1540 for(i = 0; i < ic->nb_streams; i++) {
1541 st = ic->streams[i];
1542 if (st->start_time != AV_NOPTS_VALUE &&
1543 st->start_time < start_time)
1544 start_time = st->start_time;
1546 if (start_time != MAXINT64)
1547 ic->start_time = start_time;
1549 /* estimate the end time (duration) */
1550 /* XXX: may need to support wrapping */
1551 filesize = ic->file_size;
1552 offset = filesize - DURATION_MAX_READ_SIZE;
1556 url_fseek(&ic->pb, offset, SEEK_SET);
1559 if (read_size >= DURATION_MAX_READ_SIZE)
1561 /* if all info is available, we can stop */
1562 for(i = 0;i < ic->nb_streams; i++) {
1563 st = ic->streams[i];
1564 if (st->duration == AV_NOPTS_VALUE)
1567 if (i == ic->nb_streams)
1570 ret = av_read_packet(ic, pkt);
1573 read_size += pkt->size;
1574 st = ic->streams[pkt->stream_index];
1575 if (pkt->pts != AV_NOPTS_VALUE) {
1576 end_time = av_rescale(pkt->pts, st->time_base.num * (int64_t)AV_TIME_BASE, st->time_base.den);
1577 duration = end_time - st->start_time;
1579 if (st->duration == AV_NOPTS_VALUE ||
1580 st->duration < duration)
1581 st->duration = duration;
1584 av_free_packet(pkt);
1587 /* estimate total duration */
1588 end_time = MININT64;
1589 for(i = 0;i < ic->nb_streams; i++) {
1590 st = ic->streams[i];
1591 if (st->duration != AV_NOPTS_VALUE) {
1592 end_time1 = st->start_time + st->duration;
1593 if (end_time1 > end_time)
1594 end_time = end_time1;
1598 /* update start_time (new stream may have been created, so we do
1600 if (ic->start_time != AV_NOPTS_VALUE) {
1601 for(i = 0; i < ic->nb_streams; i++) {
1602 st = ic->streams[i];
1603 if (st->start_time == AV_NOPTS_VALUE)
1604 st->start_time = ic->start_time;
1608 if (end_time != MININT64) {
1609 /* put dummy values for duration if needed */
1610 for(i = 0;i < ic->nb_streams; i++) {
1611 st = ic->streams[i];
1612 if (st->duration == AV_NOPTS_VALUE &&
1613 st->start_time != AV_NOPTS_VALUE)
1614 st->duration = end_time - st->start_time;
1616 ic->duration = end_time - ic->start_time;
1619 url_fseek(&ic->pb, 0, SEEK_SET);
1622 static void av_estimate_timings(AVFormatContext *ic)
1627 /* get the file size, if possible */
1628 if (ic->iformat->flags & AVFMT_NOFILE) {
1631 h = url_fileno(&ic->pb);
1632 file_size = url_filesize(h);
1636 ic->file_size = file_size;
1638 if ((ic->iformat == &mpegps_demux || ic->iformat == &mpegts_demux) && file_size && !ic->pb.is_streamed) {
1639 /* get accurate estimate from the PTSes */
1640 av_estimate_timings_from_pts(ic);
1641 } else if (av_has_timings(ic)) {
1642 /* at least one components has timings - we use them for all
1644 fill_all_stream_timings(ic);
1646 /* less precise: use bit rate info */
1647 av_estimate_timings_from_bit_rate(ic);
1649 av_update_stream_timings(ic);
1655 for(i = 0;i < ic->nb_streams; i++) {
1656 st = ic->streams[i];
1657 printf("%d: start_time: %0.3f duration: %0.3f\n",
1658 i, (double)st->start_time / AV_TIME_BASE,
1659 (double)st->duration / AV_TIME_BASE);
1661 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1662 (double)ic->start_time / AV_TIME_BASE,
1663 (double)ic->duration / AV_TIME_BASE,
1664 ic->bit_rate / 1000);
1669 static int has_codec_parameters(AVCodecContext *enc)
1672 switch(enc->codec_type) {
1673 case CODEC_TYPE_AUDIO:
1674 val = enc->sample_rate;
1676 case CODEC_TYPE_VIDEO:
1686 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1690 int got_picture, ret;
1693 codec = avcodec_find_decoder(st->codec.codec_id);
1696 ret = avcodec_open(&st->codec, codec);
1699 switch(st->codec.codec_type) {
1700 case CODEC_TYPE_VIDEO:
1701 ret = avcodec_decode_video(&st->codec, &picture,
1702 &got_picture, (uint8_t *)data, size);
1704 case CODEC_TYPE_AUDIO:
1705 samples = av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
1708 ret = avcodec_decode_audio(&st->codec, samples,
1709 &got_picture, (uint8_t *)data, size);
1716 avcodec_close(&st->codec);
1720 /* absolute maximum size we read until we abort */
1721 #define MAX_READ_SIZE 5000000
1723 /* maximum duration until we stop analysing the stream */
1724 #define MAX_STREAM_DURATION ((int)(AV_TIME_BASE * 1.0))
1727 * Read the beginning of a media file to get stream information. This
1728 * is useful for file formats with no headers such as MPEG. This
1729 * function also compute the real frame rate in case of mpeg2 repeat
1732 * @param ic media file handle
1733 * @return >=0 if OK. AVERROR_xxx if error.
1735 int av_find_stream_info(AVFormatContext *ic)
1737 int i, count, ret, read_size;
1739 AVPacket pkt1, *pkt;
1740 AVPacketList *pktl=NULL, **ppktl;
1741 int64_t last_dts[MAX_STREAMS];
1742 int64_t best_duration[MAX_STREAMS];
1744 for(i=0;i<MAX_STREAMS;i++){
1745 last_dts[i]= AV_NOPTS_VALUE;
1746 best_duration[i]= INT64_MAX;
1751 ppktl = &ic->packet_buffer;
1753 /* check if one codec still needs to be handled */
1754 for(i=0;i<ic->nb_streams;i++) {
1755 st = ic->streams[i];
1756 if (!has_codec_parameters(&st->codec))
1758 /* variable fps and no guess at the real fps */
1759 if( st->codec.frame_rate >= 1000LL*st->codec.frame_rate_base
1760 && best_duration[i]== INT64_MAX)
1763 if (i == ic->nb_streams) {
1764 /* NOTE: if the format has no header, then we need to read
1765 some packets to get most of the streams, so we cannot
1767 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1768 /* if we found the info for all the codecs, we can stop */
1773 /* we did not get all the codec info, but we read too much data */
1774 if (read_size >= MAX_READ_SIZE) {
1780 /* NOTE: a new stream can be added there if no header in file
1781 (AVFMTCTX_NOHEADER) */
1782 ret = av_read_frame_internal(ic, &pkt1);
1785 ret = -1; /* we could not have all the codec parameters before EOF */
1786 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) &&
1787 i == ic->nb_streams)
1792 pktl = av_mallocz(sizeof(AVPacketList));
1794 ret = AVERROR_NOMEM;
1798 /* add the packet in the buffered packet list */
1800 ppktl = &pktl->next;
1805 /* duplicate the packet */
1806 if (av_dup_packet(pkt) < 0) {
1807 ret = AVERROR_NOMEM;
1811 read_size += pkt->size;
1813 st = ic->streams[pkt->stream_index];
1814 st->codec_info_duration += pkt->duration;
1815 if (pkt->duration != 0)
1816 st->codec_info_nb_frames++;
1818 if(st->codec.codec_type == CODEC_TYPE_VIDEO){
1819 int64_t last= last_dts[pkt->stream_index];
1821 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && last < pkt->dts &&
1822 best_duration[pkt->stream_index] > pkt->dts - last){
1823 best_duration[pkt->stream_index] = pkt->dts - last;
1825 last_dts[pkt->stream_index]= pkt->dts;
1827 /* if still no information, we try to open the codec and to
1828 decompress the frame. We try to avoid that in most cases as
1829 it takes longer and uses more memory. For MPEG4, we need to
1830 decompress for Quicktime. */
1831 if (!has_codec_parameters(&st->codec) &&
1832 (st->codec.codec_id == CODEC_ID_FLV1 ||
1833 st->codec.codec_id == CODEC_ID_H264 ||
1834 st->codec.codec_id == CODEC_ID_H263 ||
1835 st->codec.codec_id == CODEC_ID_H261 ||
1836 st->codec.codec_id == CODEC_ID_VORBIS ||
1837 st->codec.codec_id == CODEC_ID_MJPEG ||
1838 st->codec.codec_id == CODEC_ID_PNG ||
1839 st->codec.codec_id == CODEC_ID_PAM ||
1840 st->codec.codec_id == CODEC_ID_PGM ||
1841 st->codec.codec_id == CODEC_ID_PGMYUV ||
1842 st->codec.codec_id == CODEC_ID_PBM ||
1843 st->codec.codec_id == CODEC_ID_PPM ||
1844 (st->codec.codec_id == CODEC_ID_MPEG4 && !st->need_parsing)))
1845 try_decode_frame(st, pkt->data, pkt->size);
1847 if (st->codec_info_duration >= MAX_STREAM_DURATION) {
1853 for(i=0;i<ic->nb_streams;i++) {
1854 st = ic->streams[i];
1855 if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
1856 if(st->codec.codec_id == CODEC_ID_RAWVIDEO && !st->codec.codec_tag && !st->codec.bits_per_sample)
1857 st->codec.codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec.pix_fmt);
1859 if(best_duration[i] < INT64_MAX && st->codec.frame_rate_base*1000 <= st->codec.frame_rate){
1862 st->r_frame_rate= st->codec.frame_rate;
1863 st->r_frame_rate_base= av_rescale(best_duration[i], st->codec.frame_rate, AV_TIME_BASE);
1864 av_reduce(&st->r_frame_rate, &st->r_frame_rate_base, st->r_frame_rate, st->r_frame_rate_base, 1<<15);
1866 int_fps= av_rescale(st->r_frame_rate, 1, st->r_frame_rate_base);
1868 if(int_fps>0 && av_rescale(st->r_frame_rate, 1, int_fps) == st->r_frame_rate_base){
1869 st->r_frame_rate= int_fps;
1870 st->r_frame_rate_base= 1;
1874 /* set real frame rate info */
1875 /* compute the real frame rate for telecine */
1876 if ((st->codec.codec_id == CODEC_ID_MPEG1VIDEO ||
1877 st->codec.codec_id == CODEC_ID_MPEG2VIDEO) &&
1878 st->codec.sub_id == 2) {
1879 if (st->codec_info_nb_frames >= 20) {
1880 float coded_frame_rate, est_frame_rate;
1881 est_frame_rate = ((double)st->codec_info_nb_frames * AV_TIME_BASE) /
1882 (double)st->codec_info_duration ;
1883 coded_frame_rate = (double)st->codec.frame_rate /
1884 (double)st->codec.frame_rate_base;
1886 printf("telecine: coded_frame_rate=%0.3f est_frame_rate=%0.3f\n",
1887 coded_frame_rate, est_frame_rate);
1889 /* if we detect that it could be a telecine, we
1890 signal it. It would be better to do it at a
1891 higher level as it can change in a film */
1892 if (coded_frame_rate >= 24.97 &&
1893 (est_frame_rate >= 23.5 && est_frame_rate < 24.5)) {
1894 st->r_frame_rate = 24000;
1895 st->r_frame_rate_base = 1001;
1899 /* if no real frame rate, use the codec one */
1900 if (!st->r_frame_rate){
1901 st->r_frame_rate = st->codec.frame_rate;
1902 st->r_frame_rate_base = st->codec.frame_rate_base;
1907 av_estimate_timings(ic);
1909 /* correct DTS for b frame streams with no timestamps */
1910 for(i=0;i<ic->nb_streams;i++) {
1911 st = ic->streams[i];
1912 if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
1914 ppktl = &ic->packet_buffer;
1916 if(ppkt1->stream_index != i)
1918 if(ppkt1->pkt->dts < 0)
1920 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
1922 ppkt1->pkt->dts -= delta;
1927 st->cur_dts -= delta;
1935 /*******************************************************/
1938 * start playing a network based stream (e.g. RTSP stream) at the
1941 int av_read_play(AVFormatContext *s)
1943 if (!s->iformat->read_play)
1944 return AVERROR_NOTSUPP;
1945 return s->iformat->read_play(s);
1949 * pause a network based stream (e.g. RTSP stream). Use av_read_play()
1952 int av_read_pause(AVFormatContext *s)
1954 if (!s->iformat->read_pause)
1955 return AVERROR_NOTSUPP;
1956 return s->iformat->read_pause(s);
1960 * Close a media file (but not its codecs)
1962 * @param s media file handle
1964 void av_close_input_file(AVFormatContext *s)
1966 int i, must_open_file;
1969 /* free previous packet */
1970 if (s->cur_st && s->cur_st->parser)
1971 av_free_packet(&s->cur_pkt);
1973 if (s->iformat->read_close)
1974 s->iformat->read_close(s);
1975 for(i=0;i<s->nb_streams;i++) {
1976 /* free all data in a stream component */
1979 av_parser_close(st->parser);
1981 av_free(st->index_entries);
1984 flush_packet_queue(s);
1986 if (s->iformat->flags & AVFMT_NOFILE) {
1989 if (must_open_file) {
1992 av_freep(&s->priv_data);
1997 * Add a new stream to a media file. Can only be called in the
1998 * read_header function. If the flag AVFMTCTX_NOHEADER is in the
1999 * format context, then new streams can be added in read_packet too.
2002 * @param s media file handle
2003 * @param id file format dependent stream id
2005 AVStream *av_new_stream(AVFormatContext *s, int id)
2009 if (s->nb_streams >= MAX_STREAMS)
2012 st = av_mallocz(sizeof(AVStream));
2015 avcodec_get_context_defaults(&st->codec);
2017 /* no default bitrate if decoding */
2018 st->codec.bit_rate = 0;
2020 st->index = s->nb_streams;
2022 st->start_time = AV_NOPTS_VALUE;
2023 st->duration = AV_NOPTS_VALUE;
2024 st->cur_dts = AV_NOPTS_VALUE;
2026 /* default pts settings is MPEG like */
2027 av_set_pts_info(st, 33, 1, 90000);
2028 st->last_IP_pts = AV_NOPTS_VALUE;
2030 s->streams[s->nb_streams++] = st;
2034 /************************************************************/
2035 /* output media file */
2037 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2041 if (s->oformat->priv_data_size > 0) {
2042 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2044 return AVERROR_NOMEM;
2046 s->priv_data = NULL;
2048 if (s->oformat->set_parameters) {
2049 ret = s->oformat->set_parameters(s, ap);
2057 * allocate the stream private data and write the stream header to an
2060 * @param s media file handle
2061 * @return 0 if OK. AVERROR_xxx if error.
2063 int av_write_header(AVFormatContext *s)
2068 ret = s->oformat->write_header(s);
2072 /* init PTS generation */
2073 for(i=0;i<s->nb_streams;i++) {
2076 switch (st->codec.codec_type) {
2077 case CODEC_TYPE_AUDIO:
2078 av_frac_init(&st->pts, 0, 0,
2079 (int64_t)st->time_base.num * st->codec.sample_rate);
2081 case CODEC_TYPE_VIDEO:
2082 av_frac_init(&st->pts, 0, 0,
2083 (int64_t)st->time_base.num * st->codec.frame_rate);
2092 //FIXME merge with compute_pkt_fields
2093 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2094 int b_frames = FFMAX(st->codec.has_b_frames, st->codec.max_b_frames);
2095 int num, den, frame_size;
2097 // 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);
2099 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2102 if(pkt->pts != AV_NOPTS_VALUE)
2103 pkt->pts = av_rescale(pkt->pts, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
2104 if(pkt->dts != AV_NOPTS_VALUE)
2105 pkt->dts = av_rescale(pkt->dts, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
2107 /* duration field */
2108 pkt->duration = av_rescale(pkt->duration, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
2109 if (pkt->duration == 0) {
2110 compute_frame_duration(&num, &den, st, NULL, pkt);
2112 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2116 //XXX/FIXME this is a temporary hack until all encoders output pts
2117 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !b_frames){
2119 // pkt->pts= st->cur_dts;
2120 pkt->pts= st->pts.val;
2123 //calculate dts from pts
2124 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2126 if(st->last_IP_pts == AV_NOPTS_VALUE){
2127 st->last_IP_pts= -pkt->duration;
2129 if(st->last_IP_pts < pkt->pts){
2130 pkt->dts= st->last_IP_pts;
2131 st->last_IP_pts= pkt->pts;
2138 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2139 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %Ld >= %Ld\n", st->cur_dts, pkt->dts);
2142 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2143 av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n");
2147 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%lld dts2:%lld\n", pkt->pts, pkt->dts);
2148 st->cur_dts= pkt->dts;
2149 st->pts.val= pkt->dts;
2152 switch (st->codec.codec_type) {
2153 case CODEC_TYPE_AUDIO:
2154 frame_size = get_audio_frame_size(&st->codec, pkt->size);
2156 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
2157 but it would be better if we had the real timestamps from the encoder */
2158 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2159 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2162 case CODEC_TYPE_VIDEO:
2163 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec.frame_rate_base);
2171 static void truncate_ts(AVStream *st, AVPacket *pkt){
2172 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2175 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here
2177 pkt->pts &= pts_mask;
2178 pkt->dts &= pts_mask;
2182 * Write a packet to an output media file. The packet shall contain
2183 * one audio or video frame.
2185 * @param s media file handle
2186 * @param pkt the packet, which contains the stream_index, buf/buf_size, dts/pts, ...
2187 * @return < 0 if error, = 0 if OK, 1 if end of stream wanted.
2189 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2193 ret=compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2197 truncate_ts(s->streams[pkt->stream_index], pkt);
2199 ret= s->oformat->write_packet(s, pkt);
2201 ret= url_ferror(&s->pb);
2206 * interleave_packet implementation which will interleave per DTS.
2208 static int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2209 AVPacketList *pktl, **next_point, *this_pktl;
2211 int streams[MAX_STREAMS];
2214 AVStream *st= s->streams[ pkt->stream_index];
2216 assert(pkt->destruct != av_destruct_packet); //FIXME
2218 this_pktl = av_mallocz(sizeof(AVPacketList));
2219 this_pktl->pkt= *pkt;
2220 av_dup_packet(&this_pktl->pkt);
2222 next_point = &s->packet_buffer;
2224 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2225 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2226 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2227 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2229 next_point= &(*next_point)->next;
2231 this_pktl->next= *next_point;
2232 *next_point= this_pktl;
2235 memset(streams, 0, sizeof(streams));
2236 pktl= s->packet_buffer;
2238 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%lld\n", pktl->pkt.stream_index, pktl->pkt.dts);
2239 if(streams[ pktl->pkt.stream_index ] == 0)
2241 streams[ pktl->pkt.stream_index ]++;
2245 if(s->nb_streams == stream_count || (flush && stream_count)){
2246 pktl= s->packet_buffer;
2249 s->packet_buffer= pktl->next;
2253 av_init_packet(out);
2259 * Interleaves a AVPacket correctly so it can be muxed.
2260 * @param out the interleaved packet will be output here
2261 * @param in the input packet
2262 * @param flush 1 if no further packets are available as input and all
2263 * remaining packets should be output
2264 * @return 1 if a packet was output, 0 if no packet could be output,
2265 * < 0 if an error occured
2267 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2268 if(s->oformat->interleave_packet)
2269 return s->oformat->interleave_packet(s, out, in, flush);
2271 return av_interleave_packet_per_dts(s, out, in, flush);
2275 * Writes a packet to an output media file ensuring correct interleaving.
2276 * The packet shall contain one audio or video frame.
2277 * If the packets are already correctly interleaved the application should
2278 * call av_write_frame() instead as its slightly faster, its also important
2279 * to keep in mind that completly non interleaved input will need huge amounts
2280 * of memory to interleave with this, so its prefereable to interleave at the
2283 * @param s media file handle
2284 * @param pkt the packet, which contains the stream_index, buf/buf_size, dts/pts, ...
2285 * @return < 0 if error, = 0 if OK, 1 if end of stream wanted.
2287 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2288 AVStream *st= s->streams[ pkt->stream_index];
2290 if(compute_pkt_fields2(st, pkt) < 0)
2293 //FIXME/XXX/HACK drop zero sized packets
2294 if(st->codec.codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2297 if(pkt->dts == AV_NOPTS_VALUE)
2302 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2303 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2306 truncate_ts(s->streams[opkt.stream_index], &opkt);
2307 ret= s->oformat->write_packet(s, &opkt);
2309 av_free_packet(&opkt);
2314 if(url_ferror(&s->pb))
2315 return url_ferror(&s->pb);
2320 * write the stream trailer to an output media file and and free the
2321 * file private data.
2323 * @param s media file handle
2324 * @return 0 if OK. AVERROR_xxx if error. */
2325 int av_write_trailer(AVFormatContext *s)
2331 ret= av_interleave_packet(s, &pkt, NULL, 1);
2332 if(ret<0) //FIXME cleanup needed for ret<0 ?
2337 truncate_ts(s->streams[pkt.stream_index], &pkt);
2338 ret= s->oformat->write_packet(s, &pkt);
2340 av_free_packet(&pkt);
2344 if(url_ferror(&s->pb))
2348 ret = s->oformat->write_trailer(s);
2351 ret=url_ferror(&s->pb);
2352 for(i=0;i<s->nb_streams;i++)
2353 av_freep(&s->streams[i]->priv_data);
2354 av_freep(&s->priv_data);
2358 /* "user interface" functions */
2360 void dump_format(AVFormatContext *ic,
2368 av_log(NULL, AV_LOG_DEBUG, "%s #%d, %s, %s '%s':\n",
2369 is_output ? "Output" : "Input",
2371 is_output ? ic->oformat->name : ic->iformat->name,
2372 is_output ? "to" : "from", url);
2374 av_log(NULL, AV_LOG_DEBUG, " Duration: ");
2375 if (ic->duration != AV_NOPTS_VALUE) {
2376 int hours, mins, secs, us;
2377 secs = ic->duration / AV_TIME_BASE;
2378 us = ic->duration % AV_TIME_BASE;
2383 av_log(NULL, AV_LOG_DEBUG, "%02d:%02d:%02d.%01d", hours, mins, secs,
2384 (10 * us) / AV_TIME_BASE);
2386 av_log(NULL, AV_LOG_DEBUG, "N/A");
2388 if (ic->start_time != AV_NOPTS_VALUE) {
2390 av_log(NULL, AV_LOG_DEBUG, ", start: ");
2391 secs = ic->start_time / AV_TIME_BASE;
2392 us = ic->start_time % AV_TIME_BASE;
2393 av_log(NULL, AV_LOG_DEBUG, "%d.%06d",
2394 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2396 av_log(NULL, AV_LOG_DEBUG, ", bitrate: ");
2398 av_log(NULL, AV_LOG_DEBUG,"%d kb/s", ic->bit_rate / 1000);
2400 av_log(NULL, AV_LOG_DEBUG, "N/A");
2402 av_log(NULL, AV_LOG_DEBUG, "\n");
2404 for(i=0;i<ic->nb_streams;i++) {
2405 AVStream *st = ic->streams[i];
2406 avcodec_string(buf, sizeof(buf), &st->codec, is_output);
2407 av_log(NULL, AV_LOG_DEBUG, " Stream #%d.%d", index, i);
2408 /* the pid is an important information, so we display it */
2409 /* XXX: add a generic system */
2411 flags = ic->oformat->flags;
2413 flags = ic->iformat->flags;
2414 if (flags & AVFMT_SHOW_IDS) {
2415 av_log(NULL, AV_LOG_DEBUG, "[0x%x]", st->id);
2417 av_log(NULL, AV_LOG_DEBUG, ": %s\n", buf);
2424 int frame_rate, frame_rate_base;
2427 static AbvEntry frame_abvs[] = {
2428 { "ntsc", 720, 480, 30000, 1001 },
2429 { "pal", 720, 576, 25, 1 },
2430 { "qntsc", 352, 240, 30000, 1001 }, /* VCD compliant ntsc */
2431 { "qpal", 352, 288, 25, 1 }, /* VCD compliant pal */
2432 { "sntsc", 640, 480, 30000, 1001 }, /* square pixel ntsc */
2433 { "spal", 768, 576, 25, 1 }, /* square pixel pal */
2434 { "film", 352, 240, 24, 1 },
2435 { "ntsc-film", 352, 240, 24000, 1001 },
2436 { "sqcif", 128, 96, 0, 0 },
2437 { "qcif", 176, 144, 0, 0 },
2438 { "cif", 352, 288, 0, 0 },
2439 { "4cif", 704, 576, 0, 0 },
2442 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2445 int n = sizeof(frame_abvs) / sizeof(AbvEntry);
2447 int frame_width = 0, frame_height = 0;
2450 if (!strcmp(frame_abvs[i].abv, str)) {
2451 frame_width = frame_abvs[i].width;
2452 frame_height = frame_abvs[i].height;
2458 frame_width = strtol(p, (char **)&p, 10);
2461 frame_height = strtol(p, (char **)&p, 10);
2463 if (frame_width <= 0 || frame_height <= 0)
2465 *width_ptr = frame_width;
2466 *height_ptr = frame_height;
2470 int parse_frame_rate(int *frame_rate, int *frame_rate_base, const char *arg)
2475 /* First, we check our abbreviation table */
2476 for (i = 0; i < sizeof(frame_abvs)/sizeof(*frame_abvs); ++i)
2477 if (!strcmp(frame_abvs[i].abv, arg)) {
2478 *frame_rate = frame_abvs[i].frame_rate;
2479 *frame_rate_base = frame_abvs[i].frame_rate_base;
2483 /* Then, we try to parse it as fraction */
2484 cp = strchr(arg, '/');
2487 *frame_rate = strtol(arg, &cpp, 10);
2488 if (cpp != arg || cpp == cp)
2489 *frame_rate_base = strtol(cp+1, &cpp, 10);
2494 /* Finally we give up and parse it as double */
2495 *frame_rate_base = DEFAULT_FRAME_RATE_BASE; //FIXME use av_d2q()
2496 *frame_rate = (int)(strtod(arg, 0) * (*frame_rate_base) + 0.5);
2498 if (!*frame_rate || !*frame_rate_base)
2505 * - If not a duration:
2506 * [{YYYY-MM-DD|YYYYMMDD}]{T| }{HH[:MM[:SS[.m...]]][Z]|HH[MM[SS[.m...]]][Z]}
2507 * Time is localtime unless Z is suffixed to the end. In this case GMT
2508 * Return the date in micro seconds since 1970
2510 * HH[:MM[:SS[.m...]]]
2513 int64_t parse_date(const char *datestr, int duration)
2519 static const char *date_fmt[] = {
2523 static const char *time_fmt[] = {
2533 time_t now = time(0);
2535 len = strlen(datestr);
2537 lastch = datestr[len - 1];
2540 is_utc = (lastch == 'z' || lastch == 'Z');
2542 memset(&dt, 0, sizeof(dt));
2547 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2548 q = small_strptime(p, date_fmt[i], &dt);
2558 dt = *localtime(&now);
2560 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2565 if (*p == 'T' || *p == 't' || *p == ' ')
2568 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2569 q = small_strptime(p, time_fmt[i], &dt);
2579 q = small_strptime(p, time_fmt[0], &dt);
2581 dt.tm_sec = strtol(p, (char **)&q, 10);
2587 /* Now we have all the fields that we can get */
2592 return now * int64_t_C(1000000);
2596 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2598 dt.tm_isdst = -1; /* unknown */
2611 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2614 val += n * (*q - '0');
2618 return negative ? -t : t;
2621 /* syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. Return
2623 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2633 while (*p != '\0' && *p != '=' && *p != '&') {
2634 if ((q - tag) < sizeof(tag) - 1)
2642 while (*p != '&' && *p != '\0') {
2643 if ((q - arg) < arg_size - 1) {
2653 if (!strcmp(tag, tag1))
2662 /* Return in 'buf' the path with '%d' replaced by number. Also handles
2663 the '%0nd' format where 'n' is the total number of digits and
2664 '%%'. Return 0 if OK, and -1 if format error */
2665 int get_frame_filename(char *buf, int buf_size,
2666 const char *path, int number)
2669 char *q, buf1[20], c;
2670 int nd, len, percentd_found;
2682 while (isdigit(*p)) {
2683 nd = nd * 10 + *p++ - '0';
2686 } while (isdigit(c));
2695 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2697 if ((q - buf + len) > buf_size - 1)
2699 memcpy(q, buf1, len);
2707 if ((q - buf) < buf_size - 1)
2711 if (!percentd_found)
2721 * Print nice hexa dump of a buffer
2722 * @param f stream for output
2724 * @param size buffer size
2726 void av_hex_dump(FILE *f, uint8_t *buf, int size)
2730 for(i=0;i<size;i+=16) {
2734 fprintf(f, "%08x ", i);
2737 fprintf(f, " %02x", buf[i+j]);
2742 for(j=0;j<len;j++) {
2744 if (c < ' ' || c > '~')
2746 fprintf(f, "%c", c);
2753 * Print on 'f' a nice dump of a packet
2754 * @param f stream for output
2755 * @param pkt packet to dump
2756 * @param dump_payload true if the payload must be displayed too
2758 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
2760 fprintf(f, "stream #%d:\n", pkt->stream_index);
2761 fprintf(f, " keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
2762 fprintf(f, " duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
2763 /* DTS is _always_ valid after av_read_frame() */
2764 fprintf(f, " dts=");
2765 if (pkt->dts == AV_NOPTS_VALUE)
2768 fprintf(f, "%0.3f", (double)pkt->dts / AV_TIME_BASE);
2769 /* PTS may be not known if B frames are present */
2770 fprintf(f, " pts=");
2771 if (pkt->pts == AV_NOPTS_VALUE)
2774 fprintf(f, "%0.3f", (double)pkt->pts / AV_TIME_BASE);
2776 fprintf(f, " size=%d\n", pkt->size);
2778 av_hex_dump(f, pkt->data, pkt->size);
2781 void url_split(char *proto, int proto_size,
2782 char *authorization, int authorization_size,
2783 char *hostname, int hostname_size,
2785 char *path, int path_size,
2796 while (*p != ':' && *p != '\0') {
2797 if ((q - proto) < proto_size - 1)
2803 if (authorization_size > 0)
2804 authorization[0] = '\0';
2808 if (hostname_size > 0)
2812 char *at,*slash; // PETR: position of '@' character and '/' character
2819 at = strchr(p,'@'); // PETR: get the position of '@'
2820 slash = strchr(p,'/'); // PETR: get position of '/' - end of hostname
2821 if (at && slash && at > slash) at = NULL; // PETR: not interested in '@' behind '/'
2823 q = at ? authorization : hostname; // PETR: if '@' exists starting with auth.
2825 while ((at || *p != ':') && *p != '/' && *p != '?' && *p != '\0') { // PETR:
2826 if (*p == '@') { // PETR: passed '@'
2827 if (authorization_size > 0)
2831 } else if (!at) { // PETR: hostname
2832 if ((q - hostname) < hostname_size - 1)
2835 if ((q - authorization) < authorization_size - 1)
2840 if (hostname_size > 0)
2844 port = strtoul(p, (char **)&p, 10);
2849 pstrcpy(path, path_size, p);
2853 * Set the pts for a given stream
2855 * @param pts_wrap_bits number of bits effectively used by the pts
2856 * (used for wrap control, 33 is the value for MPEG)
2857 * @param pts_num numerator to convert to seconds (MPEG: 1)
2858 * @param pts_den denominator to convert to seconds (MPEG: 90000)
2860 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
2861 int pts_num, int pts_den)
2863 s->pts_wrap_bits = pts_wrap_bits;
2864 s->time_base.num = pts_num;
2865 s->time_base.den = pts_den;
2868 /* fraction handling */
2871 * f = val + (num / den) + 0.5. 'num' is normalized so that it is such
2872 * as 0 <= num < den.
2874 * @param f fractional number
2875 * @param val integer value
2876 * @param num must be >= 0
2877 * @param den must be >= 1
2879 void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
2891 /* set f to (val + 0.5) */
2892 void av_frac_set(AVFrac *f, int64_t val)
2895 f->num = f->den >> 1;
2899 * Fractionnal addition to f: f = f + (incr / f->den)
2901 * @param f fractional number
2902 * @param incr increment, can be positive or negative
2904 void av_frac_add(AVFrac *f, int64_t incr)
2908 num = f->num + incr;
2911 f->val += num / den;
2917 } else if (num >= den) {
2918 f->val += num / den;
2925 * register a new image format
2926 * @param img_fmt Image format descriptor
2928 void av_register_image_format(AVImageFormat *img_fmt)
2932 p = &first_image_format;
2933 while (*p != NULL) p = &(*p)->next;
2935 img_fmt->next = NULL;
2938 /* guess image format */
2939 AVImageFormat *av_probe_image_format(AVProbeData *pd)
2941 AVImageFormat *fmt1, *fmt;
2942 int score, score_max;
2946 for(fmt1 = first_image_format; fmt1 != NULL; fmt1 = fmt1->next) {
2947 if (fmt1->img_probe) {
2948 score = fmt1->img_probe(pd);
2949 if (score > score_max) {
2958 AVImageFormat *guess_image_format(const char *filename)
2960 AVImageFormat *fmt1;
2962 for(fmt1 = first_image_format; fmt1 != NULL; fmt1 = fmt1->next) {
2963 if (fmt1->extensions && match_ext(filename, fmt1->extensions))
2970 * Read an image from a stream.
2971 * @param gb byte stream containing the image
2972 * @param fmt image format, NULL if probing is required
2974 int av_read_image(ByteIOContext *pb, const char *filename,
2976 int (*alloc_cb)(void *, AVImageInfo *info), void *opaque)
2978 char buf[PROBE_BUF_SIZE];
2979 AVProbeData probe_data, *pd = &probe_data;
2984 pd->filename = filename;
2986 pos = url_ftell(pb);
2987 pd->buf_size = get_buffer(pb, buf, PROBE_BUF_SIZE);
2988 url_fseek(pb, pos, SEEK_SET);
2989 fmt = av_probe_image_format(pd);
2992 return AVERROR_NOFMT;
2993 ret = fmt->img_read(pb, alloc_cb, opaque);
2998 * Write an image to a stream.
2999 * @param pb byte stream for the image output
3000 * @param fmt image format
3001 * @param img image data and informations
3003 int av_write_image(ByteIOContext *pb, AVImageFormat *fmt, AVImageInfo *img)
3005 return fmt->img_write(pb, img);