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;
267 * Allocate the payload of a packet and intialized its fields to default values.
269 * @param filename possible numbered sequence string
270 * @return 1 if a valid numbered sequence string, 0 otherwise.
272 int av_filename_number_test(const char *filename)
275 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
281 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened)
283 AVInputFormat *fmt1, *fmt;
284 int score, score_max;
288 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
289 if (!is_opened && !(fmt1->flags & AVFMT_NOFILE))
292 if (fmt1->read_probe) {
293 score = fmt1->read_probe(pd);
294 } else if (fmt1->extensions) {
295 if (match_ext(pd->filename, fmt1->extensions)) {
299 if (score > score_max) {
307 /************************************************************/
308 /* input media file */
311 * Open a media file from an IO stream. 'fmt' must be specified.
313 static const char* format_to_name(void* ptr)
315 AVFormatContext* fc = (AVFormatContext*) ptr;
316 if(fc->iformat) return fc->iformat->name;
317 else if(fc->oformat) return fc->oformat->name;
321 #define OFFSET(x) offsetof(AVFormatContext,x)
322 #define DEFAULT 0 //should be NAN but it doesnt work as its not a constant in glibc as required by ANSI/ISO C
323 //these names are too long to be readable
324 #define E AV_OPT_FLAG_ENCODING_PARAM
325 #define D AV_OPT_FLAG_DECODING_PARAM
327 static const AVOption options[]={
328 {"probesize", NULL, OFFSET(probesize), FF_OPT_TYPE_INT, 32000, 32, INT_MAX, D}, /* 32000 from mpegts.c: 1.0 second at 24Mbit/s */
329 {"muxrate", "set mux rate", OFFSET(mux_rate), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
330 {"packetsize", "set packet size", OFFSET(packet_size), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
331 {"fflags", NULL, OFFSET(flags), FF_OPT_TYPE_FLAGS, DEFAULT, INT_MIN, INT_MAX, D, "fflags"},
332 {"ignidx", "ignore index", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_IGNIDX, INT_MIN, INT_MAX, D, "fflags"},
333 {"genpts", "generate pts", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_GENPTS, INT_MIN, INT_MAX, D, "fflags"},
334 {"track", " set the track number", OFFSET(track), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
335 {"year", "set the year", OFFSET(year), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, E},
343 static const AVClass av_format_context_class = { "AVFormatContext", format_to_name, options };
345 #if LIBAVCODEC_VERSION_INT > ((52<<16)+(0<<8)+0)
348 void avformat_get_context_defaults(AVFormatContext *s){
349 memset(s, 0, sizeof(AVFormatContext));
351 s->av_class = &av_format_context_class;
353 av_opt_set_defaults(s);
356 AVFormatContext *av_alloc_format_context(void)
359 ic = av_malloc(sizeof(AVFormatContext));
361 avformat_get_context_defaults(ic);
362 ic->av_class = &av_format_context_class;
367 * Allocates all the structures needed to read an input stream.
368 * This does not open the needed codecs for decoding the stream[s].
370 int av_open_input_stream(AVFormatContext **ic_ptr,
371 ByteIOContext *pb, const char *filename,
372 AVInputFormat *fmt, AVFormatParameters *ap)
376 AVFormatParameters default_ap;
380 memset(ap, 0, sizeof(default_ap));
383 if(!ap->prealloced_context)
384 ic = av_alloc_format_context();
394 ic->duration = AV_NOPTS_VALUE;
395 ic->start_time = AV_NOPTS_VALUE;
396 pstrcpy(ic->filename, sizeof(ic->filename), filename);
398 /* allocate private data */
399 if (fmt->priv_data_size > 0) {
400 ic->priv_data = av_mallocz(fmt->priv_data_size);
401 if (!ic->priv_data) {
406 ic->priv_data = NULL;
409 err = ic->iformat->read_header(ic, ap);
414 ic->data_offset = url_ftell(&ic->pb);
420 av_freep(&ic->priv_data);
427 /** Size of probe buffer, for guessing file type from file contents. */
428 #define PROBE_BUF_MIN 2048
429 #define PROBE_BUF_MAX (1<<20)
432 * Open a media file as input. The codec are not opened. Only the file
433 * header (if present) is read.
435 * @param ic_ptr the opened media file handle is put here
436 * @param filename filename to open.
437 * @param fmt if non NULL, force the file format to use
438 * @param buf_size optional buffer size (zero if default is OK)
439 * @param ap additionnal parameters needed when opening the file (NULL if default)
440 * @return 0 if OK. AVERROR_xxx otherwise.
442 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
445 AVFormatParameters *ap)
447 int err, must_open_file, file_opened, probe_size;
448 AVProbeData probe_data, *pd = &probe_data;
449 ByteIOContext pb1, *pb = &pb1;
454 pd->filename = filename;
459 /* guess format if no file can be opened */
460 fmt = av_probe_input_format(pd, 0);
463 /* do not open file if the format does not need it. XXX: specific
464 hack needed to handle RTSP/TCP */
466 if (fmt && (fmt->flags & AVFMT_NOFILE)) {
468 pb= NULL; //FIXME this or memset(pb, 0, sizeof(ByteIOContext)); otherwise its uninitalized
471 if (!fmt || must_open_file) {
472 /* if no file needed do not try to open one */
473 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
479 url_setbufsize(pb, buf_size);
482 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
483 /* read probe data */
484 pd->buf= av_realloc(pd->buf, probe_size);
485 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
486 if (url_fseek(pb, 0, SEEK_SET) == (offset_t)-EPIPE) {
488 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
494 /* guess file format */
495 fmt = av_probe_input_format(pd, 1);
500 /* if still no format found, error */
506 /* XXX: suppress this hack for redirectors */
507 #ifdef CONFIG_NETWORK
508 if (fmt == &redir_demuxer) {
509 err = redir_open(ic_ptr, pb);
515 /* check filename in case of an image number is expected */
516 if (fmt->flags & AVFMT_NEEDNUMBER) {
517 if (!av_filename_number_test(filename)) {
518 err = AVERROR_NUMEXPECTED;
522 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
535 /*******************************************************/
538 * Read a transport packet from a media file.
540 * This function is absolete and should never be used.
541 * Use av_read_frame() instead.
543 * @param s media file handle
544 * @param pkt is filled
545 * @return 0 if OK. AVERROR_xxx if error.
547 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
549 return s->iformat->read_packet(s, pkt);
552 /**********************************************************/
555 * Get the number of samples of an audio frame. Return (-1) if error.
557 static int get_audio_frame_size(AVCodecContext *enc, int size)
561 if (enc->frame_size <= 1) {
562 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
564 if (bits_per_sample) {
565 if (enc->channels == 0)
567 frame_size = (size << 3) / (bits_per_sample * enc->channels);
569 /* used for example by ADPCM codecs */
570 if (enc->bit_rate == 0)
572 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
575 frame_size = enc->frame_size;
582 * Return the frame duration in seconds, return 0 if not available.
584 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
585 AVCodecParserContext *pc, AVPacket *pkt)
591 switch(st->codec->codec_type) {
592 case CODEC_TYPE_VIDEO:
593 if(st->time_base.num*1000LL > st->time_base.den){
594 *pnum = st->time_base.num;
595 *pden = st->time_base.den;
596 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
597 *pnum = st->codec->time_base.num;
598 *pden = st->codec->time_base.den;
599 if (pc && pc->repeat_pict) {
601 *pnum = (*pnum) * (2 + pc->repeat_pict);
605 case CODEC_TYPE_AUDIO:
606 frame_size = get_audio_frame_size(st->codec, pkt->size);
610 *pden = st->codec->sample_rate;
617 static int is_intra_only(AVCodecContext *enc){
618 if(enc->codec_type == CODEC_TYPE_AUDIO){
620 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
621 switch(enc->codec_id){
623 case CODEC_ID_MJPEGB:
625 case CODEC_ID_RAWVIDEO:
626 case CODEC_ID_DVVIDEO:
627 case CODEC_ID_HUFFYUV:
628 case CODEC_ID_FFVHUFF:
639 static int64_t lsb2full(int64_t lsb, int64_t last_ts, int lsb_bits){
640 int64_t mask = lsb_bits < 64 ? (1LL<<lsb_bits)-1 : -1LL;
641 int64_t delta= last_ts - mask/2;
642 return ((lsb - delta)&mask) + delta;
645 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
646 AVCodecParserContext *pc, AVPacket *pkt)
648 int num, den, presentation_delayed;
649 /* handle wrapping */
650 if(st->cur_dts != AV_NOPTS_VALUE){
651 if(pkt->pts != AV_NOPTS_VALUE)
652 pkt->pts= lsb2full(pkt->pts, st->cur_dts, st->pts_wrap_bits);
653 if(pkt->dts != AV_NOPTS_VALUE)
654 pkt->dts= lsb2full(pkt->dts, st->cur_dts, st->pts_wrap_bits);
657 if (pkt->duration == 0) {
658 compute_frame_duration(&num, &den, st, pc, pkt);
660 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
664 if(is_intra_only(st->codec))
665 pkt->flags |= PKT_FLAG_KEY;
667 /* do we have a video B frame ? */
668 presentation_delayed = 0;
669 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
670 /* XXX: need has_b_frame, but cannot get it if the codec is
672 if (( st->codec->codec_id == CODEC_ID_H264
673 || st->codec->has_b_frames) &&
674 pc && pc->pict_type != FF_B_TYPE)
675 presentation_delayed = 1;
676 /* this may be redundant, but it shouldnt hurt */
677 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
678 presentation_delayed = 1;
681 if(st->cur_dts == AV_NOPTS_VALUE){
682 if(presentation_delayed) st->cur_dts = -pkt->duration;
683 else st->cur_dts = 0;
686 // 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);
687 /* interpolate PTS and DTS if they are not present */
688 if (presentation_delayed) {
689 /* DTS = decompression time stamp */
690 /* PTS = presentation time stamp */
691 if (pkt->dts == AV_NOPTS_VALUE) {
692 /* if we know the last pts, use it */
693 if(st->last_IP_pts != AV_NOPTS_VALUE)
694 st->cur_dts = pkt->dts = st->last_IP_pts;
696 pkt->dts = st->cur_dts;
698 st->cur_dts = pkt->dts;
700 /* this is tricky: the dts must be incremented by the duration
701 of the frame we are displaying, i.e. the last I or P frame */
702 if (st->last_IP_duration == 0)
703 st->cur_dts += pkt->duration;
705 st->cur_dts += st->last_IP_duration;
706 st->last_IP_duration = pkt->duration;
707 st->last_IP_pts= pkt->pts;
708 /* cannot compute PTS if not present (we can compute it only
709 by knowing the futur */
710 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
711 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
712 int64_t old_diff= ABS(st->cur_dts - pkt->duration - pkt->pts);
713 int64_t new_diff= ABS(st->cur_dts - pkt->pts);
714 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
715 pkt->pts += pkt->duration;
716 // 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);
720 /* presentation is not delayed : PTS and DTS are the same */
721 if (pkt->pts == AV_NOPTS_VALUE) {
722 if (pkt->dts == AV_NOPTS_VALUE) {
723 pkt->pts = st->cur_dts;
724 pkt->dts = st->cur_dts;
727 st->cur_dts = pkt->dts;
731 st->cur_dts = pkt->pts;
734 st->cur_dts += pkt->duration;
736 // 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);
741 /* key frame computation */
742 switch(st->codec->codec_type) {
743 case CODEC_TYPE_VIDEO:
744 if (pc->pict_type == FF_I_TYPE)
745 pkt->flags |= PKT_FLAG_KEY;
747 case CODEC_TYPE_AUDIO:
748 pkt->flags |= PKT_FLAG_KEY;
756 void av_destruct_packet_nofree(AVPacket *pkt)
758 pkt->data = NULL; pkt->size = 0;
761 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
767 /* select current input stream component */
770 if (!st->need_parsing || !st->parser) {
771 /* no parsing needed: we just output the packet as is */
772 /* raw data support */
774 compute_pkt_fields(s, st, NULL, pkt);
777 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
778 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
779 s->cur_ptr, s->cur_len,
780 s->cur_pkt.pts, s->cur_pkt.dts);
781 s->cur_pkt.pts = AV_NOPTS_VALUE;
782 s->cur_pkt.dts = AV_NOPTS_VALUE;
783 /* increment read pointer */
787 /* return packet if any */
791 pkt->stream_index = st->index;
792 pkt->pts = st->parser->pts;
793 pkt->dts = st->parser->dts;
794 pkt->destruct = av_destruct_packet_nofree;
795 compute_pkt_fields(s, st, st->parser, pkt);
800 av_free_packet(&s->cur_pkt);
804 /* read next packet */
805 ret = av_read_packet(s, &s->cur_pkt);
809 /* return the last frames, if any */
810 for(i = 0; i < s->nb_streams; i++) {
812 if (st->parser && st->need_parsing) {
813 av_parser_parse(st->parser, st->codec,
814 &pkt->data, &pkt->size,
816 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
821 /* no more packets: really terminates parsing */
825 st = s->streams[s->cur_pkt.stream_index];
826 if(st->codec->debug & FF_DEBUG_PTS)
827 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%lld, dts=%lld, size=%d\n",
828 s->cur_pkt.stream_index,
834 s->cur_ptr = s->cur_pkt.data;
835 s->cur_len = s->cur_pkt.size;
836 if (st->need_parsing && !st->parser) {
837 st->parser = av_parser_init(st->codec->codec_id);
839 /* no parser available : just output the raw packets */
840 st->need_parsing = 0;
841 }else if(st->need_parsing == 2){
842 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
847 if(st->codec->debug & FF_DEBUG_PTS)
848 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%lld, dts=%lld, size=%d\n",
858 * Return the next frame of a stream.
860 * The returned packet is valid
861 * until the next av_read_frame() or until av_close_input_file() and
862 * must be freed with av_free_packet. For video, the packet contains
863 * exactly one frame. For audio, it contains an integer number of
864 * frames if each frame has a known fixed size (e.g. PCM or ADPCM
865 * data). If the audio frames have a variable size (e.g. MPEG audio),
866 * then it contains one frame.
868 * pkt->pts, pkt->dts and pkt->duration are always set to correct
869 * values in AV_TIME_BASE unit (and guessed if the format cannot
870 * provided them). pkt->pts can be AV_NOPTS_VALUE if the video format
871 * has B frames, so it is better to rely on pkt->dts if you do not
872 * decompress the payload.
874 * @return 0 if OK, < 0 if error or end of file.
876 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
880 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
883 pktl = s->packet_buffer;
885 AVPacket *next_pkt= &pktl->pkt;
887 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
888 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
889 if( pktl->pkt.stream_index == next_pkt->stream_index
890 && next_pkt->dts < pktl->pkt.dts
891 && pktl->pkt.pts != pktl->pkt.dts //not b frame
892 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
893 next_pkt->pts= pktl->pkt.dts;
897 pktl = s->packet_buffer;
900 if( next_pkt->pts != AV_NOPTS_VALUE
901 || next_pkt->dts == AV_NOPTS_VALUE
903 /* read packet from packet buffer, if there is data */
905 s->packet_buffer = pktl->next;
911 AVPacketList **plast_pktl= &s->packet_buffer;
912 int ret= av_read_frame_internal(s, pkt);
914 if(pktl && ret != -EAGAIN){
921 /* duplicate the packet */
922 if (av_dup_packet(pkt) < 0)
923 return AVERROR_NOMEM;
925 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
927 pktl = av_mallocz(sizeof(AVPacketList));
929 return AVERROR_NOMEM;
931 /* add the packet in the buffered packet list */
935 assert(!s->packet_buffer);
936 return av_read_frame_internal(s, pkt);
941 /* XXX: suppress the packet queue */
942 static void flush_packet_queue(AVFormatContext *s)
947 pktl = s->packet_buffer;
950 s->packet_buffer = pktl->next;
951 av_free_packet(&pktl->pkt);
956 /*******************************************************/
959 int av_find_default_stream_index(AVFormatContext *s)
964 if (s->nb_streams <= 0)
966 for(i = 0; i < s->nb_streams; i++) {
968 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
976 * Flush the frame reader.
978 static void av_read_frame_flush(AVFormatContext *s)
983 flush_packet_queue(s);
985 /* free previous packet */
987 if (s->cur_st->parser)
988 av_free_packet(&s->cur_pkt);
995 /* for each stream, reset read state */
996 for(i = 0; i < s->nb_streams; i++) {
1000 av_parser_close(st->parser);
1003 st->last_IP_pts = AV_NOPTS_VALUE;
1004 st->cur_dts = 0; /* we set the current DTS to an unspecified origin */
1009 * Updates cur_dts of all streams based on given timestamp and AVStream.
1011 * Stream ref_st unchanged, others set cur_dts in their native timebase
1012 * only needed for timestamp wrapping or if (dts not set and pts!=dts)
1013 * @param timestamp new dts expressed in time_base of param ref_st
1014 * @param ref_st reference stream giving time_base of param timestamp
1016 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1019 for(i = 0; i < s->nb_streams; i++) {
1020 AVStream *st = s->streams[i];
1022 st->cur_dts = av_rescale(timestamp,
1023 st->time_base.den * (int64_t)ref_st->time_base.num,
1024 st->time_base.num * (int64_t)ref_st->time_base.den);
1029 * Add a index entry into a sorted list updateing if it is already there.
1031 * @param timestamp timestamp in the timebase of the given stream
1033 int av_add_index_entry(AVStream *st,
1034 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1036 AVIndexEntry *entries, *ie;
1039 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1042 entries = av_fast_realloc(st->index_entries,
1043 &st->index_entries_allocated_size,
1044 (st->nb_index_entries + 1) *
1045 sizeof(AVIndexEntry));
1049 st->index_entries= entries;
1051 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1054 index= st->nb_index_entries++;
1055 ie= &entries[index];
1056 assert(index==0 || ie[-1].timestamp < timestamp);
1058 ie= &entries[index];
1059 if(ie->timestamp != timestamp){
1060 if(ie->timestamp <= timestamp)
1062 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1063 st->nb_index_entries++;
1064 }else if(ie->pos == pos && distance < ie->min_distance) //dont reduce the distance
1065 distance= ie->min_distance;
1069 ie->timestamp = timestamp;
1070 ie->min_distance= distance;
1078 * build an index for raw streams using a parser.
1080 static void av_build_index_raw(AVFormatContext *s)
1082 AVPacket pkt1, *pkt = &pkt1;
1087 av_read_frame_flush(s);
1088 url_fseek(&s->pb, s->data_offset, SEEK_SET);
1091 ret = av_read_frame(s, pkt);
1094 if (pkt->stream_index == 0 && st->parser &&
1095 (pkt->flags & PKT_FLAG_KEY)) {
1096 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
1097 0, 0, AVINDEX_KEYFRAME);
1099 av_free_packet(pkt);
1104 * Returns TRUE if we deal with a raw stream.
1106 * Raw codec data and parsing needed.
1108 static int is_raw_stream(AVFormatContext *s)
1112 if (s->nb_streams != 1)
1115 if (!st->need_parsing)
1121 * Gets the index for a specific timestamp.
1122 * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond to
1123 * the timestamp which is <= the requested one, if backward is 0
1124 * then it will be >=
1125 * if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise
1126 * @return < 0 if no such timestamp could be found
1128 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1131 AVIndexEntry *entries= st->index_entries;
1132 int nb_entries= st->nb_index_entries;
1141 timestamp = entries[m].timestamp;
1142 if(timestamp >= wanted_timestamp)
1144 if(timestamp <= wanted_timestamp)
1147 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1149 if(!(flags & AVSEEK_FLAG_ANY)){
1150 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1151 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1163 * Does a binary search using av_index_search_timestamp() and AVCodec.read_timestamp().
1164 * this isnt supposed to be called directly by a user application, but by demuxers
1165 * @param target_ts target timestamp in the time base of the given stream
1166 * @param stream_index stream number
1168 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1169 AVInputFormat *avif= s->iformat;
1170 int64_t pos_min, pos_max, pos, pos_limit;
1171 int64_t ts_min, ts_max, ts;
1172 int64_t start_pos, filesize;
1173 int index, no_change;
1176 if (stream_index < 0)
1180 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1184 ts_min= AV_NOPTS_VALUE;
1185 pos_limit= -1; //gcc falsely says it may be uninitalized
1187 st= s->streams[stream_index];
1188 if(st->index_entries){
1191 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()
1192 index= FFMAX(index, 0);
1193 e= &st->index_entries[index];
1195 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1197 ts_min= e->timestamp;
1199 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1206 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1207 assert(index < st->nb_index_entries);
1209 e= &st->index_entries[index];
1210 assert(e->timestamp >= target_ts);
1212 ts_max= e->timestamp;
1213 pos_limit= pos_max - e->min_distance;
1215 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1216 pos_max,pos_limit, ts_max);
1221 if(ts_min == AV_NOPTS_VALUE){
1222 pos_min = s->data_offset;
1223 ts_min = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1224 if (ts_min == AV_NOPTS_VALUE)
1228 if(ts_max == AV_NOPTS_VALUE){
1230 filesize = url_fsize(&s->pb);
1231 pos_max = filesize - 1;
1234 ts_max = avif->read_timestamp(s, stream_index, &pos_max, pos_max + step);
1236 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1237 if (ts_max == AV_NOPTS_VALUE)
1241 int64_t tmp_pos= pos_max + 1;
1242 int64_t tmp_ts= avif->read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1243 if(tmp_ts == AV_NOPTS_VALUE)
1247 if(tmp_pos >= filesize)
1253 if(ts_min > ts_max){
1255 }else if(ts_min == ts_max){
1260 while (pos_min < pos_limit) {
1262 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1266 assert(pos_limit <= pos_max);
1269 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1270 // interpolate position (better than dichotomy)
1271 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1272 + pos_min - approximate_keyframe_distance;
1273 }else if(no_change==1){
1274 // bisection, if interpolation failed to change min or max pos last time
1275 pos = (pos_min + pos_limit)>>1;
1277 // linear search if bisection failed, can only happen if there are very few or no keframes between min/max
1282 else if(pos > pos_limit)
1286 ts = avif->read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1292 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);
1294 assert(ts != AV_NOPTS_VALUE);
1295 if (target_ts <= ts) {
1296 pos_limit = start_pos - 1;
1300 if (target_ts >= ts) {
1306 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1307 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1310 ts_min = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1312 ts_max = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1313 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1314 pos, ts_min, target_ts, ts_max);
1317 url_fseek(&s->pb, pos, SEEK_SET);
1319 av_update_cur_dts(s, st, ts);
1324 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1325 int64_t pos_min, pos_max;
1329 if (stream_index < 0)
1332 st= s->streams[stream_index];
1335 pos_min = s->data_offset;
1336 pos_max = url_fsize(&s->pb) - 1;
1338 if (pos < pos_min) pos= pos_min;
1339 else if(pos > pos_max) pos= pos_max;
1341 url_fseek(&s->pb, pos, SEEK_SET);
1344 av_update_cur_dts(s, st, ts);
1349 static int av_seek_frame_generic(AVFormatContext *s,
1350 int stream_index, int64_t timestamp, int flags)
1356 if (!s->index_built) {
1357 if (is_raw_stream(s)) {
1358 av_build_index_raw(s);
1365 st = s->streams[stream_index];
1366 index = av_index_search_timestamp(st, timestamp, flags);
1370 /* now we have found the index, we can seek */
1371 ie = &st->index_entries[index];
1372 av_read_frame_flush(s);
1373 url_fseek(&s->pb, ie->pos, SEEK_SET);
1375 av_update_cur_dts(s, st, ie->timestamp);
1381 * Seek to the key frame at timestamp.
1382 * 'timestamp' in 'stream_index'.
1383 * @param stream_index If stream_index is (-1), a default
1384 * stream is selected, and timestamp is automatically converted
1385 * from AV_TIME_BASE units to the stream specific time_base.
1386 * @param timestamp timestamp in AVStream.time_base units
1387 * or if there is no stream specified then in AV_TIME_BASE units
1388 * @param flags flags which select direction and seeking mode
1389 * @return >= 0 on success
1391 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1396 av_read_frame_flush(s);
1398 if(flags & AVSEEK_FLAG_BYTE)
1399 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1401 if(stream_index < 0){
1402 stream_index= av_find_default_stream_index(s);
1403 if(stream_index < 0)
1406 st= s->streams[stream_index];
1407 /* timestamp for default must be expressed in AV_TIME_BASE units */
1408 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1410 st= s->streams[stream_index];
1412 /* first, we try the format specific seek */
1413 if (s->iformat->read_seek)
1414 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1421 if(s->iformat->read_timestamp)
1422 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1424 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1427 /*******************************************************/
1430 * Returns TRUE if the stream has accurate timings in any stream.
1432 * @return TRUE if the stream has accurate timings for at least one component.
1434 static int av_has_timings(AVFormatContext *ic)
1439 for(i = 0;i < ic->nb_streams; i++) {
1440 st = ic->streams[i];
1441 if (st->start_time != AV_NOPTS_VALUE &&
1442 st->duration != AV_NOPTS_VALUE)
1449 * Estimate the stream timings from the one of each components.
1451 * Also computes the global bitrate if possible.
1453 static void av_update_stream_timings(AVFormatContext *ic)
1455 int64_t start_time, start_time1, end_time, end_time1;
1459 start_time = MAXINT64;
1460 end_time = MININT64;
1461 for(i = 0;i < ic->nb_streams; i++) {
1462 st = ic->streams[i];
1463 if (st->start_time != AV_NOPTS_VALUE) {
1464 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1465 if (start_time1 < start_time)
1466 start_time = start_time1;
1467 if (st->duration != AV_NOPTS_VALUE) {
1468 end_time1 = start_time1
1469 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1470 if (end_time1 > end_time)
1471 end_time = end_time1;
1475 if (start_time != MAXINT64) {
1476 ic->start_time = start_time;
1477 if (end_time != MININT64) {
1478 ic->duration = end_time - start_time;
1479 if (ic->file_size > 0) {
1480 /* compute the bit rate */
1481 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1482 (double)ic->duration;
1489 static void fill_all_stream_timings(AVFormatContext *ic)
1494 av_update_stream_timings(ic);
1495 for(i = 0;i < ic->nb_streams; i++) {
1496 st = ic->streams[i];
1497 if (st->start_time == AV_NOPTS_VALUE) {
1498 if(ic->start_time != AV_NOPTS_VALUE)
1499 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1500 if(ic->duration != AV_NOPTS_VALUE)
1501 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1506 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1508 int64_t filesize, duration;
1512 /* if bit_rate is already set, we believe it */
1513 if (ic->bit_rate == 0) {
1515 for(i=0;i<ic->nb_streams;i++) {
1516 st = ic->streams[i];
1517 bit_rate += st->codec->bit_rate;
1519 ic->bit_rate = bit_rate;
1522 /* if duration is already set, we believe it */
1523 if (ic->duration == AV_NOPTS_VALUE &&
1524 ic->bit_rate != 0 &&
1525 ic->file_size != 0) {
1526 filesize = ic->file_size;
1528 for(i = 0; i < ic->nb_streams; i++) {
1529 st = ic->streams[i];
1530 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1531 if (st->start_time == AV_NOPTS_VALUE ||
1532 st->duration == AV_NOPTS_VALUE) {
1534 st->duration = duration;
1541 #define DURATION_MAX_READ_SIZE 250000
1543 /* only usable for MPEG-PS streams */
1544 static void av_estimate_timings_from_pts(AVFormatContext *ic)
1546 AVPacket pkt1, *pkt = &pkt1;
1548 int read_size, i, ret;
1550 int64_t filesize, offset, duration;
1552 /* free previous packet */
1553 if (ic->cur_st && ic->cur_st->parser)
1554 av_free_packet(&ic->cur_pkt);
1557 /* flush packet queue */
1558 flush_packet_queue(ic);
1560 for(i=0;i<ic->nb_streams;i++) {
1561 st = ic->streams[i];
1563 av_parser_close(st->parser);
1568 /* we read the first packets to get the first PTS (not fully
1569 accurate, but it is enough now) */
1570 url_fseek(&ic->pb, 0, SEEK_SET);
1573 if (read_size >= DURATION_MAX_READ_SIZE)
1575 /* if all info is available, we can stop */
1576 for(i = 0;i < ic->nb_streams; i++) {
1577 st = ic->streams[i];
1578 if (st->start_time == AV_NOPTS_VALUE)
1581 if (i == ic->nb_streams)
1584 ret = av_read_packet(ic, pkt);
1587 read_size += pkt->size;
1588 st = ic->streams[pkt->stream_index];
1589 if (pkt->pts != AV_NOPTS_VALUE) {
1590 if (st->start_time == AV_NOPTS_VALUE)
1591 st->start_time = pkt->pts;
1593 av_free_packet(pkt);
1596 /* estimate the end time (duration) */
1597 /* XXX: may need to support wrapping */
1598 filesize = ic->file_size;
1599 offset = filesize - DURATION_MAX_READ_SIZE;
1603 url_fseek(&ic->pb, offset, SEEK_SET);
1606 if (read_size >= DURATION_MAX_READ_SIZE)
1608 /* if all info is available, we can stop */
1609 for(i = 0;i < ic->nb_streams; i++) {
1610 st = ic->streams[i];
1611 if (st->duration == AV_NOPTS_VALUE)
1614 if (i == ic->nb_streams)
1617 ret = av_read_packet(ic, pkt);
1620 read_size += pkt->size;
1621 st = ic->streams[pkt->stream_index];
1622 if (pkt->pts != AV_NOPTS_VALUE) {
1623 end_time = pkt->pts;
1624 duration = end_time - st->start_time;
1626 if (st->duration == AV_NOPTS_VALUE ||
1627 st->duration < duration)
1628 st->duration = duration;
1631 av_free_packet(pkt);
1634 fill_all_stream_timings(ic);
1636 url_fseek(&ic->pb, 0, SEEK_SET);
1639 static void av_estimate_timings(AVFormatContext *ic)
1643 /* get the file size, if possible */
1644 if (ic->iformat->flags & AVFMT_NOFILE) {
1647 file_size = url_fsize(&ic->pb);
1651 ic->file_size = file_size;
1653 if ((!strcmp(ic->iformat->name, "mpeg") ||
1654 !strcmp(ic->iformat->name, "mpegts")) &&
1655 file_size && !ic->pb.is_streamed) {
1656 /* get accurate estimate from the PTSes */
1657 av_estimate_timings_from_pts(ic);
1658 } else if (av_has_timings(ic)) {
1659 /* at least one components has timings - we use them for all
1661 fill_all_stream_timings(ic);
1663 /* less precise: use bit rate info */
1664 av_estimate_timings_from_bit_rate(ic);
1666 av_update_stream_timings(ic);
1672 for(i = 0;i < ic->nb_streams; i++) {
1673 st = ic->streams[i];
1674 printf("%d: start_time: %0.3f duration: %0.3f\n",
1675 i, (double)st->start_time / AV_TIME_BASE,
1676 (double)st->duration / AV_TIME_BASE);
1678 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1679 (double)ic->start_time / AV_TIME_BASE,
1680 (double)ic->duration / AV_TIME_BASE,
1681 ic->bit_rate / 1000);
1686 static int has_codec_parameters(AVCodecContext *enc)
1689 switch(enc->codec_type) {
1690 case CODEC_TYPE_AUDIO:
1691 val = enc->sample_rate;
1693 case CODEC_TYPE_VIDEO:
1694 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1703 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1707 int got_picture, ret=0;
1710 if(!st->codec->codec){
1711 codec = avcodec_find_decoder(st->codec->codec_id);
1714 ret = avcodec_open(st->codec, codec);
1719 if(!has_codec_parameters(st->codec)){
1720 switch(st->codec->codec_type) {
1721 case CODEC_TYPE_VIDEO:
1722 ret = avcodec_decode_video(st->codec, &picture,
1723 &got_picture, (uint8_t *)data, size);
1725 case CODEC_TYPE_AUDIO:
1726 samples = av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
1729 ret = avcodec_decode_audio(st->codec, samples,
1730 &got_picture, (uint8_t *)data, size);
1741 /* absolute maximum size we read until we abort */
1742 #define MAX_READ_SIZE 5000000
1744 /* maximum duration until we stop analysing the stream */
1745 #define MAX_STREAM_DURATION ((int)(AV_TIME_BASE * 3.0))
1748 * Read the beginning of a media file to get stream information. This
1749 * is useful for file formats with no headers such as MPEG. This
1750 * function also compute the real frame rate in case of mpeg2 repeat
1753 * @param ic media file handle
1754 * @return >=0 if OK. AVERROR_xxx if error.
1755 * @todo let user decide somehow what information is needed so we dont waste time geting stuff the user doesnt need
1757 int av_find_stream_info(AVFormatContext *ic)
1759 int i, count, ret, read_size, j;
1761 AVPacket pkt1, *pkt;
1762 AVPacketList *pktl=NULL, **ppktl;
1763 int64_t last_dts[MAX_STREAMS];
1764 int64_t duration_sum[MAX_STREAMS];
1765 int duration_count[MAX_STREAMS]={0};
1767 for(i=0;i<ic->nb_streams;i++) {
1768 st = ic->streams[i];
1769 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1770 /* if(!st->time_base.num)
1772 if(!st->codec->time_base.num)
1773 st->codec->time_base= st->time_base;
1775 //only for the split stuff
1777 st->parser = av_parser_init(st->codec->codec_id);
1778 if(st->need_parsing == 2 && st->parser){
1779 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1784 for(i=0;i<MAX_STREAMS;i++){
1785 last_dts[i]= AV_NOPTS_VALUE;
1786 duration_sum[i]= INT64_MAX;
1791 ppktl = &ic->packet_buffer;
1793 /* check if one codec still needs to be handled */
1794 for(i=0;i<ic->nb_streams;i++) {
1795 st = ic->streams[i];
1796 if (!has_codec_parameters(st->codec))
1798 /* variable fps and no guess at the real fps */
1799 if( st->codec->time_base.den >= 101LL*st->codec->time_base.num
1800 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1802 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1805 if (i == ic->nb_streams) {
1806 /* NOTE: if the format has no header, then we need to read
1807 some packets to get most of the streams, so we cannot
1809 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1810 /* if we found the info for all the codecs, we can stop */
1815 /* we did not get all the codec info, but we read too much data */
1816 if (read_size >= MAX_READ_SIZE) {
1821 /* NOTE: a new stream can be added there if no header in file
1822 (AVFMTCTX_NOHEADER) */
1823 ret = av_read_frame_internal(ic, &pkt1);
1826 ret = -1; /* we could not have all the codec parameters before EOF */
1827 for(i=0;i<ic->nb_streams;i++) {
1828 st = ic->streams[i];
1829 if (!has_codec_parameters(st->codec)){
1831 avcodec_string(buf, sizeof(buf), st->codec, 0);
1832 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
1840 pktl = av_mallocz(sizeof(AVPacketList));
1842 ret = AVERROR_NOMEM;
1846 /* add the packet in the buffered packet list */
1848 ppktl = &pktl->next;
1853 /* duplicate the packet */
1854 if (av_dup_packet(pkt) < 0) {
1855 ret = AVERROR_NOMEM;
1859 read_size += pkt->size;
1861 st = ic->streams[pkt->stream_index];
1862 st->codec_info_duration += pkt->duration;
1863 if (pkt->duration != 0)
1864 st->codec_info_nb_frames++;
1867 int index= pkt->stream_index;
1868 int64_t last= last_dts[index];
1869 int64_t duration= pkt->dts - last;
1871 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
1872 if(duration*duration_count[index]*10/9 < duration_sum[index]){
1873 duration_sum[index]= duration;
1874 duration_count[index]=1;
1876 int factor= av_rescale(duration, duration_count[index], duration_sum[index]);
1877 duration_sum[index] += duration;
1878 duration_count[index]+= factor;
1880 if(st->codec_info_nb_frames == 0 && 0)
1881 st->codec_info_duration += duration;
1883 last_dts[pkt->stream_index]= pkt->dts;
1885 if(st->parser && st->parser->parser->split && !st->codec->extradata){
1886 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
1888 st->codec->extradata_size= i;
1889 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
1890 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
1891 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1895 /* if still no information, we try to open the codec and to
1896 decompress the frame. We try to avoid that in most cases as
1897 it takes longer and uses more memory. For MPEG4, we need to
1898 decompress for Quicktime. */
1899 if (!has_codec_parameters(st->codec) /*&&
1900 (st->codec->codec_id == CODEC_ID_FLV1 ||
1901 st->codec->codec_id == CODEC_ID_H264 ||
1902 st->codec->codec_id == CODEC_ID_H263 ||
1903 st->codec->codec_id == CODEC_ID_H261 ||
1904 st->codec->codec_id == CODEC_ID_VORBIS ||
1905 st->codec->codec_id == CODEC_ID_MJPEG ||
1906 st->codec->codec_id == CODEC_ID_PNG ||
1907 st->codec->codec_id == CODEC_ID_PAM ||
1908 st->codec->codec_id == CODEC_ID_PGM ||
1909 st->codec->codec_id == CODEC_ID_PGMYUV ||
1910 st->codec->codec_id == CODEC_ID_PBM ||
1911 st->codec->codec_id == CODEC_ID_PPM ||
1912 st->codec->codec_id == CODEC_ID_SHORTEN ||
1913 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
1914 try_decode_frame(st, pkt->data, pkt->size);
1916 if (av_rescale_q(st->codec_info_duration, st->time_base, AV_TIME_BASE_Q) >= MAX_STREAM_DURATION) {
1922 // close codecs which where opened in try_decode_frame()
1923 for(i=0;i<ic->nb_streams;i++) {
1924 st = ic->streams[i];
1925 if(st->codec->codec)
1926 avcodec_close(st->codec);
1928 for(i=0;i<ic->nb_streams;i++) {
1929 st = ic->streams[i];
1930 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1931 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
1932 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
1934 if(duration_count[i] && st->codec->time_base.num*101LL <= st->codec->time_base.den &&
1935 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den){
1936 int64_t num, den, error, best_error;
1938 num= st->time_base.den*duration_count[i];
1939 den= st->time_base.num*duration_sum[i];
1941 best_error= INT64_MAX;
1942 for(j=1; j<60*12; j++){
1943 error= ABS(1001*12*num - 1001*j*den);
1944 if(error < best_error){
1946 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, j, 12, INT_MAX);
1949 for(j=24; j<=30; j+=6){
1950 error= ABS(1001*12*num - 1000*12*j*den);
1951 if(error < best_error){
1953 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, j*1000, 1001, INT_MAX);
1958 /* if no real frame rate, use the codec one */
1959 if (!st->r_frame_rate.num){
1960 st->r_frame_rate.num = st->codec->time_base.den;
1961 st->r_frame_rate.den = st->codec->time_base.num;
1966 av_estimate_timings(ic);
1968 /* correct DTS for b frame streams with no timestamps */
1969 for(i=0;i<ic->nb_streams;i++) {
1970 st = ic->streams[i];
1971 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1973 ppktl = &ic->packet_buffer;
1975 if(ppkt1->stream_index != i)
1977 if(ppkt1->pkt->dts < 0)
1979 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
1981 ppkt1->pkt->dts -= delta;
1986 st->cur_dts -= delta;
1994 /*******************************************************/
1997 * start playing a network based stream (e.g. RTSP stream) at the
2000 int av_read_play(AVFormatContext *s)
2002 if (!s->iformat->read_play)
2003 return AVERROR_NOTSUPP;
2004 return s->iformat->read_play(s);
2008 * Pause a network based stream (e.g. RTSP stream).
2010 * Use av_read_play() to resume it.
2012 int av_read_pause(AVFormatContext *s)
2014 if (!s->iformat->read_pause)
2015 return AVERROR_NOTSUPP;
2016 return s->iformat->read_pause(s);
2020 * Close a media file (but not its codecs).
2022 * @param s media file handle
2024 void av_close_input_file(AVFormatContext *s)
2026 int i, must_open_file;
2029 /* free previous packet */
2030 if (s->cur_st && s->cur_st->parser)
2031 av_free_packet(&s->cur_pkt);
2033 if (s->iformat->read_close)
2034 s->iformat->read_close(s);
2035 for(i=0;i<s->nb_streams;i++) {
2036 /* free all data in a stream component */
2039 av_parser_close(st->parser);
2041 av_free(st->index_entries);
2042 av_free(st->codec->extradata);
2046 flush_packet_queue(s);
2048 if (s->iformat->flags & AVFMT_NOFILE) {
2051 if (must_open_file) {
2054 av_freep(&s->priv_data);
2059 * Add a new stream to a media file.
2061 * Can only be called in the read_header() function. If the flag
2062 * AVFMTCTX_NOHEADER is in the format context, then new streams
2063 * can be added in read_packet too.
2065 * @param s media file handle
2066 * @param id file format dependent stream id
2068 AVStream *av_new_stream(AVFormatContext *s, int id)
2073 if (s->nb_streams >= MAX_STREAMS)
2076 st = av_mallocz(sizeof(AVStream));
2080 st->codec= avcodec_alloc_context();
2082 /* no default bitrate if decoding */
2083 st->codec->bit_rate = 0;
2085 st->index = s->nb_streams;
2087 st->start_time = AV_NOPTS_VALUE;
2088 st->duration = AV_NOPTS_VALUE;
2089 st->cur_dts = AV_NOPTS_VALUE;
2091 /* default pts settings is MPEG like */
2092 av_set_pts_info(st, 33, 1, 90000);
2093 st->last_IP_pts = AV_NOPTS_VALUE;
2094 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2095 st->pts_buffer[i]= AV_NOPTS_VALUE;
2097 s->streams[s->nb_streams++] = st;
2101 /************************************************************/
2102 /* output media file */
2104 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2108 if (s->oformat->priv_data_size > 0) {
2109 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2111 return AVERROR_NOMEM;
2113 s->priv_data = NULL;
2115 if (s->oformat->set_parameters) {
2116 ret = s->oformat->set_parameters(s, ap);
2124 * allocate the stream private data and write the stream header to an
2127 * @param s media file handle
2128 * @return 0 if OK. AVERROR_xxx if error.
2130 int av_write_header(AVFormatContext *s)
2135 // some sanity checks
2136 for(i=0;i<s->nb_streams;i++) {
2139 switch (st->codec->codec_type) {
2140 case CODEC_TYPE_AUDIO:
2141 if(st->codec->sample_rate<=0){
2142 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2146 case CODEC_TYPE_VIDEO:
2147 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2148 av_log(s, AV_LOG_ERROR, "time base not set\n");
2151 if(st->codec->width<=0 || st->codec->height<=0){
2152 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2159 if(s->oformat->write_header){
2160 ret = s->oformat->write_header(s);
2165 /* init PTS generation */
2166 for(i=0;i<s->nb_streams;i++) {
2167 int64_t den = AV_NOPTS_VALUE;
2170 switch (st->codec->codec_type) {
2171 case CODEC_TYPE_AUDIO:
2172 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2174 case CODEC_TYPE_VIDEO:
2175 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2180 if (den != AV_NOPTS_VALUE) {
2182 return AVERROR_INVALIDDATA;
2183 av_frac_init(&st->pts, 0, 0, den);
2189 //FIXME merge with compute_pkt_fields
2190 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2191 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2192 int num, den, frame_size, i;
2194 // 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);
2196 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2199 /* duration field */
2200 if (pkt->duration == 0) {
2201 compute_frame_duration(&num, &den, st, NULL, pkt);
2203 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2207 //XXX/FIXME this is a temporary hack until all encoders output pts
2208 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2210 // pkt->pts= st->cur_dts;
2211 pkt->pts= st->pts.val;
2214 //calculate dts from pts
2215 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2216 st->pts_buffer[0]= pkt->pts;
2217 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2218 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2219 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2220 SWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2222 pkt->dts= st->pts_buffer[0];
2225 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2226 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2229 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2230 av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n");
2234 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%lld dts2:%lld\n", pkt->pts, pkt->dts);
2235 st->cur_dts= pkt->dts;
2236 st->pts.val= pkt->dts;
2239 switch (st->codec->codec_type) {
2240 case CODEC_TYPE_AUDIO:
2241 frame_size = get_audio_frame_size(st->codec, pkt->size);
2243 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
2244 but it would be better if we had the real timestamps from the encoder */
2245 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2246 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2249 case CODEC_TYPE_VIDEO:
2250 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2258 static void truncate_ts(AVStream *st, AVPacket *pkt){
2259 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2262 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here
2264 pkt->pts &= pts_mask;
2265 pkt->dts &= pts_mask;
2269 * Write a packet to an output media file.
2271 * The packet shall contain one audio or video frame.
2273 * @param s media file handle
2274 * @param pkt the packet, which contains the stream_index, buf/buf_size, dts/pts, ...
2275 * @return < 0 if error, = 0 if OK, 1 if end of stream wanted.
2277 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2281 ret=compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2282 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2285 truncate_ts(s->streams[pkt->stream_index], pkt);
2287 ret= s->oformat->write_packet(s, pkt);
2289 ret= url_ferror(&s->pb);
2294 * Interleave a packet per DTS in an output media file.
2296 * Packets with pkt->destruct == av_destruct_packet will be freed inside this function,
2297 * so they cannot be used after it, note calling av_free_packet() on them is still safe.
2299 * @param s media file handle
2300 * @param out the interleaved packet will be output here
2301 * @param in the input packet
2302 * @param flush 1 if no further packets are available as input and all
2303 * remaining packets should be output
2304 * @return 1 if a packet was output, 0 if no packet could be output,
2305 * < 0 if an error occured
2307 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2308 AVPacketList *pktl, **next_point, *this_pktl;
2310 int streams[MAX_STREAMS];
2313 AVStream *st= s->streams[ pkt->stream_index];
2315 // assert(pkt->destruct != av_destruct_packet); //FIXME
2317 this_pktl = av_mallocz(sizeof(AVPacketList));
2318 this_pktl->pkt= *pkt;
2319 if(pkt->destruct == av_destruct_packet)
2320 pkt->destruct= NULL; // non shared -> must keep original from being freed
2322 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2324 next_point = &s->packet_buffer;
2326 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2327 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2328 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2329 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2331 next_point= &(*next_point)->next;
2333 this_pktl->next= *next_point;
2334 *next_point= this_pktl;
2337 memset(streams, 0, sizeof(streams));
2338 pktl= s->packet_buffer;
2340 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%lld\n", pktl->pkt.stream_index, pktl->pkt.dts);
2341 if(streams[ pktl->pkt.stream_index ] == 0)
2343 streams[ pktl->pkt.stream_index ]++;
2347 if(s->nb_streams == stream_count || (flush && stream_count)){
2348 pktl= s->packet_buffer;
2351 s->packet_buffer= pktl->next;
2355 av_init_packet(out);
2361 * Interleaves a AVPacket correctly so it can be muxed.
2362 * @param out the interleaved packet will be output here
2363 * @param in the input packet
2364 * @param flush 1 if no further packets are available as input and all
2365 * remaining packets should be output
2366 * @return 1 if a packet was output, 0 if no packet could be output,
2367 * < 0 if an error occured
2369 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2370 if(s->oformat->interleave_packet)
2371 return s->oformat->interleave_packet(s, out, in, flush);
2373 return av_interleave_packet_per_dts(s, out, in, flush);
2377 * Writes a packet to an output media file ensuring correct interleaving.
2379 * The packet must contain one audio or video frame.
2380 * If the packets are already correctly interleaved the application should
2381 * call av_write_frame() instead as its slightly faster, its also important
2382 * to keep in mind that completly non interleaved input will need huge amounts
2383 * of memory to interleave with this, so its prefereable to interleave at the
2386 * @param s media file handle
2387 * @param pkt the packet, which contains the stream_index, buf/buf_size, dts/pts, ...
2388 * @return < 0 if error, = 0 if OK, 1 if end of stream wanted.
2390 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2391 AVStream *st= s->streams[ pkt->stream_index];
2393 //FIXME/XXX/HACK drop zero sized packets
2394 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2397 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %Ld %Ld\n", pkt->size, pkt->dts, pkt->pts);
2398 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2401 if(pkt->dts == AV_NOPTS_VALUE)
2406 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2407 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2410 truncate_ts(s->streams[opkt.stream_index], &opkt);
2411 ret= s->oformat->write_packet(s, &opkt);
2413 av_free_packet(&opkt);
2418 if(url_ferror(&s->pb))
2419 return url_ferror(&s->pb);
2424 * @brief Write the stream trailer to an output media file and
2425 * free the file private data.
2427 * @param s media file handle
2428 * @return 0 if OK. AVERROR_xxx if error.
2430 int av_write_trailer(AVFormatContext *s)
2436 ret= av_interleave_packet(s, &pkt, NULL, 1);
2437 if(ret<0) //FIXME cleanup needed for ret<0 ?
2442 truncate_ts(s->streams[pkt.stream_index], &pkt);
2443 ret= s->oformat->write_packet(s, &pkt);
2445 av_free_packet(&pkt);
2449 if(url_ferror(&s->pb))
2453 if(s->oformat->write_trailer)
2454 ret = s->oformat->write_trailer(s);
2457 ret=url_ferror(&s->pb);
2458 for(i=0;i<s->nb_streams;i++)
2459 av_freep(&s->streams[i]->priv_data);
2460 av_freep(&s->priv_data);
2464 /* "user interface" functions */
2466 void dump_format(AVFormatContext *ic,
2474 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2475 is_output ? "Output" : "Input",
2477 is_output ? ic->oformat->name : ic->iformat->name,
2478 is_output ? "to" : "from", url);
2480 av_log(NULL, AV_LOG_INFO, " Duration: ");
2481 if (ic->duration != AV_NOPTS_VALUE) {
2482 int hours, mins, secs, us;
2483 secs = ic->duration / AV_TIME_BASE;
2484 us = ic->duration % AV_TIME_BASE;
2489 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%01d", hours, mins, secs,
2490 (10 * us) / AV_TIME_BASE);
2492 av_log(NULL, AV_LOG_INFO, "N/A");
2494 if (ic->start_time != AV_NOPTS_VALUE) {
2496 av_log(NULL, AV_LOG_INFO, ", start: ");
2497 secs = ic->start_time / AV_TIME_BASE;
2498 us = ic->start_time % AV_TIME_BASE;
2499 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2500 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2502 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2504 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2506 av_log(NULL, AV_LOG_INFO, "N/A");
2508 av_log(NULL, AV_LOG_INFO, "\n");
2510 for(i=0;i<ic->nb_streams;i++) {
2511 AVStream *st = ic->streams[i];
2512 int g= ff_gcd(st->time_base.num, st->time_base.den);
2513 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2514 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2515 /* the pid is an important information, so we display it */
2516 /* XXX: add a generic system */
2518 flags = ic->oformat->flags;
2520 flags = ic->iformat->flags;
2521 if (flags & AVFMT_SHOW_IDS) {
2522 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2524 if (strlen(st->language) > 0) {
2525 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2527 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2528 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2529 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2530 if(st->r_frame_rate.den && st->r_frame_rate.num)
2531 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(r)", av_q2d(st->r_frame_rate));
2532 /* else if(st->time_base.den && st->time_base.num)
2533 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(m)", 1/av_q2d(st->time_base));*/
2535 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(c)", 1/av_q2d(st->codec->time_base));
2537 av_log(NULL, AV_LOG_INFO, "\n");
2544 int frame_rate, frame_rate_base;
2547 static AbvEntry frame_abvs[] = {
2548 { "ntsc", 720, 480, 30000, 1001 },
2549 { "pal", 720, 576, 25, 1 },
2550 { "qntsc", 352, 240, 30000, 1001 }, /* VCD compliant ntsc */
2551 { "qpal", 352, 288, 25, 1 }, /* VCD compliant pal */
2552 { "sntsc", 640, 480, 30000, 1001 }, /* square pixel ntsc */
2553 { "spal", 768, 576, 25, 1 }, /* square pixel pal */
2554 { "film", 352, 240, 24, 1 },
2555 { "ntsc-film", 352, 240, 24000, 1001 },
2556 { "sqcif", 128, 96, 0, 0 },
2557 { "qcif", 176, 144, 0, 0 },
2558 { "cif", 352, 288, 0, 0 },
2559 { "4cif", 704, 576, 0, 0 },
2563 * parses width and height out of string str.
2565 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2568 int n = sizeof(frame_abvs) / sizeof(AbvEntry);
2570 int frame_width = 0, frame_height = 0;
2573 if (!strcmp(frame_abvs[i].abv, str)) {
2574 frame_width = frame_abvs[i].width;
2575 frame_height = frame_abvs[i].height;
2581 frame_width = strtol(p, (char **)&p, 10);
2584 frame_height = strtol(p, (char **)&p, 10);
2586 if (frame_width <= 0 || frame_height <= 0)
2588 *width_ptr = frame_width;
2589 *height_ptr = frame_height;
2594 * Converts frame rate from string to a fraction.
2596 * First we try to get an exact integer or fractional frame rate.
2597 * If this fails we convert the frame rate to a double and return
2598 * an approximate fraction using the DEFAULT_FRAME_RATE_BASE.
2600 int parse_frame_rate(int *frame_rate, int *frame_rate_base, const char *arg)
2605 /* First, we check our abbreviation table */
2606 for (i = 0; i < sizeof(frame_abvs)/sizeof(*frame_abvs); ++i)
2607 if (!strcmp(frame_abvs[i].abv, arg)) {
2608 *frame_rate = frame_abvs[i].frame_rate;
2609 *frame_rate_base = frame_abvs[i].frame_rate_base;
2613 /* Then, we try to parse it as fraction */
2614 cp = strchr(arg, '/');
2616 cp = strchr(arg, ':');
2619 *frame_rate = strtol(arg, &cpp, 10);
2620 if (cpp != arg || cpp == cp)
2621 *frame_rate_base = strtol(cp+1, &cpp, 10);
2626 /* Finally we give up and parse it as double */
2627 AVRational time_base = av_d2q(strtod(arg, 0), DEFAULT_FRAME_RATE_BASE);
2628 *frame_rate_base = time_base.den;
2629 *frame_rate = time_base.num;
2631 if (!*frame_rate || !*frame_rate_base)
2638 * Converts date string to number of seconds since Jan 1st, 1970.
2642 * - If not a duration:
2643 * [{YYYY-MM-DD|YYYYMMDD}]{T| }{HH[:MM[:SS[.m...]]][Z]|HH[MM[SS[.m...]]][Z]}
2644 * Time is localtime unless Z is suffixed to the end. In this case GMT
2645 * Return the date in micro seconds since 1970
2648 * HH[:MM[:SS[.m...]]]
2652 #ifndef CONFIG_WINCE
2653 int64_t parse_date(const char *datestr, int duration)
2659 static const char *date_fmt[] = {
2663 static const char *time_fmt[] = {
2673 time_t now = time(0);
2675 len = strlen(datestr);
2677 lastch = datestr[len - 1];
2680 is_utc = (lastch == 'z' || lastch == 'Z');
2682 memset(&dt, 0, sizeof(dt));
2687 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2688 q = small_strptime(p, date_fmt[i], &dt);
2698 dt = *localtime(&now);
2700 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2705 if (*p == 'T' || *p == 't' || *p == ' ')
2708 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2709 q = small_strptime(p, time_fmt[i], &dt);
2719 q = small_strptime(p, time_fmt[0], &dt);
2721 dt.tm_sec = strtol(p, (char **)&q, 10);
2727 /* Now we have all the fields that we can get */
2732 return now * int64_t_C(1000000);
2736 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2738 dt.tm_isdst = -1; /* unknown */
2751 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2754 val += n * (*q - '0');
2758 return negative ? -t : t;
2760 #endif /* CONFIG_WINCE */
2763 * Attempts to find a specific tag in a URL.
2765 * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done.
2766 * Return 1 if found.
2768 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2778 while (*p != '\0' && *p != '=' && *p != '&') {
2779 if ((q - tag) < sizeof(tag) - 1)
2787 while (*p != '&' && *p != '\0') {
2788 if ((q - arg) < arg_size - 1) {
2798 if (!strcmp(tag, tag1))
2808 * Returns in 'buf' the path with '%d' replaced by number.
2810 * Also handles the '%0nd' format where 'n' is the total number
2811 * of digits and '%%'.
2813 * @param buf destination buffer
2814 * @param buf_size destination buffer size
2815 * @param path numbered sequence string
2816 * @number frame number
2817 * @return 0 if OK, -1 if format error.
2819 int av_get_frame_filename(char *buf, int buf_size,
2820 const char *path, int number)
2823 char *q, buf1[20], c;
2824 int nd, len, percentd_found;
2836 while (isdigit(*p)) {
2837 nd = nd * 10 + *p++ - '0';
2840 } while (isdigit(c));
2849 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2851 if ((q - buf + len) > buf_size - 1)
2853 memcpy(q, buf1, len);
2861 if ((q - buf) < buf_size - 1)
2865 if (!percentd_found)
2875 * Print nice hexa dump of a buffer
2876 * @param f stream for output
2878 * @param size buffer size
2880 void av_hex_dump(FILE *f, uint8_t *buf, int size)
2884 for(i=0;i<size;i+=16) {
2888 fprintf(f, "%08x ", i);
2891 fprintf(f, " %02x", buf[i+j]);
2896 for(j=0;j<len;j++) {
2898 if (c < ' ' || c > '~')
2900 fprintf(f, "%c", c);
2907 * Print on 'f' a nice dump of a packet
2908 * @param f stream for output
2909 * @param pkt packet to dump
2910 * @param dump_payload true if the payload must be displayed too
2912 //FIXME needs to know the time_base
2913 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
2915 fprintf(f, "stream #%d:\n", pkt->stream_index);
2916 fprintf(f, " keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
2917 fprintf(f, " duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
2918 /* DTS is _always_ valid after av_read_frame() */
2919 fprintf(f, " dts=");
2920 if (pkt->dts == AV_NOPTS_VALUE)
2923 fprintf(f, "%0.3f", (double)pkt->dts / AV_TIME_BASE);
2924 /* PTS may be not known if B frames are present */
2925 fprintf(f, " pts=");
2926 if (pkt->pts == AV_NOPTS_VALUE)
2929 fprintf(f, "%0.3f", (double)pkt->pts / AV_TIME_BASE);
2931 fprintf(f, " size=%d\n", pkt->size);
2933 av_hex_dump(f, pkt->data, pkt->size);
2936 void url_split(char *proto, int proto_size,
2937 char *authorization, int authorization_size,
2938 char *hostname, int hostname_size,
2940 char *path, int path_size,
2951 while (*p != ':' && *p != '\0') {
2952 if ((q - proto) < proto_size - 1)
2958 if (authorization_size > 0)
2959 authorization[0] = '\0';
2963 if (hostname_size > 0)
2967 char *at,*slash; // PETR: position of '@' character and '/' character
2974 at = strchr(p,'@'); // PETR: get the position of '@'
2975 slash = strchr(p,'/'); // PETR: get position of '/' - end of hostname
2976 if (at && slash && at > slash) at = NULL; // PETR: not interested in '@' behind '/'
2978 q = at ? authorization : hostname; // PETR: if '@' exists starting with auth.
2980 while ((at || *p != ':') && *p != '/' && *p != '?' && *p != '\0') { // PETR:
2981 if (*p == '@') { // PETR: passed '@'
2982 if (authorization_size > 0)
2986 } else if (!at) { // PETR: hostname
2987 if ((q - hostname) < hostname_size - 1)
2990 if ((q - authorization) < authorization_size - 1)
2995 if (hostname_size > 0)
2999 port = strtoul(p, (char **)&p, 10);
3004 pstrcpy(path, path_size, p);
3008 * Set the pts for a given stream.
3011 * @param pts_wrap_bits number of bits effectively used by the pts
3012 * (used for wrap control, 33 is the value for MPEG)
3013 * @param pts_num numerator to convert to seconds (MPEG: 1)
3014 * @param pts_den denominator to convert to seconds (MPEG: 90000)
3016 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3017 int pts_num, int pts_den)
3019 s->pts_wrap_bits = pts_wrap_bits;
3020 s->time_base.num = pts_num;
3021 s->time_base.den = pts_den;
3024 /* fraction handling */
3027 * f = val + (num / den) + 0.5.
3029 * 'num' is normalized so that it is such as 0 <= num < den.
3031 * @param f fractional number
3032 * @param val integer value
3033 * @param num must be >= 0
3034 * @param den must be >= 1
3036 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
3049 * Set f to (val + 0.5).
3051 static void av_frac_set(AVFrac *f, int64_t val)
3054 f->num = f->den >> 1;
3058 * Fractionnal addition to f: f = f + (incr / f->den).
3060 * @param f fractional number
3061 * @param incr increment, can be positive or negative
3063 static void av_frac_add(AVFrac *f, int64_t incr)
3067 num = f->num + incr;
3070 f->val += num / den;
3076 } else if (num >= den) {
3077 f->val += num / den;
3084 * register a new image format
3085 * @param img_fmt Image format descriptor
3087 void av_register_image_format(AVImageFormat *img_fmt)
3091 p = &first_image_format;
3092 while (*p != NULL) p = &(*p)->next;
3094 img_fmt->next = NULL;
3098 * Guesses image format based on data in the image.
3100 AVImageFormat *av_probe_image_format(AVProbeData *pd)
3102 AVImageFormat *fmt1, *fmt;
3103 int score, score_max;
3107 for(fmt1 = first_image_format; fmt1 != NULL; fmt1 = fmt1->next) {
3108 if (fmt1->img_probe) {
3109 score = fmt1->img_probe(pd);
3110 if (score > score_max) {
3120 * Guesses image format based on file name extensions.
3122 AVImageFormat *guess_image_format(const char *filename)
3124 AVImageFormat *fmt1;
3126 for(fmt1 = first_image_format; fmt1 != NULL; fmt1 = fmt1->next) {
3127 if (fmt1->extensions && match_ext(filename, fmt1->extensions))
3134 * Read an image from a stream.
3135 * @param gb byte stream containing the image
3136 * @param fmt image format, NULL if probing is required
3138 int av_read_image(ByteIOContext *pb, const char *filename,
3140 int (*alloc_cb)(void *, AVImageInfo *info), void *opaque)
3142 uint8_t buf[PROBE_BUF_MIN];
3143 AVProbeData probe_data, *pd = &probe_data;
3148 pd->filename = filename;
3150 pos = url_ftell(pb);
3151 pd->buf_size = get_buffer(pb, buf, PROBE_BUF_MIN);
3152 url_fseek(pb, pos, SEEK_SET);
3153 fmt = av_probe_image_format(pd);
3156 return AVERROR_NOFMT;
3157 ret = fmt->img_read(pb, alloc_cb, opaque);
3162 * Write an image to a stream.
3163 * @param pb byte stream for the image output
3164 * @param fmt image format
3165 * @param img image data and informations
3167 int av_write_image(ByteIOContext *pb, AVImageFormat *fmt, AVImageInfo *img)
3169 return fmt->img_write(pb, img);