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"
27 * @file libavformat/utils.c
28 * Various utility functions for using ffmpeg library.
31 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den);
32 static void av_frac_add(AVFrac *f, int64_t incr);
33 static void av_frac_set(AVFrac *f, int64_t val);
35 /** head of registered input format linked list. */
36 AVInputFormat *first_iformat = NULL;
37 /** head of registered output format linked list. */
38 AVOutputFormat *first_oformat = NULL;
39 /** head of registered image format linked list. */
40 AVImageFormat *first_image_format = NULL;
42 void av_register_input_format(AVInputFormat *format)
46 while (*p != NULL) p = &(*p)->next;
51 void av_register_output_format(AVOutputFormat *format)
55 while (*p != NULL) p = &(*p)->next;
60 int match_ext(const char *filename, const char *extensions)
68 ext = strrchr(filename, '.');
74 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
77 if (!strcasecmp(ext1, ext))
87 AVOutputFormat *guess_format(const char *short_name, const char *filename,
88 const char *mime_type)
90 AVOutputFormat *fmt, *fmt_found;
93 /* specific test for image sequences */
94 #ifdef CONFIG_IMAGE2_MUXER
95 if (!short_name && filename &&
96 av_filename_number_test(filename) &&
97 av_guess_image2_codec(filename) != CODEC_ID_NONE) {
98 return guess_format("image2", NULL, NULL);
101 if (!short_name && filename &&
102 av_filename_number_test(filename) &&
103 guess_image_format(filename)) {
104 return guess_format("image", NULL, NULL);
107 /* find the proper file type */
111 while (fmt != NULL) {
113 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
115 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
117 if (filename && fmt->extensions &&
118 match_ext(filename, fmt->extensions)) {
121 if (score > score_max) {
130 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
131 const char *mime_type)
133 AVOutputFormat *fmt = guess_format(short_name, filename, mime_type);
136 AVOutputFormat *stream_fmt;
137 char stream_format_name[64];
139 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
140 stream_fmt = guess_format(stream_format_name, NULL, NULL);
150 * Guesses the codec id based upon muxer and filename.
152 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
153 const char *filename, const char *mime_type, enum CodecType type){
154 if(type == CODEC_TYPE_VIDEO){
155 enum CodecID codec_id= CODEC_ID_NONE;
157 #ifdef CONFIG_IMAGE2_MUXER
158 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
159 codec_id= av_guess_image2_codec(filename);
162 if(codec_id == CODEC_ID_NONE)
163 codec_id= fmt->video_codec;
165 }else if(type == CODEC_TYPE_AUDIO)
166 return fmt->audio_codec;
168 return CODEC_ID_NONE;
172 * finds AVInputFormat based on input format's short name.
174 AVInputFormat *av_find_input_format(const char *short_name)
177 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) {
178 if (!strcmp(fmt->name, short_name))
184 /* memory handling */
187 * Default packet destructor.
189 void av_destruct_packet(AVPacket *pkt)
192 pkt->data = NULL; pkt->size = 0;
196 * Allocate the payload of a packet and intialized its fields to default values.
199 * @param size wanted payload size
200 * @return 0 if OK. AVERROR_xxx otherwise.
202 int av_new_packet(AVPacket *pkt, int size)
205 if((unsigned)size > (unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE)
206 return AVERROR_NOMEM;
207 data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
209 return AVERROR_NOMEM;
210 memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
215 pkt->destruct = av_destruct_packet;
220 * Allocate and read the payload of a packet and intialized its fields to default values.
223 * @param size wanted payload size
224 * @return >0 (read size) if OK. AVERROR_xxx otherwise.
226 int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size)
228 int ret= av_new_packet(pkt, size);
233 pkt->pos= url_ftell(s);
235 ret= get_buffer(s, pkt->data, size);
244 /* This is a hack - the packet memory allocation stuff is broken. The
245 packet is allocated if it was not really allocated */
246 int av_dup_packet(AVPacket *pkt)
248 if (pkt->destruct != av_destruct_packet) {
250 /* we duplicate the packet and don't forget to put the padding
252 if((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE)
253 return AVERROR_NOMEM;
254 data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
256 return AVERROR_NOMEM;
258 memcpy(data, pkt->data, pkt->size);
259 memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
261 pkt->destruct = av_destruct_packet;
268 int fifo_init(FifoBuffer *f, int size)
270 f->buffer = av_malloc(size);
273 f->end = f->buffer + size;
274 f->wptr = f->rptr = f->buffer;
278 void fifo_free(FifoBuffer *f)
283 int fifo_size(FifoBuffer *f, uint8_t *rptr)
290 if (f->wptr >= rptr) {
291 size = f->wptr - rptr;
293 size = (f->end - rptr) + (f->wptr - f->buffer);
299 * Get data from the fifo (returns -1 if not enough data).
301 int fifo_read(FifoBuffer *f, uint8_t *buf, int buf_size, uint8_t **rptr_ptr)
310 if (f->wptr >= rptr) {
311 size = f->wptr - rptr;
313 size = (f->end - rptr) + (f->wptr - f->buffer);
318 while (buf_size > 0) {
322 memcpy(buf, rptr, len);
336 void fifo_realloc(FifoBuffer *f, unsigned int new_size){
337 unsigned int old_size= f->end - f->buffer;
339 if(old_size < new_size){
340 uint8_t *old= f->buffer;
342 f->buffer= av_realloc(f->buffer, new_size);
344 f->rptr += f->buffer - old;
345 f->wptr += f->buffer - old;
347 if(f->wptr < f->rptr){
348 memmove(f->rptr + new_size - old_size, f->rptr, f->buffer + old_size - f->rptr);
349 f->rptr += new_size - old_size;
351 f->end= f->buffer + new_size;
355 void fifo_write(FifoBuffer *f, const uint8_t *buf, int size, uint8_t **wptr_ptr)
368 memcpy(wptr, buf, len);
378 /* get data from the fifo (return -1 if not enough data) */
379 int put_fifo(ByteIOContext *pb, FifoBuffer *f, int buf_size, uint8_t **rptr_ptr)
381 uint8_t *rptr = *rptr_ptr;
384 if (f->wptr >= rptr) {
385 size = f->wptr - rptr;
387 size = (f->end - rptr) + (f->wptr - f->buffer);
392 while (buf_size > 0) {
396 put_buffer(pb, rptr, len);
407 * Allocate the payload of a packet and intialized its fields to default values.
409 * @param filename possible numbered sequence string
410 * @return 1 if a valid numbered sequence string, 0 otherwise.
412 int av_filename_number_test(const char *filename)
415 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
421 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened)
423 AVInputFormat *fmt1, *fmt;
424 int score, score_max;
428 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
429 if (!is_opened && !(fmt1->flags & AVFMT_NOFILE))
432 if (fmt1->read_probe) {
433 score = fmt1->read_probe(pd);
434 } else if (fmt1->extensions) {
435 if (match_ext(pd->filename, fmt1->extensions)) {
439 if (score > score_max) {
447 /************************************************************/
448 /* input media file */
451 * Open a media file from an IO stream. 'fmt' must be specified.
453 static const char* format_to_name(void* ptr)
455 AVFormatContext* fc = (AVFormatContext*) ptr;
456 if(fc->iformat) return fc->iformat->name;
457 else if(fc->oformat) return fc->oformat->name;
461 #define OFFSET(x) (int)&((AVFormatContext*)0)->x
462 #define DEFAULT 0 //should be NAN but it doesnt work as its not a constant in glibc as required by ANSI/ISO C
463 //these names are too long to be readable
464 #define E AV_OPT_FLAG_ENCODING_PARAM
465 #define D AV_OPT_FLAG_DECODING_PARAM
467 static const AVOption options[]={
468 {"probesize", NULL, OFFSET(probesize), FF_OPT_TYPE_INT, DEFAULT, 32, INT_MAX, D},
469 {"fflags", NULL, OFFSET(flags), FF_OPT_TYPE_FLAGS, DEFAULT, INT_MIN, INT_MAX, D, "fflags"},
470 {"ignidx", "ignore index", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_IGNIDX, INT_MIN, INT_MAX, D, "fflags"},
471 {"genpts", "generate pts", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_GENPTS, INT_MIN, INT_MAX, D, "fflags"},
475 static const AVClass av_format_context_class = { "AVFormatContext", format_to_name, options };
477 #if LIBAVCODEC_VERSION_INT > ((52<<16)+(0<<8)+0)
480 void avformat_get_context_defaults(AVFormatContext *s){
481 memset(s, 0, sizeof(AVFormatContext));
483 /* from mpegts.c: 1.0 second at 24Mbit/s */
487 AVFormatContext *av_alloc_format_context(void)
490 ic = av_mallocz(sizeof(AVFormatContext));
492 avformat_get_context_defaults(ic);
493 ic->av_class = &av_format_context_class;
498 * Allocates all the structures needed to read an input stream.
499 * This does not open the needed codecs for decoding the stream[s].
501 int av_open_input_stream(AVFormatContext **ic_ptr,
502 ByteIOContext *pb, const char *filename,
503 AVInputFormat *fmt, AVFormatParameters *ap)
507 AVFormatParameters default_ap;
511 memset(ap, 0, sizeof(default_ap));
514 if(!ap->prealloced_context)
515 ic = av_alloc_format_context();
525 ic->duration = AV_NOPTS_VALUE;
526 ic->start_time = AV_NOPTS_VALUE;
527 pstrcpy(ic->filename, sizeof(ic->filename), filename);
529 /* allocate private data */
530 if (fmt->priv_data_size > 0) {
531 ic->priv_data = av_mallocz(fmt->priv_data_size);
532 if (!ic->priv_data) {
537 ic->priv_data = NULL;
540 err = ic->iformat->read_header(ic, ap);
545 ic->data_offset = url_ftell(&ic->pb);
551 av_freep(&ic->priv_data);
558 /** Size of probe buffer, for guessing file type from file contents. */
559 #define PROBE_BUF_MIN 2048
560 #define PROBE_BUF_MAX (1<<20)
563 * Open a media file as input. The codec are not opened. Only the file
564 * header (if present) is read.
566 * @param ic_ptr the opened media file handle is put here
567 * @param filename filename to open.
568 * @param fmt if non NULL, force the file format to use
569 * @param buf_size optional buffer size (zero if default is OK)
570 * @param ap additionnal parameters needed when opening the file (NULL if default)
571 * @return 0 if OK. AVERROR_xxx otherwise.
573 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
576 AVFormatParameters *ap)
578 int err, must_open_file, file_opened, probe_size;
579 AVProbeData probe_data, *pd = &probe_data;
580 ByteIOContext pb1, *pb = &pb1;
585 pd->filename = filename;
590 /* guess format if no file can be opened */
591 fmt = av_probe_input_format(pd, 0);
594 /* do not open file if the format does not need it. XXX: specific
595 hack needed to handle RTSP/TCP */
597 if (fmt && (fmt->flags & AVFMT_NOFILE)) {
599 pb= NULL; //FIXME this or memset(pb, 0, sizeof(ByteIOContext)); otherwise its uninitalized
602 if (!fmt || must_open_file) {
603 /* if no file needed do not try to open one */
604 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
610 url_setbufsize(pb, buf_size);
613 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
614 /* read probe data */
615 pd->buf= av_realloc(pd->buf, probe_size);
616 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
617 if (url_fseek(pb, 0, SEEK_SET) == (offset_t)-EPIPE) {
619 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
625 /* guess file format */
626 fmt = av_probe_input_format(pd, 1);
631 /* if still no format found, error */
637 /* XXX: suppress this hack for redirectors */
638 #ifdef CONFIG_NETWORK
639 if (fmt == &redir_demuxer) {
640 err = redir_open(ic_ptr, pb);
646 /* check filename in case of an image number is expected */
647 if (fmt->flags & AVFMT_NEEDNUMBER) {
648 if (!av_filename_number_test(filename)) {
649 err = AVERROR_NUMEXPECTED;
653 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
666 /*******************************************************/
669 * Read a transport packet from a media file.
671 * This function is absolete and should never be used.
672 * Use av_read_frame() instead.
674 * @param s media file handle
675 * @param pkt is filled
676 * @return 0 if OK. AVERROR_xxx if error.
678 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
680 return s->iformat->read_packet(s, pkt);
683 /**********************************************************/
686 * Get the number of samples of an audio frame. Return (-1) if error.
688 static int get_audio_frame_size(AVCodecContext *enc, int size)
692 if (enc->frame_size <= 1) {
693 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
695 if (bits_per_sample) {
696 if (enc->channels == 0)
698 frame_size = (size << 3) / (bits_per_sample * enc->channels);
700 /* used for example by ADPCM codecs */
701 if (enc->bit_rate == 0)
703 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
706 frame_size = enc->frame_size;
713 * Return the frame duration in seconds, return 0 if not available.
715 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
716 AVCodecParserContext *pc, AVPacket *pkt)
722 switch(st->codec->codec_type) {
723 case CODEC_TYPE_VIDEO:
724 if(st->time_base.num*1000LL > st->time_base.den){
725 *pnum = st->time_base.num;
726 *pden = st->time_base.den;
727 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
728 *pnum = st->codec->time_base.num;
729 *pden = st->codec->time_base.den;
730 if (pc && pc->repeat_pict) {
732 *pnum = (*pnum) * (2 + pc->repeat_pict);
736 case CODEC_TYPE_AUDIO:
737 frame_size = get_audio_frame_size(st->codec, pkt->size);
741 *pden = st->codec->sample_rate;
748 static int is_intra_only(AVCodecContext *enc){
749 if(enc->codec_type == CODEC_TYPE_AUDIO){
751 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
752 switch(enc->codec_id){
754 case CODEC_ID_MJPEGB:
756 case CODEC_ID_RAWVIDEO:
757 case CODEC_ID_DVVIDEO:
758 case CODEC_ID_HUFFYUV:
759 case CODEC_ID_FFVHUFF:
770 static int64_t lsb2full(int64_t lsb, int64_t last_ts, int lsb_bits){
771 int64_t mask = lsb_bits < 64 ? (1LL<<lsb_bits)-1 : -1LL;
772 int64_t delta= last_ts - mask/2;
773 return ((lsb - delta)&mask) + delta;
776 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
777 AVCodecParserContext *pc, AVPacket *pkt)
779 int num, den, presentation_delayed;
780 /* handle wrapping */
781 if(st->cur_dts != AV_NOPTS_VALUE){
782 if(pkt->pts != AV_NOPTS_VALUE)
783 pkt->pts= lsb2full(pkt->pts, st->cur_dts, st->pts_wrap_bits);
784 if(pkt->dts != AV_NOPTS_VALUE)
785 pkt->dts= lsb2full(pkt->dts, st->cur_dts, st->pts_wrap_bits);
788 if (pkt->duration == 0) {
789 compute_frame_duration(&num, &den, st, pc, pkt);
791 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
795 if(is_intra_only(st->codec))
796 pkt->flags |= PKT_FLAG_KEY;
798 /* do we have a video B frame ? */
799 presentation_delayed = 0;
800 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
801 /* XXX: need has_b_frame, but cannot get it if the codec is
803 if (( st->codec->codec_id == CODEC_ID_H264
804 || st->codec->has_b_frames) &&
805 pc && pc->pict_type != FF_B_TYPE)
806 presentation_delayed = 1;
807 /* this may be redundant, but it shouldnt hurt */
808 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
809 presentation_delayed = 1;
812 if(st->cur_dts == AV_NOPTS_VALUE){
813 if(presentation_delayed) st->cur_dts = -pkt->duration;
814 else st->cur_dts = 0;
817 // 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);
818 /* interpolate PTS and DTS if they are not present */
819 if (presentation_delayed) {
820 /* DTS = decompression time stamp */
821 /* PTS = presentation time stamp */
822 if (pkt->dts == AV_NOPTS_VALUE) {
823 /* if we know the last pts, use it */
824 if(st->last_IP_pts != AV_NOPTS_VALUE)
825 st->cur_dts = pkt->dts = st->last_IP_pts;
827 pkt->dts = st->cur_dts;
829 st->cur_dts = pkt->dts;
831 /* this is tricky: the dts must be incremented by the duration
832 of the frame we are displaying, i.e. the last I or P frame */
833 if (st->last_IP_duration == 0)
834 st->cur_dts += pkt->duration;
836 st->cur_dts += st->last_IP_duration;
837 st->last_IP_duration = pkt->duration;
838 st->last_IP_pts= pkt->pts;
839 /* cannot compute PTS if not present (we can compute it only
840 by knowing the futur */
841 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
842 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
843 int64_t old_diff= ABS(st->cur_dts - pkt->duration - pkt->pts);
844 int64_t new_diff= ABS(st->cur_dts - pkt->pts);
845 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
846 pkt->pts += pkt->duration;
847 // 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);
851 /* presentation is not delayed : PTS and DTS are the same */
852 if (pkt->pts == AV_NOPTS_VALUE) {
853 if (pkt->dts == AV_NOPTS_VALUE) {
854 pkt->pts = st->cur_dts;
855 pkt->dts = st->cur_dts;
858 st->cur_dts = pkt->dts;
862 st->cur_dts = pkt->pts;
865 st->cur_dts += pkt->duration;
867 // 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);
872 /* key frame computation */
873 switch(st->codec->codec_type) {
874 case CODEC_TYPE_VIDEO:
875 if (pc->pict_type == FF_I_TYPE)
876 pkt->flags |= PKT_FLAG_KEY;
878 case CODEC_TYPE_AUDIO:
879 pkt->flags |= PKT_FLAG_KEY;
887 void av_destruct_packet_nofree(AVPacket *pkt)
889 pkt->data = NULL; pkt->size = 0;
892 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
898 /* select current input stream component */
901 if (!st->need_parsing || !st->parser) {
902 /* no parsing needed: we just output the packet as is */
903 /* raw data support */
905 compute_pkt_fields(s, st, NULL, pkt);
908 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
909 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
910 s->cur_ptr, s->cur_len,
911 s->cur_pkt.pts, s->cur_pkt.dts);
912 s->cur_pkt.pts = AV_NOPTS_VALUE;
913 s->cur_pkt.dts = AV_NOPTS_VALUE;
914 /* increment read pointer */
918 /* return packet if any */
922 pkt->stream_index = st->index;
923 pkt->pts = st->parser->pts;
924 pkt->dts = st->parser->dts;
925 pkt->destruct = av_destruct_packet_nofree;
926 compute_pkt_fields(s, st, st->parser, pkt);
931 av_free_packet(&s->cur_pkt);
935 /* read next packet */
936 ret = av_read_packet(s, &s->cur_pkt);
940 /* return the last frames, if any */
941 for(i = 0; i < s->nb_streams; i++) {
943 if (st->parser && st->need_parsing) {
944 av_parser_parse(st->parser, st->codec,
945 &pkt->data, &pkt->size,
947 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
952 /* no more packets: really terminates parsing */
956 st = s->streams[s->cur_pkt.stream_index];
957 if(st->codec->debug & FF_DEBUG_PTS)
958 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%lld, dts=%lld, size=%d\n",
959 s->cur_pkt.stream_index,
965 s->cur_ptr = s->cur_pkt.data;
966 s->cur_len = s->cur_pkt.size;
967 if (st->need_parsing && !st->parser) {
968 st->parser = av_parser_init(st->codec->codec_id);
970 /* no parser available : just output the raw packets */
971 st->need_parsing = 0;
972 }else if(st->need_parsing == 2){
973 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
978 if(st->codec->debug & FF_DEBUG_PTS)
979 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%lld, dts=%lld, size=%d\n",
989 * Return the next frame of a stream.
991 * The returned packet is valid
992 * until the next av_read_frame() or until av_close_input_file() and
993 * must be freed with av_free_packet. For video, the packet contains
994 * exactly one frame. For audio, it contains an integer number of
995 * frames if each frame has a known fixed size (e.g. PCM or ADPCM
996 * data). If the audio frames have a variable size (e.g. MPEG audio),
997 * then it contains one frame.
999 * pkt->pts, pkt->dts and pkt->duration are always set to correct
1000 * values in AV_TIME_BASE unit (and guessed if the format cannot
1001 * provided them). pkt->pts can be AV_NOPTS_VALUE if the video format
1002 * has B frames, so it is better to rely on pkt->dts if you do not
1003 * decompress the payload.
1005 * @return 0 if OK, < 0 if error or end of file.
1007 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1011 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1014 pktl = s->packet_buffer;
1016 AVPacket *next_pkt= &pktl->pkt;
1018 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1019 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1020 if( pktl->pkt.stream_index == next_pkt->stream_index
1021 && next_pkt->dts < pktl->pkt.dts
1022 && pktl->pkt.pts != pktl->pkt.dts //not b frame
1023 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
1024 next_pkt->pts= pktl->pkt.dts;
1028 pktl = s->packet_buffer;
1031 if( next_pkt->pts != AV_NOPTS_VALUE
1032 || next_pkt->dts == AV_NOPTS_VALUE
1034 /* read packet from packet buffer, if there is data */
1036 s->packet_buffer = pktl->next;
1042 AVPacketList **plast_pktl= &s->packet_buffer;
1043 int ret= av_read_frame_internal(s, pkt);
1045 if(pktl && ret != -EAGAIN){
1052 /* duplicate the packet */
1053 if (av_dup_packet(pkt) < 0)
1054 return AVERROR_NOMEM;
1056 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
1058 pktl = av_mallocz(sizeof(AVPacketList));
1060 return AVERROR_NOMEM;
1062 /* add the packet in the buffered packet list */
1066 assert(!s->packet_buffer);
1067 return av_read_frame_internal(s, pkt);
1072 /* XXX: suppress the packet queue */
1073 static void flush_packet_queue(AVFormatContext *s)
1078 pktl = s->packet_buffer;
1081 s->packet_buffer = pktl->next;
1082 av_free_packet(&pktl->pkt);
1087 /*******************************************************/
1090 int av_find_default_stream_index(AVFormatContext *s)
1095 if (s->nb_streams <= 0)
1097 for(i = 0; i < s->nb_streams; i++) {
1099 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1107 * Flush the frame reader.
1109 static void av_read_frame_flush(AVFormatContext *s)
1114 flush_packet_queue(s);
1116 /* free previous packet */
1118 if (s->cur_st->parser)
1119 av_free_packet(&s->cur_pkt);
1126 /* for each stream, reset read state */
1127 for(i = 0; i < s->nb_streams; i++) {
1131 av_parser_close(st->parser);
1134 st->last_IP_pts = AV_NOPTS_VALUE;
1135 st->cur_dts = 0; /* we set the current DTS to an unspecified origin */
1140 * Updates cur_dts of all streams based on given timestamp and AVStream.
1142 * Stream ref_st unchanged, others set cur_dts in their native timebase
1143 * only needed for timestamp wrapping or if (dts not set and pts!=dts)
1144 * @param timestamp new dts expressed in time_base of param ref_st
1145 * @param ref_st reference stream giving time_base of param timestamp
1147 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1150 for(i = 0; i < s->nb_streams; i++) {
1151 AVStream *st = s->streams[i];
1153 st->cur_dts = av_rescale(timestamp,
1154 st->time_base.den * (int64_t)ref_st->time_base.num,
1155 st->time_base.num * (int64_t)ref_st->time_base.den);
1160 * Add a index entry into a sorted list updateing if it is already there.
1162 * @param timestamp timestamp in the timebase of the given stream
1164 int av_add_index_entry(AVStream *st,
1165 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1167 AVIndexEntry *entries, *ie;
1170 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1173 entries = av_fast_realloc(st->index_entries,
1174 &st->index_entries_allocated_size,
1175 (st->nb_index_entries + 1) *
1176 sizeof(AVIndexEntry));
1180 st->index_entries= entries;
1182 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1185 index= st->nb_index_entries++;
1186 ie= &entries[index];
1187 assert(index==0 || ie[-1].timestamp < timestamp);
1189 ie= &entries[index];
1190 if(ie->timestamp != timestamp){
1191 if(ie->timestamp <= timestamp)
1193 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1194 st->nb_index_entries++;
1195 }else if(ie->pos == pos && distance < ie->min_distance) //dont reduce the distance
1196 distance= ie->min_distance;
1200 ie->timestamp = timestamp;
1201 ie->min_distance= distance;
1209 * build an index for raw streams using a parser.
1211 static void av_build_index_raw(AVFormatContext *s)
1213 AVPacket pkt1, *pkt = &pkt1;
1218 av_read_frame_flush(s);
1219 url_fseek(&s->pb, s->data_offset, SEEK_SET);
1222 ret = av_read_frame(s, pkt);
1225 if (pkt->stream_index == 0 && st->parser &&
1226 (pkt->flags & PKT_FLAG_KEY)) {
1227 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
1228 0, 0, AVINDEX_KEYFRAME);
1230 av_free_packet(pkt);
1235 * Returns TRUE if we deal with a raw stream.
1237 * Raw codec data and parsing needed.
1239 static int is_raw_stream(AVFormatContext *s)
1243 if (s->nb_streams != 1)
1246 if (!st->need_parsing)
1252 * Gets the index for a specific timestamp.
1253 * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond to
1254 * the timestamp which is <= the requested one, if backward is 0
1255 * then it will be >=
1256 * if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise
1257 * @return < 0 if no such timestamp could be found
1259 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1262 AVIndexEntry *entries= st->index_entries;
1263 int nb_entries= st->nb_index_entries;
1272 timestamp = entries[m].timestamp;
1273 if(timestamp >= wanted_timestamp)
1275 if(timestamp <= wanted_timestamp)
1278 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1280 if(!(flags & AVSEEK_FLAG_ANY)){
1281 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1282 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1294 * Does a binary search using av_index_search_timestamp() and AVCodec.read_timestamp().
1295 * this isnt supposed to be called directly by a user application, but by demuxers
1296 * @param target_ts target timestamp in the time base of the given stream
1297 * @param stream_index stream number
1299 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1300 AVInputFormat *avif= s->iformat;
1301 int64_t pos_min, pos_max, pos, pos_limit;
1302 int64_t ts_min, ts_max, ts;
1303 int64_t start_pos, filesize;
1304 int index, no_change;
1307 if (stream_index < 0)
1311 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1315 ts_min= AV_NOPTS_VALUE;
1316 pos_limit= -1; //gcc falsely says it may be uninitalized
1318 st= s->streams[stream_index];
1319 if(st->index_entries){
1322 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()
1323 index= FFMAX(index, 0);
1324 e= &st->index_entries[index];
1326 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1328 ts_min= e->timestamp;
1330 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1337 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1338 assert(index < st->nb_index_entries);
1340 e= &st->index_entries[index];
1341 assert(e->timestamp >= target_ts);
1343 ts_max= e->timestamp;
1344 pos_limit= pos_max - e->min_distance;
1346 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1347 pos_max,pos_limit, ts_max);
1352 if(ts_min == AV_NOPTS_VALUE){
1353 pos_min = s->data_offset;
1354 ts_min = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1355 if (ts_min == AV_NOPTS_VALUE)
1359 if(ts_max == AV_NOPTS_VALUE){
1361 filesize = url_fsize(&s->pb);
1362 pos_max = filesize - 1;
1365 ts_max = avif->read_timestamp(s, stream_index, &pos_max, pos_max + step);
1367 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1368 if (ts_max == AV_NOPTS_VALUE)
1372 int64_t tmp_pos= pos_max + 1;
1373 int64_t tmp_ts= avif->read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1374 if(tmp_ts == AV_NOPTS_VALUE)
1378 if(tmp_pos >= filesize)
1384 if(ts_min > ts_max){
1386 }else if(ts_min == ts_max){
1391 while (pos_min < pos_limit) {
1393 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1397 assert(pos_limit <= pos_max);
1400 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1401 // interpolate position (better than dichotomy)
1402 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1403 + pos_min - approximate_keyframe_distance;
1404 }else if(no_change==1){
1405 // bisection, if interpolation failed to change min or max pos last time
1406 pos = (pos_min + pos_limit)>>1;
1408 // linear search if bisection failed, can only happen if there are very few or no keframes between min/max
1413 else if(pos > pos_limit)
1417 ts = avif->read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1423 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);
1425 assert(ts != AV_NOPTS_VALUE);
1426 if (target_ts <= ts) {
1427 pos_limit = start_pos - 1;
1431 if (target_ts >= ts) {
1437 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1438 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1441 ts_min = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1443 ts_max = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1444 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1445 pos, ts_min, target_ts, ts_max);
1448 url_fseek(&s->pb, pos, SEEK_SET);
1450 av_update_cur_dts(s, st, ts);
1455 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1456 int64_t pos_min, pos_max;
1460 if (stream_index < 0)
1463 st= s->streams[stream_index];
1466 pos_min = s->data_offset;
1467 pos_max = url_fsize(&s->pb) - 1;
1469 if (pos < pos_min) pos= pos_min;
1470 else if(pos > pos_max) pos= pos_max;
1472 url_fseek(&s->pb, pos, SEEK_SET);
1475 av_update_cur_dts(s, st, ts);
1480 static int av_seek_frame_generic(AVFormatContext *s,
1481 int stream_index, int64_t timestamp, int flags)
1487 if (!s->index_built) {
1488 if (is_raw_stream(s)) {
1489 av_build_index_raw(s);
1496 st = s->streams[stream_index];
1497 index = av_index_search_timestamp(st, timestamp, flags);
1501 /* now we have found the index, we can seek */
1502 ie = &st->index_entries[index];
1503 av_read_frame_flush(s);
1504 url_fseek(&s->pb, ie->pos, SEEK_SET);
1506 av_update_cur_dts(s, st, ie->timestamp);
1512 * Seek to the key frame at timestamp.
1513 * 'timestamp' in 'stream_index'.
1514 * @param stream_index If stream_index is (-1), a default
1515 * stream is selected, and timestamp is automatically converted
1516 * from AV_TIME_BASE units to the stream specific time_base.
1517 * @param timestamp timestamp in AVStream.time_base units
1518 * or if there is no stream specified then in AV_TIME_BASE units
1519 * @param flags flags which select direction and seeking mode
1520 * @return >= 0 on success
1522 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1527 av_read_frame_flush(s);
1529 if(flags & AVSEEK_FLAG_BYTE)
1530 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1532 if(stream_index < 0){
1533 stream_index= av_find_default_stream_index(s);
1534 if(stream_index < 0)
1537 st= s->streams[stream_index];
1538 /* timestamp for default must be expressed in AV_TIME_BASE units */
1539 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1541 st= s->streams[stream_index];
1543 /* first, we try the format specific seek */
1544 if (s->iformat->read_seek)
1545 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1552 if(s->iformat->read_timestamp)
1553 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1555 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1558 /*******************************************************/
1561 * Returns TRUE if the stream has accurate timings in any stream.
1563 * @return TRUE if the stream has accurate timings for at least one component.
1565 static int av_has_timings(AVFormatContext *ic)
1570 for(i = 0;i < ic->nb_streams; i++) {
1571 st = ic->streams[i];
1572 if (st->start_time != AV_NOPTS_VALUE &&
1573 st->duration != AV_NOPTS_VALUE)
1580 * Estimate the stream timings from the one of each components.
1582 * Also computes the global bitrate if possible.
1584 static void av_update_stream_timings(AVFormatContext *ic)
1586 int64_t start_time, start_time1, end_time, end_time1;
1590 start_time = MAXINT64;
1591 end_time = MININT64;
1592 for(i = 0;i < ic->nb_streams; i++) {
1593 st = ic->streams[i];
1594 if (st->start_time != AV_NOPTS_VALUE) {
1595 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1596 if (start_time1 < start_time)
1597 start_time = start_time1;
1598 if (st->duration != AV_NOPTS_VALUE) {
1599 end_time1 = start_time1
1600 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1601 if (end_time1 > end_time)
1602 end_time = end_time1;
1606 if (start_time != MAXINT64) {
1607 ic->start_time = start_time;
1608 if (end_time != MININT64) {
1609 ic->duration = end_time - start_time;
1610 if (ic->file_size > 0) {
1611 /* compute the bit rate */
1612 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1613 (double)ic->duration;
1620 static void fill_all_stream_timings(AVFormatContext *ic)
1625 av_update_stream_timings(ic);
1626 for(i = 0;i < ic->nb_streams; i++) {
1627 st = ic->streams[i];
1628 if (st->start_time == AV_NOPTS_VALUE) {
1629 if(ic->start_time != AV_NOPTS_VALUE)
1630 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1631 if(ic->duration != AV_NOPTS_VALUE)
1632 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1637 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1639 int64_t filesize, duration;
1643 /* if bit_rate is already set, we believe it */
1644 if (ic->bit_rate == 0) {
1646 for(i=0;i<ic->nb_streams;i++) {
1647 st = ic->streams[i];
1648 bit_rate += st->codec->bit_rate;
1650 ic->bit_rate = bit_rate;
1653 /* if duration is already set, we believe it */
1654 if (ic->duration == AV_NOPTS_VALUE &&
1655 ic->bit_rate != 0 &&
1656 ic->file_size != 0) {
1657 filesize = ic->file_size;
1659 for(i = 0; i < ic->nb_streams; i++) {
1660 st = ic->streams[i];
1661 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1662 if (st->start_time == AV_NOPTS_VALUE ||
1663 st->duration == AV_NOPTS_VALUE) {
1665 st->duration = duration;
1672 #define DURATION_MAX_READ_SIZE 250000
1674 /* only usable for MPEG-PS streams */
1675 static void av_estimate_timings_from_pts(AVFormatContext *ic)
1677 AVPacket pkt1, *pkt = &pkt1;
1679 int read_size, i, ret;
1681 int64_t filesize, offset, duration;
1683 /* free previous packet */
1684 if (ic->cur_st && ic->cur_st->parser)
1685 av_free_packet(&ic->cur_pkt);
1688 /* flush packet queue */
1689 flush_packet_queue(ic);
1691 for(i=0;i<ic->nb_streams;i++) {
1692 st = ic->streams[i];
1694 av_parser_close(st->parser);
1699 /* we read the first packets to get the first PTS (not fully
1700 accurate, but it is enough now) */
1701 url_fseek(&ic->pb, 0, SEEK_SET);
1704 if (read_size >= DURATION_MAX_READ_SIZE)
1706 /* if all info is available, we can stop */
1707 for(i = 0;i < ic->nb_streams; i++) {
1708 st = ic->streams[i];
1709 if (st->start_time == AV_NOPTS_VALUE)
1712 if (i == ic->nb_streams)
1715 ret = av_read_packet(ic, pkt);
1718 read_size += pkt->size;
1719 st = ic->streams[pkt->stream_index];
1720 if (pkt->pts != AV_NOPTS_VALUE) {
1721 if (st->start_time == AV_NOPTS_VALUE)
1722 st->start_time = pkt->pts;
1724 av_free_packet(pkt);
1727 /* estimate the end time (duration) */
1728 /* XXX: may need to support wrapping */
1729 filesize = ic->file_size;
1730 offset = filesize - DURATION_MAX_READ_SIZE;
1734 url_fseek(&ic->pb, offset, SEEK_SET);
1737 if (read_size >= DURATION_MAX_READ_SIZE)
1739 /* if all info is available, we can stop */
1740 for(i = 0;i < ic->nb_streams; i++) {
1741 st = ic->streams[i];
1742 if (st->duration == AV_NOPTS_VALUE)
1745 if (i == ic->nb_streams)
1748 ret = av_read_packet(ic, pkt);
1751 read_size += pkt->size;
1752 st = ic->streams[pkt->stream_index];
1753 if (pkt->pts != AV_NOPTS_VALUE) {
1754 end_time = pkt->pts;
1755 duration = end_time - st->start_time;
1757 if (st->duration == AV_NOPTS_VALUE ||
1758 st->duration < duration)
1759 st->duration = duration;
1762 av_free_packet(pkt);
1765 fill_all_stream_timings(ic);
1767 url_fseek(&ic->pb, 0, SEEK_SET);
1770 static void av_estimate_timings(AVFormatContext *ic)
1774 /* get the file size, if possible */
1775 if (ic->iformat->flags & AVFMT_NOFILE) {
1778 file_size = url_fsize(&ic->pb);
1782 ic->file_size = file_size;
1784 if ((!strcmp(ic->iformat->name, "mpeg") ||
1785 !strcmp(ic->iformat->name, "mpegts")) &&
1786 file_size && !ic->pb.is_streamed) {
1787 /* get accurate estimate from the PTSes */
1788 av_estimate_timings_from_pts(ic);
1789 } else if (av_has_timings(ic)) {
1790 /* at least one components has timings - we use them for all
1792 fill_all_stream_timings(ic);
1794 /* less precise: use bit rate info */
1795 av_estimate_timings_from_bit_rate(ic);
1797 av_update_stream_timings(ic);
1803 for(i = 0;i < ic->nb_streams; i++) {
1804 st = ic->streams[i];
1805 printf("%d: start_time: %0.3f duration: %0.3f\n",
1806 i, (double)st->start_time / AV_TIME_BASE,
1807 (double)st->duration / AV_TIME_BASE);
1809 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1810 (double)ic->start_time / AV_TIME_BASE,
1811 (double)ic->duration / AV_TIME_BASE,
1812 ic->bit_rate / 1000);
1817 static int has_codec_parameters(AVCodecContext *enc)
1820 switch(enc->codec_type) {
1821 case CODEC_TYPE_AUDIO:
1822 val = enc->sample_rate;
1824 case CODEC_TYPE_VIDEO:
1825 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1834 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1838 int got_picture, ret=0;
1841 if(!st->codec->codec){
1842 codec = avcodec_find_decoder(st->codec->codec_id);
1845 ret = avcodec_open(st->codec, codec);
1850 if(!has_codec_parameters(st->codec)){
1851 switch(st->codec->codec_type) {
1852 case CODEC_TYPE_VIDEO:
1853 ret = avcodec_decode_video(st->codec, &picture,
1854 &got_picture, (uint8_t *)data, size);
1856 case CODEC_TYPE_AUDIO:
1857 samples = av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
1860 ret = avcodec_decode_audio(st->codec, samples,
1861 &got_picture, (uint8_t *)data, size);
1872 /* absolute maximum size we read until we abort */
1873 #define MAX_READ_SIZE 5000000
1875 /* maximum duration until we stop analysing the stream */
1876 #define MAX_STREAM_DURATION ((int)(AV_TIME_BASE * 3.0))
1879 * Read the beginning of a media file to get stream information. This
1880 * is useful for file formats with no headers such as MPEG. This
1881 * function also compute the real frame rate in case of mpeg2 repeat
1884 * @param ic media file handle
1885 * @return >=0 if OK. AVERROR_xxx if error.
1886 * @todo let user decide somehow what information is needed so we dont waste time geting stuff the user doesnt need
1888 int av_find_stream_info(AVFormatContext *ic)
1890 int i, count, ret, read_size, j;
1892 AVPacket pkt1, *pkt;
1893 AVPacketList *pktl=NULL, **ppktl;
1894 int64_t last_dts[MAX_STREAMS];
1895 int64_t duration_sum[MAX_STREAMS];
1896 int duration_count[MAX_STREAMS]={0};
1898 for(i=0;i<ic->nb_streams;i++) {
1899 st = ic->streams[i];
1900 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1901 /* if(!st->time_base.num)
1903 if(!st->codec->time_base.num)
1904 st->codec->time_base= st->time_base;
1906 //only for the split stuff
1908 st->parser = av_parser_init(st->codec->codec_id);
1909 if(st->need_parsing == 2 && st->parser){
1910 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1915 for(i=0;i<MAX_STREAMS;i++){
1916 last_dts[i]= AV_NOPTS_VALUE;
1917 duration_sum[i]= INT64_MAX;
1922 ppktl = &ic->packet_buffer;
1924 /* check if one codec still needs to be handled */
1925 for(i=0;i<ic->nb_streams;i++) {
1926 st = ic->streams[i];
1927 if (!has_codec_parameters(st->codec))
1929 /* variable fps and no guess at the real fps */
1930 if( st->codec->time_base.den >= 101LL*st->codec->time_base.num
1931 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1933 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1936 if (i == ic->nb_streams) {
1937 /* NOTE: if the format has no header, then we need to read
1938 some packets to get most of the streams, so we cannot
1940 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1941 /* if we found the info for all the codecs, we can stop */
1946 /* we did not get all the codec info, but we read too much data */
1947 if (read_size >= MAX_READ_SIZE) {
1953 /* NOTE: a new stream can be added there if no header in file
1954 (AVFMTCTX_NOHEADER) */
1955 ret = av_read_frame_internal(ic, &pkt1);
1958 ret = -1; /* we could not have all the codec parameters before EOF */
1959 for(i=0;i<ic->nb_streams;i++) {
1960 st = ic->streams[i];
1961 if (!has_codec_parameters(st->codec)){
1963 avcodec_string(buf, sizeof(buf), st->codec, 0);
1964 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
1972 pktl = av_mallocz(sizeof(AVPacketList));
1974 ret = AVERROR_NOMEM;
1978 /* add the packet in the buffered packet list */
1980 ppktl = &pktl->next;
1985 /* duplicate the packet */
1986 if (av_dup_packet(pkt) < 0) {
1987 ret = AVERROR_NOMEM;
1991 read_size += pkt->size;
1993 st = ic->streams[pkt->stream_index];
1994 st->codec_info_duration += pkt->duration;
1995 if (pkt->duration != 0)
1996 st->codec_info_nb_frames++;
1999 int index= pkt->stream_index;
2000 int64_t last= last_dts[index];
2001 int64_t duration= pkt->dts - last;
2003 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2004 if(duration*duration_count[index]*10/9 < duration_sum[index]){
2005 duration_sum[index]= duration;
2006 duration_count[index]=1;
2008 int factor= av_rescale(duration, duration_count[index], duration_sum[index]);
2009 duration_sum[index] += duration;
2010 duration_count[index]+= factor;
2012 if(st->codec_info_nb_frames == 0 && 0)
2013 st->codec_info_duration += duration;
2015 last_dts[pkt->stream_index]= pkt->dts;
2017 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2018 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2020 st->codec->extradata_size= i;
2021 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2022 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2023 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2027 /* if still no information, we try to open the codec and to
2028 decompress the frame. We try to avoid that in most cases as
2029 it takes longer and uses more memory. For MPEG4, we need to
2030 decompress for Quicktime. */
2031 if (!has_codec_parameters(st->codec) /*&&
2032 (st->codec->codec_id == CODEC_ID_FLV1 ||
2033 st->codec->codec_id == CODEC_ID_H264 ||
2034 st->codec->codec_id == CODEC_ID_H263 ||
2035 st->codec->codec_id == CODEC_ID_H261 ||
2036 st->codec->codec_id == CODEC_ID_VORBIS ||
2037 st->codec->codec_id == CODEC_ID_MJPEG ||
2038 st->codec->codec_id == CODEC_ID_PNG ||
2039 st->codec->codec_id == CODEC_ID_PAM ||
2040 st->codec->codec_id == CODEC_ID_PGM ||
2041 st->codec->codec_id == CODEC_ID_PGMYUV ||
2042 st->codec->codec_id == CODEC_ID_PBM ||
2043 st->codec->codec_id == CODEC_ID_PPM ||
2044 st->codec->codec_id == CODEC_ID_SHORTEN ||
2045 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
2046 try_decode_frame(st, pkt->data, pkt->size);
2048 if (av_rescale_q(st->codec_info_duration, st->time_base, AV_TIME_BASE_Q) >= MAX_STREAM_DURATION) {
2054 // close codecs which where opened in try_decode_frame()
2055 for(i=0;i<ic->nb_streams;i++) {
2056 st = ic->streams[i];
2057 if(st->codec->codec)
2058 avcodec_close(st->codec);
2060 for(i=0;i<ic->nb_streams;i++) {
2061 st = ic->streams[i];
2062 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2063 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
2064 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2066 if(duration_count[i] && st->codec->time_base.num*101LL <= st->codec->time_base.den &&
2067 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den){
2068 int64_t num, den, error, best_error;
2070 num= st->time_base.den*duration_count[i];
2071 den= st->time_base.num*duration_sum[i];
2073 best_error= INT64_MAX;
2074 for(j=1; j<60*12; j++){
2075 error= ABS(1001*12*num - 1001*j*den);
2076 if(error < best_error){
2078 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, j, 12, INT_MAX);
2081 for(j=24; j<=30; j+=6){
2082 error= ABS(1001*12*num - 1000*12*j*den);
2083 if(error < best_error){
2085 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, j*1000, 1001, INT_MAX);
2090 /* set real frame rate info */
2091 /* compute the real frame rate for telecine */
2092 if ((st->codec->codec_id == CODEC_ID_MPEG1VIDEO ||
2093 st->codec->codec_id == CODEC_ID_MPEG2VIDEO) &&
2094 st->codec->sub_id == 2) {
2095 if (st->codec_info_nb_frames >= 20) {
2096 float coded_frame_rate, est_frame_rate;
2097 est_frame_rate = ((double)st->codec_info_nb_frames * AV_TIME_BASE) /
2098 (double)st->codec_info_duration ;
2099 coded_frame_rate = 1.0/av_q2d(st->codec->time_base);
2101 printf("telecine: coded_frame_rate=%0.3f est_frame_rate=%0.3f\n",
2102 coded_frame_rate, est_frame_rate);
2104 /* if we detect that it could be a telecine, we
2105 signal it. It would be better to do it at a
2106 higher level as it can change in a film */
2107 if (coded_frame_rate >= 24.97 &&
2108 (est_frame_rate >= 23.5 && est_frame_rate < 24.5)) {
2109 st->r_frame_rate = (AVRational){24000, 1001};
2113 /* if no real frame rate, use the codec one */
2114 if (!st->r_frame_rate.num){
2115 st->r_frame_rate.num = st->codec->time_base.den;
2116 st->r_frame_rate.den = st->codec->time_base.num;
2121 av_estimate_timings(ic);
2123 /* correct DTS for b frame streams with no timestamps */
2124 for(i=0;i<ic->nb_streams;i++) {
2125 st = ic->streams[i];
2126 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2128 ppktl = &ic->packet_buffer;
2130 if(ppkt1->stream_index != i)
2132 if(ppkt1->pkt->dts < 0)
2134 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2136 ppkt1->pkt->dts -= delta;
2141 st->cur_dts -= delta;
2149 /*******************************************************/
2152 * start playing a network based stream (e.g. RTSP stream) at the
2155 int av_read_play(AVFormatContext *s)
2157 if (!s->iformat->read_play)
2158 return AVERROR_NOTSUPP;
2159 return s->iformat->read_play(s);
2163 * Pause a network based stream (e.g. RTSP stream).
2165 * Use av_read_play() to resume it.
2167 int av_read_pause(AVFormatContext *s)
2169 if (!s->iformat->read_pause)
2170 return AVERROR_NOTSUPP;
2171 return s->iformat->read_pause(s);
2175 * Close a media file (but not its codecs).
2177 * @param s media file handle
2179 void av_close_input_file(AVFormatContext *s)
2181 int i, must_open_file;
2184 /* free previous packet */
2185 if (s->cur_st && s->cur_st->parser)
2186 av_free_packet(&s->cur_pkt);
2188 if (s->iformat->read_close)
2189 s->iformat->read_close(s);
2190 for(i=0;i<s->nb_streams;i++) {
2191 /* free all data in a stream component */
2194 av_parser_close(st->parser);
2196 av_free(st->index_entries);
2197 av_free(st->codec->extradata);
2201 flush_packet_queue(s);
2203 if (s->iformat->flags & AVFMT_NOFILE) {
2206 if (must_open_file) {
2209 av_freep(&s->priv_data);
2214 * Add a new stream to a media file.
2216 * Can only be called in the read_header() function. If the flag
2217 * AVFMTCTX_NOHEADER is in the format context, then new streams
2218 * can be added in read_packet too.
2220 * @param s media file handle
2221 * @param id file format dependent stream id
2223 AVStream *av_new_stream(AVFormatContext *s, int id)
2228 if (s->nb_streams >= MAX_STREAMS)
2231 st = av_mallocz(sizeof(AVStream));
2235 st->codec= avcodec_alloc_context();
2237 /* no default bitrate if decoding */
2238 st->codec->bit_rate = 0;
2240 st->index = s->nb_streams;
2242 st->start_time = AV_NOPTS_VALUE;
2243 st->duration = AV_NOPTS_VALUE;
2244 st->cur_dts = AV_NOPTS_VALUE;
2246 /* default pts settings is MPEG like */
2247 av_set_pts_info(st, 33, 1, 90000);
2248 st->last_IP_pts = AV_NOPTS_VALUE;
2249 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2250 st->pts_buffer[i]= AV_NOPTS_VALUE;
2252 s->streams[s->nb_streams++] = st;
2256 /************************************************************/
2257 /* output media file */
2259 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2263 if (s->oformat->priv_data_size > 0) {
2264 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2266 return AVERROR_NOMEM;
2268 s->priv_data = NULL;
2270 if (s->oformat->set_parameters) {
2271 ret = s->oformat->set_parameters(s, ap);
2279 * allocate the stream private data and write the stream header to an
2282 * @param s media file handle
2283 * @return 0 if OK. AVERROR_xxx if error.
2285 int av_write_header(AVFormatContext *s)
2290 // some sanity checks
2291 for(i=0;i<s->nb_streams;i++) {
2294 switch (st->codec->codec_type) {
2295 case CODEC_TYPE_AUDIO:
2296 if(st->codec->sample_rate<=0){
2297 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2301 case CODEC_TYPE_VIDEO:
2302 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2303 av_log(s, AV_LOG_ERROR, "time base not set\n");
2306 if(st->codec->width<=0 || st->codec->height<=0){
2307 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2314 if(s->oformat->write_header){
2315 ret = s->oformat->write_header(s);
2320 /* init PTS generation */
2321 for(i=0;i<s->nb_streams;i++) {
2322 int64_t den = AV_NOPTS_VALUE;
2325 switch (st->codec->codec_type) {
2326 case CODEC_TYPE_AUDIO:
2327 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2329 case CODEC_TYPE_VIDEO:
2330 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2335 if (den != AV_NOPTS_VALUE) {
2337 return AVERROR_INVALIDDATA;
2338 av_frac_init(&st->pts, 0, 0, den);
2344 //FIXME merge with compute_pkt_fields
2345 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2346 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2347 int num, den, frame_size, i;
2349 // 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, delay, pkt->size, pkt->stream_index);
2351 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2354 /* duration field */
2355 if (pkt->duration == 0) {
2356 compute_frame_duration(&num, &den, st, NULL, pkt);
2358 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2362 //XXX/FIXME this is a temporary hack until all encoders output pts
2363 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2365 // pkt->pts= st->cur_dts;
2366 pkt->pts= st->pts.val;
2369 //calculate dts from pts
2370 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2371 st->pts_buffer[0]= pkt->pts;
2372 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2373 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2374 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2375 SWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2377 pkt->dts= st->pts_buffer[0];
2380 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2381 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2384 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2385 av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n");
2389 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%lld dts2:%lld\n", pkt->pts, pkt->dts);
2390 st->cur_dts= pkt->dts;
2391 st->pts.val= pkt->dts;
2394 switch (st->codec->codec_type) {
2395 case CODEC_TYPE_AUDIO:
2396 frame_size = get_audio_frame_size(st->codec, pkt->size);
2398 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
2399 but it would be better if we had the real timestamps from the encoder */
2400 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2401 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2404 case CODEC_TYPE_VIDEO:
2405 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2413 static void truncate_ts(AVStream *st, AVPacket *pkt){
2414 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2417 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here
2419 pkt->pts &= pts_mask;
2420 pkt->dts &= pts_mask;
2424 * Write a packet to an output media file.
2426 * The packet shall contain one audio or video frame.
2428 * @param s media file handle
2429 * @param pkt the packet, which contains the stream_index, buf/buf_size, dts/pts, ...
2430 * @return < 0 if error, = 0 if OK, 1 if end of stream wanted.
2432 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2436 ret=compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2437 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2440 truncate_ts(s->streams[pkt->stream_index], pkt);
2442 ret= s->oformat->write_packet(s, pkt);
2444 ret= url_ferror(&s->pb);
2449 * Interleave a packet per DTS in an output media file.
2451 * Packets with pkt->destruct == av_destruct_packet will be freed inside this function,
2452 * so they cannot be used after it, note calling av_free_packet() on them is still safe.
2454 * @param s media file handle
2455 * @param out the interleaved packet will be output here
2456 * @param in the input packet
2457 * @param flush 1 if no further packets are available as input and all
2458 * remaining packets should be output
2459 * @return 1 if a packet was output, 0 if no packet could be output,
2460 * < 0 if an error occured
2462 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2463 AVPacketList *pktl, **next_point, *this_pktl;
2465 int streams[MAX_STREAMS];
2468 AVStream *st= s->streams[ pkt->stream_index];
2470 // assert(pkt->destruct != av_destruct_packet); //FIXME
2472 this_pktl = av_mallocz(sizeof(AVPacketList));
2473 this_pktl->pkt= *pkt;
2474 if(pkt->destruct == av_destruct_packet)
2475 pkt->destruct= NULL; // non shared -> must keep original from being freed
2477 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2479 next_point = &s->packet_buffer;
2481 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2482 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2483 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2484 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2486 next_point= &(*next_point)->next;
2488 this_pktl->next= *next_point;
2489 *next_point= this_pktl;
2492 memset(streams, 0, sizeof(streams));
2493 pktl= s->packet_buffer;
2495 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%lld\n", pktl->pkt.stream_index, pktl->pkt.dts);
2496 if(streams[ pktl->pkt.stream_index ] == 0)
2498 streams[ pktl->pkt.stream_index ]++;
2502 if(s->nb_streams == stream_count || (flush && stream_count)){
2503 pktl= s->packet_buffer;
2506 s->packet_buffer= pktl->next;
2510 av_init_packet(out);
2516 * Interleaves a AVPacket correctly so it can be muxed.
2517 * @param out the interleaved packet will be output here
2518 * @param in the input packet
2519 * @param flush 1 if no further packets are available as input and all
2520 * remaining packets should be output
2521 * @return 1 if a packet was output, 0 if no packet could be output,
2522 * < 0 if an error occured
2524 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2525 if(s->oformat->interleave_packet)
2526 return s->oformat->interleave_packet(s, out, in, flush);
2528 return av_interleave_packet_per_dts(s, out, in, flush);
2532 * Writes a packet to an output media file ensuring correct interleaving.
2534 * The packet must contain one audio or video frame.
2535 * If the packets are already correctly interleaved the application should
2536 * call av_write_frame() instead as its slightly faster, its also important
2537 * to keep in mind that completly non interleaved input will need huge amounts
2538 * of memory to interleave with this, so its prefereable to interleave at the
2541 * @param s media file handle
2542 * @param pkt the packet, which contains the stream_index, buf/buf_size, dts/pts, ...
2543 * @return < 0 if error, = 0 if OK, 1 if end of stream wanted.
2545 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2546 AVStream *st= s->streams[ pkt->stream_index];
2548 //FIXME/XXX/HACK drop zero sized packets
2549 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2552 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %Ld %Ld\n", pkt->size, pkt->dts, pkt->pts);
2553 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2556 if(pkt->dts == AV_NOPTS_VALUE)
2561 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2562 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2565 truncate_ts(s->streams[opkt.stream_index], &opkt);
2566 ret= s->oformat->write_packet(s, &opkt);
2568 av_free_packet(&opkt);
2573 if(url_ferror(&s->pb))
2574 return url_ferror(&s->pb);
2579 * @brief Write the stream trailer to an output media file and
2580 * free the file private data.
2582 * @param s media file handle
2583 * @return 0 if OK. AVERROR_xxx if error.
2585 int av_write_trailer(AVFormatContext *s)
2591 ret= av_interleave_packet(s, &pkt, NULL, 1);
2592 if(ret<0) //FIXME cleanup needed for ret<0 ?
2597 truncate_ts(s->streams[pkt.stream_index], &pkt);
2598 ret= s->oformat->write_packet(s, &pkt);
2600 av_free_packet(&pkt);
2604 if(url_ferror(&s->pb))
2608 if(s->oformat->write_trailer)
2609 ret = s->oformat->write_trailer(s);
2612 ret=url_ferror(&s->pb);
2613 for(i=0;i<s->nb_streams;i++)
2614 av_freep(&s->streams[i]->priv_data);
2615 av_freep(&s->priv_data);
2619 /* "user interface" functions */
2621 void dump_format(AVFormatContext *ic,
2629 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2630 is_output ? "Output" : "Input",
2632 is_output ? ic->oformat->name : ic->iformat->name,
2633 is_output ? "to" : "from", url);
2635 av_log(NULL, AV_LOG_INFO, " Duration: ");
2636 if (ic->duration != AV_NOPTS_VALUE) {
2637 int hours, mins, secs, us;
2638 secs = ic->duration / AV_TIME_BASE;
2639 us = ic->duration % AV_TIME_BASE;
2644 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%01d", hours, mins, secs,
2645 (10 * us) / AV_TIME_BASE);
2647 av_log(NULL, AV_LOG_INFO, "N/A");
2649 if (ic->start_time != AV_NOPTS_VALUE) {
2651 av_log(NULL, AV_LOG_INFO, ", start: ");
2652 secs = ic->start_time / AV_TIME_BASE;
2653 us = ic->start_time % AV_TIME_BASE;
2654 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2655 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2657 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2659 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2661 av_log(NULL, AV_LOG_INFO, "N/A");
2663 av_log(NULL, AV_LOG_INFO, "\n");
2665 for(i=0;i<ic->nb_streams;i++) {
2666 AVStream *st = ic->streams[i];
2667 int g= ff_gcd(st->time_base.num, st->time_base.den);
2668 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2669 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2670 /* the pid is an important information, so we display it */
2671 /* XXX: add a generic system */
2673 flags = ic->oformat->flags;
2675 flags = ic->iformat->flags;
2676 if (flags & AVFMT_SHOW_IDS) {
2677 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2679 if (strlen(st->language) > 0) {
2680 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2682 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2683 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2684 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2685 if(st->r_frame_rate.den && st->r_frame_rate.num)
2686 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(r)", av_q2d(st->r_frame_rate));
2687 /* else if(st->time_base.den && st->time_base.num)
2688 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(m)", 1/av_q2d(st->time_base));*/
2690 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(c)", 1/av_q2d(st->codec->time_base));
2692 av_log(NULL, AV_LOG_INFO, "\n");
2699 int frame_rate, frame_rate_base;
2702 static AbvEntry frame_abvs[] = {
2703 { "ntsc", 720, 480, 30000, 1001 },
2704 { "pal", 720, 576, 25, 1 },
2705 { "qntsc", 352, 240, 30000, 1001 }, /* VCD compliant ntsc */
2706 { "qpal", 352, 288, 25, 1 }, /* VCD compliant pal */
2707 { "sntsc", 640, 480, 30000, 1001 }, /* square pixel ntsc */
2708 { "spal", 768, 576, 25, 1 }, /* square pixel pal */
2709 { "film", 352, 240, 24, 1 },
2710 { "ntsc-film", 352, 240, 24000, 1001 },
2711 { "sqcif", 128, 96, 0, 0 },
2712 { "qcif", 176, 144, 0, 0 },
2713 { "cif", 352, 288, 0, 0 },
2714 { "4cif", 704, 576, 0, 0 },
2718 * parses width and height out of string str.
2720 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2723 int n = sizeof(frame_abvs) / sizeof(AbvEntry);
2725 int frame_width = 0, frame_height = 0;
2728 if (!strcmp(frame_abvs[i].abv, str)) {
2729 frame_width = frame_abvs[i].width;
2730 frame_height = frame_abvs[i].height;
2736 frame_width = strtol(p, (char **)&p, 10);
2739 frame_height = strtol(p, (char **)&p, 10);
2741 if (frame_width <= 0 || frame_height <= 0)
2743 *width_ptr = frame_width;
2744 *height_ptr = frame_height;
2749 * Converts frame rate from string to a fraction.
2751 * First we try to get an exact integer or fractional frame rate.
2752 * If this fails we convert the frame rate to a double and return
2753 * an approximate fraction using the DEFAULT_FRAME_RATE_BASE.
2755 int parse_frame_rate(int *frame_rate, int *frame_rate_base, const char *arg)
2760 /* First, we check our abbreviation table */
2761 for (i = 0; i < sizeof(frame_abvs)/sizeof(*frame_abvs); ++i)
2762 if (!strcmp(frame_abvs[i].abv, arg)) {
2763 *frame_rate = frame_abvs[i].frame_rate;
2764 *frame_rate_base = frame_abvs[i].frame_rate_base;
2768 /* Then, we try to parse it as fraction */
2769 cp = strchr(arg, '/');
2771 cp = strchr(arg, ':');
2774 *frame_rate = strtol(arg, &cpp, 10);
2775 if (cpp != arg || cpp == cp)
2776 *frame_rate_base = strtol(cp+1, &cpp, 10);
2781 /* Finally we give up and parse it as double */
2782 AVRational time_base = av_d2q(strtod(arg, 0), DEFAULT_FRAME_RATE_BASE);
2783 *frame_rate_base = time_base.den;
2784 *frame_rate = time_base.num;
2786 if (!*frame_rate || !*frame_rate_base)
2793 * Converts date string to number of seconds since Jan 1st, 1970.
2797 * - If not a duration:
2798 * [{YYYY-MM-DD|YYYYMMDD}]{T| }{HH[:MM[:SS[.m...]]][Z]|HH[MM[SS[.m...]]][Z]}
2799 * Time is localtime unless Z is suffixed to the end. In this case GMT
2800 * Return the date in micro seconds since 1970
2803 * HH[:MM[:SS[.m...]]]
2807 #ifndef CONFIG_WINCE
2808 int64_t parse_date(const char *datestr, int duration)
2814 static const char *date_fmt[] = {
2818 static const char *time_fmt[] = {
2828 time_t now = time(0);
2830 len = strlen(datestr);
2832 lastch = datestr[len - 1];
2835 is_utc = (lastch == 'z' || lastch == 'Z');
2837 memset(&dt, 0, sizeof(dt));
2842 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2843 q = small_strptime(p, date_fmt[i], &dt);
2853 dt = *localtime(&now);
2855 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2860 if (*p == 'T' || *p == 't' || *p == ' ')
2863 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2864 q = small_strptime(p, time_fmt[i], &dt);
2874 q = small_strptime(p, time_fmt[0], &dt);
2876 dt.tm_sec = strtol(p, (char **)&q, 10);
2882 /* Now we have all the fields that we can get */
2887 return now * int64_t_C(1000000);
2891 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2893 dt.tm_isdst = -1; /* unknown */
2906 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2909 val += n * (*q - '0');
2913 return negative ? -t : t;
2915 #endif /* CONFIG_WINCE */
2918 * Attempts to find a specific tag in a URL.
2920 * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done.
2921 * Return 1 if found.
2923 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2933 while (*p != '\0' && *p != '=' && *p != '&') {
2934 if ((q - tag) < sizeof(tag) - 1)
2942 while (*p != '&' && *p != '\0') {
2943 if ((q - arg) < arg_size - 1) {
2953 if (!strcmp(tag, tag1))
2963 * Returns in 'buf' the path with '%d' replaced by number.
2965 * Also handles the '%0nd' format where 'n' is the total number
2966 * of digits and '%%'.
2968 * @param buf destination buffer
2969 * @param buf_size destination buffer size
2970 * @param path numbered sequence string
2971 * @number frame number
2972 * @return 0 if OK, -1 if format error.
2974 int av_get_frame_filename(char *buf, int buf_size,
2975 const char *path, int number)
2978 char *q, buf1[20], c;
2979 int nd, len, percentd_found;
2991 while (isdigit(*p)) {
2992 nd = nd * 10 + *p++ - '0';
2995 } while (isdigit(c));
3004 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3006 if ((q - buf + len) > buf_size - 1)
3008 memcpy(q, buf1, len);
3016 if ((q - buf) < buf_size - 1)
3020 if (!percentd_found)
3030 * Print nice hexa dump of a buffer
3031 * @param f stream for output
3033 * @param size buffer size
3035 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3039 for(i=0;i<size;i+=16) {
3043 fprintf(f, "%08x ", i);
3046 fprintf(f, " %02x", buf[i+j]);
3051 for(j=0;j<len;j++) {
3053 if (c < ' ' || c > '~')
3055 fprintf(f, "%c", c);
3062 * Print on 'f' a nice dump of a packet
3063 * @param f stream for output
3064 * @param pkt packet to dump
3065 * @param dump_payload true if the payload must be displayed too
3067 //FIXME needs to know the time_base
3068 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3070 fprintf(f, "stream #%d:\n", pkt->stream_index);
3071 fprintf(f, " keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
3072 fprintf(f, " duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
3073 /* DTS is _always_ valid after av_read_frame() */
3074 fprintf(f, " dts=");
3075 if (pkt->dts == AV_NOPTS_VALUE)
3078 fprintf(f, "%0.3f", (double)pkt->dts / AV_TIME_BASE);
3079 /* PTS may be not known if B frames are present */
3080 fprintf(f, " pts=");
3081 if (pkt->pts == AV_NOPTS_VALUE)
3084 fprintf(f, "%0.3f", (double)pkt->pts / AV_TIME_BASE);
3086 fprintf(f, " size=%d\n", pkt->size);
3088 av_hex_dump(f, pkt->data, pkt->size);
3091 void url_split(char *proto, int proto_size,
3092 char *authorization, int authorization_size,
3093 char *hostname, int hostname_size,
3095 char *path, int path_size,
3106 while (*p != ':' && *p != '\0') {
3107 if ((q - proto) < proto_size - 1)
3113 if (authorization_size > 0)
3114 authorization[0] = '\0';
3118 if (hostname_size > 0)
3122 char *at,*slash; // PETR: position of '@' character and '/' character
3129 at = strchr(p,'@'); // PETR: get the position of '@'
3130 slash = strchr(p,'/'); // PETR: get position of '/' - end of hostname
3131 if (at && slash && at > slash) at = NULL; // PETR: not interested in '@' behind '/'
3133 q = at ? authorization : hostname; // PETR: if '@' exists starting with auth.
3135 while ((at || *p != ':') && *p != '/' && *p != '?' && *p != '\0') { // PETR:
3136 if (*p == '@') { // PETR: passed '@'
3137 if (authorization_size > 0)
3141 } else if (!at) { // PETR: hostname
3142 if ((q - hostname) < hostname_size - 1)
3145 if ((q - authorization) < authorization_size - 1)
3150 if (hostname_size > 0)
3154 port = strtoul(p, (char **)&p, 10);
3159 pstrcpy(path, path_size, p);
3163 * Set the pts for a given stream.
3166 * @param pts_wrap_bits number of bits effectively used by the pts
3167 * (used for wrap control, 33 is the value for MPEG)
3168 * @param pts_num numerator to convert to seconds (MPEG: 1)
3169 * @param pts_den denominator to convert to seconds (MPEG: 90000)
3171 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3172 int pts_num, int pts_den)
3174 s->pts_wrap_bits = pts_wrap_bits;
3175 s->time_base.num = pts_num;
3176 s->time_base.den = pts_den;
3179 /* fraction handling */
3182 * f = val + (num / den) + 0.5.
3184 * 'num' is normalized so that it is such as 0 <= num < den.
3186 * @param f fractional number
3187 * @param val integer value
3188 * @param num must be >= 0
3189 * @param den must be >= 1
3191 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
3204 * Set f to (val + 0.5).
3206 static void av_frac_set(AVFrac *f, int64_t val)
3209 f->num = f->den >> 1;
3213 * Fractionnal addition to f: f = f + (incr / f->den).
3215 * @param f fractional number
3216 * @param incr increment, can be positive or negative
3218 static void av_frac_add(AVFrac *f, int64_t incr)
3222 num = f->num + incr;
3225 f->val += num / den;
3231 } else if (num >= den) {
3232 f->val += num / den;
3239 * register a new image format
3240 * @param img_fmt Image format descriptor
3242 void av_register_image_format(AVImageFormat *img_fmt)
3246 p = &first_image_format;
3247 while (*p != NULL) p = &(*p)->next;
3249 img_fmt->next = NULL;
3253 * Guesses image format based on data in the image.
3255 AVImageFormat *av_probe_image_format(AVProbeData *pd)
3257 AVImageFormat *fmt1, *fmt;
3258 int score, score_max;
3262 for(fmt1 = first_image_format; fmt1 != NULL; fmt1 = fmt1->next) {
3263 if (fmt1->img_probe) {
3264 score = fmt1->img_probe(pd);
3265 if (score > score_max) {
3275 * Guesses image format based on file name extensions.
3277 AVImageFormat *guess_image_format(const char *filename)
3279 AVImageFormat *fmt1;
3281 for(fmt1 = first_image_format; fmt1 != NULL; fmt1 = fmt1->next) {
3282 if (fmt1->extensions && match_ext(filename, fmt1->extensions))
3289 * Read an image from a stream.
3290 * @param gb byte stream containing the image
3291 * @param fmt image format, NULL if probing is required
3293 int av_read_image(ByteIOContext *pb, const char *filename,
3295 int (*alloc_cb)(void *, AVImageInfo *info), void *opaque)
3297 uint8_t buf[PROBE_BUF_MIN];
3298 AVProbeData probe_data, *pd = &probe_data;
3303 pd->filename = filename;
3305 pos = url_ftell(pb);
3306 pd->buf_size = get_buffer(pb, buf, PROBE_BUF_MIN);
3307 url_fseek(pb, pos, SEEK_SET);
3308 fmt = av_probe_image_format(pd);
3311 return AVERROR_NOFMT;
3312 ret = fmt->img_read(pb, alloc_cb, opaque);
3317 * Write an image to a stream.
3318 * @param pb byte stream for the image output
3319 * @param fmt image format
3320 * @param img image data and informations
3322 int av_write_image(ByteIOContext *pb, AVImageFormat *fmt, AVImageInfo *img)
3324 return fmt->img_write(pb, img);