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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 #include "allformats.h"
26 * @file libavformat/utils.c
27 * Various utility functions for using ffmpeg library.
30 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den);
31 static void av_frac_add(AVFrac *f, int64_t incr);
32 static void av_frac_set(AVFrac *f, int64_t val);
34 /** head of registered input format linked list. */
35 AVInputFormat *first_iformat = NULL;
36 /** head of registered output format linked list. */
37 AVOutputFormat *first_oformat = NULL;
38 /** head of registered image format linked list. */
39 AVImageFormat *first_image_format = NULL;
41 void av_register_input_format(AVInputFormat *format)
45 while (*p != NULL) p = &(*p)->next;
50 void av_register_output_format(AVOutputFormat *format)
54 while (*p != NULL) p = &(*p)->next;
59 int match_ext(const char *filename, const char *extensions)
67 ext = strrchr(filename, '.');
73 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
76 if (!strcasecmp(ext1, ext))
86 AVOutputFormat *guess_format(const char *short_name, const char *filename,
87 const char *mime_type)
89 AVOutputFormat *fmt, *fmt_found;
92 /* specific test for image sequences */
93 if (!short_name && filename &&
94 filename_number_test(filename) >= 0 &&
95 av_guess_image2_codec(filename) != CODEC_ID_NONE) {
96 return guess_format("image2", NULL, NULL);
98 if (!short_name && filename &&
99 filename_number_test(filename) >= 0 &&
100 guess_image_format(filename)) {
101 return guess_format("image", NULL, NULL);
104 /* find the proper file type */
108 while (fmt != NULL) {
110 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
112 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
114 if (filename && fmt->extensions &&
115 match_ext(filename, fmt->extensions)) {
118 if (score > score_max) {
127 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
128 const char *mime_type)
130 AVOutputFormat *fmt = guess_format(short_name, filename, mime_type);
133 AVOutputFormat *stream_fmt;
134 char stream_format_name[64];
136 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
137 stream_fmt = guess_format(stream_format_name, NULL, NULL);
147 * Guesses the codec id based upon muxer and filename.
149 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
150 const char *filename, const char *mime_type, enum CodecType type){
151 if(type == CODEC_TYPE_VIDEO){
152 enum CodecID codec_id= CODEC_ID_NONE;
154 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
155 codec_id= av_guess_image2_codec(filename);
157 if(codec_id == CODEC_ID_NONE)
158 codec_id= fmt->video_codec;
160 }else if(type == CODEC_TYPE_AUDIO)
161 return fmt->audio_codec;
163 return CODEC_ID_NONE;
167 * finds AVInputFormat based on input format's short name.
169 AVInputFormat *av_find_input_format(const char *short_name)
172 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) {
173 if (!strcmp(fmt->name, short_name))
179 /* memory handling */
182 * Default packet destructor.
184 void av_destruct_packet(AVPacket *pkt)
187 pkt->data = NULL; pkt->size = 0;
191 * Allocate the payload of a packet and intialized its fields to default values.
194 * @param size wanted payload size
195 * @return 0 if OK. AVERROR_xxx otherwise.
197 int av_new_packet(AVPacket *pkt, int size)
200 if((unsigned)size > (unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE)
201 return AVERROR_NOMEM;
202 data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
204 return AVERROR_NOMEM;
205 memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
210 pkt->destruct = av_destruct_packet;
215 * Allocate and read the payload of a packet and intialized its fields to default values.
218 * @param size wanted payload size
219 * @return >0 (read size) if OK. AVERROR_xxx otherwise.
221 int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size)
223 int ret= av_new_packet(pkt, size);
228 pkt->pos= url_ftell(s);
230 ret= get_buffer(s, pkt->data, size);
239 /* This is a hack - the packet memory allocation stuff is broken. The
240 packet is allocated if it was not really allocated */
241 int av_dup_packet(AVPacket *pkt)
243 if (pkt->destruct != av_destruct_packet) {
245 /* we duplicate the packet and don't forget to put the padding
247 if((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE)
248 return AVERROR_NOMEM;
249 data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
251 return AVERROR_NOMEM;
253 memcpy(data, pkt->data, pkt->size);
254 memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
256 pkt->destruct = av_destruct_packet;
263 int fifo_init(FifoBuffer *f, int size)
265 f->buffer = av_malloc(size);
268 f->end = f->buffer + size;
269 f->wptr = f->rptr = f->buffer;
273 void fifo_free(FifoBuffer *f)
278 int fifo_size(FifoBuffer *f, uint8_t *rptr)
285 if (f->wptr >= rptr) {
286 size = f->wptr - rptr;
288 size = (f->end - rptr) + (f->wptr - f->buffer);
294 * Get data from the fifo (returns -1 if not enough data).
296 int fifo_read(FifoBuffer *f, uint8_t *buf, int buf_size, uint8_t **rptr_ptr)
305 if (f->wptr >= rptr) {
306 size = f->wptr - rptr;
308 size = (f->end - rptr) + (f->wptr - f->buffer);
313 while (buf_size > 0) {
317 memcpy(buf, rptr, len);
331 void fifo_realloc(FifoBuffer *f, unsigned int new_size){
332 unsigned int old_size= f->end - f->buffer;
334 if(old_size < new_size){
335 uint8_t *old= f->buffer;
337 f->buffer= av_realloc(f->buffer, new_size);
339 f->rptr += f->buffer - old;
340 f->wptr += f->buffer - old;
342 if(f->wptr < f->rptr){
343 memmove(f->rptr + new_size - old_size, f->rptr, f->buffer + old_size - f->rptr);
344 f->rptr += new_size - old_size;
346 f->end= f->buffer + new_size;
350 void fifo_write(FifoBuffer *f, const uint8_t *buf, int size, uint8_t **wptr_ptr)
363 memcpy(wptr, buf, len);
373 /* get data from the fifo (return -1 if not enough data) */
374 int put_fifo(ByteIOContext *pb, FifoBuffer *f, int buf_size, uint8_t **rptr_ptr)
376 uint8_t *rptr = *rptr_ptr;
379 if (f->wptr >= rptr) {
380 size = f->wptr - rptr;
382 size = (f->end - rptr) + (f->wptr - f->buffer);
387 while (buf_size > 0) {
391 put_buffer(pb, rptr, len);
401 int filename_number_test(const char *filename)
406 return get_frame_filename(buf, sizeof(buf), filename, 1);
412 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened)
414 AVInputFormat *fmt1, *fmt;
415 int score, score_max;
419 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
420 if (!is_opened && !(fmt1->flags & AVFMT_NOFILE))
423 if (fmt1->read_probe) {
424 score = fmt1->read_probe(pd);
425 } else if (fmt1->extensions) {
426 if (match_ext(pd->filename, fmt1->extensions)) {
430 if (score > score_max) {
438 /************************************************************/
439 /* input media file */
442 * Open a media file from an IO stream. 'fmt' must be specified.
444 static const char* format_to_name(void* ptr)
446 AVFormatContext* fc = (AVFormatContext*) ptr;
447 if(fc->iformat) return fc->iformat->name;
448 else if(fc->oformat) return fc->oformat->name;
452 static const AVClass av_format_context_class = { "AVFormatContext", format_to_name };
454 AVFormatContext *av_alloc_format_context(void)
457 ic = av_mallocz(sizeof(AVFormatContext));
459 ic->av_class = &av_format_context_class;
464 * Allocates all the structures needed to read an input stream.
465 * This does not open the needed codecs for decoding the stream[s].
467 int av_open_input_stream(AVFormatContext **ic_ptr,
468 ByteIOContext *pb, const char *filename,
469 AVInputFormat *fmt, AVFormatParameters *ap)
473 AVFormatParameters default_ap;
477 memset(ap, 0, sizeof(default_ap));
480 ic = av_alloc_format_context();
488 ic->duration = AV_NOPTS_VALUE;
489 ic->start_time = AV_NOPTS_VALUE;
490 pstrcpy(ic->filename, sizeof(ic->filename), filename);
492 /* allocate private data */
493 if (fmt->priv_data_size > 0) {
494 ic->priv_data = av_mallocz(fmt->priv_data_size);
495 if (!ic->priv_data) {
500 ic->priv_data = NULL;
503 err = ic->iformat->read_header(ic, ap);
508 ic->data_offset = url_ftell(&ic->pb);
514 av_freep(&ic->priv_data);
521 /** Size of probe buffer, for guessing file type from file contents. */
522 #define PROBE_BUF_MIN 2048
523 #define PROBE_BUF_MAX (1<<20)
526 * Open a media file as input. The codec are not opened. Only the file
527 * header (if present) is read.
529 * @param ic_ptr the opened media file handle is put here
530 * @param filename filename to open.
531 * @param fmt if non NULL, force the file format to use
532 * @param buf_size optional buffer size (zero if default is OK)
533 * @param ap additionnal parameters needed when opening the file (NULL if default)
534 * @return 0 if OK. AVERROR_xxx otherwise.
536 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
539 AVFormatParameters *ap)
541 int err, must_open_file, file_opened, probe_size;
542 AVProbeData probe_data, *pd = &probe_data;
543 ByteIOContext pb1, *pb = &pb1;
548 pd->filename = filename;
553 /* guess format if no file can be opened */
554 fmt = av_probe_input_format(pd, 0);
557 /* do not open file if the format does not need it. XXX: specific
558 hack needed to handle RTSP/TCP */
560 if (fmt && (fmt->flags & AVFMT_NOFILE)) {
562 pb= NULL; //FIXME this or memset(pb, 0, sizeof(ByteIOContext)); otherwise its uninitalized
565 if (!fmt || must_open_file) {
566 /* if no file needed do not try to open one */
567 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
573 url_setbufsize(pb, buf_size);
576 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
577 /* read probe data */
578 pd->buf= av_realloc(pd->buf, probe_size);
579 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
580 if (url_fseek(pb, 0, SEEK_SET) == (offset_t)-EPIPE) {
582 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
588 /* guess file format */
589 fmt = av_probe_input_format(pd, 1);
594 /* if still no format found, error */
600 /* XXX: suppress this hack for redirectors */
601 #ifdef CONFIG_NETWORK
602 if (fmt == &redir_demux) {
603 err = redir_open(ic_ptr, pb);
609 /* check filename in case of an image number is expected */
610 if (fmt->flags & AVFMT_NEEDNUMBER) {
611 if (filename_number_test(filename) < 0) {
612 err = AVERROR_NUMEXPECTED;
616 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
629 /*******************************************************/
632 * Read a transport packet from a media file.
634 * This function is absolete and should never be used.
635 * Use av_read_frame() instead.
637 * @param s media file handle
638 * @param pkt is filled
639 * @return 0 if OK. AVERROR_xxx if error.
641 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
643 return s->iformat->read_packet(s, pkt);
646 /**********************************************************/
649 * Get the number of samples of an audio frame. Return (-1) if error.
651 static int get_audio_frame_size(AVCodecContext *enc, int size)
655 if (enc->frame_size <= 1) {
656 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
658 if (bits_per_sample) {
659 if (enc->channels == 0)
661 frame_size = (size << 3) / (bits_per_sample * 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;
669 frame_size = enc->frame_size;
676 * Return the frame duration in seconds, return 0 if not available.
678 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
679 AVCodecParserContext *pc, AVPacket *pkt)
685 switch(st->codec->codec_type) {
686 case CODEC_TYPE_VIDEO:
687 if(st->time_base.num*1000LL > st->time_base.den){
688 *pnum = st->time_base.num;
689 *pden = st->time_base.den;
690 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
691 *pnum = st->codec->time_base.num;
692 *pden = st->codec->time_base.den;
693 if (pc && pc->repeat_pict) {
695 *pnum = (*pnum) * (2 + pc->repeat_pict);
699 case CODEC_TYPE_AUDIO:
700 frame_size = get_audio_frame_size(st->codec, pkt->size);
704 *pden = st->codec->sample_rate;
711 static int is_intra_only(AVCodecContext *enc){
712 if(enc->codec_type == CODEC_TYPE_AUDIO){
714 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
715 switch(enc->codec_id){
717 case CODEC_ID_MJPEGB:
719 case CODEC_ID_RAWVIDEO:
720 case CODEC_ID_DVVIDEO:
721 case CODEC_ID_HUFFYUV:
722 case CODEC_ID_FFVHUFF:
733 static int64_t lsb2full(int64_t lsb, int64_t last_ts, int lsb_bits){
734 int64_t mask = lsb_bits < 64 ? (1LL<<lsb_bits)-1 : -1LL;
735 int64_t delta= last_ts - mask/2;
736 return ((lsb - delta)&mask) + delta;
739 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
740 AVCodecParserContext *pc, AVPacket *pkt)
742 int num, den, presentation_delayed;
743 /* handle wrapping */
744 if(st->cur_dts != AV_NOPTS_VALUE){
745 if(pkt->pts != AV_NOPTS_VALUE)
746 pkt->pts= lsb2full(pkt->pts, st->cur_dts, st->pts_wrap_bits);
747 if(pkt->dts != AV_NOPTS_VALUE)
748 pkt->dts= lsb2full(pkt->dts, st->cur_dts, st->pts_wrap_bits);
751 if (pkt->duration == 0) {
752 compute_frame_duration(&num, &den, st, pc, pkt);
754 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
758 if(is_intra_only(st->codec))
759 pkt->flags |= PKT_FLAG_KEY;
761 /* do we have a video B frame ? */
762 presentation_delayed = 0;
763 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
764 /* XXX: need has_b_frame, but cannot get it if the codec is
766 if (( st->codec->codec_id == CODEC_ID_H264
767 || st->codec->has_b_frames) &&
768 pc && pc->pict_type != FF_B_TYPE)
769 presentation_delayed = 1;
770 /* this may be redundant, but it shouldnt hurt */
771 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
772 presentation_delayed = 1;
775 if(st->cur_dts == AV_NOPTS_VALUE){
776 if(presentation_delayed) st->cur_dts = -pkt->duration;
777 else st->cur_dts = 0;
780 // 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);
781 /* interpolate PTS and DTS if they are not present */
782 if (presentation_delayed) {
783 /* DTS = decompression time stamp */
784 /* PTS = presentation time stamp */
785 if (pkt->dts == AV_NOPTS_VALUE) {
786 /* if we know the last pts, use it */
787 if(st->last_IP_pts != AV_NOPTS_VALUE)
788 st->cur_dts = pkt->dts = st->last_IP_pts;
790 pkt->dts = st->cur_dts;
792 st->cur_dts = pkt->dts;
794 /* this is tricky: the dts must be incremented by the duration
795 of the frame we are displaying, i.e. the last I or P frame */
796 if (st->last_IP_duration == 0)
797 st->cur_dts += pkt->duration;
799 st->cur_dts += st->last_IP_duration;
800 st->last_IP_duration = pkt->duration;
801 st->last_IP_pts= pkt->pts;
802 /* cannot compute PTS if not present (we can compute it only
803 by knowing the futur */
804 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
805 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
806 int64_t old_diff= ABS(st->cur_dts - pkt->duration - pkt->pts);
807 int64_t new_diff= ABS(st->cur_dts - pkt->pts);
808 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
809 pkt->pts += pkt->duration;
810 // 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);
814 /* presentation is not delayed : PTS and DTS are the same */
815 if (pkt->pts == AV_NOPTS_VALUE) {
816 if (pkt->dts == AV_NOPTS_VALUE) {
817 pkt->pts = st->cur_dts;
818 pkt->dts = st->cur_dts;
821 st->cur_dts = pkt->dts;
825 st->cur_dts = pkt->pts;
828 st->cur_dts += pkt->duration;
830 // 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);
835 /* key frame computation */
836 switch(st->codec->codec_type) {
837 case CODEC_TYPE_VIDEO:
838 if (pc->pict_type == FF_I_TYPE)
839 pkt->flags |= PKT_FLAG_KEY;
841 case CODEC_TYPE_AUDIO:
842 pkt->flags |= PKT_FLAG_KEY;
850 void av_destruct_packet_nofree(AVPacket *pkt)
852 pkt->data = NULL; pkt->size = 0;
855 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
861 /* select current input stream component */
864 if (!st->need_parsing || !st->parser) {
865 /* no parsing needed: we just output the packet as is */
866 /* raw data support */
868 compute_pkt_fields(s, st, NULL, pkt);
871 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
872 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
873 s->cur_ptr, s->cur_len,
874 s->cur_pkt.pts, s->cur_pkt.dts);
875 s->cur_pkt.pts = AV_NOPTS_VALUE;
876 s->cur_pkt.dts = AV_NOPTS_VALUE;
877 /* increment read pointer */
881 /* return packet if any */
885 pkt->stream_index = st->index;
886 pkt->pts = st->parser->pts;
887 pkt->dts = st->parser->dts;
888 pkt->destruct = av_destruct_packet_nofree;
889 compute_pkt_fields(s, st, st->parser, pkt);
894 av_free_packet(&s->cur_pkt);
898 /* read next packet */
899 ret = av_read_packet(s, &s->cur_pkt);
903 /* return the last frames, if any */
904 for(i = 0; i < s->nb_streams; i++) {
906 if (st->parser && st->need_parsing) {
907 av_parser_parse(st->parser, st->codec,
908 &pkt->data, &pkt->size,
910 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
915 /* no more packets: really terminates parsing */
919 st = s->streams[s->cur_pkt.stream_index];
922 s->cur_ptr = s->cur_pkt.data;
923 s->cur_len = s->cur_pkt.size;
924 if (st->need_parsing && !st->parser) {
925 st->parser = av_parser_init(st->codec->codec_id);
927 /* no parser available : just output the raw packets */
928 st->need_parsing = 0;
929 }else if(st->need_parsing == 2){
930 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
938 * Return the next frame of a stream.
940 * The returned packet is valid
941 * until the next av_read_frame() or until av_close_input_file() and
942 * must be freed with av_free_packet. For video, the packet contains
943 * exactly one frame. For audio, it contains an integer number of
944 * frames if each frame has a known fixed size (e.g. PCM or ADPCM
945 * data). If the audio frames have a variable size (e.g. MPEG audio),
946 * then it contains one frame.
948 * pkt->pts, pkt->dts and pkt->duration are always set to correct
949 * values in AV_TIME_BASE unit (and guessed if the format cannot
950 * provided them). pkt->pts can be AV_NOPTS_VALUE if the video format
951 * has B frames, so it is better to rely on pkt->dts if you do not
952 * decompress the payload.
954 * @return 0 if OK, < 0 if error or end of file.
956 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
960 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
963 pktl = s->packet_buffer;
965 AVPacket *next_pkt= &pktl->pkt;
967 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
968 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
969 if( pktl->pkt.stream_index == next_pkt->stream_index
970 && next_pkt->dts < pktl->pkt.dts
971 && pktl->pkt.pts != pktl->pkt.dts //not b frame
972 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
973 next_pkt->pts= pktl->pkt.dts;
977 pktl = s->packet_buffer;
980 if( next_pkt->pts != AV_NOPTS_VALUE
981 || next_pkt->dts == AV_NOPTS_VALUE
983 /* read packet from packet buffer, if there is data */
985 s->packet_buffer = pktl->next;
991 AVPacketList **plast_pktl= &s->packet_buffer;
992 int ret= av_read_frame_internal(s, pkt);
994 if(pktl && ret != -EAGAIN){
1001 /* duplicate the packet */
1002 if (av_dup_packet(pkt) < 0)
1003 return AVERROR_NOMEM;
1005 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
1007 pktl = av_mallocz(sizeof(AVPacketList));
1009 return AVERROR_NOMEM;
1011 /* add the packet in the buffered packet list */
1015 assert(!s->packet_buffer);
1016 return av_read_frame_internal(s, pkt);
1021 /* XXX: suppress the packet queue */
1022 static void flush_packet_queue(AVFormatContext *s)
1027 pktl = s->packet_buffer;
1030 s->packet_buffer = pktl->next;
1031 av_free_packet(&pktl->pkt);
1036 /*******************************************************/
1039 int av_find_default_stream_index(AVFormatContext *s)
1044 if (s->nb_streams <= 0)
1046 for(i = 0; i < s->nb_streams; i++) {
1048 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1056 * Flush the frame reader.
1058 static void av_read_frame_flush(AVFormatContext *s)
1063 flush_packet_queue(s);
1065 /* free previous packet */
1067 if (s->cur_st->parser)
1068 av_free_packet(&s->cur_pkt);
1075 /* for each stream, reset read state */
1076 for(i = 0; i < s->nb_streams; i++) {
1080 av_parser_close(st->parser);
1083 st->last_IP_pts = AV_NOPTS_VALUE;
1084 st->cur_dts = 0; /* we set the current DTS to an unspecified origin */
1089 * Updates cur_dts of all streams based on given timestamp and AVStream.
1091 * Stream ref_st unchanged, others set cur_dts in their native timebase
1092 * only needed for timestamp wrapping or if (dts not set and pts!=dts)
1093 * @param timestamp new dts expressed in time_base of param ref_st
1094 * @param ref_st reference stream giving time_base of param timestamp
1096 static void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1099 for(i = 0; i < s->nb_streams; i++) {
1100 AVStream *st = s->streams[i];
1102 st->cur_dts = av_rescale(timestamp,
1103 st->time_base.den * (int64_t)ref_st->time_base.num,
1104 st->time_base.num * (int64_t)ref_st->time_base.den);
1109 * Add a index entry into a sorted list updateing if it is already there.
1111 * @param timestamp timestamp in the timebase of the given stream
1113 int av_add_index_entry(AVStream *st,
1114 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1116 AVIndexEntry *entries, *ie;
1119 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1122 entries = av_fast_realloc(st->index_entries,
1123 &st->index_entries_allocated_size,
1124 (st->nb_index_entries + 1) *
1125 sizeof(AVIndexEntry));
1129 st->index_entries= entries;
1131 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1134 index= st->nb_index_entries++;
1135 ie= &entries[index];
1136 assert(index==0 || ie[-1].timestamp < timestamp);
1138 ie= &entries[index];
1139 if(ie->timestamp != timestamp){
1140 if(ie->timestamp <= timestamp)
1142 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1143 st->nb_index_entries++;
1144 }else if(ie->pos == pos && distance < ie->min_distance) //dont reduce the distance
1145 distance= ie->min_distance;
1149 ie->timestamp = timestamp;
1150 ie->min_distance= distance;
1158 * build an index for raw streams using a parser.
1160 static void av_build_index_raw(AVFormatContext *s)
1162 AVPacket pkt1, *pkt = &pkt1;
1167 av_read_frame_flush(s);
1168 url_fseek(&s->pb, s->data_offset, SEEK_SET);
1171 ret = av_read_frame(s, pkt);
1174 if (pkt->stream_index == 0 && st->parser &&
1175 (pkt->flags & PKT_FLAG_KEY)) {
1176 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
1177 0, 0, AVINDEX_KEYFRAME);
1179 av_free_packet(pkt);
1184 * Returns TRUE if we deal with a raw stream.
1186 * Raw codec data and parsing needed.
1188 static int is_raw_stream(AVFormatContext *s)
1192 if (s->nb_streams != 1)
1195 if (!st->need_parsing)
1201 * Gets the index for a specific timestamp.
1202 * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond to
1203 * the timestamp which is <= the requested one, if backward is 0
1204 * then it will be >=
1205 * if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise
1206 * @return < 0 if no such timestamp could be found
1208 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1211 AVIndexEntry *entries= st->index_entries;
1212 int nb_entries= st->nb_index_entries;
1221 timestamp = entries[m].timestamp;
1222 if(timestamp >= wanted_timestamp)
1224 if(timestamp <= wanted_timestamp)
1227 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1229 if(!(flags & AVSEEK_FLAG_ANY)){
1230 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1231 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1243 * Does a binary search using av_index_search_timestamp() and AVCodec.read_timestamp().
1244 * this isnt supposed to be called directly by a user application, but by demuxers
1245 * @param target_ts target timestamp in the time base of the given stream
1246 * @param stream_index stream number
1248 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1249 AVInputFormat *avif= s->iformat;
1250 int64_t pos_min, pos_max, pos, pos_limit;
1251 int64_t ts_min, ts_max, ts;
1252 int64_t start_pos, filesize;
1253 int index, no_change;
1256 if (stream_index < 0)
1260 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1264 ts_min= AV_NOPTS_VALUE;
1265 pos_limit= -1; //gcc falsely says it may be uninitalized
1267 st= s->streams[stream_index];
1268 if(st->index_entries){
1271 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()
1272 index= FFMAX(index, 0);
1273 e= &st->index_entries[index];
1275 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1277 ts_min= e->timestamp;
1279 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1286 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1287 assert(index < st->nb_index_entries);
1289 e= &st->index_entries[index];
1290 assert(e->timestamp >= target_ts);
1292 ts_max= e->timestamp;
1293 pos_limit= pos_max - e->min_distance;
1295 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1296 pos_max,pos_limit, ts_max);
1301 if(ts_min == AV_NOPTS_VALUE){
1302 pos_min = s->data_offset;
1303 ts_min = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1304 if (ts_min == AV_NOPTS_VALUE)
1308 if(ts_max == AV_NOPTS_VALUE){
1310 filesize = url_fsize(&s->pb);
1311 pos_max = filesize - 1;
1314 ts_max = avif->read_timestamp(s, stream_index, &pos_max, pos_max + step);
1316 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1317 if (ts_max == AV_NOPTS_VALUE)
1321 int64_t tmp_pos= pos_max + 1;
1322 int64_t tmp_ts= avif->read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1323 if(tmp_ts == AV_NOPTS_VALUE)
1327 if(tmp_pos >= filesize)
1333 if(ts_min > ts_max){
1335 }else if(ts_min == ts_max){
1340 while (pos_min < pos_limit) {
1342 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1346 assert(pos_limit <= pos_max);
1349 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1350 // interpolate position (better than dichotomy)
1351 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1352 + pos_min - approximate_keyframe_distance;
1353 }else if(no_change==1){
1354 // bisection, if interpolation failed to change min or max pos last time
1355 pos = (pos_min + pos_limit)>>1;
1357 // linear search if bisection failed, can only happen if there are very few or no keframes between min/max
1362 else if(pos > pos_limit)
1366 ts = avif->read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1372 av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n", pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit, start_pos, no_change);
1374 assert(ts != AV_NOPTS_VALUE);
1375 if (target_ts <= ts) {
1376 pos_limit = start_pos - 1;
1380 if (target_ts >= ts) {
1386 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1387 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1390 ts_min = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1392 ts_max = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1393 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1394 pos, ts_min, target_ts, ts_max);
1397 url_fseek(&s->pb, pos, SEEK_SET);
1399 av_update_cur_dts(s, st, ts);
1404 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1405 int64_t pos_min, pos_max;
1409 if (stream_index < 0)
1412 st= s->streams[stream_index];
1415 pos_min = s->data_offset;
1416 pos_max = url_fsize(&s->pb) - 1;
1418 if (pos < pos_min) pos= pos_min;
1419 else if(pos > pos_max) pos= pos_max;
1421 url_fseek(&s->pb, pos, SEEK_SET);
1424 av_update_cur_dts(s, st, ts);
1429 static int av_seek_frame_generic(AVFormatContext *s,
1430 int stream_index, int64_t timestamp, int flags)
1436 if (!s->index_built) {
1437 if (is_raw_stream(s)) {
1438 av_build_index_raw(s);
1445 st = s->streams[stream_index];
1446 index = av_index_search_timestamp(st, timestamp, flags);
1450 /* now we have found the index, we can seek */
1451 ie = &st->index_entries[index];
1452 av_read_frame_flush(s);
1453 url_fseek(&s->pb, ie->pos, SEEK_SET);
1455 av_update_cur_dts(s, st, ie->timestamp);
1461 * Seek to the key frame at timestamp.
1462 * 'timestamp' in 'stream_index'.
1463 * @param stream_index If stream_index is (-1), a default
1464 * stream is selected, and timestamp is automatically converted
1465 * from AV_TIME_BASE units to the stream specific time_base.
1466 * @param timestamp timestamp in AVStream.time_base units
1467 * or if there is no stream specified then in AV_TIME_BASE units
1468 * @param flags flags which select direction and seeking mode
1469 * @return >= 0 on success
1471 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1476 av_read_frame_flush(s);
1478 if(flags & AVSEEK_FLAG_BYTE)
1479 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1481 if(stream_index < 0){
1482 stream_index= av_find_default_stream_index(s);
1483 if(stream_index < 0)
1486 st= s->streams[stream_index];
1487 /* timestamp for default must be expressed in AV_TIME_BASE units */
1488 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1490 st= s->streams[stream_index];
1492 /* first, we try the format specific seek */
1493 if (s->iformat->read_seek)
1494 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1501 if(s->iformat->read_timestamp)
1502 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1504 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1507 /*******************************************************/
1510 * Returns TRUE if the stream has accurate timings in any stream.
1512 * @return TRUE if the stream has accurate timings for at least one component.
1514 static int av_has_timings(AVFormatContext *ic)
1519 for(i = 0;i < ic->nb_streams; i++) {
1520 st = ic->streams[i];
1521 if (st->start_time != AV_NOPTS_VALUE &&
1522 st->duration != AV_NOPTS_VALUE)
1529 * Estimate the stream timings from the one of each components.
1531 * Also computes the global bitrate if possible.
1533 static void av_update_stream_timings(AVFormatContext *ic)
1535 int64_t start_time, start_time1, end_time, end_time1;
1539 start_time = MAXINT64;
1540 end_time = MININT64;
1541 for(i = 0;i < ic->nb_streams; i++) {
1542 st = ic->streams[i];
1543 if (st->start_time != AV_NOPTS_VALUE) {
1544 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1545 if (start_time1 < start_time)
1546 start_time = start_time1;
1547 if (st->duration != AV_NOPTS_VALUE) {
1548 end_time1 = start_time1
1549 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1550 if (end_time1 > end_time)
1551 end_time = end_time1;
1555 if (start_time != MAXINT64) {
1556 ic->start_time = start_time;
1557 if (end_time != MININT64) {
1558 ic->duration = end_time - start_time;
1559 if (ic->file_size > 0) {
1560 /* compute the bit rate */
1561 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1562 (double)ic->duration;
1569 static void fill_all_stream_timings(AVFormatContext *ic)
1574 av_update_stream_timings(ic);
1575 for(i = 0;i < ic->nb_streams; i++) {
1576 st = ic->streams[i];
1577 if (st->start_time == AV_NOPTS_VALUE) {
1578 if(ic->start_time != AV_NOPTS_VALUE)
1579 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1580 if(ic->duration != AV_NOPTS_VALUE)
1581 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1586 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1588 int64_t filesize, duration;
1592 /* if bit_rate is already set, we believe it */
1593 if (ic->bit_rate == 0) {
1595 for(i=0;i<ic->nb_streams;i++) {
1596 st = ic->streams[i];
1597 bit_rate += st->codec->bit_rate;
1599 ic->bit_rate = bit_rate;
1602 /* if duration is already set, we believe it */
1603 if (ic->duration == AV_NOPTS_VALUE &&
1604 ic->bit_rate != 0 &&
1605 ic->file_size != 0) {
1606 filesize = ic->file_size;
1608 for(i = 0; i < ic->nb_streams; i++) {
1609 st = ic->streams[i];
1610 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1611 if (st->start_time == AV_NOPTS_VALUE ||
1612 st->duration == AV_NOPTS_VALUE) {
1614 st->duration = duration;
1621 #define DURATION_MAX_READ_SIZE 250000
1623 /* only usable for MPEG-PS streams */
1624 static void av_estimate_timings_from_pts(AVFormatContext *ic)
1626 AVPacket pkt1, *pkt = &pkt1;
1628 int read_size, i, ret;
1630 int64_t filesize, offset, duration;
1632 /* free previous packet */
1633 if (ic->cur_st && ic->cur_st->parser)
1634 av_free_packet(&ic->cur_pkt);
1637 /* flush packet queue */
1638 flush_packet_queue(ic);
1640 for(i=0;i<ic->nb_streams;i++) {
1641 st = ic->streams[i];
1643 av_parser_close(st->parser);
1648 /* we read the first packets to get the first PTS (not fully
1649 accurate, but it is enough now) */
1650 url_fseek(&ic->pb, 0, SEEK_SET);
1653 if (read_size >= DURATION_MAX_READ_SIZE)
1655 /* if all info is available, we can stop */
1656 for(i = 0;i < ic->nb_streams; i++) {
1657 st = ic->streams[i];
1658 if (st->start_time == AV_NOPTS_VALUE)
1661 if (i == ic->nb_streams)
1664 ret = av_read_packet(ic, pkt);
1667 read_size += pkt->size;
1668 st = ic->streams[pkt->stream_index];
1669 if (pkt->pts != AV_NOPTS_VALUE) {
1670 if (st->start_time == AV_NOPTS_VALUE)
1671 st->start_time = pkt->pts;
1673 av_free_packet(pkt);
1676 /* estimate the end time (duration) */
1677 /* XXX: may need to support wrapping */
1678 filesize = ic->file_size;
1679 offset = filesize - DURATION_MAX_READ_SIZE;
1683 url_fseek(&ic->pb, offset, SEEK_SET);
1686 if (read_size >= DURATION_MAX_READ_SIZE)
1688 /* if all info is available, we can stop */
1689 for(i = 0;i < ic->nb_streams; i++) {
1690 st = ic->streams[i];
1691 if (st->duration == AV_NOPTS_VALUE)
1694 if (i == ic->nb_streams)
1697 ret = av_read_packet(ic, pkt);
1700 read_size += pkt->size;
1701 st = ic->streams[pkt->stream_index];
1702 if (pkt->pts != AV_NOPTS_VALUE) {
1703 end_time = pkt->pts;
1704 duration = end_time - st->start_time;
1706 if (st->duration == AV_NOPTS_VALUE ||
1707 st->duration < duration)
1708 st->duration = duration;
1711 av_free_packet(pkt);
1714 fill_all_stream_timings(ic);
1716 url_fseek(&ic->pb, 0, SEEK_SET);
1719 static void av_estimate_timings(AVFormatContext *ic)
1723 /* get the file size, if possible */
1724 if (ic->iformat->flags & AVFMT_NOFILE) {
1727 file_size = url_fsize(&ic->pb);
1731 ic->file_size = file_size;
1733 if ((ic->iformat == &mpegps_demux || ic->iformat == &mpegts_demux) && file_size && !ic->pb.is_streamed) {
1734 /* get accurate estimate from the PTSes */
1735 av_estimate_timings_from_pts(ic);
1736 } else if (av_has_timings(ic)) {
1737 /* at least one components has timings - we use them for all
1739 fill_all_stream_timings(ic);
1741 /* less precise: use bit rate info */
1742 av_estimate_timings_from_bit_rate(ic);
1744 av_update_stream_timings(ic);
1750 for(i = 0;i < ic->nb_streams; i++) {
1751 st = ic->streams[i];
1752 printf("%d: start_time: %0.3f duration: %0.3f\n",
1753 i, (double)st->start_time / AV_TIME_BASE,
1754 (double)st->duration / AV_TIME_BASE);
1756 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1757 (double)ic->start_time / AV_TIME_BASE,
1758 (double)ic->duration / AV_TIME_BASE,
1759 ic->bit_rate / 1000);
1764 static int has_codec_parameters(AVCodecContext *enc)
1767 switch(enc->codec_type) {
1768 case CODEC_TYPE_AUDIO:
1769 val = enc->sample_rate;
1771 case CODEC_TYPE_VIDEO:
1772 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1781 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1785 int got_picture, ret=0;
1788 if(!st->codec->codec){
1789 codec = avcodec_find_decoder(st->codec->codec_id);
1792 ret = avcodec_open(st->codec, codec);
1797 if(!has_codec_parameters(st->codec)){
1798 switch(st->codec->codec_type) {
1799 case CODEC_TYPE_VIDEO:
1800 ret = avcodec_decode_video(st->codec, &picture,
1801 &got_picture, (uint8_t *)data, size);
1803 case CODEC_TYPE_AUDIO:
1804 samples = av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
1807 ret = avcodec_decode_audio(st->codec, samples,
1808 &got_picture, (uint8_t *)data, size);
1819 /* absolute maximum size we read until we abort */
1820 #define MAX_READ_SIZE 5000000
1822 /* maximum duration until we stop analysing the stream */
1823 #define MAX_STREAM_DURATION ((int)(AV_TIME_BASE * 3.0))
1826 * Read the beginning of a media file to get stream information. This
1827 * is useful for file formats with no headers such as MPEG. This
1828 * function also compute the real frame rate in case of mpeg2 repeat
1831 * @param ic media file handle
1832 * @return >=0 if OK. AVERROR_xxx if error.
1833 * @todo let user decide somehow what information is needed so we dont waste time geting stuff the user doesnt need
1835 int av_find_stream_info(AVFormatContext *ic)
1837 int i, count, ret, read_size, j;
1839 AVPacket pkt1, *pkt;
1840 AVPacketList *pktl=NULL, **ppktl;
1841 int64_t last_dts[MAX_STREAMS];
1842 int64_t duration_sum[MAX_STREAMS];
1843 int duration_count[MAX_STREAMS]={0};
1845 for(i=0;i<ic->nb_streams;i++) {
1846 st = ic->streams[i];
1847 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1848 /* if(!st->time_base.num)
1850 if(!st->codec->time_base.num)
1851 st->codec->time_base= st->time_base;
1853 //only for the split stuff
1855 st->parser = av_parser_init(st->codec->codec_id);
1856 if(st->need_parsing == 2 && st->parser){
1857 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1862 for(i=0;i<MAX_STREAMS;i++){
1863 last_dts[i]= AV_NOPTS_VALUE;
1864 duration_sum[i]= INT64_MAX;
1869 ppktl = &ic->packet_buffer;
1871 /* check if one codec still needs to be handled */
1872 for(i=0;i<ic->nb_streams;i++) {
1873 st = ic->streams[i];
1874 if (!has_codec_parameters(st->codec))
1876 /* variable fps and no guess at the real fps */
1877 if( st->codec->time_base.den >= 101LL*st->codec->time_base.num
1878 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1880 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1883 if (i == ic->nb_streams) {
1884 /* NOTE: if the format has no header, then we need to read
1885 some packets to get most of the streams, so we cannot
1887 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1888 /* if we found the info for all the codecs, we can stop */
1893 /* we did not get all the codec info, but we read too much data */
1894 if (read_size >= MAX_READ_SIZE) {
1900 /* NOTE: a new stream can be added there if no header in file
1901 (AVFMTCTX_NOHEADER) */
1902 ret = av_read_frame_internal(ic, &pkt1);
1905 ret = -1; /* we could not have all the codec parameters before EOF */
1906 for(i=0;i<ic->nb_streams;i++) {
1907 st = ic->streams[i];
1908 if (!has_codec_parameters(st->codec)){
1910 avcodec_string(buf, sizeof(buf), st->codec, 0);
1911 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
1919 pktl = av_mallocz(sizeof(AVPacketList));
1921 ret = AVERROR_NOMEM;
1925 /* add the packet in the buffered packet list */
1927 ppktl = &pktl->next;
1932 /* duplicate the packet */
1933 if (av_dup_packet(pkt) < 0) {
1934 ret = AVERROR_NOMEM;
1938 read_size += pkt->size;
1940 st = ic->streams[pkt->stream_index];
1941 st->codec_info_duration += pkt->duration;
1942 if (pkt->duration != 0)
1943 st->codec_info_nb_frames++;
1946 int index= pkt->stream_index;
1947 int64_t last= last_dts[index];
1948 int64_t duration= pkt->dts - last;
1950 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
1951 if(duration*duration_count[index]*10/9 < duration_sum[index]){
1952 duration_sum[index]= duration;
1953 duration_count[index]=1;
1955 int factor= av_rescale(duration, duration_count[index], duration_sum[index]);
1956 duration_sum[index] += duration;
1957 duration_count[index]+= factor;
1959 if(st->codec_info_nb_frames == 0 && 0)
1960 st->codec_info_duration += duration;
1962 last_dts[pkt->stream_index]= pkt->dts;
1964 if(st->parser && st->parser->parser->split && !st->codec->extradata){
1965 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
1967 st->codec->extradata_size= i;
1968 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
1969 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
1970 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1974 /* if still no information, we try to open the codec and to
1975 decompress the frame. We try to avoid that in most cases as
1976 it takes longer and uses more memory. For MPEG4, we need to
1977 decompress for Quicktime. */
1978 if (!has_codec_parameters(st->codec) /*&&
1979 (st->codec->codec_id == CODEC_ID_FLV1 ||
1980 st->codec->codec_id == CODEC_ID_H264 ||
1981 st->codec->codec_id == CODEC_ID_H263 ||
1982 st->codec->codec_id == CODEC_ID_H261 ||
1983 st->codec->codec_id == CODEC_ID_VORBIS ||
1984 st->codec->codec_id == CODEC_ID_MJPEG ||
1985 st->codec->codec_id == CODEC_ID_PNG ||
1986 st->codec->codec_id == CODEC_ID_PAM ||
1987 st->codec->codec_id == CODEC_ID_PGM ||
1988 st->codec->codec_id == CODEC_ID_PGMYUV ||
1989 st->codec->codec_id == CODEC_ID_PBM ||
1990 st->codec->codec_id == CODEC_ID_PPM ||
1991 st->codec->codec_id == CODEC_ID_SHORTEN ||
1992 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
1993 try_decode_frame(st, pkt->data, pkt->size);
1995 if (av_rescale_q(st->codec_info_duration, st->time_base, AV_TIME_BASE_Q) >= MAX_STREAM_DURATION) {
2001 // close codecs which where opened in try_decode_frame()
2002 for(i=0;i<ic->nb_streams;i++) {
2003 st = ic->streams[i];
2004 if(st->codec->codec)
2005 avcodec_close(st->codec);
2007 for(i=0;i<ic->nb_streams;i++) {
2008 st = ic->streams[i];
2009 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2010 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
2011 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2013 if(duration_count[i] && st->codec->time_base.num*101LL <= st->codec->time_base.den &&
2014 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den){
2015 int64_t num, den, error, best_error;
2017 num= st->time_base.den*duration_count[i];
2018 den= st->time_base.num*duration_sum[i];
2020 best_error= INT64_MAX;
2021 for(j=1; j<60*12; j++){
2022 error= ABS(1001*12*num - 1001*j*den);
2023 if(error < best_error){
2025 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, j, 12, INT_MAX);
2028 for(j=24; j<=30; j+=6){
2029 error= ABS(1001*12*num - 1000*12*j*den);
2030 if(error < best_error){
2032 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, j*1000, 1001, INT_MAX);
2037 /* set real frame rate info */
2038 /* compute the real frame rate for telecine */
2039 if ((st->codec->codec_id == CODEC_ID_MPEG1VIDEO ||
2040 st->codec->codec_id == CODEC_ID_MPEG2VIDEO) &&
2041 st->codec->sub_id == 2) {
2042 if (st->codec_info_nb_frames >= 20) {
2043 float coded_frame_rate, est_frame_rate;
2044 est_frame_rate = ((double)st->codec_info_nb_frames * AV_TIME_BASE) /
2045 (double)st->codec_info_duration ;
2046 coded_frame_rate = 1.0/av_q2d(st->codec->time_base);
2048 printf("telecine: coded_frame_rate=%0.3f est_frame_rate=%0.3f\n",
2049 coded_frame_rate, est_frame_rate);
2051 /* if we detect that it could be a telecine, we
2052 signal it. It would be better to do it at a
2053 higher level as it can change in a film */
2054 if (coded_frame_rate >= 24.97 &&
2055 (est_frame_rate >= 23.5 && est_frame_rate < 24.5)) {
2056 st->r_frame_rate = (AVRational){24000, 1001};
2060 /* if no real frame rate, use the codec one */
2061 if (!st->r_frame_rate.num){
2062 st->r_frame_rate.num = st->codec->time_base.den;
2063 st->r_frame_rate.den = st->codec->time_base.num;
2068 av_estimate_timings(ic);
2070 /* correct DTS for b frame streams with no timestamps */
2071 for(i=0;i<ic->nb_streams;i++) {
2072 st = ic->streams[i];
2073 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2075 ppktl = &ic->packet_buffer;
2077 if(ppkt1->stream_index != i)
2079 if(ppkt1->pkt->dts < 0)
2081 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2083 ppkt1->pkt->dts -= delta;
2088 st->cur_dts -= delta;
2096 /*******************************************************/
2099 * start playing a network based stream (e.g. RTSP stream) at the
2102 int av_read_play(AVFormatContext *s)
2104 if (!s->iformat->read_play)
2105 return AVERROR_NOTSUPP;
2106 return s->iformat->read_play(s);
2110 * Pause a network based stream (e.g. RTSP stream).
2112 * Use av_read_play() to resume it.
2114 int av_read_pause(AVFormatContext *s)
2116 if (!s->iformat->read_pause)
2117 return AVERROR_NOTSUPP;
2118 return s->iformat->read_pause(s);
2122 * Close a media file (but not its codecs).
2124 * @param s media file handle
2126 void av_close_input_file(AVFormatContext *s)
2128 int i, must_open_file;
2131 /* free previous packet */
2132 if (s->cur_st && s->cur_st->parser)
2133 av_free_packet(&s->cur_pkt);
2135 if (s->iformat->read_close)
2136 s->iformat->read_close(s);
2137 for(i=0;i<s->nb_streams;i++) {
2138 /* free all data in a stream component */
2141 av_parser_close(st->parser);
2143 av_free(st->index_entries);
2144 av_free(st->codec->extradata);
2148 flush_packet_queue(s);
2150 if (s->iformat->flags & AVFMT_NOFILE) {
2153 if (must_open_file) {
2156 av_freep(&s->priv_data);
2161 * Add a new stream to a media file.
2163 * Can only be called in the read_header() function. If the flag
2164 * AVFMTCTX_NOHEADER is in the format context, then new streams
2165 * can be added in read_packet too.
2167 * @param s media file handle
2168 * @param id file format dependent stream id
2170 AVStream *av_new_stream(AVFormatContext *s, int id)
2174 if (s->nb_streams >= MAX_STREAMS)
2177 st = av_mallocz(sizeof(AVStream));
2181 st->codec= avcodec_alloc_context();
2183 /* no default bitrate if decoding */
2184 st->codec->bit_rate = 0;
2186 st->index = s->nb_streams;
2188 st->start_time = AV_NOPTS_VALUE;
2189 st->duration = AV_NOPTS_VALUE;
2190 st->cur_dts = AV_NOPTS_VALUE;
2192 /* default pts settings is MPEG like */
2193 av_set_pts_info(st, 33, 1, 90000);
2194 st->last_IP_pts = AV_NOPTS_VALUE;
2196 s->streams[s->nb_streams++] = st;
2200 /************************************************************/
2201 /* output media file */
2203 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2207 if (s->oformat->priv_data_size > 0) {
2208 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2210 return AVERROR_NOMEM;
2212 s->priv_data = NULL;
2214 if (s->oformat->set_parameters) {
2215 ret = s->oformat->set_parameters(s, ap);
2223 * allocate the stream private data and write the stream header to an
2226 * @param s media file handle
2227 * @return 0 if OK. AVERROR_xxx if error.
2229 int av_write_header(AVFormatContext *s)
2234 // some sanity checks
2235 for(i=0;i<s->nb_streams;i++) {
2238 switch (st->codec->codec_type) {
2239 case CODEC_TYPE_AUDIO:
2240 if(st->codec->sample_rate<=0){
2241 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2245 case CODEC_TYPE_VIDEO:
2246 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2247 av_log(s, AV_LOG_ERROR, "time base not set\n");
2250 if(st->codec->width<=0 || st->codec->height<=0){
2251 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2258 if(s->oformat->write_header){
2259 ret = s->oformat->write_header(s);
2264 /* init PTS generation */
2265 for(i=0;i<s->nb_streams;i++) {
2266 int64_t den = AV_NOPTS_VALUE;
2269 switch (st->codec->codec_type) {
2270 case CODEC_TYPE_AUDIO:
2271 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2273 case CODEC_TYPE_VIDEO:
2274 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2279 if (den != AV_NOPTS_VALUE) {
2281 return AVERROR_INVALIDDATA;
2282 av_frac_init(&st->pts, 0, 0, den);
2288 //FIXME merge with compute_pkt_fields
2289 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2290 int b_frames = FFMAX(st->codec->has_b_frames, st->codec->max_b_frames);
2291 int num, den, frame_size;
2293 // 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);
2295 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2298 /* duration field */
2299 if (pkt->duration == 0) {
2300 compute_frame_duration(&num, &den, st, NULL, pkt);
2302 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2306 //XXX/FIXME this is a temporary hack until all encoders output pts
2307 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !b_frames){
2309 // pkt->pts= st->cur_dts;
2310 pkt->pts= st->pts.val;
2313 //calculate dts from pts
2314 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2316 if(st->last_IP_pts == AV_NOPTS_VALUE){
2317 st->last_IP_pts= -pkt->duration;
2319 if(st->last_IP_pts < pkt->pts){
2320 pkt->dts= st->last_IP_pts;
2321 st->last_IP_pts= pkt->pts;
2328 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2329 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2332 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2333 av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n");
2337 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%lld dts2:%lld\n", pkt->pts, pkt->dts);
2338 st->cur_dts= pkt->dts;
2339 st->pts.val= pkt->dts;
2342 switch (st->codec->codec_type) {
2343 case CODEC_TYPE_AUDIO:
2344 frame_size = get_audio_frame_size(st->codec, pkt->size);
2346 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
2347 but it would be better if we had the real timestamps from the encoder */
2348 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2349 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2352 case CODEC_TYPE_VIDEO:
2353 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2361 static void truncate_ts(AVStream *st, AVPacket *pkt){
2362 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2365 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here
2367 pkt->pts &= pts_mask;
2368 pkt->dts &= pts_mask;
2372 * Write a packet to an output media file.
2374 * The packet shall contain one audio or video frame.
2376 * @param s media file handle
2377 * @param pkt the packet, which contains the stream_index, buf/buf_size, dts/pts, ...
2378 * @return < 0 if error, = 0 if OK, 1 if end of stream wanted.
2380 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2384 ret=compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2388 truncate_ts(s->streams[pkt->stream_index], pkt);
2390 ret= s->oformat->write_packet(s, pkt);
2392 ret= url_ferror(&s->pb);
2397 * interleave_packet implementation which will interleave per DTS.
2398 * packets with pkt->destruct == av_destruct_packet will be freed inside this function.
2399 * so they cannot be used after it, note calling av_free_packet() on them is still safe
2401 static int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2402 AVPacketList *pktl, **next_point, *this_pktl;
2404 int streams[MAX_STREAMS];
2407 AVStream *st= s->streams[ pkt->stream_index];
2409 // assert(pkt->destruct != av_destruct_packet); //FIXME
2411 this_pktl = av_mallocz(sizeof(AVPacketList));
2412 this_pktl->pkt= *pkt;
2413 if(pkt->destruct == av_destruct_packet)
2414 pkt->destruct= NULL; // non shared -> must keep original from being freed
2416 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2418 next_point = &s->packet_buffer;
2420 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2421 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2422 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2423 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2425 next_point= &(*next_point)->next;
2427 this_pktl->next= *next_point;
2428 *next_point= this_pktl;
2431 memset(streams, 0, sizeof(streams));
2432 pktl= s->packet_buffer;
2434 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%lld\n", pktl->pkt.stream_index, pktl->pkt.dts);
2435 if(streams[ pktl->pkt.stream_index ] == 0)
2437 streams[ pktl->pkt.stream_index ]++;
2441 if(s->nb_streams == stream_count || (flush && stream_count)){
2442 pktl= s->packet_buffer;
2445 s->packet_buffer= pktl->next;
2449 av_init_packet(out);
2455 * Interleaves a AVPacket correctly so it can be muxed.
2456 * @param out the interleaved packet will be output here
2457 * @param in the input packet
2458 * @param flush 1 if no further packets are available as input and all
2459 * remaining packets should be output
2460 * @return 1 if a packet was output, 0 if no packet could be output,
2461 * < 0 if an error occured
2463 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2464 if(s->oformat->interleave_packet)
2465 return s->oformat->interleave_packet(s, out, in, flush);
2467 return av_interleave_packet_per_dts(s, out, in, flush);
2471 * Writes a packet to an output media file ensuring correct interleaving.
2473 * The packet must contain one audio or video frame.
2474 * If the packets are already correctly interleaved the application should
2475 * call av_write_frame() instead as its slightly faster, its also important
2476 * to keep in mind that completly non interleaved input will need huge amounts
2477 * of memory to interleave with this, so its prefereable to interleave at the
2480 * @param s media file handle
2481 * @param pkt the packet, which contains the stream_index, buf/buf_size, dts/pts, ...
2482 * @return < 0 if error, = 0 if OK, 1 if end of stream wanted.
2484 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2485 AVStream *st= s->streams[ pkt->stream_index];
2487 //FIXME/XXX/HACK drop zero sized packets
2488 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2491 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %Ld %Ld\n", pkt->size, pkt->dts, pkt->pts);
2492 if(compute_pkt_fields2(st, pkt) < 0)
2495 if(pkt->dts == AV_NOPTS_VALUE)
2500 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2501 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2504 truncate_ts(s->streams[opkt.stream_index], &opkt);
2505 ret= s->oformat->write_packet(s, &opkt);
2507 av_free_packet(&opkt);
2512 if(url_ferror(&s->pb))
2513 return url_ferror(&s->pb);
2518 * @brief Write the stream trailer to an output media file and
2519 * free the file private data.
2521 * @param s media file handle
2522 * @return 0 if OK. AVERROR_xxx if error.
2524 int av_write_trailer(AVFormatContext *s)
2530 ret= av_interleave_packet(s, &pkt, NULL, 1);
2531 if(ret<0) //FIXME cleanup needed for ret<0 ?
2536 truncate_ts(s->streams[pkt.stream_index], &pkt);
2537 ret= s->oformat->write_packet(s, &pkt);
2539 av_free_packet(&pkt);
2543 if(url_ferror(&s->pb))
2547 if(s->oformat->write_trailer)
2548 ret = s->oformat->write_trailer(s);
2551 ret=url_ferror(&s->pb);
2552 for(i=0;i<s->nb_streams;i++)
2553 av_freep(&s->streams[i]->priv_data);
2554 av_freep(&s->priv_data);
2558 /* "user interface" functions */
2560 void dump_format(AVFormatContext *ic,
2568 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2569 is_output ? "Output" : "Input",
2571 is_output ? ic->oformat->name : ic->iformat->name,
2572 is_output ? "to" : "from", url);
2574 av_log(NULL, AV_LOG_INFO, " Duration: ");
2575 if (ic->duration != AV_NOPTS_VALUE) {
2576 int hours, mins, secs, us;
2577 secs = ic->duration / AV_TIME_BASE;
2578 us = ic->duration % AV_TIME_BASE;
2583 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%01d", hours, mins, secs,
2584 (10 * us) / AV_TIME_BASE);
2586 av_log(NULL, AV_LOG_INFO, "N/A");
2588 if (ic->start_time != AV_NOPTS_VALUE) {
2590 av_log(NULL, AV_LOG_INFO, ", start: ");
2591 secs = ic->start_time / AV_TIME_BASE;
2592 us = ic->start_time % AV_TIME_BASE;
2593 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2594 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2596 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2598 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2600 av_log(NULL, AV_LOG_INFO, "N/A");
2602 av_log(NULL, AV_LOG_INFO, "\n");
2604 for(i=0;i<ic->nb_streams;i++) {
2605 AVStream *st = ic->streams[i];
2606 int g= ff_gcd(st->time_base.num, st->time_base.den);
2607 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2608 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2609 /* the pid is an important information, so we display it */
2610 /* XXX: add a generic system */
2612 flags = ic->oformat->flags;
2614 flags = ic->iformat->flags;
2615 if (flags & AVFMT_SHOW_IDS) {
2616 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2618 if (strlen(st->language) > 0) {
2619 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2621 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2622 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2623 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2624 if(st->r_frame_rate.den && st->r_frame_rate.num)
2625 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(r)", av_q2d(st->r_frame_rate));
2626 /* else if(st->time_base.den && st->time_base.num)
2627 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(m)", 1/av_q2d(st->time_base));*/
2629 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(c)", 1/av_q2d(st->codec->time_base));
2631 av_log(NULL, AV_LOG_INFO, "\n");
2638 int frame_rate, frame_rate_base;
2641 static AbvEntry frame_abvs[] = {
2642 { "ntsc", 720, 480, 30000, 1001 },
2643 { "pal", 720, 576, 25, 1 },
2644 { "qntsc", 352, 240, 30000, 1001 }, /* VCD compliant ntsc */
2645 { "qpal", 352, 288, 25, 1 }, /* VCD compliant pal */
2646 { "sntsc", 640, 480, 30000, 1001 }, /* square pixel ntsc */
2647 { "spal", 768, 576, 25, 1 }, /* square pixel pal */
2648 { "film", 352, 240, 24, 1 },
2649 { "ntsc-film", 352, 240, 24000, 1001 },
2650 { "sqcif", 128, 96, 0, 0 },
2651 { "qcif", 176, 144, 0, 0 },
2652 { "cif", 352, 288, 0, 0 },
2653 { "4cif", 704, 576, 0, 0 },
2657 * parses width and height out of string str.
2659 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2662 int n = sizeof(frame_abvs) / sizeof(AbvEntry);
2664 int frame_width = 0, frame_height = 0;
2667 if (!strcmp(frame_abvs[i].abv, str)) {
2668 frame_width = frame_abvs[i].width;
2669 frame_height = frame_abvs[i].height;
2675 frame_width = strtol(p, (char **)&p, 10);
2678 frame_height = strtol(p, (char **)&p, 10);
2680 if (frame_width <= 0 || frame_height <= 0)
2682 *width_ptr = frame_width;
2683 *height_ptr = frame_height;
2688 * Converts frame rate from string to a fraction.
2690 * First we try to get an exact integer or fractional frame rate.
2691 * If this fails we convert the frame rate to a double and return
2692 * an approximate fraction using the DEFAULT_FRAME_RATE_BASE.
2694 int parse_frame_rate(int *frame_rate, int *frame_rate_base, const char *arg)
2699 /* First, we check our abbreviation table */
2700 for (i = 0; i < sizeof(frame_abvs)/sizeof(*frame_abvs); ++i)
2701 if (!strcmp(frame_abvs[i].abv, arg)) {
2702 *frame_rate = frame_abvs[i].frame_rate;
2703 *frame_rate_base = frame_abvs[i].frame_rate_base;
2707 /* Then, we try to parse it as fraction */
2708 cp = strchr(arg, '/');
2710 cp = strchr(arg, ':');
2713 *frame_rate = strtol(arg, &cpp, 10);
2714 if (cpp != arg || cpp == cp)
2715 *frame_rate_base = strtol(cp+1, &cpp, 10);
2720 /* Finally we give up and parse it as double */
2721 AVRational time_base = av_d2q(strtod(arg, 0), DEFAULT_FRAME_RATE_BASE);
2722 *frame_rate_base = time_base.den;
2723 *frame_rate = time_base.num;
2725 if (!*frame_rate || !*frame_rate_base)
2732 * Converts date string to number of seconds since Jan 1st, 1970.
2736 * - If not a duration:
2737 * [{YYYY-MM-DD|YYYYMMDD}]{T| }{HH[:MM[:SS[.m...]]][Z]|HH[MM[SS[.m...]]][Z]}
2738 * Time is localtime unless Z is suffixed to the end. In this case GMT
2739 * Return the date in micro seconds since 1970
2742 * HH[:MM[:SS[.m...]]]
2746 #ifndef CONFIG_WINCE
2747 int64_t parse_date(const char *datestr, int duration)
2753 static const char *date_fmt[] = {
2757 static const char *time_fmt[] = {
2767 time_t now = time(0);
2769 len = strlen(datestr);
2771 lastch = datestr[len - 1];
2774 is_utc = (lastch == 'z' || lastch == 'Z');
2776 memset(&dt, 0, sizeof(dt));
2781 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2782 q = small_strptime(p, date_fmt[i], &dt);
2792 dt = *localtime(&now);
2794 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2799 if (*p == 'T' || *p == 't' || *p == ' ')
2802 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2803 q = small_strptime(p, time_fmt[i], &dt);
2813 q = small_strptime(p, time_fmt[0], &dt);
2815 dt.tm_sec = strtol(p, (char **)&q, 10);
2821 /* Now we have all the fields that we can get */
2826 return now * int64_t_C(1000000);
2830 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2832 dt.tm_isdst = -1; /* unknown */
2845 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2848 val += n * (*q - '0');
2852 return negative ? -t : t;
2854 #endif /* CONFIG_WINCE */
2857 * Attempts to find a specific tag in a URL.
2859 * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done.
2860 * Return 1 if found.
2862 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2872 while (*p != '\0' && *p != '=' && *p != '&') {
2873 if ((q - tag) < sizeof(tag) - 1)
2881 while (*p != '&' && *p != '\0') {
2882 if ((q - arg) < arg_size - 1) {
2892 if (!strcmp(tag, tag1))
2902 * Returns in 'buf' the path with '%d' replaced by number.
2904 * Also handles the '%0nd' format where 'n' is the total number
2905 * of digits and '%%'. Return 0 if OK, and -1 if format error.
2907 int get_frame_filename(char *buf, int buf_size,
2908 const char *path, int number)
2911 char *q, buf1[20], c;
2912 int nd, len, percentd_found;
2924 while (isdigit(*p)) {
2925 nd = nd * 10 + *p++ - '0';
2928 } while (isdigit(c));
2937 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2939 if ((q - buf + len) > buf_size - 1)
2941 memcpy(q, buf1, len);
2949 if ((q - buf) < buf_size - 1)
2953 if (!percentd_found)
2963 * Print nice hexa dump of a buffer
2964 * @param f stream for output
2966 * @param size buffer size
2968 void av_hex_dump(FILE *f, uint8_t *buf, int size)
2972 for(i=0;i<size;i+=16) {
2976 fprintf(f, "%08x ", i);
2979 fprintf(f, " %02x", buf[i+j]);
2984 for(j=0;j<len;j++) {
2986 if (c < ' ' || c > '~')
2988 fprintf(f, "%c", c);
2995 * Print on 'f' a nice dump of a packet
2996 * @param f stream for output
2997 * @param pkt packet to dump
2998 * @param dump_payload true if the payload must be displayed too
3000 //FIXME needs to know the time_base
3001 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3003 fprintf(f, "stream #%d:\n", pkt->stream_index);
3004 fprintf(f, " keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
3005 fprintf(f, " duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
3006 /* DTS is _always_ valid after av_read_frame() */
3007 fprintf(f, " dts=");
3008 if (pkt->dts == AV_NOPTS_VALUE)
3011 fprintf(f, "%0.3f", (double)pkt->dts / AV_TIME_BASE);
3012 /* PTS may be not known if B frames are present */
3013 fprintf(f, " pts=");
3014 if (pkt->pts == AV_NOPTS_VALUE)
3017 fprintf(f, "%0.3f", (double)pkt->pts / AV_TIME_BASE);
3019 fprintf(f, " size=%d\n", pkt->size);
3021 av_hex_dump(f, pkt->data, pkt->size);
3024 void url_split(char *proto, int proto_size,
3025 char *authorization, int authorization_size,
3026 char *hostname, int hostname_size,
3028 char *path, int path_size,
3039 while (*p != ':' && *p != '\0') {
3040 if ((q - proto) < proto_size - 1)
3046 if (authorization_size > 0)
3047 authorization[0] = '\0';
3051 if (hostname_size > 0)
3055 char *at,*slash; // PETR: position of '@' character and '/' character
3062 at = strchr(p,'@'); // PETR: get the position of '@'
3063 slash = strchr(p,'/'); // PETR: get position of '/' - end of hostname
3064 if (at && slash && at > slash) at = NULL; // PETR: not interested in '@' behind '/'
3066 q = at ? authorization : hostname; // PETR: if '@' exists starting with auth.
3068 while ((at || *p != ':') && *p != '/' && *p != '?' && *p != '\0') { // PETR:
3069 if (*p == '@') { // PETR: passed '@'
3070 if (authorization_size > 0)
3074 } else if (!at) { // PETR: hostname
3075 if ((q - hostname) < hostname_size - 1)
3078 if ((q - authorization) < authorization_size - 1)
3083 if (hostname_size > 0)
3087 port = strtoul(p, (char **)&p, 10);
3092 pstrcpy(path, path_size, p);
3096 * Set the pts for a given stream.
3099 * @param pts_wrap_bits number of bits effectively used by the pts
3100 * (used for wrap control, 33 is the value for MPEG)
3101 * @param pts_num numerator to convert to seconds (MPEG: 1)
3102 * @param pts_den denominator to convert to seconds (MPEG: 90000)
3104 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3105 int pts_num, int pts_den)
3107 s->pts_wrap_bits = pts_wrap_bits;
3108 s->time_base.num = pts_num;
3109 s->time_base.den = pts_den;
3112 /* fraction handling */
3115 * f = val + (num / den) + 0.5.
3117 * 'num' is normalized so that it is such as 0 <= num < den.
3119 * @param f fractional number
3120 * @param val integer value
3121 * @param num must be >= 0
3122 * @param den must be >= 1
3124 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
3137 * Set f to (val + 0.5).
3139 static void av_frac_set(AVFrac *f, int64_t val)
3142 f->num = f->den >> 1;
3146 * Fractionnal addition to f: f = f + (incr / f->den).
3148 * @param f fractional number
3149 * @param incr increment, can be positive or negative
3151 static void av_frac_add(AVFrac *f, int64_t incr)
3155 num = f->num + incr;
3158 f->val += num / den;
3164 } else if (num >= den) {
3165 f->val += num / den;
3172 * register a new image format
3173 * @param img_fmt Image format descriptor
3175 void av_register_image_format(AVImageFormat *img_fmt)
3179 p = &first_image_format;
3180 while (*p != NULL) p = &(*p)->next;
3182 img_fmt->next = NULL;
3186 * Guesses image format based on data in the image.
3188 AVImageFormat *av_probe_image_format(AVProbeData *pd)
3190 AVImageFormat *fmt1, *fmt;
3191 int score, score_max;
3195 for(fmt1 = first_image_format; fmt1 != NULL; fmt1 = fmt1->next) {
3196 if (fmt1->img_probe) {
3197 score = fmt1->img_probe(pd);
3198 if (score > score_max) {
3208 * Guesses image format based on file name extensions.
3210 AVImageFormat *guess_image_format(const char *filename)
3212 AVImageFormat *fmt1;
3214 for(fmt1 = first_image_format; fmt1 != NULL; fmt1 = fmt1->next) {
3215 if (fmt1->extensions && match_ext(filename, fmt1->extensions))
3222 * Read an image from a stream.
3223 * @param gb byte stream containing the image
3224 * @param fmt image format, NULL if probing is required
3226 int av_read_image(ByteIOContext *pb, const char *filename,
3228 int (*alloc_cb)(void *, AVImageInfo *info), void *opaque)
3230 uint8_t buf[PROBE_BUF_MIN];
3231 AVProbeData probe_data, *pd = &probe_data;
3236 pd->filename = filename;
3238 pos = url_ftell(pb);
3239 pd->buf_size = get_buffer(pb, buf, PROBE_BUF_MIN);
3240 url_fseek(pb, pos, SEEK_SET);
3241 fmt = av_probe_image_format(pd);
3244 return AVERROR_NOFMT;
3245 ret = fmt->img_read(pb, alloc_cb, opaque);
3250 * Write an image to a stream.
3251 * @param pb byte stream for the image output
3252 * @param fmt image format
3253 * @param img image data and informations
3255 int av_write_image(ByteIOContext *pb, AVImageFormat *fmt, AVImageInfo *img)
3257 return fmt->img_write(pb, img);