2 * Various utilities for ffmpeg system
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 AVInputFormat *first_iformat = NULL;
25 AVOutputFormat *first_oformat = NULL;
26 AVImageFormat *first_image_format = NULL;
28 void av_register_input_format(AVInputFormat *format)
32 while (*p != NULL) p = &(*p)->next;
37 void av_register_output_format(AVOutputFormat *format)
41 while (*p != NULL) p = &(*p)->next;
46 int match_ext(const char *filename, const char *extensions)
54 ext = strrchr(filename, '.');
60 while (*p != '\0' && *p != ',')
63 if (!strcasecmp(ext1, ext))
73 AVOutputFormat *guess_format(const char *short_name, const char *filename,
74 const char *mime_type)
76 AVOutputFormat *fmt, *fmt_found;
79 /* specific test for image sequences */
80 if (!short_name && filename &&
81 filename_number_test(filename) >= 0 &&
82 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)
183 void *data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
185 return AVERROR_NOMEM;
186 memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
191 pkt->destruct = av_destruct_packet;
195 /* This is a hack - the packet memory allocation stuff is broken. The
196 packet is allocated if it was not really allocated */
197 int av_dup_packet(AVPacket *pkt)
199 if (pkt->destruct != av_destruct_packet) {
201 /* we duplicate the packet and don't forget to put the padding
203 data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
205 return AVERROR_NOMEM;
207 memcpy(data, pkt->data, pkt->size);
208 memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
210 pkt->destruct = av_destruct_packet;
217 int fifo_init(FifoBuffer *f, int size)
219 f->buffer = av_malloc(size);
222 f->end = f->buffer + size;
223 f->wptr = f->rptr = f->buffer;
227 void fifo_free(FifoBuffer *f)
232 int fifo_size(FifoBuffer *f, uint8_t *rptr)
239 if (f->wptr >= rptr) {
240 size = f->wptr - rptr;
242 size = (f->end - rptr) + (f->wptr - f->buffer);
247 /* get data from the fifo (return -1 if not enough data) */
248 int fifo_read(FifoBuffer *f, uint8_t *buf, int buf_size, uint8_t **rptr_ptr)
257 if (f->wptr >= rptr) {
258 size = f->wptr - rptr;
260 size = (f->end - rptr) + (f->wptr - f->buffer);
265 while (buf_size > 0) {
269 memcpy(buf, rptr, len);
280 void fifo_realloc(FifoBuffer *f, int new_size){
281 int old_size= f->end - f->buffer;
283 if(old_size < new_size){
284 uint8_t *old= f->buffer;
286 f->buffer= av_realloc(f->buffer, new_size);
288 f->rptr += f->buffer - old;
289 f->wptr += f->buffer - old;
291 if(f->wptr < f->rptr){
292 memmove(f->rptr + new_size - old_size, f->rptr, f->buffer + old_size - f->rptr);
293 f->rptr += new_size - old_size;
295 f->end= f->buffer + new_size;
299 void fifo_write(FifoBuffer *f, uint8_t *buf, int size, uint8_t **wptr_ptr)
312 memcpy(wptr, buf, len);
322 /* get data from the fifo (return -1 if not enough data) */
323 int put_fifo(ByteIOContext *pb, FifoBuffer *f, int buf_size, uint8_t **rptr_ptr)
325 uint8_t *rptr = *rptr_ptr;
328 if (f->wptr >= rptr) {
329 size = f->wptr - rptr;
331 size = (f->end - rptr) + (f->wptr - f->buffer);
336 while (buf_size > 0) {
340 put_buffer(pb, rptr, len);
350 int filename_number_test(const char *filename)
355 return get_frame_filename(buf, sizeof(buf), filename, 1);
358 /* guess file format */
359 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened)
361 AVInputFormat *fmt1, *fmt;
362 int score, score_max;
366 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
367 if (!is_opened && !(fmt1->flags & AVFMT_NOFILE))
370 if (fmt1->read_probe) {
371 score = fmt1->read_probe(pd);
372 } else if (fmt1->extensions) {
373 if (match_ext(pd->filename, fmt1->extensions)) {
377 if (score > score_max) {
385 /************************************************************/
386 /* input media file */
389 * open a media file from an IO stream. 'fmt' must be specified.
392 static const char* format_to_name(void* ptr)
394 AVFormatContext* fc = (AVFormatContext*) ptr;
395 if(fc->iformat) return fc->iformat->name;
396 else if(fc->oformat) return fc->oformat->name;
400 static const AVClass av_format_context_class = { "AVFormatContext", format_to_name };
402 AVFormatContext *av_alloc_format_context(void)
405 ic = av_mallocz(sizeof(AVFormatContext));
407 ic->av_class = &av_format_context_class;
411 int av_open_input_stream(AVFormatContext **ic_ptr,
412 ByteIOContext *pb, const char *filename,
413 AVInputFormat *fmt, AVFormatParameters *ap)
418 ic = av_alloc_format_context();
426 ic->duration = AV_NOPTS_VALUE;
427 ic->start_time = AV_NOPTS_VALUE;
428 pstrcpy(ic->filename, sizeof(ic->filename), filename);
430 /* allocate private data */
431 if (fmt->priv_data_size > 0) {
432 ic->priv_data = av_mallocz(fmt->priv_data_size);
433 if (!ic->priv_data) {
438 ic->priv_data = NULL;
441 err = ic->iformat->read_header(ic, ap);
446 ic->data_offset = url_ftell(&ic->pb);
452 av_freep(&ic->priv_data);
459 #define PROBE_BUF_SIZE 2048
462 * Open a media file as input. The codec are not opened. Only the file
463 * header (if present) is read.
465 * @param ic_ptr the opened media file handle is put here
466 * @param filename filename to open.
467 * @param fmt if non NULL, force the file format to use
468 * @param buf_size optional buffer size (zero if default is OK)
469 * @param ap additionnal parameters needed when opening the file (NULL if default)
470 * @return 0 if OK. AVERROR_xxx otherwise.
472 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
475 AVFormatParameters *ap)
477 int err, must_open_file, file_opened;
478 uint8_t buf[PROBE_BUF_SIZE];
479 AVProbeData probe_data, *pd = &probe_data;
480 ByteIOContext pb1, *pb = &pb1;
485 pd->filename = filename;
490 /* guess format if no file can be opened */
491 fmt = av_probe_input_format(pd, 0);
494 /* do not open file if the format does not need it. XXX: specific
495 hack needed to handle RTSP/TCP */
497 if (fmt && (fmt->flags & AVFMT_NOFILE)) {
499 pb= NULL; //FIXME this or memset(pb, 0, sizeof(ByteIOContext)); otherwise its uninitalized
502 if (!fmt || must_open_file) {
503 /* if no file needed do not try to open one */
504 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
510 url_setbufsize(pb, buf_size);
513 /* read probe data */
514 pd->buf_size = get_buffer(pb, buf, PROBE_BUF_SIZE);
515 if (url_fseek(pb, 0, SEEK_SET) == (offset_t)-EPIPE) {
517 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
525 /* guess file format */
527 fmt = av_probe_input_format(pd, 1);
530 /* if still no format found, error */
536 /* XXX: suppress this hack for redirectors */
537 #ifdef CONFIG_NETWORK
538 if (fmt == &redir_demux) {
539 err = redir_open(ic_ptr, pb);
545 /* check filename in case of an image number is expected */
546 if (fmt->flags & AVFMT_NEEDNUMBER) {
547 if (filename_number_test(filename) < 0) {
548 err = AVERROR_NUMEXPECTED;
552 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
564 /*******************************************************/
567 * Read a transport packet from a media file. This function is
568 * absolete and should never be used. Use av_read_frame() instead.
570 * @param s media file handle
571 * @param pkt is filled
572 * @return 0 if OK. AVERROR_xxx if error.
574 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
576 return s->iformat->read_packet(s, pkt);
579 /**********************************************************/
581 /* get the number of samples of an audio frame. Return (-1) if error */
582 static int get_audio_frame_size(AVCodecContext *enc, int size)
586 if (enc->frame_size <= 1) {
587 /* specific hack for pcm codecs because no frame size is
589 switch(enc->codec_id) {
590 case CODEC_ID_PCM_S16LE:
591 case CODEC_ID_PCM_S16BE:
592 case CODEC_ID_PCM_U16LE:
593 case CODEC_ID_PCM_U16BE:
594 if (enc->channels == 0)
596 frame_size = size / (2 * enc->channels);
598 case CODEC_ID_PCM_S8:
599 case CODEC_ID_PCM_U8:
600 case CODEC_ID_PCM_MULAW:
601 case CODEC_ID_PCM_ALAW:
602 if (enc->channels == 0)
604 frame_size = size / (enc->channels);
607 /* used for example by ADPCM codecs */
608 if (enc->bit_rate == 0)
610 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
614 frame_size = enc->frame_size;
620 /* return the frame duration in seconds, return 0 if not available */
621 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
622 AVCodecParserContext *pc, AVPacket *pkt)
628 switch(st->codec.codec_type) {
629 case CODEC_TYPE_VIDEO:
630 *pnum = st->codec.frame_rate_base;
631 *pden = st->codec.frame_rate;
632 if (pc && pc->repeat_pict) {
634 *pnum = (*pnum) * (2 + pc->repeat_pict);
637 case CODEC_TYPE_AUDIO:
638 frame_size = get_audio_frame_size(&st->codec, pkt->size);
642 *pden = st->codec.sample_rate;
649 static int is_intra_only(AVCodecContext *enc){
650 if(enc->codec_type == CODEC_TYPE_AUDIO){
652 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
653 switch(enc->codec_id){
655 case CODEC_ID_MJPEGB:
657 case CODEC_ID_RAWVIDEO:
658 case CODEC_ID_DVVIDEO:
659 case CODEC_ID_HUFFYUV:
660 case CODEC_ID_FFVHUFF:
671 static int64_t lsb2full(int64_t lsb, int64_t last_ts, int lsb_bits){
672 int64_t mask = lsb_bits < 64 ? (1LL<<lsb_bits)-1 : -1LL;
673 int64_t delta= last_ts - mask/2;
674 return ((lsb - delta)&mask) + delta;
677 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
678 AVCodecParserContext *pc, AVPacket *pkt)
680 int num, den, presentation_delayed;
682 /* handle wrapping */
683 if(st->cur_dts != AV_NOPTS_VALUE){
684 if(pkt->pts != AV_NOPTS_VALUE)
685 pkt->pts= lsb2full(pkt->pts, st->cur_dts, st->pts_wrap_bits);
686 if(pkt->dts != AV_NOPTS_VALUE)
687 pkt->dts= lsb2full(pkt->dts, st->cur_dts, st->pts_wrap_bits);
690 if (pkt->duration == 0) {
691 compute_frame_duration(&num, &den, st, pc, pkt);
693 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
697 if(is_intra_only(&st->codec))
698 pkt->flags |= PKT_FLAG_KEY;
700 /* do we have a video B frame ? */
701 presentation_delayed = 0;
702 if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
703 /* XXX: need has_b_frame, but cannot get it if the codec is
705 if (( st->codec.codec_id == CODEC_ID_H264
706 || st->codec.has_b_frames) &&
707 pc && pc->pict_type != FF_B_TYPE)
708 presentation_delayed = 1;
709 /* this may be redundant, but it shouldnt hurt */
710 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
711 presentation_delayed = 1;
714 if(st->cur_dts == AV_NOPTS_VALUE){
715 if(presentation_delayed) st->cur_dts = -pkt->duration;
716 else st->cur_dts = 0;
719 // 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);
720 /* interpolate PTS and DTS if they are not present */
721 if (presentation_delayed) {
722 /* DTS = decompression time stamp */
723 /* PTS = presentation time stamp */
724 if (pkt->dts == AV_NOPTS_VALUE) {
725 /* if we know the last pts, use it */
726 if(st->last_IP_pts != AV_NOPTS_VALUE)
727 st->cur_dts = pkt->dts = st->last_IP_pts;
729 pkt->dts = st->cur_dts;
731 st->cur_dts = pkt->dts;
733 /* this is tricky: the dts must be incremented by the duration
734 of the frame we are displaying, i.e. the last I or P frame */
735 if (st->last_IP_duration == 0)
736 st->cur_dts += pkt->duration;
738 st->cur_dts += st->last_IP_duration;
739 st->last_IP_duration = pkt->duration;
740 st->last_IP_pts= pkt->pts;
741 /* cannot compute PTS if not present (we can compute it only
742 by knowing the futur */
744 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
745 int64_t old_diff= ABS(st->cur_dts - pkt->duration - pkt->pts);
746 int64_t new_diff= ABS(st->cur_dts - pkt->pts);
747 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
748 pkt->pts += pkt->duration;
749 // 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);
753 /* presentation is not delayed : PTS and DTS are the same */
754 if (pkt->pts == AV_NOPTS_VALUE) {
755 if (pkt->dts == AV_NOPTS_VALUE) {
756 pkt->pts = st->cur_dts;
757 pkt->dts = st->cur_dts;
760 st->cur_dts = pkt->dts;
764 st->cur_dts = pkt->pts;
767 st->cur_dts += pkt->duration;
769 // 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);
774 /* key frame computation */
775 switch(st->codec.codec_type) {
776 case CODEC_TYPE_VIDEO:
777 if (pc->pict_type == FF_I_TYPE)
778 pkt->flags |= PKT_FLAG_KEY;
780 case CODEC_TYPE_AUDIO:
781 pkt->flags |= PKT_FLAG_KEY;
788 /* convert the packet time stamp units */
789 if(pkt->pts != AV_NOPTS_VALUE)
790 pkt->pts = av_rescale(pkt->pts, AV_TIME_BASE * (int64_t)st->time_base.num, st->time_base.den);
791 if(pkt->dts != AV_NOPTS_VALUE)
792 pkt->dts = av_rescale(pkt->dts, AV_TIME_BASE * (int64_t)st->time_base.num, st->time_base.den);
795 pkt->duration = av_rescale(pkt->duration, AV_TIME_BASE * (int64_t)st->time_base.num, st->time_base.den);
798 void av_destruct_packet_nofree(AVPacket *pkt)
800 pkt->data = NULL; pkt->size = 0;
803 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
809 /* select current input stream component */
813 /* no parsing needed: we just output the packet as is */
814 /* raw data support */
816 compute_pkt_fields(s, st, NULL, pkt);
819 } else if (s->cur_len > 0) {
820 len = av_parser_parse(st->parser, &st->codec, &pkt->data, &pkt->size,
821 s->cur_ptr, s->cur_len,
822 s->cur_pkt.pts, s->cur_pkt.dts);
823 s->cur_pkt.pts = AV_NOPTS_VALUE;
824 s->cur_pkt.dts = AV_NOPTS_VALUE;
825 /* increment read pointer */
829 /* return packet if any */
833 pkt->stream_index = st->index;
834 pkt->pts = st->parser->pts;
835 pkt->dts = st->parser->dts;
836 pkt->destruct = av_destruct_packet_nofree;
837 compute_pkt_fields(s, st, st->parser, pkt);
842 av_free_packet(&s->cur_pkt);
846 /* read next packet */
847 ret = av_read_packet(s, &s->cur_pkt);
851 /* return the last frames, if any */
852 for(i = 0; i < s->nb_streams; i++) {
855 av_parser_parse(st->parser, &st->codec,
856 &pkt->data, &pkt->size,
858 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
863 /* no more packets: really terminates parsing */
867 st = s->streams[s->cur_pkt.stream_index];
870 s->cur_ptr = s->cur_pkt.data;
871 s->cur_len = s->cur_pkt.size;
872 if (st->need_parsing && !st->parser) {
873 st->parser = av_parser_init(st->codec.codec_id);
875 /* no parser available : just output the raw packets */
876 st->need_parsing = 0;
884 * Return the next frame of a stream. The returned packet is valid
885 * until the next av_read_frame() or until av_close_input_file() and
886 * must be freed with av_free_packet. For video, the packet contains
887 * exactly one frame. For audio, it contains an integer number of
888 * frames if each frame has a known fixed size (e.g. PCM or ADPCM
889 * data). If the audio frames have a variable size (e.g. MPEG audio),
890 * then it contains one frame.
892 * pkt->pts, pkt->dts and pkt->duration are always set to correct
893 * values in AV_TIME_BASE unit (and guessed if the format cannot
894 * provided them). pkt->pts can be AV_NOPTS_VALUE if the video format
895 * has B frames, so it is better to rely on pkt->dts if you do not
896 * decompress the payload.
898 * Return 0 if OK, < 0 if error or end of file.
900 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
904 pktl = s->packet_buffer;
906 /* read packet from packet buffer, if there is data */
908 s->packet_buffer = pktl->next;
912 return av_read_frame_internal(s, pkt);
916 /* XXX: suppress the packet queue */
917 static void flush_packet_queue(AVFormatContext *s)
922 pktl = s->packet_buffer;
925 s->packet_buffer = pktl->next;
926 av_free_packet(&pktl->pkt);
931 /*******************************************************/
934 int av_find_default_stream_index(AVFormatContext *s)
939 if (s->nb_streams <= 0)
941 for(i = 0; i < s->nb_streams; i++) {
943 if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
950 /* flush the frame reader */
951 static void av_read_frame_flush(AVFormatContext *s)
956 flush_packet_queue(s);
958 /* free previous packet */
960 if (s->cur_st->parser)
961 av_free_packet(&s->cur_pkt);
968 /* for each stream, reset read state */
969 for(i = 0; i < s->nb_streams; i++) {
973 av_parser_close(st->parser);
976 st->last_IP_pts = AV_NOPTS_VALUE;
977 st->cur_dts = 0; /* we set the current DTS to an unspecified origin */
982 * updates cur_dts of all streams based on given timestamp and AVStream.
983 * stream ref_st unchanged, others set cur_dts in their native timebase
984 * only needed for timestamp wrapping or if (dts not set and pts!=dts)
985 * @param timestamp new dts expressed in time_base of param ref_st
986 * @param ref_st reference stream giving time_base of param timestamp
988 static void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
991 for(i = 0; i < s->nb_streams; i++) {
992 AVStream *st = s->streams[i];
994 st->cur_dts = av_rescale(timestamp,
995 st->time_base.den * (int64_t)ref_st->time_base.num,
996 st->time_base.num * (int64_t)ref_st->time_base.den);
1001 * add a index entry into a sorted list updateing if it is already there.
1002 * @param timestamp timestamp in the timebase of the given stream
1004 int av_add_index_entry(AVStream *st,
1005 int64_t pos, int64_t timestamp, int distance, int flags)
1007 AVIndexEntry *entries, *ie;
1010 entries = av_fast_realloc(st->index_entries,
1011 &st->index_entries_allocated_size,
1012 (st->nb_index_entries + 1) *
1013 sizeof(AVIndexEntry));
1014 st->index_entries= entries;
1016 index= av_index_search_timestamp(st, timestamp, 0);
1019 index= st->nb_index_entries++;
1020 ie= &entries[index];
1021 assert(index==0 || ie[-1].timestamp < timestamp);
1023 ie= &entries[index];
1024 if(ie->timestamp != timestamp){
1025 if(ie->timestamp <= timestamp)
1027 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1028 st->nb_index_entries++;
1029 }else if(ie->pos == pos && distance < ie->min_distance) //dont reduce the distance
1030 distance= ie->min_distance;
1034 ie->timestamp = timestamp;
1035 ie->min_distance= distance;
1041 /* build an index for raw streams using a parser */
1042 static void av_build_index_raw(AVFormatContext *s)
1044 AVPacket pkt1, *pkt = &pkt1;
1049 av_read_frame_flush(s);
1050 url_fseek(&s->pb, s->data_offset, SEEK_SET);
1053 ret = av_read_frame(s, pkt);
1056 if (pkt->stream_index == 0 && st->parser &&
1057 (pkt->flags & PKT_FLAG_KEY)) {
1058 int64_t dts= av_rescale(pkt->dts, st->time_base.den, AV_TIME_BASE*(int64_t)st->time_base.num);
1059 av_add_index_entry(st, st->parser->frame_offset, dts,
1060 0, AVINDEX_KEYFRAME);
1062 av_free_packet(pkt);
1066 /* return TRUE if we deal with a raw stream (raw codec data and
1068 static int is_raw_stream(AVFormatContext *s)
1072 if (s->nb_streams != 1)
1075 if (!st->need_parsing)
1081 * gets the index for a specific timestamp.
1082 * @param backward if non zero then the returned index will correspond to
1083 * the timestamp which is <= the requested one, if backward is 0
1084 * then it will be >=
1085 * @return < 0 if no such timestamp could be found
1087 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1090 AVIndexEntry *entries= st->index_entries;
1091 int nb_entries= st->nb_index_entries;
1100 timestamp = entries[m].timestamp;
1101 if(timestamp >= wanted_timestamp)
1103 if(timestamp <= wanted_timestamp)
1106 m= backward ? a : b;
1116 * Does a binary search using av_index_search_timestamp() and AVCodec.read_timestamp().
1117 * this isnt supposed to be called directly by a user application, but by demuxers
1118 * @param target_ts target timestamp in the time base of the given stream
1119 * @param stream_index stream number
1121 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1122 AVInputFormat *avif= s->iformat;
1123 int64_t pos_min, pos_max, pos, pos_limit;
1124 int64_t ts_min, ts_max, ts;
1126 int index, no_change;
1129 if (stream_index < 0)
1133 av_log(s, AV_LOG_DEBUG, "read_seek: %d %lld\n", stream_index, target_ts);
1137 ts_min= AV_NOPTS_VALUE;
1138 pos_limit= -1; //gcc falsely says it may be uninitalized
1140 st= s->streams[stream_index];
1141 if(st->index_entries){
1144 index= av_index_search_timestamp(st, target_ts, 1);
1145 index= FFMAX(index, 0);
1146 e= &st->index_entries[index];
1148 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1150 ts_min= e->timestamp;
1152 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%llx dts_min=%lld\n",
1159 if(index < st->nb_index_entries){
1160 e= &st->index_entries[index];
1161 assert(e->timestamp >= target_ts);
1163 ts_max= e->timestamp;
1164 pos_limit= pos_max - e->min_distance;
1166 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%llx pos_limit=0x%llx dts_max=%lld\n",
1167 pos_max,pos_limit, ts_max);
1172 if(ts_min == AV_NOPTS_VALUE){
1173 pos_min = s->data_offset;
1174 ts_min = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1175 if (ts_min == AV_NOPTS_VALUE)
1179 if(ts_max == AV_NOPTS_VALUE){
1181 pos_max = url_filesize(url_fileno(&s->pb)) - 1;
1184 ts_max = avif->read_timestamp(s, stream_index, &pos_max, pos_max + step);
1186 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1187 if (ts_max == AV_NOPTS_VALUE)
1191 int64_t tmp_pos= pos_max + 1;
1192 int64_t tmp_ts= avif->read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1193 if(tmp_ts == AV_NOPTS_VALUE)
1202 while (pos_min < pos_limit) {
1204 av_log(s, AV_LOG_DEBUG, "pos_min=0x%llx pos_max=0x%llx dts_min=%lld dts_max=%lld\n",
1208 assert(pos_limit <= pos_max);
1211 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1212 // interpolate position (better than dichotomy)
1213 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1214 + pos_min - approximate_keyframe_distance;
1215 }else if(no_change==1){
1216 // bisection, if interpolation failed to change min or max pos last time
1217 pos = (pos_min + pos_limit)>>1;
1219 // linear search if bisection failed, can only happen if there are very few or no keframes between min/max
1224 else if(pos > pos_limit)
1228 ts = avif->read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1234 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);
1236 assert(ts != AV_NOPTS_VALUE);
1237 if (target_ts <= ts) {
1238 pos_limit = start_pos - 1;
1242 if (target_ts >= ts) {
1248 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1249 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1252 ts_min = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1254 ts_max = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1255 av_log(s, AV_LOG_DEBUG, "pos=0x%llx %lld<=%lld<=%lld\n",
1256 pos, ts_min, target_ts, ts_max);
1259 url_fseek(&s->pb, pos, SEEK_SET);
1261 av_update_cur_dts(s, st, ts);
1266 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1267 AVInputFormat *avif= s->iformat;
1268 int64_t pos_min, pos_max;
1272 if (stream_index < 0)
1275 st= s->streams[stream_index];
1278 pos_min = s->data_offset;
1279 pos_max = url_filesize(url_fileno(&s->pb)) - 1;
1281 if (pos < pos_min) pos= pos_min;
1282 else if(pos > pos_max) pos= pos_max;
1284 url_fseek(&s->pb, pos, SEEK_SET);
1287 av_update_cur_dts(s, st, ts);
1292 static int av_seek_frame_generic(AVFormatContext *s,
1293 int stream_index, int64_t timestamp, int flags)
1299 if (!s->index_built) {
1300 if (is_raw_stream(s)) {
1301 av_build_index_raw(s);
1308 st = s->streams[stream_index];
1309 index = av_index_search_timestamp(st, timestamp, flags & AVSEEK_FLAG_BACKWARD);
1313 /* now we have found the index, we can seek */
1314 ie = &st->index_entries[index];
1315 av_read_frame_flush(s);
1316 url_fseek(&s->pb, ie->pos, SEEK_SET);
1318 av_update_cur_dts(s, st, ie->timestamp);
1324 * Seek to the key frame at timestamp.
1325 * 'timestamp' in 'stream_index'.
1326 * @param stream_index If stream_index is (-1), a default
1327 * stream is selected, and timestamp is automatically converted
1328 * from AV_TIME_BASE units to the stream specific time_base.
1329 * @param timestamp timestamp in AVStream.time_base units
1330 * @param flags flags which select direction and seeking mode
1331 * @return >= 0 on success
1333 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1338 av_read_frame_flush(s);
1340 if(flags & AVSEEK_FLAG_BYTE)
1341 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1343 if(stream_index < 0){
1344 stream_index= av_find_default_stream_index(s);
1345 if(stream_index < 0)
1348 st= s->streams[stream_index];
1349 /* timestamp for default must be expressed in AV_TIME_BASE units */
1350 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1352 st= s->streams[stream_index];
1354 /* first, we try the format specific seek */
1355 if (s->iformat->read_seek)
1356 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1363 if(s->iformat->read_timestamp)
1364 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1366 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1369 /*******************************************************/
1371 /* return TRUE if the stream has accurate timings for at least one component */
1372 static int av_has_timings(AVFormatContext *ic)
1377 for(i = 0;i < ic->nb_streams; i++) {
1378 st = ic->streams[i];
1379 if (st->start_time != AV_NOPTS_VALUE &&
1380 st->duration != AV_NOPTS_VALUE)
1386 /* estimate the stream timings from the one of each components. Also
1387 compute the global bitrate if possible */
1388 static void av_update_stream_timings(AVFormatContext *ic)
1390 int64_t start_time, end_time, end_time1;
1394 start_time = MAXINT64;
1395 end_time = MININT64;
1396 for(i = 0;i < ic->nb_streams; i++) {
1397 st = ic->streams[i];
1398 if (st->start_time != AV_NOPTS_VALUE) {
1399 if (st->start_time < start_time)
1400 start_time = st->start_time;
1401 if (st->duration != AV_NOPTS_VALUE) {
1402 end_time1 = st->start_time + st->duration;
1403 if (end_time1 > end_time)
1404 end_time = end_time1;
1408 if (start_time != MAXINT64) {
1409 ic->start_time = start_time;
1410 if (end_time != MAXINT64) {
1411 ic->duration = end_time - start_time;
1412 if (ic->file_size > 0) {
1413 /* compute the bit rate */
1414 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1415 (double)ic->duration;
1422 static void fill_all_stream_timings(AVFormatContext *ic)
1427 av_update_stream_timings(ic);
1428 for(i = 0;i < ic->nb_streams; i++) {
1429 st = ic->streams[i];
1430 if (st->start_time == AV_NOPTS_VALUE) {
1431 st->start_time = ic->start_time;
1432 st->duration = ic->duration;
1437 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1439 int64_t filesize, duration;
1443 /* if bit_rate is already set, we believe it */
1444 if (ic->bit_rate == 0) {
1446 for(i=0;i<ic->nb_streams;i++) {
1447 st = ic->streams[i];
1448 bit_rate += st->codec.bit_rate;
1450 ic->bit_rate = bit_rate;
1453 /* if duration is already set, we believe it */
1454 if (ic->duration == AV_NOPTS_VALUE &&
1455 ic->bit_rate != 0 &&
1456 ic->file_size != 0) {
1457 filesize = ic->file_size;
1459 duration = (int64_t)((8 * AV_TIME_BASE * (double)filesize) / (double)ic->bit_rate);
1460 for(i = 0; i < ic->nb_streams; i++) {
1461 st = ic->streams[i];
1462 if (st->start_time == AV_NOPTS_VALUE ||
1463 st->duration == AV_NOPTS_VALUE) {
1465 st->duration = duration;
1472 #define DURATION_MAX_READ_SIZE 250000
1474 /* only usable for MPEG-PS streams */
1475 static void av_estimate_timings_from_pts(AVFormatContext *ic)
1477 AVPacket pkt1, *pkt = &pkt1;
1479 int read_size, i, ret;
1480 int64_t start_time, end_time, end_time1;
1481 int64_t filesize, offset, duration;
1483 /* free previous packet */
1484 if (ic->cur_st && ic->cur_st->parser)
1485 av_free_packet(&ic->cur_pkt);
1488 /* flush packet queue */
1489 flush_packet_queue(ic);
1491 for(i=0;i<ic->nb_streams;i++) {
1492 st = ic->streams[i];
1494 av_parser_close(st->parser);
1499 /* we read the first packets to get the first PTS (not fully
1500 accurate, but it is enough now) */
1501 url_fseek(&ic->pb, 0, SEEK_SET);
1504 if (read_size >= DURATION_MAX_READ_SIZE)
1506 /* if all info is available, we can stop */
1507 for(i = 0;i < ic->nb_streams; i++) {
1508 st = ic->streams[i];
1509 if (st->start_time == AV_NOPTS_VALUE)
1512 if (i == ic->nb_streams)
1515 ret = av_read_packet(ic, pkt);
1518 read_size += pkt->size;
1519 st = ic->streams[pkt->stream_index];
1520 if (pkt->pts != AV_NOPTS_VALUE) {
1521 if (st->start_time == AV_NOPTS_VALUE)
1522 st->start_time = av_rescale(pkt->pts, st->time_base.num * (int64_t)AV_TIME_BASE, st->time_base.den);
1524 av_free_packet(pkt);
1527 /* we compute the minimum start_time and use it as default */
1528 start_time = MAXINT64;
1529 for(i = 0; i < ic->nb_streams; i++) {
1530 st = ic->streams[i];
1531 if (st->start_time != AV_NOPTS_VALUE &&
1532 st->start_time < start_time)
1533 start_time = st->start_time;
1535 if (start_time != MAXINT64)
1536 ic->start_time = start_time;
1538 /* estimate the end time (duration) */
1539 /* XXX: may need to support wrapping */
1540 filesize = ic->file_size;
1541 offset = filesize - DURATION_MAX_READ_SIZE;
1545 url_fseek(&ic->pb, offset, SEEK_SET);
1548 if (read_size >= DURATION_MAX_READ_SIZE)
1550 /* if all info is available, we can stop */
1551 for(i = 0;i < ic->nb_streams; i++) {
1552 st = ic->streams[i];
1553 if (st->duration == AV_NOPTS_VALUE)
1556 if (i == ic->nb_streams)
1559 ret = av_read_packet(ic, pkt);
1562 read_size += pkt->size;
1563 st = ic->streams[pkt->stream_index];
1564 if (pkt->pts != AV_NOPTS_VALUE) {
1565 end_time = av_rescale(pkt->pts, st->time_base.num * (int64_t)AV_TIME_BASE, st->time_base.den);
1566 duration = end_time - st->start_time;
1568 if (st->duration == AV_NOPTS_VALUE ||
1569 st->duration < duration)
1570 st->duration = duration;
1573 av_free_packet(pkt);
1576 /* estimate total duration */
1577 end_time = MININT64;
1578 for(i = 0;i < ic->nb_streams; i++) {
1579 st = ic->streams[i];
1580 if (st->duration != AV_NOPTS_VALUE) {
1581 end_time1 = st->start_time + st->duration;
1582 if (end_time1 > end_time)
1583 end_time = end_time1;
1587 /* update start_time (new stream may have been created, so we do
1589 if (ic->start_time != AV_NOPTS_VALUE) {
1590 for(i = 0; i < ic->nb_streams; i++) {
1591 st = ic->streams[i];
1592 if (st->start_time == AV_NOPTS_VALUE)
1593 st->start_time = ic->start_time;
1597 if (end_time != MININT64) {
1598 /* put dummy values for duration if needed */
1599 for(i = 0;i < ic->nb_streams; i++) {
1600 st = ic->streams[i];
1601 if (st->duration == AV_NOPTS_VALUE &&
1602 st->start_time != AV_NOPTS_VALUE)
1603 st->duration = end_time - st->start_time;
1605 ic->duration = end_time - ic->start_time;
1608 url_fseek(&ic->pb, 0, SEEK_SET);
1611 static void av_estimate_timings(AVFormatContext *ic)
1616 /* get the file size, if possible */
1617 if (ic->iformat->flags & AVFMT_NOFILE) {
1620 h = url_fileno(&ic->pb);
1621 file_size = url_filesize(h);
1625 ic->file_size = file_size;
1627 if ((ic->iformat == &mpegps_demux || ic->iformat == &mpegts_demux) && file_size && !ic->pb.is_streamed) {
1628 /* get accurate estimate from the PTSes */
1629 av_estimate_timings_from_pts(ic);
1630 } else if (av_has_timings(ic)) {
1631 /* at least one components has timings - we use them for all
1633 fill_all_stream_timings(ic);
1635 /* less precise: use bit rate info */
1636 av_estimate_timings_from_bit_rate(ic);
1638 av_update_stream_timings(ic);
1644 for(i = 0;i < ic->nb_streams; i++) {
1645 st = ic->streams[i];
1646 printf("%d: start_time: %0.3f duration: %0.3f\n",
1647 i, (double)st->start_time / AV_TIME_BASE,
1648 (double)st->duration / AV_TIME_BASE);
1650 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1651 (double)ic->start_time / AV_TIME_BASE,
1652 (double)ic->duration / AV_TIME_BASE,
1653 ic->bit_rate / 1000);
1658 static int has_codec_parameters(AVCodecContext *enc)
1661 switch(enc->codec_type) {
1662 case CODEC_TYPE_AUDIO:
1663 val = enc->sample_rate;
1665 case CODEC_TYPE_VIDEO:
1675 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1679 int got_picture, ret;
1682 codec = avcodec_find_decoder(st->codec.codec_id);
1685 ret = avcodec_open(&st->codec, codec);
1688 switch(st->codec.codec_type) {
1689 case CODEC_TYPE_VIDEO:
1690 ret = avcodec_decode_video(&st->codec, &picture,
1691 &got_picture, (uint8_t *)data, size);
1693 case CODEC_TYPE_AUDIO:
1694 samples = av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
1697 ret = avcodec_decode_audio(&st->codec, samples,
1698 &got_picture, (uint8_t *)data, size);
1705 avcodec_close(&st->codec);
1709 /* absolute maximum size we read until we abort */
1710 #define MAX_READ_SIZE 5000000
1712 /* maximum duration until we stop analysing the stream */
1713 #define MAX_STREAM_DURATION ((int)(AV_TIME_BASE * 1.0))
1716 * Read the beginning of a media file to get stream information. This
1717 * is useful for file formats with no headers such as MPEG. This
1718 * function also compute the real frame rate in case of mpeg2 repeat
1721 * @param ic media file handle
1722 * @return >=0 if OK. AVERROR_xxx if error.
1724 int av_find_stream_info(AVFormatContext *ic)
1726 int i, count, ret, read_size;
1728 AVPacket pkt1, *pkt;
1729 AVPacketList *pktl=NULL, **ppktl;
1730 int64_t last_dts[MAX_STREAMS];
1731 int64_t best_duration[MAX_STREAMS];
1733 for(i=0;i<MAX_STREAMS;i++){
1734 last_dts[i]= AV_NOPTS_VALUE;
1735 best_duration[i]= INT64_MAX;
1740 ppktl = &ic->packet_buffer;
1742 /* check if one codec still needs to be handled */
1743 for(i=0;i<ic->nb_streams;i++) {
1744 st = ic->streams[i];
1745 if (!has_codec_parameters(&st->codec))
1747 /* variable fps and no guess at the real fps */
1748 if( st->codec.frame_rate >= 1000LL*st->codec.frame_rate_base
1749 && best_duration[i]== INT64_MAX)
1752 if (i == ic->nb_streams) {
1753 /* NOTE: if the format has no header, then we need to read
1754 some packets to get most of the streams, so we cannot
1756 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1757 /* if we found the info for all the codecs, we can stop */
1762 /* we did not get all the codec info, but we read too much data */
1763 if (read_size >= MAX_READ_SIZE) {
1769 /* NOTE: a new stream can be added there if no header in file
1770 (AVFMTCTX_NOHEADER) */
1771 ret = av_read_frame_internal(ic, &pkt1);
1774 ret = -1; /* we could not have all the codec parameters before EOF */
1775 if ((ic->ctx_flags & AVFMTCTX_NOHEADER) &&
1776 i == ic->nb_streams)
1781 pktl = av_mallocz(sizeof(AVPacketList));
1783 ret = AVERROR_NOMEM;
1787 /* add the packet in the buffered packet list */
1789 ppktl = &pktl->next;
1794 /* duplicate the packet */
1795 if (av_dup_packet(pkt) < 0) {
1796 ret = AVERROR_NOMEM;
1800 read_size += pkt->size;
1802 st = ic->streams[pkt->stream_index];
1803 st->codec_info_duration += pkt->duration;
1804 if (pkt->duration != 0)
1805 st->codec_info_nb_frames++;
1807 if(st->codec.codec_type == CODEC_TYPE_VIDEO){
1808 int64_t last= last_dts[pkt->stream_index];
1810 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && last < pkt->dts &&
1811 best_duration[pkt->stream_index] > pkt->dts - last){
1812 best_duration[pkt->stream_index] = pkt->dts - last;
1814 last_dts[pkt->stream_index]= pkt->dts;
1816 /* if still no information, we try to open the codec and to
1817 decompress the frame. We try to avoid that in most cases as
1818 it takes longer and uses more memory. For MPEG4, we need to
1819 decompress for Quicktime. */
1820 if (!has_codec_parameters(&st->codec) &&
1821 (st->codec.codec_id == CODEC_ID_FLV1 ||
1822 st->codec.codec_id == CODEC_ID_H264 ||
1823 st->codec.codec_id == CODEC_ID_H263 ||
1824 st->codec.codec_id == CODEC_ID_H261 ||
1825 st->codec.codec_id == CODEC_ID_VORBIS ||
1826 st->codec.codec_id == CODEC_ID_MJPEG ||
1827 st->codec.codec_id == CODEC_ID_PNG ||
1828 st->codec.codec_id == CODEC_ID_PAM ||
1829 st->codec.codec_id == CODEC_ID_PGM ||
1830 st->codec.codec_id == CODEC_ID_PGMYUV ||
1831 st->codec.codec_id == CODEC_ID_PBM ||
1832 st->codec.codec_id == CODEC_ID_PPM ||
1833 (st->codec.codec_id == CODEC_ID_MPEG4 && !st->need_parsing)))
1834 try_decode_frame(st, pkt->data, pkt->size);
1836 if (st->codec_info_duration >= MAX_STREAM_DURATION) {
1842 for(i=0;i<ic->nb_streams;i++) {
1843 st = ic->streams[i];
1844 if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
1845 if(st->codec.codec_id == CODEC_ID_RAWVIDEO && !st->codec.codec_tag && !st->codec.bits_per_sample)
1846 st->codec.codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec.pix_fmt);
1848 if(best_duration[i] < INT64_MAX && st->codec.frame_rate_base*1000 <= st->codec.frame_rate){
1851 st->r_frame_rate= st->codec.frame_rate;
1852 st->r_frame_rate_base= av_rescale(best_duration[i], st->codec.frame_rate, AV_TIME_BASE);
1853 av_reduce(&st->r_frame_rate, &st->r_frame_rate_base, st->r_frame_rate, st->r_frame_rate_base, 1<<15);
1855 int_fps= av_rescale(st->r_frame_rate, 1, st->r_frame_rate_base);
1857 if(av_rescale(st->r_frame_rate, 1, int_fps) == st->r_frame_rate_base){
1858 st->r_frame_rate= int_fps;
1859 st->r_frame_rate_base= 1;
1863 /* set real frame rate info */
1864 /* compute the real frame rate for telecine */
1865 if ((st->codec.codec_id == CODEC_ID_MPEG1VIDEO ||
1866 st->codec.codec_id == CODEC_ID_MPEG2VIDEO) &&
1867 st->codec.sub_id == 2) {
1868 if (st->codec_info_nb_frames >= 20) {
1869 float coded_frame_rate, est_frame_rate;
1870 est_frame_rate = ((double)st->codec_info_nb_frames * AV_TIME_BASE) /
1871 (double)st->codec_info_duration ;
1872 coded_frame_rate = (double)st->codec.frame_rate /
1873 (double)st->codec.frame_rate_base;
1875 printf("telecine: coded_frame_rate=%0.3f est_frame_rate=%0.3f\n",
1876 coded_frame_rate, est_frame_rate);
1878 /* if we detect that it could be a telecine, we
1879 signal it. It would be better to do it at a
1880 higher level as it can change in a film */
1881 if (coded_frame_rate >= 24.97 &&
1882 (est_frame_rate >= 23.5 && est_frame_rate < 24.5)) {
1883 st->r_frame_rate = 24024;
1884 st->r_frame_rate_base = 1001;
1888 /* if no real frame rate, use the codec one */
1889 if (!st->r_frame_rate){
1890 st->r_frame_rate = st->codec.frame_rate;
1891 st->r_frame_rate_base = st->codec.frame_rate_base;
1896 av_estimate_timings(ic);
1898 /* correct DTS for b frame streams with no timestamps */
1899 for(i=0;i<ic->nb_streams;i++) {
1900 st = ic->streams[i];
1901 if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
1903 ppktl = &ic->packet_buffer;
1905 if(ppkt1->stream_index != i)
1907 if(ppkt1->pkt->dts < 0)
1909 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
1911 ppkt1->pkt->dts -= delta;
1916 st->cur_dts -= delta;
1924 /*******************************************************/
1927 * start playing a network based stream (e.g. RTSP stream) at the
1930 int av_read_play(AVFormatContext *s)
1932 if (!s->iformat->read_play)
1933 return AVERROR_NOTSUPP;
1934 return s->iformat->read_play(s);
1938 * pause a network based stream (e.g. RTSP stream). Use av_read_play()
1941 int av_read_pause(AVFormatContext *s)
1943 if (!s->iformat->read_pause)
1944 return AVERROR_NOTSUPP;
1945 return s->iformat->read_pause(s);
1949 * Close a media file (but not its codecs)
1951 * @param s media file handle
1953 void av_close_input_file(AVFormatContext *s)
1955 int i, must_open_file;
1958 /* free previous packet */
1959 if (s->cur_st && s->cur_st->parser)
1960 av_free_packet(&s->cur_pkt);
1962 if (s->iformat->read_close)
1963 s->iformat->read_close(s);
1964 for(i=0;i<s->nb_streams;i++) {
1965 /* free all data in a stream component */
1968 av_parser_close(st->parser);
1970 av_free(st->index_entries);
1973 flush_packet_queue(s);
1975 if (s->iformat->flags & AVFMT_NOFILE) {
1978 if (must_open_file) {
1981 av_freep(&s->priv_data);
1986 * Add a new stream to a media file. Can only be called in the
1987 * read_header function. If the flag AVFMTCTX_NOHEADER is in the
1988 * format context, then new streams can be added in read_packet too.
1991 * @param s media file handle
1992 * @param id file format dependent stream id
1994 AVStream *av_new_stream(AVFormatContext *s, int id)
1998 if (s->nb_streams >= MAX_STREAMS)
2001 st = av_mallocz(sizeof(AVStream));
2004 avcodec_get_context_defaults(&st->codec);
2006 /* no default bitrate if decoding */
2007 st->codec.bit_rate = 0;
2009 st->index = s->nb_streams;
2011 st->start_time = AV_NOPTS_VALUE;
2012 st->duration = AV_NOPTS_VALUE;
2013 st->cur_dts = AV_NOPTS_VALUE;
2015 /* default pts settings is MPEG like */
2016 av_set_pts_info(st, 33, 1, 90000);
2017 st->last_IP_pts = AV_NOPTS_VALUE;
2019 s->streams[s->nb_streams++] = st;
2023 /************************************************************/
2024 /* output media file */
2026 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2030 if (s->oformat->priv_data_size > 0) {
2031 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2033 return AVERROR_NOMEM;
2035 s->priv_data = NULL;
2037 if (s->oformat->set_parameters) {
2038 ret = s->oformat->set_parameters(s, ap);
2046 * allocate the stream private data and write the stream header to an
2049 * @param s media file handle
2050 * @return 0 if OK. AVERROR_xxx if error.
2052 int av_write_header(AVFormatContext *s)
2057 ret = s->oformat->write_header(s);
2061 /* init PTS generation */
2062 for(i=0;i<s->nb_streams;i++) {
2065 switch (st->codec.codec_type) {
2066 case CODEC_TYPE_AUDIO:
2067 av_frac_init(&st->pts, 0, 0,
2068 (int64_t)st->time_base.num * st->codec.sample_rate);
2070 case CODEC_TYPE_VIDEO:
2071 av_frac_init(&st->pts, 0, 0,
2072 (int64_t)st->time_base.num * st->codec.frame_rate);
2081 //FIXME merge with compute_pkt_fields
2082 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2083 int b_frames = FFMAX(st->codec.has_b_frames, st->codec.max_b_frames);
2084 int num, den, frame_size;
2086 // 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);
2088 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2091 if(pkt->pts != AV_NOPTS_VALUE)
2092 pkt->pts = av_rescale(pkt->pts, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
2093 if(pkt->dts != AV_NOPTS_VALUE)
2094 pkt->dts = av_rescale(pkt->dts, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
2096 /* duration field */
2097 pkt->duration = av_rescale(pkt->duration, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
2098 if (pkt->duration == 0) {
2099 compute_frame_duration(&num, &den, st, NULL, pkt);
2101 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2105 //XXX/FIXME this is a temporary hack until all encoders output pts
2106 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !b_frames){
2108 // pkt->pts= st->cur_dts;
2109 pkt->pts= st->pts.val;
2112 //calculate dts from pts
2113 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2115 if(st->last_IP_pts == AV_NOPTS_VALUE){
2116 st->last_IP_pts= -pkt->duration;
2118 if(st->last_IP_pts < pkt->pts){
2119 pkt->dts= st->last_IP_pts;
2120 st->last_IP_pts= pkt->pts;
2127 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2128 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %Ld >= %Ld\n", st->cur_dts, pkt->dts);
2131 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2132 av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n");
2136 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%lld dts2:%lld\n", pkt->pts, pkt->dts);
2137 st->cur_dts= pkt->dts;
2138 st->pts.val= pkt->dts;
2141 switch (st->codec.codec_type) {
2142 case CODEC_TYPE_AUDIO:
2143 frame_size = get_audio_frame_size(&st->codec, pkt->size);
2145 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
2146 but it would be better if we had the real timestamps from the encoder */
2147 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2148 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2151 case CODEC_TYPE_VIDEO:
2152 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec.frame_rate_base);
2160 static void truncate_ts(AVStream *st, AVPacket *pkt){
2161 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2164 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here
2166 pkt->pts &= pts_mask;
2167 pkt->dts &= pts_mask;
2171 * Write a packet to an output media file. The packet shall contain
2172 * one audio or video frame.
2174 * @param s media file handle
2175 * @param pkt the packet, which contains the stream_index, buf/buf_size, dts/pts, ...
2176 * @return < 0 if error, = 0 if OK, 1 if end of stream wanted.
2178 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2182 ret=compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2186 truncate_ts(s->streams[pkt->stream_index], pkt);
2188 ret= s->oformat->write_packet(s, pkt);
2190 ret= url_ferror(&s->pb);
2195 * interleave_packet implementation which will interleave per DTS.
2197 static int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2198 AVPacketList *pktl, **next_point, *this_pktl;
2200 int streams[MAX_STREAMS];
2203 AVStream *st= s->streams[ pkt->stream_index];
2205 assert(pkt->destruct != av_destruct_packet); //FIXME
2207 this_pktl = av_mallocz(sizeof(AVPacketList));
2208 this_pktl->pkt= *pkt;
2209 av_dup_packet(&this_pktl->pkt);
2211 next_point = &s->packet_buffer;
2213 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2214 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2215 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2216 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2218 next_point= &(*next_point)->next;
2220 this_pktl->next= *next_point;
2221 *next_point= this_pktl;
2224 memset(streams, 0, sizeof(streams));
2225 pktl= s->packet_buffer;
2227 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%lld\n", pktl->pkt.stream_index, pktl->pkt.dts);
2228 if(streams[ pktl->pkt.stream_index ] == 0)
2230 streams[ pktl->pkt.stream_index ]++;
2234 if(s->nb_streams == stream_count || (flush && stream_count)){
2235 pktl= s->packet_buffer;
2238 s->packet_buffer= pktl->next;
2242 av_init_packet(out);
2248 * Interleaves a AVPacket correctly so it can be muxed.
2249 * @param out the interleaved packet will be output here
2250 * @param in the input packet
2251 * @param flush 1 if no further packets are available as input and all
2252 * remaining packets should be output
2253 * @return 1 if a packet was output, 0 if no packet could be output,
2254 * < 0 if an error occured
2256 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2257 if(s->oformat->interleave_packet)
2258 return s->oformat->interleave_packet(s, out, in, flush);
2260 return av_interleave_packet_per_dts(s, out, in, flush);
2264 * Writes a packet to an output media file ensuring correct interleaving.
2265 * The packet shall contain one audio or video frame.
2266 * If the packets are already correctly interleaved the application should
2267 * call av_write_frame() instead as its slightly faster, its also important
2268 * to keep in mind that completly non interleaved input will need huge amounts
2269 * of memory to interleave with this, so its prefereable to interleave at the
2272 * @param s media file handle
2273 * @param pkt the packet, which contains the stream_index, buf/buf_size, dts/pts, ...
2274 * @return < 0 if error, = 0 if OK, 1 if end of stream wanted.
2276 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2277 AVStream *st= s->streams[ pkt->stream_index];
2279 if(compute_pkt_fields2(st, pkt) < 0)
2282 //FIXME/XXX/HACK drop zero sized packets
2283 if(st->codec.codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2286 if(pkt->dts == AV_NOPTS_VALUE)
2291 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2292 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2295 truncate_ts(s->streams[opkt.stream_index], &opkt);
2296 ret= s->oformat->write_packet(s, &opkt);
2298 av_free_packet(&opkt);
2303 if(url_ferror(&s->pb))
2304 return url_ferror(&s->pb);
2309 * write the stream trailer to an output media file and and free the
2310 * file private data.
2312 * @param s media file handle
2313 * @return 0 if OK. AVERROR_xxx if error. */
2314 int av_write_trailer(AVFormatContext *s)
2320 ret= av_interleave_packet(s, &pkt, NULL, 1);
2321 if(ret<0) //FIXME cleanup needed for ret<0 ?
2326 truncate_ts(s->streams[pkt.stream_index], &pkt);
2327 ret= s->oformat->write_packet(s, &pkt);
2329 av_free_packet(&pkt);
2333 if(url_ferror(&s->pb))
2337 ret = s->oformat->write_trailer(s);
2340 ret=url_ferror(&s->pb);
2341 for(i=0;i<s->nb_streams;i++)
2342 av_freep(&s->streams[i]->priv_data);
2343 av_freep(&s->priv_data);
2347 /* "user interface" functions */
2349 void dump_format(AVFormatContext *ic,
2357 av_log(NULL, AV_LOG_DEBUG, "%s #%d, %s, %s '%s':\n",
2358 is_output ? "Output" : "Input",
2360 is_output ? ic->oformat->name : ic->iformat->name,
2361 is_output ? "to" : "from", url);
2363 av_log(NULL, AV_LOG_DEBUG, " Duration: ");
2364 if (ic->duration != AV_NOPTS_VALUE) {
2365 int hours, mins, secs, us;
2366 secs = ic->duration / AV_TIME_BASE;
2367 us = ic->duration % AV_TIME_BASE;
2372 av_log(NULL, AV_LOG_DEBUG, "%02d:%02d:%02d.%01d", hours, mins, secs,
2373 (10 * us) / AV_TIME_BASE);
2375 av_log(NULL, AV_LOG_DEBUG, "N/A");
2377 if (ic->start_time != AV_NOPTS_VALUE) {
2379 av_log(NULL, AV_LOG_DEBUG, ", start: ");
2380 secs = ic->start_time / AV_TIME_BASE;
2381 us = ic->start_time % AV_TIME_BASE;
2382 av_log(NULL, AV_LOG_DEBUG, "%d.%06d",
2383 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2385 av_log(NULL, AV_LOG_DEBUG, ", bitrate: ");
2387 av_log(NULL, AV_LOG_DEBUG,"%d kb/s", ic->bit_rate / 1000);
2389 av_log(NULL, AV_LOG_DEBUG, "N/A");
2391 av_log(NULL, AV_LOG_DEBUG, "\n");
2393 for(i=0;i<ic->nb_streams;i++) {
2394 AVStream *st = ic->streams[i];
2395 avcodec_string(buf, sizeof(buf), &st->codec, is_output);
2396 av_log(NULL, AV_LOG_DEBUG, " Stream #%d.%d", index, i);
2397 /* the pid is an important information, so we display it */
2398 /* XXX: add a generic system */
2400 flags = ic->oformat->flags;
2402 flags = ic->iformat->flags;
2403 if (flags & AVFMT_SHOW_IDS) {
2404 av_log(NULL, AV_LOG_DEBUG, "[0x%x]", st->id);
2406 av_log(NULL, AV_LOG_DEBUG, ": %s\n", buf);
2413 int frame_rate, frame_rate_base;
2416 static AbvEntry frame_abvs[] = {
2417 { "ntsc", 720, 480, 30000, 1001 },
2418 { "pal", 720, 576, 25, 1 },
2419 { "qntsc", 352, 240, 30000, 1001 }, /* VCD compliant ntsc */
2420 { "qpal", 352, 288, 25, 1 }, /* VCD compliant pal */
2421 { "sntsc", 640, 480, 30000, 1001 }, /* square pixel ntsc */
2422 { "spal", 768, 576, 25, 1 }, /* square pixel pal */
2423 { "film", 352, 240, 24, 1 },
2424 { "ntsc-film", 352, 240, 24000, 1001 },
2425 { "sqcif", 128, 96, 0, 0 },
2426 { "qcif", 176, 144, 0, 0 },
2427 { "cif", 352, 288, 0, 0 },
2428 { "4cif", 704, 576, 0, 0 },
2431 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2434 int n = sizeof(frame_abvs) / sizeof(AbvEntry);
2436 int frame_width = 0, frame_height = 0;
2439 if (!strcmp(frame_abvs[i].abv, str)) {
2440 frame_width = frame_abvs[i].width;
2441 frame_height = frame_abvs[i].height;
2447 frame_width = strtol(p, (char **)&p, 10);
2450 frame_height = strtol(p, (char **)&p, 10);
2452 if (frame_width <= 0 || frame_height <= 0)
2454 *width_ptr = frame_width;
2455 *height_ptr = frame_height;
2459 int parse_frame_rate(int *frame_rate, int *frame_rate_base, const char *arg)
2464 /* First, we check our abbreviation table */
2465 for (i = 0; i < sizeof(frame_abvs)/sizeof(*frame_abvs); ++i)
2466 if (!strcmp(frame_abvs[i].abv, arg)) {
2467 *frame_rate = frame_abvs[i].frame_rate;
2468 *frame_rate_base = frame_abvs[i].frame_rate_base;
2472 /* Then, we try to parse it as fraction */
2473 cp = strchr(arg, '/');
2476 *frame_rate = strtol(arg, &cpp, 10);
2477 if (cpp != arg || cpp == cp)
2478 *frame_rate_base = strtol(cp+1, &cpp, 10);
2483 /* Finally we give up and parse it as double */
2484 *frame_rate_base = DEFAULT_FRAME_RATE_BASE; //FIXME use av_d2q()
2485 *frame_rate = (int)(strtod(arg, 0) * (*frame_rate_base) + 0.5);
2487 if (!*frame_rate || !*frame_rate_base)
2494 * - If not a duration:
2495 * [{YYYY-MM-DD|YYYYMMDD}]{T| }{HH[:MM[:SS[.m...]]][Z]|HH[MM[SS[.m...]]][Z]}
2496 * Time is localtime unless Z is suffixed to the end. In this case GMT
2497 * Return the date in micro seconds since 1970
2499 * HH[:MM[:SS[.m...]]]
2502 int64_t parse_date(const char *datestr, int duration)
2508 static const char *date_fmt[] = {
2512 static const char *time_fmt[] = {
2522 time_t now = time(0);
2524 len = strlen(datestr);
2526 lastch = datestr[len - 1];
2529 is_utc = (lastch == 'z' || lastch == 'Z');
2531 memset(&dt, 0, sizeof(dt));
2536 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2537 q = small_strptime(p, date_fmt[i], &dt);
2547 dt = *localtime(&now);
2549 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2554 if (*p == 'T' || *p == 't' || *p == ' ')
2557 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2558 q = small_strptime(p, time_fmt[i], &dt);
2568 q = small_strptime(p, time_fmt[0], &dt);
2570 dt.tm_sec = strtol(p, (char **)&q, 10);
2576 /* Now we have all the fields that we can get */
2581 return now * int64_t_C(1000000);
2585 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2587 dt.tm_isdst = -1; /* unknown */
2600 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2603 val += n * (*q - '0');
2607 return negative ? -t : t;
2610 /* syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. Return
2612 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2622 while (*p != '\0' && *p != '=' && *p != '&') {
2623 if ((q - tag) < sizeof(tag) - 1)
2631 while (*p != '&' && *p != '\0') {
2632 if ((q - arg) < arg_size - 1) {
2642 if (!strcmp(tag, tag1))
2651 /* Return in 'buf' the path with '%d' replaced by number. Also handles
2652 the '%0nd' format where 'n' is the total number of digits and
2653 '%%'. Return 0 if OK, and -1 if format error */
2654 int get_frame_filename(char *buf, int buf_size,
2655 const char *path, int number)
2658 char *q, buf1[20], c;
2659 int nd, len, percentd_found;
2671 while (isdigit(*p)) {
2672 nd = nd * 10 + *p++ - '0';
2675 } while (isdigit(c));
2684 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2686 if ((q - buf + len) > buf_size - 1)
2688 memcpy(q, buf1, len);
2696 if ((q - buf) < buf_size - 1)
2700 if (!percentd_found)
2710 * Print nice hexa dump of a buffer
2711 * @param f stream for output
2713 * @param size buffer size
2715 void av_hex_dump(FILE *f, uint8_t *buf, int size)
2719 for(i=0;i<size;i+=16) {
2723 fprintf(f, "%08x ", i);
2726 fprintf(f, " %02x", buf[i+j]);
2731 for(j=0;j<len;j++) {
2733 if (c < ' ' || c > '~')
2735 fprintf(f, "%c", c);
2742 * Print on 'f' a nice dump of a packet
2743 * @param f stream for output
2744 * @param pkt packet to dump
2745 * @param dump_payload true if the payload must be displayed too
2747 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
2749 fprintf(f, "stream #%d:\n", pkt->stream_index);
2750 fprintf(f, " keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
2751 fprintf(f, " duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
2752 /* DTS is _always_ valid after av_read_frame() */
2753 fprintf(f, " dts=");
2754 if (pkt->dts == AV_NOPTS_VALUE)
2757 fprintf(f, "%0.3f", (double)pkt->dts / AV_TIME_BASE);
2758 /* PTS may be not known if B frames are present */
2759 fprintf(f, " pts=");
2760 if (pkt->pts == AV_NOPTS_VALUE)
2763 fprintf(f, "%0.3f", (double)pkt->pts / AV_TIME_BASE);
2765 fprintf(f, " size=%d\n", pkt->size);
2767 av_hex_dump(f, pkt->data, pkt->size);
2770 void url_split(char *proto, int proto_size,
2771 char *authorization, int authorization_size,
2772 char *hostname, int hostname_size,
2774 char *path, int path_size,
2785 while (*p != ':' && *p != '\0') {
2786 if ((q - proto) < proto_size - 1)
2792 if (authorization_size > 0)
2793 authorization[0] = '\0';
2797 if (hostname_size > 0)
2801 char *at,*slash; // PETR: position of '@' character and '/' character
2808 at = strchr(p,'@'); // PETR: get the position of '@'
2809 slash = strchr(p,'/'); // PETR: get position of '/' - end of hostname
2810 if (at && slash && at > slash) at = NULL; // PETR: not interested in '@' behind '/'
2812 q = at ? authorization : hostname; // PETR: if '@' exists starting with auth.
2814 while ((at || *p != ':') && *p != '/' && *p != '?' && *p != '\0') { // PETR:
2815 if (*p == '@') { // PETR: passed '@'
2816 if (authorization_size > 0)
2820 } else if (!at) { // PETR: hostname
2821 if ((q - hostname) < hostname_size - 1)
2824 if ((q - authorization) < authorization_size - 1)
2829 if (hostname_size > 0)
2833 port = strtoul(p, (char **)&p, 10);
2838 pstrcpy(path, path_size, p);
2842 * Set the pts for a given stream
2844 * @param pts_wrap_bits number of bits effectively used by the pts
2845 * (used for wrap control, 33 is the value for MPEG)
2846 * @param pts_num numerator to convert to seconds (MPEG: 1)
2847 * @param pts_den denominator to convert to seconds (MPEG: 90000)
2849 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
2850 int pts_num, int pts_den)
2852 s->pts_wrap_bits = pts_wrap_bits;
2853 s->time_base.num = pts_num;
2854 s->time_base.den = pts_den;
2857 /* fraction handling */
2860 * f = val + (num / den) + 0.5. 'num' is normalized so that it is such
2861 * as 0 <= num < den.
2863 * @param f fractional number
2864 * @param val integer value
2865 * @param num must be >= 0
2866 * @param den must be >= 1
2868 void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
2880 /* set f to (val + 0.5) */
2881 void av_frac_set(AVFrac *f, int64_t val)
2884 f->num = f->den >> 1;
2888 * Fractionnal addition to f: f = f + (incr / f->den)
2890 * @param f fractional number
2891 * @param incr increment, can be positive or negative
2893 void av_frac_add(AVFrac *f, int64_t incr)
2897 num = f->num + incr;
2900 f->val += num / den;
2906 } else if (num >= den) {
2907 f->val += num / den;
2914 * register a new image format
2915 * @param img_fmt Image format descriptor
2917 void av_register_image_format(AVImageFormat *img_fmt)
2921 p = &first_image_format;
2922 while (*p != NULL) p = &(*p)->next;
2924 img_fmt->next = NULL;
2927 /* guess image format */
2928 AVImageFormat *av_probe_image_format(AVProbeData *pd)
2930 AVImageFormat *fmt1, *fmt;
2931 int score, score_max;
2935 for(fmt1 = first_image_format; fmt1 != NULL; fmt1 = fmt1->next) {
2936 if (fmt1->img_probe) {
2937 score = fmt1->img_probe(pd);
2938 if (score > score_max) {
2947 AVImageFormat *guess_image_format(const char *filename)
2949 AVImageFormat *fmt1;
2951 for(fmt1 = first_image_format; fmt1 != NULL; fmt1 = fmt1->next) {
2952 if (fmt1->extensions && match_ext(filename, fmt1->extensions))
2959 * Read an image from a stream.
2960 * @param gb byte stream containing the image
2961 * @param fmt image format, NULL if probing is required
2963 int av_read_image(ByteIOContext *pb, const char *filename,
2965 int (*alloc_cb)(void *, AVImageInfo *info), void *opaque)
2967 char buf[PROBE_BUF_SIZE];
2968 AVProbeData probe_data, *pd = &probe_data;
2973 pd->filename = filename;
2975 pos = url_ftell(pb);
2976 pd->buf_size = get_buffer(pb, buf, PROBE_BUF_SIZE);
2977 url_fseek(pb, pos, SEEK_SET);
2978 fmt = av_probe_image_format(pd);
2981 return AVERROR_NOFMT;
2982 ret = fmt->img_read(pb, alloc_cb, opaque);
2987 * Write an image to a stream.
2988 * @param pb byte stream for the image output
2989 * @param fmt image format
2990 * @param img image data and informations
2992 int av_write_image(ByteIOContext *pb, AVImageFormat *fmt, AVImageInfo *img)
2994 return fmt->img_write(pb, img);