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
25 * @file libavformat/utils.c
26 * Various utility functions for using ffmpeg library.
29 /** head of registered input format linked list. */
30 AVInputFormat *first_iformat = NULL;
31 /** head of registered output format linked list. */
32 AVOutputFormat *first_oformat = NULL;
33 /** head of registered image format linked list. */
34 AVImageFormat *first_image_format = NULL;
36 void av_register_input_format(AVInputFormat *format)
40 while (*p != NULL) p = &(*p)->next;
45 void av_register_output_format(AVOutputFormat *format)
49 while (*p != NULL) p = &(*p)->next;
54 int match_ext(const char *filename, const char *extensions)
62 ext = strrchr(filename, '.');
68 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
71 if (!strcasecmp(ext1, ext))
81 AVOutputFormat *guess_format(const char *short_name, const char *filename,
82 const char *mime_type)
84 AVOutputFormat *fmt, *fmt_found;
87 /* specific test for image sequences */
88 if (!short_name && filename &&
89 filename_number_test(filename) >= 0 &&
90 av_guess_image2_codec(filename) != CODEC_ID_NONE) {
91 return guess_format("image2", NULL, NULL);
93 if (!short_name && filename &&
94 filename_number_test(filename) >= 0 &&
95 guess_image_format(filename)) {
96 return guess_format("image", NULL, NULL);
99 /* find the proper file type */
103 while (fmt != NULL) {
105 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
107 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
109 if (filename && fmt->extensions &&
110 match_ext(filename, fmt->extensions)) {
113 if (score > score_max) {
122 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
123 const char *mime_type)
125 AVOutputFormat *fmt = guess_format(short_name, filename, mime_type);
128 AVOutputFormat *stream_fmt;
129 char stream_format_name[64];
131 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
132 stream_fmt = guess_format(stream_format_name, NULL, NULL);
142 * Guesses the codec id based upon muxer and filename.
144 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
145 const char *filename, const char *mime_type, enum CodecType type){
146 if(type == CODEC_TYPE_VIDEO){
147 enum CodecID codec_id= CODEC_ID_NONE;
149 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
150 codec_id= av_guess_image2_codec(filename);
152 if(codec_id == CODEC_ID_NONE)
153 codec_id= fmt->video_codec;
155 }else if(type == CODEC_TYPE_AUDIO)
156 return fmt->audio_codec;
158 return CODEC_ID_NONE;
162 * finds AVInputFormat based on input format's short name.
164 AVInputFormat *av_find_input_format(const char *short_name)
167 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) {
168 if (!strcmp(fmt->name, short_name))
174 /* memory handling */
177 * Default packet destructor.
179 void av_destruct_packet(AVPacket *pkt)
182 pkt->data = NULL; pkt->size = 0;
186 * Allocate the payload of a packet and intialized its fields to default values.
189 * @param size wanted payload size
190 * @return 0 if OK. AVERROR_xxx otherwise.
192 int av_new_packet(AVPacket *pkt, int size)
195 if((unsigned)size > (unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE)
196 return AVERROR_NOMEM;
197 data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
199 return AVERROR_NOMEM;
200 memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
205 pkt->destruct = av_destruct_packet;
210 * Allocate and read the payload of a packet and intialized its fields to default values.
213 * @param size wanted payload size
214 * @return >0 (read size) if OK. AVERROR_xxx otherwise.
216 int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size)
218 int ret= av_new_packet(pkt, size);
223 pkt->pos= url_ftell(s);
225 ret= get_buffer(s, pkt->data, size);
234 /* This is a hack - the packet memory allocation stuff is broken. The
235 packet is allocated if it was not really allocated */
236 int av_dup_packet(AVPacket *pkt)
238 if (pkt->destruct != av_destruct_packet) {
240 /* we duplicate the packet and don't forget to put the padding
242 if((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE)
243 return AVERROR_NOMEM;
244 data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
246 return AVERROR_NOMEM;
248 memcpy(data, pkt->data, pkt->size);
249 memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
251 pkt->destruct = av_destruct_packet;
258 int fifo_init(FifoBuffer *f, int size)
260 f->buffer = av_malloc(size);
263 f->end = f->buffer + size;
264 f->wptr = f->rptr = f->buffer;
268 void fifo_free(FifoBuffer *f)
273 int fifo_size(FifoBuffer *f, uint8_t *rptr)
280 if (f->wptr >= rptr) {
281 size = f->wptr - rptr;
283 size = (f->end - rptr) + (f->wptr - f->buffer);
289 * Get data from the fifo (returns -1 if not enough data).
291 int fifo_read(FifoBuffer *f, uint8_t *buf, int buf_size, uint8_t **rptr_ptr)
300 if (f->wptr >= rptr) {
301 size = f->wptr - rptr;
303 size = (f->end - rptr) + (f->wptr - f->buffer);
308 while (buf_size > 0) {
312 memcpy(buf, rptr, len);
326 void fifo_realloc(FifoBuffer *f, unsigned int new_size){
327 unsigned int old_size= f->end - f->buffer;
329 if(old_size < new_size){
330 uint8_t *old= f->buffer;
332 f->buffer= av_realloc(f->buffer, new_size);
334 f->rptr += f->buffer - old;
335 f->wptr += f->buffer - old;
337 if(f->wptr < f->rptr){
338 memmove(f->rptr + new_size - old_size, f->rptr, f->buffer + old_size - f->rptr);
339 f->rptr += new_size - old_size;
341 f->end= f->buffer + new_size;
345 void fifo_write(FifoBuffer *f, uint8_t *buf, int size, uint8_t **wptr_ptr)
358 memcpy(wptr, buf, len);
368 /* get data from the fifo (return -1 if not enough data) */
369 int put_fifo(ByteIOContext *pb, FifoBuffer *f, int buf_size, uint8_t **rptr_ptr)
371 uint8_t *rptr = *rptr_ptr;
374 if (f->wptr >= rptr) {
375 size = f->wptr - rptr;
377 size = (f->end - rptr) + (f->wptr - f->buffer);
382 while (buf_size > 0) {
386 put_buffer(pb, rptr, len);
396 int filename_number_test(const char *filename)
401 return get_frame_filename(buf, sizeof(buf), filename, 1);
407 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened)
409 AVInputFormat *fmt1, *fmt;
410 int score, score_max;
414 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
415 if (!is_opened && !(fmt1->flags & AVFMT_NOFILE))
418 if (fmt1->read_probe) {
419 score = fmt1->read_probe(pd);
420 } else if (fmt1->extensions) {
421 if (match_ext(pd->filename, fmt1->extensions)) {
425 if (score > score_max) {
433 /************************************************************/
434 /* input media file */
437 * Open a media file from an IO stream. 'fmt' must be specified.
439 static const char* format_to_name(void* ptr)
441 AVFormatContext* fc = (AVFormatContext*) ptr;
442 if(fc->iformat) return fc->iformat->name;
443 else if(fc->oformat) return fc->oformat->name;
447 static const AVClass av_format_context_class = { "AVFormatContext", format_to_name };
449 AVFormatContext *av_alloc_format_context(void)
452 ic = av_mallocz(sizeof(AVFormatContext));
454 ic->av_class = &av_format_context_class;
459 * Allocates all the structures needed to read an input stream.
460 * This does not open the needed codecs for decoding the stream[s].
462 int av_open_input_stream(AVFormatContext **ic_ptr,
463 ByteIOContext *pb, const char *filename,
464 AVInputFormat *fmt, AVFormatParameters *ap)
469 ic = av_alloc_format_context();
477 ic->duration = AV_NOPTS_VALUE;
478 ic->start_time = AV_NOPTS_VALUE;
479 pstrcpy(ic->filename, sizeof(ic->filename), filename);
481 /* allocate private data */
482 if (fmt->priv_data_size > 0) {
483 ic->priv_data = av_mallocz(fmt->priv_data_size);
484 if (!ic->priv_data) {
489 ic->priv_data = NULL;
492 err = ic->iformat->read_header(ic, ap);
497 ic->data_offset = url_ftell(&ic->pb);
503 av_freep(&ic->priv_data);
510 /** Size of probe buffer, for guessing file type from file contents. */
511 #define PROBE_BUF_SIZE 2048
514 * Open a media file as input. The codec are not opened. Only the file
515 * header (if present) is read.
517 * @param ic_ptr the opened media file handle is put here
518 * @param filename filename to open.
519 * @param fmt if non NULL, force the file format to use
520 * @param buf_size optional buffer size (zero if default is OK)
521 * @param ap additionnal parameters needed when opening the file (NULL if default)
522 * @return 0 if OK. AVERROR_xxx otherwise.
524 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
527 AVFormatParameters *ap)
529 int err, must_open_file, file_opened;
530 uint8_t buf[PROBE_BUF_SIZE];
531 AVProbeData probe_data, *pd = &probe_data;
532 ByteIOContext pb1, *pb = &pb1;
537 pd->filename = filename;
542 /* guess format if no file can be opened */
543 fmt = av_probe_input_format(pd, 0);
546 /* do not open file if the format does not need it. XXX: specific
547 hack needed to handle RTSP/TCP */
549 if (fmt && (fmt->flags & AVFMT_NOFILE)) {
551 pb= NULL; //FIXME this or memset(pb, 0, sizeof(ByteIOContext)); otherwise its uninitalized
554 if (!fmt || must_open_file) {
555 /* if no file needed do not try to open one */
556 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
562 url_setbufsize(pb, buf_size);
565 /* read probe data */
566 pd->buf_size = get_buffer(pb, buf, PROBE_BUF_SIZE);
567 if (url_fseek(pb, 0, SEEK_SET) == (offset_t)-EPIPE) {
569 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
577 /* guess file format */
579 fmt = av_probe_input_format(pd, 1);
582 /* if still no format found, error */
588 /* XXX: suppress this hack for redirectors */
589 #ifdef CONFIG_NETWORK
590 if (fmt == &redir_demux) {
591 err = redir_open(ic_ptr, pb);
597 /* check filename in case of an image number is expected */
598 if (fmt->flags & AVFMT_NEEDNUMBER) {
599 if (filename_number_test(filename) < 0) {
600 err = AVERROR_NUMEXPECTED;
604 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
616 /*******************************************************/
619 * Read a transport packet from a media file.
621 * This function is absolete and should never be used.
622 * Use av_read_frame() instead.
624 * @param s media file handle
625 * @param pkt is filled
626 * @return 0 if OK. AVERROR_xxx if error.
628 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
630 return s->iformat->read_packet(s, pkt);
633 /**********************************************************/
636 * Get the number of samples of an audio frame. Return (-1) if error.
638 static int get_audio_frame_size(AVCodecContext *enc, int size)
642 if (enc->frame_size <= 1) {
643 /* specific hack for pcm codecs because no frame size is
645 switch(enc->codec_id) {
646 case CODEC_ID_PCM_S16LE:
647 case CODEC_ID_PCM_S16BE:
648 case CODEC_ID_PCM_U16LE:
649 case CODEC_ID_PCM_U16BE:
650 if (enc->channels == 0)
652 frame_size = size / (2 * enc->channels);
654 case CODEC_ID_PCM_S8:
655 case CODEC_ID_PCM_U8:
656 case CODEC_ID_PCM_MULAW:
657 case CODEC_ID_PCM_ALAW:
658 if (enc->channels == 0)
660 frame_size = size / (enc->channels);
663 /* used for example by ADPCM codecs */
664 if (enc->bit_rate == 0)
666 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
670 frame_size = enc->frame_size;
677 * Return the frame duration in seconds, return 0 if not available.
679 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
680 AVCodecParserContext *pc, AVPacket *pkt)
686 switch(st->codec->codec_type) {
687 case CODEC_TYPE_VIDEO:
688 if(st->time_base.num*1000LL > st->time_base.den){
689 *pnum = st->time_base.num;
690 *pden = st->time_base.den;
691 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
692 *pnum = st->codec->time_base.num;
693 *pden = st->codec->time_base.den;
694 if (pc && pc->repeat_pict) {
696 *pnum = (*pnum) * (2 + pc->repeat_pict);
700 case CODEC_TYPE_AUDIO:
701 frame_size = get_audio_frame_size(st->codec, pkt->size);
705 *pden = st->codec->sample_rate;
712 static int is_intra_only(AVCodecContext *enc){
713 if(enc->codec_type == CODEC_TYPE_AUDIO){
715 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
716 switch(enc->codec_id){
718 case CODEC_ID_MJPEGB:
720 case CODEC_ID_RAWVIDEO:
721 case CODEC_ID_DVVIDEO:
722 case CODEC_ID_HUFFYUV:
723 case CODEC_ID_FFVHUFF:
734 static int64_t lsb2full(int64_t lsb, int64_t last_ts, int lsb_bits){
735 int64_t mask = lsb_bits < 64 ? (1LL<<lsb_bits)-1 : -1LL;
736 int64_t delta= last_ts - mask/2;
737 return ((lsb - delta)&mask) + delta;
740 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
741 AVCodecParserContext *pc, AVPacket *pkt)
743 int num, den, presentation_delayed;
744 /* handle wrapping */
745 if(st->cur_dts != AV_NOPTS_VALUE){
746 if(pkt->pts != AV_NOPTS_VALUE)
747 pkt->pts= lsb2full(pkt->pts, st->cur_dts, st->pts_wrap_bits);
748 if(pkt->dts != AV_NOPTS_VALUE)
749 pkt->dts= lsb2full(pkt->dts, st->cur_dts, st->pts_wrap_bits);
752 if (pkt->duration == 0) {
753 compute_frame_duration(&num, &den, st, pc, pkt);
755 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
759 if(is_intra_only(st->codec))
760 pkt->flags |= PKT_FLAG_KEY;
762 /* do we have a video B frame ? */
763 presentation_delayed = 0;
764 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
765 /* XXX: need has_b_frame, but cannot get it if the codec is
767 if (( st->codec->codec_id == CODEC_ID_H264
768 || st->codec->has_b_frames) &&
769 pc && pc->pict_type != FF_B_TYPE)
770 presentation_delayed = 1;
771 /* this may be redundant, but it shouldnt hurt */
772 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
773 presentation_delayed = 1;
776 if(st->cur_dts == AV_NOPTS_VALUE){
777 if(presentation_delayed) st->cur_dts = -pkt->duration;
778 else st->cur_dts = 0;
781 // 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);
782 /* interpolate PTS and DTS if they are not present */
783 if (presentation_delayed) {
784 /* DTS = decompression time stamp */
785 /* PTS = presentation time stamp */
786 if (pkt->dts == AV_NOPTS_VALUE) {
787 /* if we know the last pts, use it */
788 if(st->last_IP_pts != AV_NOPTS_VALUE)
789 st->cur_dts = pkt->dts = st->last_IP_pts;
791 pkt->dts = st->cur_dts;
793 st->cur_dts = pkt->dts;
795 /* this is tricky: the dts must be incremented by the duration
796 of the frame we are displaying, i.e. the last I or P frame */
797 if (st->last_IP_duration == 0)
798 st->cur_dts += pkt->duration;
800 st->cur_dts += st->last_IP_duration;
801 st->last_IP_duration = pkt->duration;
802 st->last_IP_pts= pkt->pts;
803 /* cannot compute PTS if not present (we can compute it only
804 by knowing the futur */
805 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
806 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
807 int64_t old_diff= ABS(st->cur_dts - pkt->duration - pkt->pts);
808 int64_t new_diff= ABS(st->cur_dts - pkt->pts);
809 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
810 pkt->pts += pkt->duration;
811 // 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);
815 /* presentation is not delayed : PTS and DTS are the same */
816 if (pkt->pts == AV_NOPTS_VALUE) {
817 if (pkt->dts == AV_NOPTS_VALUE) {
818 pkt->pts = st->cur_dts;
819 pkt->dts = st->cur_dts;
822 st->cur_dts = pkt->dts;
826 st->cur_dts = pkt->pts;
829 st->cur_dts += pkt->duration;
831 // 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);
836 /* key frame computation */
837 switch(st->codec->codec_type) {
838 case CODEC_TYPE_VIDEO:
839 if (pc->pict_type == FF_I_TYPE)
840 pkt->flags |= PKT_FLAG_KEY;
842 case CODEC_TYPE_AUDIO:
843 pkt->flags |= PKT_FLAG_KEY;
851 void av_destruct_packet_nofree(AVPacket *pkt)
853 pkt->data = NULL; pkt->size = 0;
856 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
862 /* select current input stream component */
865 if (!st->need_parsing || !st->parser) {
866 /* no parsing needed: we just output the packet as is */
867 /* raw data support */
869 compute_pkt_fields(s, st, NULL, pkt);
872 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
873 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
874 s->cur_ptr, s->cur_len,
875 s->cur_pkt.pts, s->cur_pkt.dts);
876 s->cur_pkt.pts = AV_NOPTS_VALUE;
877 s->cur_pkt.dts = AV_NOPTS_VALUE;
878 /* increment read pointer */
882 /* return packet if any */
886 pkt->stream_index = st->index;
887 pkt->pts = st->parser->pts;
888 pkt->dts = st->parser->dts;
889 pkt->destruct = av_destruct_packet_nofree;
890 compute_pkt_fields(s, st, st->parser, pkt);
895 av_free_packet(&s->cur_pkt);
899 /* read next packet */
900 ret = av_read_packet(s, &s->cur_pkt);
904 /* return the last frames, if any */
905 for(i = 0; i < s->nb_streams; i++) {
907 if (st->parser && st->need_parsing) {
908 av_parser_parse(st->parser, st->codec,
909 &pkt->data, &pkt->size,
911 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
916 /* no more packets: really terminates parsing */
920 st = s->streams[s->cur_pkt.stream_index];
923 s->cur_ptr = s->cur_pkt.data;
924 s->cur_len = s->cur_pkt.size;
925 if (st->need_parsing && !st->parser) {
926 st->parser = av_parser_init(st->codec->codec_id);
928 /* no parser available : just output the raw packets */
929 st->need_parsing = 0;
937 * Return the next frame of a stream.
939 * The returned packet is valid
940 * until the next av_read_frame() or until av_close_input_file() and
941 * must be freed with av_free_packet. For video, the packet contains
942 * exactly one frame. For audio, it contains an integer number of
943 * frames if each frame has a known fixed size (e.g. PCM or ADPCM
944 * data). If the audio frames have a variable size (e.g. MPEG audio),
945 * then it contains one frame.
947 * pkt->pts, pkt->dts and pkt->duration are always set to correct
948 * values in AV_TIME_BASE unit (and guessed if the format cannot
949 * provided them). pkt->pts can be AV_NOPTS_VALUE if the video format
950 * has B frames, so it is better to rely on pkt->dts if you do not
951 * decompress the payload.
953 * @return 0 if OK, < 0 if error or end of file.
955 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
959 pktl = s->packet_buffer;
961 /* read packet from packet buffer, if there is data */
963 s->packet_buffer = pktl->next;
967 return av_read_frame_internal(s, pkt);
971 /* XXX: suppress the packet queue */
972 static void flush_packet_queue(AVFormatContext *s)
977 pktl = s->packet_buffer;
980 s->packet_buffer = pktl->next;
981 av_free_packet(&pktl->pkt);
986 /*******************************************************/
989 int av_find_default_stream_index(AVFormatContext *s)
994 if (s->nb_streams <= 0)
996 for(i = 0; i < s->nb_streams; i++) {
998 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1006 * Flush the frame reader.
1008 static void av_read_frame_flush(AVFormatContext *s)
1013 flush_packet_queue(s);
1015 /* free previous packet */
1017 if (s->cur_st->parser)
1018 av_free_packet(&s->cur_pkt);
1025 /* for each stream, reset read state */
1026 for(i = 0; i < s->nb_streams; i++) {
1030 av_parser_close(st->parser);
1033 st->last_IP_pts = AV_NOPTS_VALUE;
1034 st->cur_dts = 0; /* we set the current DTS to an unspecified origin */
1039 * Updates cur_dts of all streams based on given timestamp and AVStream.
1041 * Stream ref_st unchanged, others set cur_dts in their native timebase
1042 * only needed for timestamp wrapping or if (dts not set and pts!=dts)
1043 * @param timestamp new dts expressed in time_base of param ref_st
1044 * @param ref_st reference stream giving time_base of param timestamp
1046 static void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1049 for(i = 0; i < s->nb_streams; i++) {
1050 AVStream *st = s->streams[i];
1052 st->cur_dts = av_rescale(timestamp,
1053 st->time_base.den * (int64_t)ref_st->time_base.num,
1054 st->time_base.num * (int64_t)ref_st->time_base.den);
1059 * Add a index entry into a sorted list updateing if it is already there.
1061 * @param timestamp timestamp in the timebase of the given stream
1063 int av_add_index_entry(AVStream *st,
1064 int64_t pos, int64_t timestamp, int distance, int flags)
1066 AVIndexEntry *entries, *ie;
1069 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1072 entries = av_fast_realloc(st->index_entries,
1073 &st->index_entries_allocated_size,
1074 (st->nb_index_entries + 1) *
1075 sizeof(AVIndexEntry));
1079 st->index_entries= entries;
1081 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1084 index= st->nb_index_entries++;
1085 ie= &entries[index];
1086 assert(index==0 || ie[-1].timestamp < timestamp);
1088 ie= &entries[index];
1089 if(ie->timestamp != timestamp){
1090 if(ie->timestamp <= timestamp)
1092 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1093 st->nb_index_entries++;
1094 }else if(ie->pos == pos && distance < ie->min_distance) //dont reduce the distance
1095 distance= ie->min_distance;
1099 ie->timestamp = timestamp;
1100 ie->min_distance= distance;
1107 * build an index for raw streams using a parser.
1109 static void av_build_index_raw(AVFormatContext *s)
1111 AVPacket pkt1, *pkt = &pkt1;
1116 av_read_frame_flush(s);
1117 url_fseek(&s->pb, s->data_offset, SEEK_SET);
1120 ret = av_read_frame(s, pkt);
1123 if (pkt->stream_index == 0 && st->parser &&
1124 (pkt->flags & PKT_FLAG_KEY)) {
1125 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
1126 0, AVINDEX_KEYFRAME);
1128 av_free_packet(pkt);
1133 * Returns TRUE if we deal with a raw stream.
1135 * Raw codec data and parsing needed.
1137 static int is_raw_stream(AVFormatContext *s)
1141 if (s->nb_streams != 1)
1144 if (!st->need_parsing)
1150 * Gets the index for a specific timestamp.
1151 * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond to
1152 * the timestamp which is <= the requested one, if backward is 0
1153 * then it will be >=
1154 * if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise
1155 * @return < 0 if no such timestamp could be found
1157 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1160 AVIndexEntry *entries= st->index_entries;
1161 int nb_entries= st->nb_index_entries;
1170 timestamp = entries[m].timestamp;
1171 if(timestamp >= wanted_timestamp)
1173 if(timestamp <= wanted_timestamp)
1176 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1178 if(!(flags & AVSEEK_FLAG_ANY)){
1179 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1180 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1192 * Does a binary search using av_index_search_timestamp() and AVCodec.read_timestamp().
1193 * this isnt supposed to be called directly by a user application, but by demuxers
1194 * @param target_ts target timestamp in the time base of the given stream
1195 * @param stream_index stream number
1197 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1198 AVInputFormat *avif= s->iformat;
1199 int64_t pos_min, pos_max, pos, pos_limit;
1200 int64_t ts_min, ts_max, ts;
1201 int64_t start_pos, filesize;
1202 int index, no_change;
1205 if (stream_index < 0)
1209 av_log(s, AV_LOG_DEBUG, "read_seek: %d %lld\n", stream_index, target_ts);
1213 ts_min= AV_NOPTS_VALUE;
1214 pos_limit= -1; //gcc falsely says it may be uninitalized
1216 st= s->streams[stream_index];
1217 if(st->index_entries){
1220 index= av_index_search_timestamp(st, target_ts, flags | AVSEEK_FLAG_BACKWARD); //FIXME whole func must be checked for non keyframe entries in index case, especially read_timestamp()
1221 index= FFMAX(index, 0);
1222 e= &st->index_entries[index];
1224 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1226 ts_min= e->timestamp;
1228 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%llx dts_min=%lld\n",
1235 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1236 assert(index < st->nb_index_entries);
1238 e= &st->index_entries[index];
1239 assert(e->timestamp >= target_ts);
1241 ts_max= e->timestamp;
1242 pos_limit= pos_max - e->min_distance;
1244 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%llx pos_limit=0x%llx dts_max=%lld\n",
1245 pos_max,pos_limit, ts_max);
1250 if(ts_min == AV_NOPTS_VALUE){
1251 pos_min = s->data_offset;
1252 ts_min = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1253 if (ts_min == AV_NOPTS_VALUE)
1257 if(ts_max == AV_NOPTS_VALUE){
1259 filesize = url_fsize(&s->pb);
1260 pos_max = filesize - 1;
1263 ts_max = avif->read_timestamp(s, stream_index, &pos_max, pos_max + step);
1265 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1266 if (ts_max == AV_NOPTS_VALUE)
1270 int64_t tmp_pos= pos_max + 1;
1271 int64_t tmp_ts= avif->read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1272 if(tmp_ts == AV_NOPTS_VALUE)
1276 if(tmp_pos >= filesize)
1283 while (pos_min < pos_limit) {
1285 av_log(s, AV_LOG_DEBUG, "pos_min=0x%llx pos_max=0x%llx dts_min=%lld dts_max=%lld\n",
1289 assert(pos_limit <= pos_max);
1292 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1293 // interpolate position (better than dichotomy)
1294 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1295 + pos_min - approximate_keyframe_distance;
1296 }else if(no_change==1){
1297 // bisection, if interpolation failed to change min or max pos last time
1298 pos = (pos_min + pos_limit)>>1;
1300 // linear search if bisection failed, can only happen if there are very few or no keframes between min/max
1305 else if(pos > pos_limit)
1309 ts = avif->read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1315 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);
1317 assert(ts != AV_NOPTS_VALUE);
1318 if (target_ts <= ts) {
1319 pos_limit = start_pos - 1;
1323 if (target_ts >= ts) {
1329 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1330 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1333 ts_min = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1335 ts_max = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1336 av_log(s, AV_LOG_DEBUG, "pos=0x%llx %lld<=%lld<=%lld\n",
1337 pos, ts_min, target_ts, ts_max);
1340 url_fseek(&s->pb, pos, SEEK_SET);
1342 av_update_cur_dts(s, st, ts);
1347 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1348 int64_t pos_min, pos_max;
1352 if (stream_index < 0)
1355 st= s->streams[stream_index];
1358 pos_min = s->data_offset;
1359 pos_max = url_fsize(&s->pb) - 1;
1361 if (pos < pos_min) pos= pos_min;
1362 else if(pos > pos_max) pos= pos_max;
1364 url_fseek(&s->pb, pos, SEEK_SET);
1367 av_update_cur_dts(s, st, ts);
1372 static int av_seek_frame_generic(AVFormatContext *s,
1373 int stream_index, int64_t timestamp, int flags)
1379 if (!s->index_built) {
1380 if (is_raw_stream(s)) {
1381 av_build_index_raw(s);
1388 st = s->streams[stream_index];
1389 index = av_index_search_timestamp(st, timestamp, flags);
1393 /* now we have found the index, we can seek */
1394 ie = &st->index_entries[index];
1395 av_read_frame_flush(s);
1396 url_fseek(&s->pb, ie->pos, SEEK_SET);
1398 av_update_cur_dts(s, st, ie->timestamp);
1404 * Seek to the key frame at timestamp.
1405 * 'timestamp' in 'stream_index'.
1406 * @param stream_index If stream_index is (-1), a default
1407 * stream is selected, and timestamp is automatically converted
1408 * from AV_TIME_BASE units to the stream specific time_base.
1409 * @param timestamp timestamp in AVStream.time_base units
1410 * or if there is no stream specified then in AV_TIME_BASE units
1411 * @param flags flags which select direction and seeking mode
1412 * @return >= 0 on success
1414 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1419 av_read_frame_flush(s);
1421 if(flags & AVSEEK_FLAG_BYTE)
1422 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1424 if(stream_index < 0){
1425 stream_index= av_find_default_stream_index(s);
1426 if(stream_index < 0)
1429 st= s->streams[stream_index];
1430 /* timestamp for default must be expressed in AV_TIME_BASE units */
1431 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1433 st= s->streams[stream_index];
1435 /* first, we try the format specific seek */
1436 if (s->iformat->read_seek)
1437 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1444 if(s->iformat->read_timestamp)
1445 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1447 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1450 /*******************************************************/
1453 * Returns TRUE if the stream has accurate timings in any stream.
1455 * @return TRUE if the stream has accurate timings for at least one component.
1457 static int av_has_timings(AVFormatContext *ic)
1462 for(i = 0;i < ic->nb_streams; i++) {
1463 st = ic->streams[i];
1464 if (st->start_time != AV_NOPTS_VALUE &&
1465 st->duration != AV_NOPTS_VALUE)
1472 * Estimate the stream timings from the one of each components.
1474 * Also computes the global bitrate if possible.
1476 static void av_update_stream_timings(AVFormatContext *ic)
1478 int64_t start_time, start_time1, end_time, end_time1;
1482 start_time = MAXINT64;
1483 end_time = MININT64;
1484 for(i = 0;i < ic->nb_streams; i++) {
1485 st = ic->streams[i];
1486 if (st->start_time != AV_NOPTS_VALUE) {
1487 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1488 if (start_time1 < start_time)
1489 start_time = start_time1;
1490 if (st->duration != AV_NOPTS_VALUE) {
1491 end_time1 = start_time1
1492 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1493 if (end_time1 > end_time)
1494 end_time = end_time1;
1498 if (start_time != MAXINT64) {
1499 ic->start_time = start_time;
1500 if (end_time != MININT64) {
1501 ic->duration = end_time - start_time;
1502 if (ic->file_size > 0) {
1503 /* compute the bit rate */
1504 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1505 (double)ic->duration;
1512 static void fill_all_stream_timings(AVFormatContext *ic)
1517 av_update_stream_timings(ic);
1518 for(i = 0;i < ic->nb_streams; i++) {
1519 st = ic->streams[i];
1520 if (st->start_time == AV_NOPTS_VALUE) {
1521 if(ic->start_time != AV_NOPTS_VALUE)
1522 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1523 if(ic->duration != AV_NOPTS_VALUE)
1524 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1529 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1531 int64_t filesize, duration;
1535 /* if bit_rate is already set, we believe it */
1536 if (ic->bit_rate == 0) {
1538 for(i=0;i<ic->nb_streams;i++) {
1539 st = ic->streams[i];
1540 bit_rate += st->codec->bit_rate;
1542 ic->bit_rate = bit_rate;
1545 /* if duration is already set, we believe it */
1546 if (ic->duration == AV_NOPTS_VALUE &&
1547 ic->bit_rate != 0 &&
1548 ic->file_size != 0) {
1549 filesize = ic->file_size;
1551 for(i = 0; i < ic->nb_streams; i++) {
1552 st = ic->streams[i];
1553 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1554 if (st->start_time == AV_NOPTS_VALUE ||
1555 st->duration == AV_NOPTS_VALUE) {
1557 st->duration = duration;
1564 #define DURATION_MAX_READ_SIZE 250000
1566 /* only usable for MPEG-PS streams */
1567 static void av_estimate_timings_from_pts(AVFormatContext *ic)
1569 AVPacket pkt1, *pkt = &pkt1;
1571 int read_size, i, ret;
1573 int64_t filesize, offset, duration;
1575 /* free previous packet */
1576 if (ic->cur_st && ic->cur_st->parser)
1577 av_free_packet(&ic->cur_pkt);
1580 /* flush packet queue */
1581 flush_packet_queue(ic);
1583 for(i=0;i<ic->nb_streams;i++) {
1584 st = ic->streams[i];
1586 av_parser_close(st->parser);
1591 /* we read the first packets to get the first PTS (not fully
1592 accurate, but it is enough now) */
1593 url_fseek(&ic->pb, 0, SEEK_SET);
1596 if (read_size >= DURATION_MAX_READ_SIZE)
1598 /* if all info is available, we can stop */
1599 for(i = 0;i < ic->nb_streams; i++) {
1600 st = ic->streams[i];
1601 if (st->start_time == AV_NOPTS_VALUE)
1604 if (i == ic->nb_streams)
1607 ret = av_read_packet(ic, pkt);
1610 read_size += pkt->size;
1611 st = ic->streams[pkt->stream_index];
1612 if (pkt->pts != AV_NOPTS_VALUE) {
1613 if (st->start_time == AV_NOPTS_VALUE)
1614 st->start_time = pkt->pts;
1616 av_free_packet(pkt);
1619 /* estimate the end time (duration) */
1620 /* XXX: may need to support wrapping */
1621 filesize = ic->file_size;
1622 offset = filesize - DURATION_MAX_READ_SIZE;
1626 url_fseek(&ic->pb, offset, SEEK_SET);
1629 if (read_size >= DURATION_MAX_READ_SIZE)
1631 /* if all info is available, we can stop */
1632 for(i = 0;i < ic->nb_streams; i++) {
1633 st = ic->streams[i];
1634 if (st->duration == AV_NOPTS_VALUE)
1637 if (i == ic->nb_streams)
1640 ret = av_read_packet(ic, pkt);
1643 read_size += pkt->size;
1644 st = ic->streams[pkt->stream_index];
1645 if (pkt->pts != AV_NOPTS_VALUE) {
1646 end_time = pkt->pts;
1647 duration = end_time - st->start_time;
1649 if (st->duration == AV_NOPTS_VALUE ||
1650 st->duration < duration)
1651 st->duration = duration;
1654 av_free_packet(pkt);
1657 fill_all_stream_timings(ic);
1659 url_fseek(&ic->pb, 0, SEEK_SET);
1662 static void av_estimate_timings(AVFormatContext *ic)
1666 /* get the file size, if possible */
1667 if (ic->iformat->flags & AVFMT_NOFILE) {
1670 file_size = url_fsize(&ic->pb);
1674 ic->file_size = file_size;
1676 if ((ic->iformat == &mpegps_demux || ic->iformat == &mpegts_demux) && file_size && !ic->pb.is_streamed) {
1677 /* get accurate estimate from the PTSes */
1678 av_estimate_timings_from_pts(ic);
1679 } else if (av_has_timings(ic)) {
1680 /* at least one components has timings - we use them for all
1682 fill_all_stream_timings(ic);
1684 /* less precise: use bit rate info */
1685 av_estimate_timings_from_bit_rate(ic);
1687 av_update_stream_timings(ic);
1693 for(i = 0;i < ic->nb_streams; i++) {
1694 st = ic->streams[i];
1695 printf("%d: start_time: %0.3f duration: %0.3f\n",
1696 i, (double)st->start_time / AV_TIME_BASE,
1697 (double)st->duration / AV_TIME_BASE);
1699 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1700 (double)ic->start_time / AV_TIME_BASE,
1701 (double)ic->duration / AV_TIME_BASE,
1702 ic->bit_rate / 1000);
1707 static int has_codec_parameters(AVCodecContext *enc)
1710 switch(enc->codec_type) {
1711 case CODEC_TYPE_AUDIO:
1712 val = enc->sample_rate;
1714 case CODEC_TYPE_VIDEO:
1715 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1724 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1728 int got_picture, ret=0;
1731 if(!st->codec->codec){
1732 codec = avcodec_find_decoder(st->codec->codec_id);
1735 ret = avcodec_open(st->codec, codec);
1740 if(!has_codec_parameters(st->codec)){
1741 switch(st->codec->codec_type) {
1742 case CODEC_TYPE_VIDEO:
1743 ret = avcodec_decode_video(st->codec, &picture,
1744 &got_picture, (uint8_t *)data, size);
1746 case CODEC_TYPE_AUDIO:
1747 samples = av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
1750 ret = avcodec_decode_audio(st->codec, samples,
1751 &got_picture, (uint8_t *)data, size);
1762 /* absolute maximum size we read until we abort */
1763 #define MAX_READ_SIZE 5000000
1765 /* maximum duration until we stop analysing the stream */
1766 #define MAX_STREAM_DURATION ((int)(AV_TIME_BASE * 2.0))
1769 * Read the beginning of a media file to get stream information. This
1770 * is useful for file formats with no headers such as MPEG. This
1771 * function also compute the real frame rate in case of mpeg2 repeat
1774 * @param ic media file handle
1775 * @return >=0 if OK. AVERROR_xxx if error.
1776 * @todo let user decide somehow what information is needed so we dont waste time geting stuff the user doesnt need
1778 int av_find_stream_info(AVFormatContext *ic)
1780 int i, count, ret, read_size;
1782 AVPacket pkt1, *pkt;
1783 AVPacketList *pktl=NULL, **ppktl;
1784 int64_t last_dts[MAX_STREAMS];
1785 int64_t duration_sum[MAX_STREAMS];
1786 int duration_count[MAX_STREAMS]={0};
1788 for(i=0;i<ic->nb_streams;i++) {
1789 st = ic->streams[i];
1790 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1791 /* if(!st->time_base.num)
1793 if(!st->codec->time_base.num)
1794 st->codec->time_base= st->time_base;
1796 //only for the split stuff
1798 st->parser = av_parser_init(st->codec->codec_id);
1802 for(i=0;i<MAX_STREAMS;i++){
1803 last_dts[i]= AV_NOPTS_VALUE;
1804 duration_sum[i]= INT64_MAX;
1809 ppktl = &ic->packet_buffer;
1811 /* check if one codec still needs to be handled */
1812 for(i=0;i<ic->nb_streams;i++) {
1813 st = ic->streams[i];
1814 if (!has_codec_parameters(st->codec))
1816 /* variable fps and no guess at the real fps */
1817 if( st->codec->time_base.den >= 1000LL*st->codec->time_base.num
1818 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1820 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1823 if (i == ic->nb_streams) {
1824 /* NOTE: if the format has no header, then we need to read
1825 some packets to get most of the streams, so we cannot
1827 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1828 /* if we found the info for all the codecs, we can stop */
1833 /* we did not get all the codec info, but we read too much data */
1834 if (read_size >= MAX_READ_SIZE) {
1840 /* NOTE: a new stream can be added there if no header in file
1841 (AVFMTCTX_NOHEADER) */
1842 ret = av_read_frame_internal(ic, &pkt1);
1845 ret = -1; /* we could not have all the codec parameters before EOF */
1846 for(i=0;i<ic->nb_streams;i++) {
1847 st = ic->streams[i];
1848 if (!has_codec_parameters(st->codec))
1851 if (i == ic->nb_streams)
1856 pktl = av_mallocz(sizeof(AVPacketList));
1858 ret = AVERROR_NOMEM;
1862 /* add the packet in the buffered packet list */
1864 ppktl = &pktl->next;
1869 /* duplicate the packet */
1870 if (av_dup_packet(pkt) < 0) {
1871 ret = AVERROR_NOMEM;
1875 read_size += pkt->size;
1877 st = ic->streams[pkt->stream_index];
1878 st->codec_info_duration += pkt->duration;
1879 if (pkt->duration != 0)
1880 st->codec_info_nb_frames++;
1883 int index= pkt->stream_index;
1884 int64_t last= last_dts[index];
1885 int64_t duration= pkt->dts - last;
1887 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
1888 if(duration*duration_count[index]*10/9 < duration_sum[index]){
1889 duration_sum[index]= duration;
1890 duration_count[index]=1;
1892 int factor= av_rescale(duration, duration_count[index], duration_sum[index]);
1893 duration_sum[index] += duration;
1894 duration_count[index]+= factor;
1896 if(st->codec_info_nb_frames == 0 && 0)
1897 st->codec_info_duration += duration;
1899 last_dts[pkt->stream_index]= pkt->dts;
1901 if(st->parser && st->parser->parser->split && !st->codec->extradata){
1902 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
1904 st->codec->extradata_size= i;
1905 st->codec->extradata= av_malloc(st->codec->extradata_size);
1906 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
1910 /* if still no information, we try to open the codec and to
1911 decompress the frame. We try to avoid that in most cases as
1912 it takes longer and uses more memory. For MPEG4, we need to
1913 decompress for Quicktime. */
1914 if (!has_codec_parameters(st->codec) /*&&
1915 (st->codec->codec_id == CODEC_ID_FLV1 ||
1916 st->codec->codec_id == CODEC_ID_H264 ||
1917 st->codec->codec_id == CODEC_ID_H263 ||
1918 st->codec->codec_id == CODEC_ID_H261 ||
1919 st->codec->codec_id == CODEC_ID_VORBIS ||
1920 st->codec->codec_id == CODEC_ID_MJPEG ||
1921 st->codec->codec_id == CODEC_ID_PNG ||
1922 st->codec->codec_id == CODEC_ID_PAM ||
1923 st->codec->codec_id == CODEC_ID_PGM ||
1924 st->codec->codec_id == CODEC_ID_PGMYUV ||
1925 st->codec->codec_id == CODEC_ID_PBM ||
1926 st->codec->codec_id == CODEC_ID_PPM ||
1927 st->codec->codec_id == CODEC_ID_SHORTEN ||
1928 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
1929 try_decode_frame(st, pkt->data, pkt->size);
1931 if (av_rescale_q(st->codec_info_duration, st->time_base, AV_TIME_BASE_Q) >= MAX_STREAM_DURATION) {
1937 // close codecs which where opened in try_decode_frame()
1938 for(i=0;i<ic->nb_streams;i++) {
1939 st = ic->streams[i];
1940 if(st->codec->codec)
1941 avcodec_close(st->codec);
1943 for(i=0;i<ic->nb_streams;i++) {
1944 st = ic->streams[i];
1945 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1946 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
1947 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
1949 if(duration_count[i] && st->codec->time_base.num*1000LL <= st->codec->time_base.den &&
1950 st->time_base.num*duration_sum[i]/duration_count[i]*1000LL > st->time_base.den){
1954 num= st->time_base.den*duration_count[i];
1955 den= st->time_base.num*duration_sum[i];
1957 av_reduce(&fps1.num, &fps1.den, num*1001, den*1000, FFMAX(st->time_base.den, st->time_base.num)/4);
1958 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, den, FFMAX(st->time_base.den, st->time_base.num)/4);
1959 if(fps1.num < st->r_frame_rate.num && fps1.den == 1 && (fps1.num==24 || fps1.num==30)){ //FIXME better decission
1960 st->r_frame_rate.num= fps1.num*1000;
1961 st->r_frame_rate.den= fps1.den*1001;
1965 /* set real frame rate info */
1966 /* compute the real frame rate for telecine */
1967 if ((st->codec->codec_id == CODEC_ID_MPEG1VIDEO ||
1968 st->codec->codec_id == CODEC_ID_MPEG2VIDEO) &&
1969 st->codec->sub_id == 2) {
1970 if (st->codec_info_nb_frames >= 20) {
1971 float coded_frame_rate, est_frame_rate;
1972 est_frame_rate = ((double)st->codec_info_nb_frames * AV_TIME_BASE) /
1973 (double)st->codec_info_duration ;
1974 coded_frame_rate = 1.0/av_q2d(st->codec->time_base);
1976 printf("telecine: coded_frame_rate=%0.3f est_frame_rate=%0.3f\n",
1977 coded_frame_rate, est_frame_rate);
1979 /* if we detect that it could be a telecine, we
1980 signal it. It would be better to do it at a
1981 higher level as it can change in a film */
1982 if (coded_frame_rate >= 24.97 &&
1983 (est_frame_rate >= 23.5 && est_frame_rate < 24.5)) {
1984 st->r_frame_rate = (AVRational){24000, 1001};
1988 /* if no real frame rate, use the codec one */
1989 if (!st->r_frame_rate.num){
1990 st->r_frame_rate.num = st->codec->time_base.den;
1991 st->r_frame_rate.den = st->codec->time_base.num;
1996 av_estimate_timings(ic);
1998 /* correct DTS for b frame streams with no timestamps */
1999 for(i=0;i<ic->nb_streams;i++) {
2000 st = ic->streams[i];
2001 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2003 ppktl = &ic->packet_buffer;
2005 if(ppkt1->stream_index != i)
2007 if(ppkt1->pkt->dts < 0)
2009 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2011 ppkt1->pkt->dts -= delta;
2016 st->cur_dts -= delta;
2024 /*******************************************************/
2027 * start playing a network based stream (e.g. RTSP stream) at the
2030 int av_read_play(AVFormatContext *s)
2032 if (!s->iformat->read_play)
2033 return AVERROR_NOTSUPP;
2034 return s->iformat->read_play(s);
2038 * Pause a network based stream (e.g. RTSP stream).
2040 * Use av_read_play() to resume it.
2042 int av_read_pause(AVFormatContext *s)
2044 if (!s->iformat->read_pause)
2045 return AVERROR_NOTSUPP;
2046 return s->iformat->read_pause(s);
2050 * Close a media file (but not its codecs).
2052 * @param s media file handle
2054 void av_close_input_file(AVFormatContext *s)
2056 int i, must_open_file;
2059 /* free previous packet */
2060 if (s->cur_st && s->cur_st->parser)
2061 av_free_packet(&s->cur_pkt);
2063 if (s->iformat->read_close)
2064 s->iformat->read_close(s);
2065 for(i=0;i<s->nb_streams;i++) {
2066 /* free all data in a stream component */
2069 av_parser_close(st->parser);
2071 av_free(st->index_entries);
2075 flush_packet_queue(s);
2077 if (s->iformat->flags & AVFMT_NOFILE) {
2080 if (must_open_file) {
2083 av_freep(&s->priv_data);
2088 * Add a new stream to a media file.
2090 * Can only be called in the read_header() function. If the flag
2091 * AVFMTCTX_NOHEADER is in the format context, then new streams
2092 * can be added in read_packet too.
2094 * @param s media file handle
2095 * @param id file format dependent stream id
2097 AVStream *av_new_stream(AVFormatContext *s, int id)
2101 if (s->nb_streams >= MAX_STREAMS)
2104 st = av_mallocz(sizeof(AVStream));
2108 st->codec= avcodec_alloc_context();
2110 /* no default bitrate if decoding */
2111 st->codec->bit_rate = 0;
2113 st->index = s->nb_streams;
2115 st->start_time = AV_NOPTS_VALUE;
2116 st->duration = AV_NOPTS_VALUE;
2117 st->cur_dts = AV_NOPTS_VALUE;
2119 /* default pts settings is MPEG like */
2120 av_set_pts_info(st, 33, 1, 90000);
2121 st->last_IP_pts = AV_NOPTS_VALUE;
2123 s->streams[s->nb_streams++] = st;
2127 /************************************************************/
2128 /* output media file */
2130 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2134 if (s->oformat->priv_data_size > 0) {
2135 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2137 return AVERROR_NOMEM;
2139 s->priv_data = NULL;
2141 if (s->oformat->set_parameters) {
2142 ret = s->oformat->set_parameters(s, ap);
2150 * allocate the stream private data and write the stream header to an
2153 * @param s media file handle
2154 * @return 0 if OK. AVERROR_xxx if error.
2156 int av_write_header(AVFormatContext *s)
2161 // some sanity checks
2162 for(i=0;i<s->nb_streams;i++) {
2165 switch (st->codec->codec_type) {
2166 case CODEC_TYPE_AUDIO:
2167 if(st->codec->sample_rate<=0){
2168 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2172 case CODEC_TYPE_VIDEO:
2173 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2174 av_log(s, AV_LOG_ERROR, "time base not set\n");
2177 if(st->codec->width<=0 || st->codec->height<=0){
2178 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2185 ret = s->oformat->write_header(s);
2189 /* init PTS generation */
2190 for(i=0;i<s->nb_streams;i++) {
2191 int64_t den = AV_NOPTS_VALUE;
2194 switch (st->codec->codec_type) {
2195 case CODEC_TYPE_AUDIO:
2196 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2198 case CODEC_TYPE_VIDEO:
2199 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2204 if (den != AV_NOPTS_VALUE) {
2206 return AVERROR_INVALIDDATA;
2207 av_frac_init(&st->pts, 0, 0, den);
2213 //FIXME merge with compute_pkt_fields
2214 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2215 int b_frames = FFMAX(st->codec->has_b_frames, st->codec->max_b_frames);
2216 int num, den, frame_size;
2218 // 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);
2220 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2223 /* duration field */
2224 if (pkt->duration == 0) {
2225 compute_frame_duration(&num, &den, st, NULL, pkt);
2227 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2231 //XXX/FIXME this is a temporary hack until all encoders output pts
2232 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !b_frames){
2234 // pkt->pts= st->cur_dts;
2235 pkt->pts= st->pts.val;
2238 //calculate dts from pts
2239 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2241 if(st->last_IP_pts == AV_NOPTS_VALUE){
2242 st->last_IP_pts= -pkt->duration;
2244 if(st->last_IP_pts < pkt->pts){
2245 pkt->dts= st->last_IP_pts;
2246 st->last_IP_pts= pkt->pts;
2253 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2254 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %Ld >= %Ld\n", st->cur_dts, pkt->dts);
2257 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2258 av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n");
2262 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%lld dts2:%lld\n", pkt->pts, pkt->dts);
2263 st->cur_dts= pkt->dts;
2264 st->pts.val= pkt->dts;
2267 switch (st->codec->codec_type) {
2268 case CODEC_TYPE_AUDIO:
2269 frame_size = get_audio_frame_size(st->codec, pkt->size);
2271 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
2272 but it would be better if we had the real timestamps from the encoder */
2273 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2274 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2277 case CODEC_TYPE_VIDEO:
2278 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2286 static void truncate_ts(AVStream *st, AVPacket *pkt){
2287 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2290 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here
2292 pkt->pts &= pts_mask;
2293 pkt->dts &= pts_mask;
2297 * Write a packet to an output media file.
2299 * The packet shall contain one audio or video frame.
2301 * @param s media file handle
2302 * @param pkt the packet, which contains the stream_index, buf/buf_size, dts/pts, ...
2303 * @return < 0 if error, = 0 if OK, 1 if end of stream wanted.
2305 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2309 ret=compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2313 truncate_ts(s->streams[pkt->stream_index], pkt);
2315 ret= s->oformat->write_packet(s, pkt);
2317 ret= url_ferror(&s->pb);
2322 * interleave_packet implementation which will interleave per DTS.
2323 * packets with pkt->destruct == av_destruct_packet will be freed inside this function.
2324 * so they cannot be used after it, note calling av_free_packet() on them is still safe
2326 static int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2327 AVPacketList *pktl, **next_point, *this_pktl;
2329 int streams[MAX_STREAMS];
2332 AVStream *st= s->streams[ pkt->stream_index];
2334 // assert(pkt->destruct != av_destruct_packet); //FIXME
2336 this_pktl = av_mallocz(sizeof(AVPacketList));
2337 this_pktl->pkt= *pkt;
2338 if(pkt->destruct == av_destruct_packet)
2339 pkt->destruct= NULL; // non shared -> must keep original from being freed
2341 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2343 next_point = &s->packet_buffer;
2345 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2346 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2347 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2348 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2350 next_point= &(*next_point)->next;
2352 this_pktl->next= *next_point;
2353 *next_point= this_pktl;
2356 memset(streams, 0, sizeof(streams));
2357 pktl= s->packet_buffer;
2359 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%lld\n", pktl->pkt.stream_index, pktl->pkt.dts);
2360 if(streams[ pktl->pkt.stream_index ] == 0)
2362 streams[ pktl->pkt.stream_index ]++;
2366 if(s->nb_streams == stream_count || (flush && stream_count)){
2367 pktl= s->packet_buffer;
2370 s->packet_buffer= pktl->next;
2374 av_init_packet(out);
2380 * Interleaves a AVPacket correctly so it can be muxed.
2381 * @param out the interleaved packet will be output here
2382 * @param in the input packet
2383 * @param flush 1 if no further packets are available as input and all
2384 * remaining packets should be output
2385 * @return 1 if a packet was output, 0 if no packet could be output,
2386 * < 0 if an error occured
2388 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2389 if(s->oformat->interleave_packet)
2390 return s->oformat->interleave_packet(s, out, in, flush);
2392 return av_interleave_packet_per_dts(s, out, in, flush);
2396 * Writes a packet to an output media file ensuring correct interleaving.
2398 * The packet must contain one audio or video frame.
2399 * If the packets are already correctly interleaved the application should
2400 * call av_write_frame() instead as its slightly faster, its also important
2401 * to keep in mind that completly non interleaved input will need huge amounts
2402 * of memory to interleave with this, so its prefereable to interleave at the
2405 * @param s media file handle
2406 * @param pkt the packet, which contains the stream_index, buf/buf_size, dts/pts, ...
2407 * @return < 0 if error, = 0 if OK, 1 if end of stream wanted.
2409 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2410 AVStream *st= s->streams[ pkt->stream_index];
2412 //FIXME/XXX/HACK drop zero sized packets
2413 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2416 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %Ld %Ld\n", pkt->size, pkt->dts, pkt->pts);
2417 if(compute_pkt_fields2(st, pkt) < 0)
2420 if(pkt->dts == AV_NOPTS_VALUE)
2425 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2426 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2429 truncate_ts(s->streams[opkt.stream_index], &opkt);
2430 ret= s->oformat->write_packet(s, &opkt);
2432 av_free_packet(&opkt);
2437 if(url_ferror(&s->pb))
2438 return url_ferror(&s->pb);
2443 * @brief Write the stream trailer to an output media file and
2444 * free the file private data.
2446 * @param s media file handle
2447 * @return 0 if OK. AVERROR_xxx if error.
2449 int av_write_trailer(AVFormatContext *s)
2455 ret= av_interleave_packet(s, &pkt, NULL, 1);
2456 if(ret<0) //FIXME cleanup needed for ret<0 ?
2461 truncate_ts(s->streams[pkt.stream_index], &pkt);
2462 ret= s->oformat->write_packet(s, &pkt);
2464 av_free_packet(&pkt);
2468 if(url_ferror(&s->pb))
2472 ret = s->oformat->write_trailer(s);
2475 ret=url_ferror(&s->pb);
2476 for(i=0;i<s->nb_streams;i++)
2477 av_freep(&s->streams[i]->priv_data);
2478 av_freep(&s->priv_data);
2482 /* "user interface" functions */
2484 void dump_format(AVFormatContext *ic,
2492 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2493 is_output ? "Output" : "Input",
2495 is_output ? ic->oformat->name : ic->iformat->name,
2496 is_output ? "to" : "from", url);
2498 av_log(NULL, AV_LOG_INFO, " Duration: ");
2499 if (ic->duration != AV_NOPTS_VALUE) {
2500 int hours, mins, secs, us;
2501 secs = ic->duration / AV_TIME_BASE;
2502 us = ic->duration % AV_TIME_BASE;
2507 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%01d", hours, mins, secs,
2508 (10 * us) / AV_TIME_BASE);
2510 av_log(NULL, AV_LOG_INFO, "N/A");
2512 if (ic->start_time != AV_NOPTS_VALUE) {
2514 av_log(NULL, AV_LOG_INFO, ", start: ");
2515 secs = ic->start_time / AV_TIME_BASE;
2516 us = ic->start_time % AV_TIME_BASE;
2517 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2518 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2520 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2522 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2524 av_log(NULL, AV_LOG_INFO, "N/A");
2526 av_log(NULL, AV_LOG_INFO, "\n");
2528 for(i=0;i<ic->nb_streams;i++) {
2529 AVStream *st = ic->streams[i];
2530 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2531 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2532 /* the pid is an important information, so we display it */
2533 /* XXX: add a generic system */
2535 flags = ic->oformat->flags;
2537 flags = ic->iformat->flags;
2538 if (flags & AVFMT_SHOW_IDS) {
2539 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2541 if (strlen(st->language) > 0) {
2542 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2544 av_log(NULL, AV_LOG_INFO, ": %s\n", buf);
2551 int frame_rate, frame_rate_base;
2554 static AbvEntry frame_abvs[] = {
2555 { "ntsc", 720, 480, 30000, 1001 },
2556 { "pal", 720, 576, 25, 1 },
2557 { "qntsc", 352, 240, 30000, 1001 }, /* VCD compliant ntsc */
2558 { "qpal", 352, 288, 25, 1 }, /* VCD compliant pal */
2559 { "sntsc", 640, 480, 30000, 1001 }, /* square pixel ntsc */
2560 { "spal", 768, 576, 25, 1 }, /* square pixel pal */
2561 { "film", 352, 240, 24, 1 },
2562 { "ntsc-film", 352, 240, 24000, 1001 },
2563 { "sqcif", 128, 96, 0, 0 },
2564 { "qcif", 176, 144, 0, 0 },
2565 { "cif", 352, 288, 0, 0 },
2566 { "4cif", 704, 576, 0, 0 },
2570 * parses width and height out of string str.
2572 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2575 int n = sizeof(frame_abvs) / sizeof(AbvEntry);
2577 int frame_width = 0, frame_height = 0;
2580 if (!strcmp(frame_abvs[i].abv, str)) {
2581 frame_width = frame_abvs[i].width;
2582 frame_height = frame_abvs[i].height;
2588 frame_width = strtol(p, (char **)&p, 10);
2591 frame_height = strtol(p, (char **)&p, 10);
2593 if (frame_width <= 0 || frame_height <= 0)
2595 *width_ptr = frame_width;
2596 *height_ptr = frame_height;
2601 * Converts frame rate from string to a fraction.
2603 * First we try to get an exact integer or fractional frame rate.
2604 * If this fails we convert the frame rate to a double and return
2605 * an approximate fraction using the DEFAULT_FRAME_RATE_BASE.
2607 int parse_frame_rate(int *frame_rate, int *frame_rate_base, const char *arg)
2612 /* First, we check our abbreviation table */
2613 for (i = 0; i < sizeof(frame_abvs)/sizeof(*frame_abvs); ++i)
2614 if (!strcmp(frame_abvs[i].abv, arg)) {
2615 *frame_rate = frame_abvs[i].frame_rate;
2616 *frame_rate_base = frame_abvs[i].frame_rate_base;
2620 /* Then, we try to parse it as fraction */
2621 cp = strchr(arg, '/');
2623 cp = strchr(arg, ':');
2626 *frame_rate = strtol(arg, &cpp, 10);
2627 if (cpp != arg || cpp == cp)
2628 *frame_rate_base = strtol(cp+1, &cpp, 10);
2633 /* Finally we give up and parse it as double */
2634 *frame_rate_base = DEFAULT_FRAME_RATE_BASE; //FIXME use av_d2q()
2635 *frame_rate = (int)(strtod(arg, 0) * (*frame_rate_base) + 0.5);
2637 if (!*frame_rate || !*frame_rate_base)
2644 * Converts date string to number of seconds since Jan 1st, 1970.
2648 * - If not a duration:
2649 * [{YYYY-MM-DD|YYYYMMDD}]{T| }{HH[:MM[:SS[.m...]]][Z]|HH[MM[SS[.m...]]][Z]}
2650 * Time is localtime unless Z is suffixed to the end. In this case GMT
2651 * Return the date in micro seconds since 1970
2654 * HH[:MM[:SS[.m...]]]
2658 int64_t parse_date(const char *datestr, int duration)
2664 static const char *date_fmt[] = {
2668 static const char *time_fmt[] = {
2678 time_t now = time(0);
2680 len = strlen(datestr);
2682 lastch = datestr[len - 1];
2685 is_utc = (lastch == 'z' || lastch == 'Z');
2687 memset(&dt, 0, sizeof(dt));
2692 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2693 q = small_strptime(p, date_fmt[i], &dt);
2703 dt = *localtime(&now);
2705 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2710 if (*p == 'T' || *p == 't' || *p == ' ')
2713 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2714 q = small_strptime(p, time_fmt[i], &dt);
2724 q = small_strptime(p, time_fmt[0], &dt);
2726 dt.tm_sec = strtol(p, (char **)&q, 10);
2732 /* Now we have all the fields that we can get */
2737 return now * int64_t_C(1000000);
2741 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2743 dt.tm_isdst = -1; /* unknown */
2756 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2759 val += n * (*q - '0');
2763 return negative ? -t : t;
2767 * Attempts to find a specific tag in a URL.
2769 * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done.
2770 * Return 1 if found.
2772 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2782 while (*p != '\0' && *p != '=' && *p != '&') {
2783 if ((q - tag) < sizeof(tag) - 1)
2791 while (*p != '&' && *p != '\0') {
2792 if ((q - arg) < arg_size - 1) {
2802 if (!strcmp(tag, tag1))
2812 * Returns in 'buf' the path with '%d' replaced by number.
2814 * Also handles the '%0nd' format where 'n' is the total number
2815 * of digits and '%%'. Return 0 if OK, and -1 if format error.
2817 int get_frame_filename(char *buf, int buf_size,
2818 const char *path, int number)
2821 char *q, buf1[20], c;
2822 int nd, len, percentd_found;
2834 while (isdigit(*p)) {
2835 nd = nd * 10 + *p++ - '0';
2838 } while (isdigit(c));
2847 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2849 if ((q - buf + len) > buf_size - 1)
2851 memcpy(q, buf1, len);
2859 if ((q - buf) < buf_size - 1)
2863 if (!percentd_found)
2873 * Print nice hexa dump of a buffer
2874 * @param f stream for output
2876 * @param size buffer size
2878 void av_hex_dump(FILE *f, uint8_t *buf, int size)
2882 for(i=0;i<size;i+=16) {
2886 fprintf(f, "%08x ", i);
2889 fprintf(f, " %02x", buf[i+j]);
2894 for(j=0;j<len;j++) {
2896 if (c < ' ' || c > '~')
2898 fprintf(f, "%c", c);
2905 * Print on 'f' a nice dump of a packet
2906 * @param f stream for output
2907 * @param pkt packet to dump
2908 * @param dump_payload true if the payload must be displayed too
2910 //FIXME needs to know the time_base
2911 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
2913 fprintf(f, "stream #%d:\n", pkt->stream_index);
2914 fprintf(f, " keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
2915 fprintf(f, " duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
2916 /* DTS is _always_ valid after av_read_frame() */
2917 fprintf(f, " dts=");
2918 if (pkt->dts == AV_NOPTS_VALUE)
2921 fprintf(f, "%0.3f", (double)pkt->dts / AV_TIME_BASE);
2922 /* PTS may be not known if B frames are present */
2923 fprintf(f, " pts=");
2924 if (pkt->pts == AV_NOPTS_VALUE)
2927 fprintf(f, "%0.3f", (double)pkt->pts / AV_TIME_BASE);
2929 fprintf(f, " size=%d\n", pkt->size);
2931 av_hex_dump(f, pkt->data, pkt->size);
2934 void url_split(char *proto, int proto_size,
2935 char *authorization, int authorization_size,
2936 char *hostname, int hostname_size,
2938 char *path, int path_size,
2949 while (*p != ':' && *p != '\0') {
2950 if ((q - proto) < proto_size - 1)
2956 if (authorization_size > 0)
2957 authorization[0] = '\0';
2961 if (hostname_size > 0)
2965 char *at,*slash; // PETR: position of '@' character and '/' character
2972 at = strchr(p,'@'); // PETR: get the position of '@'
2973 slash = strchr(p,'/'); // PETR: get position of '/' - end of hostname
2974 if (at && slash && at > slash) at = NULL; // PETR: not interested in '@' behind '/'
2976 q = at ? authorization : hostname; // PETR: if '@' exists starting with auth.
2978 while ((at || *p != ':') && *p != '/' && *p != '?' && *p != '\0') { // PETR:
2979 if (*p == '@') { // PETR: passed '@'
2980 if (authorization_size > 0)
2984 } else if (!at) { // PETR: hostname
2985 if ((q - hostname) < hostname_size - 1)
2988 if ((q - authorization) < authorization_size - 1)
2993 if (hostname_size > 0)
2997 port = strtoul(p, (char **)&p, 10);
3002 pstrcpy(path, path_size, p);
3006 * Set the pts for a given stream.
3009 * @param pts_wrap_bits number of bits effectively used by the pts
3010 * (used for wrap control, 33 is the value for MPEG)
3011 * @param pts_num numerator to convert to seconds (MPEG: 1)
3012 * @param pts_den denominator to convert to seconds (MPEG: 90000)
3014 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3015 int pts_num, int pts_den)
3017 s->pts_wrap_bits = pts_wrap_bits;
3018 s->time_base.num = pts_num;
3019 s->time_base.den = pts_den;
3022 /* fraction handling */
3025 * f = val + (num / den) + 0.5.
3027 * 'num' is normalized so that it is such as 0 <= num < den.
3029 * @param f fractional number
3030 * @param val integer value
3031 * @param num must be >= 0
3032 * @param den must be >= 1
3034 void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
3047 * Set f to (val + 0.5).
3049 void av_frac_set(AVFrac *f, int64_t val)
3052 f->num = f->den >> 1;
3056 * Fractionnal addition to f: f = f + (incr / f->den).
3058 * @param f fractional number
3059 * @param incr increment, can be positive or negative
3061 void av_frac_add(AVFrac *f, int64_t incr)
3065 num = f->num + incr;
3068 f->val += num / den;
3074 } else if (num >= den) {
3075 f->val += num / den;
3082 * register a new image format
3083 * @param img_fmt Image format descriptor
3085 void av_register_image_format(AVImageFormat *img_fmt)
3089 p = &first_image_format;
3090 while (*p != NULL) p = &(*p)->next;
3092 img_fmt->next = NULL;
3096 * Guesses image format based on data in the image.
3098 AVImageFormat *av_probe_image_format(AVProbeData *pd)
3100 AVImageFormat *fmt1, *fmt;
3101 int score, score_max;
3105 for(fmt1 = first_image_format; fmt1 != NULL; fmt1 = fmt1->next) {
3106 if (fmt1->img_probe) {
3107 score = fmt1->img_probe(pd);
3108 if (score > score_max) {
3118 * Guesses image format based on file name extensions.
3120 AVImageFormat *guess_image_format(const char *filename)
3122 AVImageFormat *fmt1;
3124 for(fmt1 = first_image_format; fmt1 != NULL; fmt1 = fmt1->next) {
3125 if (fmt1->extensions && match_ext(filename, fmt1->extensions))
3132 * Read an image from a stream.
3133 * @param gb byte stream containing the image
3134 * @param fmt image format, NULL if probing is required
3136 int av_read_image(ByteIOContext *pb, const char *filename,
3138 int (*alloc_cb)(void *, AVImageInfo *info), void *opaque)
3140 char buf[PROBE_BUF_SIZE];
3141 AVProbeData probe_data, *pd = &probe_data;
3146 pd->filename = filename;
3148 pos = url_ftell(pb);
3149 pd->buf_size = get_buffer(pb, buf, PROBE_BUF_SIZE);
3150 url_fseek(pb, pos, SEEK_SET);
3151 fmt = av_probe_image_format(pd);
3154 return AVERROR_NOFMT;
3155 ret = fmt->img_read(pb, alloc_cb, opaque);
3160 * Write an image to a stream.
3161 * @param pb byte stream for the image output
3162 * @param fmt image format
3163 * @param img image data and informations
3165 int av_write_image(ByteIOContext *pb, AVImageFormat *fmt, AVImageInfo *img)
3167 return fmt->img_write(pb, img);