2 * Various utilities for ffmpeg system
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "allformats.h"
33 * @file libavformat/utils.c
34 * Various utility functions for using ffmpeg library.
37 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den);
38 static void av_frac_add(AVFrac *f, int64_t incr);
40 /** head of registered input format linked list. */
41 AVInputFormat *first_iformat = NULL;
42 /** head of registered output format linked list. */
43 AVOutputFormat *first_oformat = NULL;
45 void av_register_input_format(AVInputFormat *format)
49 while (*p != NULL) p = &(*p)->next;
54 void av_register_output_format(AVOutputFormat *format)
58 while (*p != NULL) p = &(*p)->next;
63 int match_ext(const char *filename, const char *extensions)
71 ext = strrchr(filename, '.');
77 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
80 if (!strcasecmp(ext1, ext))
90 AVOutputFormat *guess_format(const char *short_name, const char *filename,
91 const char *mime_type)
93 AVOutputFormat *fmt, *fmt_found;
96 /* specific test for image sequences */
97 #ifdef CONFIG_IMAGE2_MUXER
98 if (!short_name && filename &&
99 av_filename_number_test(filename) &&
100 av_guess_image2_codec(filename) != CODEC_ID_NONE) {
101 return guess_format("image2", NULL, NULL);
104 /* find the proper file type */
108 while (fmt != NULL) {
110 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
112 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
114 if (filename && fmt->extensions &&
115 match_ext(filename, fmt->extensions)) {
118 if (score > score_max) {
127 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
128 const char *mime_type)
130 AVOutputFormat *fmt = guess_format(short_name, filename, mime_type);
133 AVOutputFormat *stream_fmt;
134 char stream_format_name[64];
136 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
137 stream_fmt = guess_format(stream_format_name, NULL, NULL);
146 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
147 const char *filename, const char *mime_type, enum CodecType type){
148 if(type == CODEC_TYPE_VIDEO){
149 enum CodecID codec_id= CODEC_ID_NONE;
151 #ifdef CONFIG_IMAGE2_MUXER
152 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
153 codec_id= av_guess_image2_codec(filename);
156 if(codec_id == CODEC_ID_NONE)
157 codec_id= fmt->video_codec;
159 }else if(type == CODEC_TYPE_AUDIO)
160 return fmt->audio_codec;
162 return CODEC_ID_NONE;
165 AVInputFormat *av_find_input_format(const char *short_name)
168 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) {
169 if (!strcmp(fmt->name, short_name))
175 /* memory handling */
177 void av_destruct_packet(AVPacket *pkt)
180 pkt->data = NULL; pkt->size = 0;
183 void av_init_packet(AVPacket *pkt)
185 pkt->pts = AV_NOPTS_VALUE;
186 pkt->dts = AV_NOPTS_VALUE;
190 pkt->stream_index = 0;
191 pkt->destruct= av_destruct_packet_nofree;
194 int av_new_packet(AVPacket *pkt, int size)
197 if((unsigned)size > (unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE)
198 return AVERROR_NOMEM;
199 data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
201 return AVERROR_NOMEM;
202 memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
207 pkt->destruct = av_destruct_packet;
211 int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size)
213 int ret= av_new_packet(pkt, size);
218 pkt->pos= url_ftell(s);
220 ret= get_buffer(s, pkt->data, size);
229 int av_dup_packet(AVPacket *pkt)
231 if (pkt->destruct != av_destruct_packet) {
233 /* we duplicate the packet and don't forget to put the padding
235 if((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE)
236 return AVERROR_NOMEM;
237 data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
239 return AVERROR_NOMEM;
241 memcpy(data, pkt->data, pkt->size);
242 memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
244 pkt->destruct = av_destruct_packet;
249 int av_filename_number_test(const char *filename)
252 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
255 static AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
257 AVInputFormat *fmt1, *fmt;
261 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
262 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
265 if (fmt1->read_probe) {
266 score = fmt1->read_probe(pd);
267 } else if (fmt1->extensions) {
268 if (match_ext(pd->filename, fmt1->extensions)) {
272 if (score > *score_max) {
280 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
282 return av_probe_input_format2(pd, is_opened, &score);
285 /************************************************************/
286 /* input media file */
289 * Open a media file from an IO stream. 'fmt' must be specified.
291 static const char* format_to_name(void* ptr)
293 AVFormatContext* fc = (AVFormatContext*) ptr;
294 if(fc->iformat) return fc->iformat->name;
295 else if(fc->oformat) return fc->oformat->name;
299 #define OFFSET(x) offsetof(AVFormatContext,x)
300 #define DEFAULT 0 //should be NAN but it does not work as it is not a constant in glibc as required by ANSI/ISO C
301 //these names are too long to be readable
302 #define E AV_OPT_FLAG_ENCODING_PARAM
303 #define D AV_OPT_FLAG_DECODING_PARAM
305 static const AVOption options[]={
306 {"probesize", NULL, OFFSET(probesize), FF_OPT_TYPE_INT, 32000, 32, INT_MAX, D}, /* 32000 from mpegts.c: 1.0 second at 24Mbit/s */
307 {"muxrate", "set mux rate", OFFSET(mux_rate), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
308 {"packetsize", "set packet size", OFFSET(packet_size), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
309 {"fflags", NULL, OFFSET(flags), FF_OPT_TYPE_FLAGS, DEFAULT, INT_MIN, INT_MAX, D|E, "fflags"},
310 {"ignidx", "ignore index", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_IGNIDX, INT_MIN, INT_MAX, D, "fflags"},
311 {"genpts", "generate pts", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_GENPTS, INT_MIN, INT_MAX, D, "fflags"},
312 {"track", " set the track number", OFFSET(track), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
313 {"year", "set the year", OFFSET(year), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, E},
314 {"analyzeduration", "how many microseconds are analyzed to estimate duration", OFFSET(max_analyze_duration), FF_OPT_TYPE_INT, 3*AV_TIME_BASE, 0, INT_MAX, D},
322 static const AVClass av_format_context_class = { "AVFormatContext", format_to_name, options };
324 static void avformat_get_context_defaults(AVFormatContext *s)
326 memset(s, 0, sizeof(AVFormatContext));
328 s->av_class = &av_format_context_class;
330 av_opt_set_defaults(s);
333 AVFormatContext *av_alloc_format_context(void)
336 ic = av_malloc(sizeof(AVFormatContext));
338 avformat_get_context_defaults(ic);
339 ic->av_class = &av_format_context_class;
343 int av_open_input_stream(AVFormatContext **ic_ptr,
344 ByteIOContext *pb, const char *filename,
345 AVInputFormat *fmt, AVFormatParameters *ap)
349 AVFormatParameters default_ap;
353 memset(ap, 0, sizeof(default_ap));
356 if(!ap->prealloced_context)
357 ic = av_alloc_format_context();
367 ic->duration = AV_NOPTS_VALUE;
368 ic->start_time = AV_NOPTS_VALUE;
369 av_strlcpy(ic->filename, filename, sizeof(ic->filename));
371 /* allocate private data */
372 if (fmt->priv_data_size > 0) {
373 ic->priv_data = av_mallocz(fmt->priv_data_size);
374 if (!ic->priv_data) {
379 ic->priv_data = NULL;
382 err = ic->iformat->read_header(ic, ap);
386 if (pb && !ic->data_offset)
387 ic->data_offset = url_ftell(&ic->pb);
393 av_freep(&ic->priv_data);
400 /** Size of probe buffer, for guessing file type from file contents. */
401 #define PROBE_BUF_MIN 2048
402 #define PROBE_BUF_MAX (1<<20)
404 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
407 AVFormatParameters *ap)
409 int err, must_open_file, file_opened, probe_size;
410 AVProbeData probe_data, *pd = &probe_data;
411 ByteIOContext pb1, *pb = &pb1;
416 pd->filename = filename;
421 /* guess format if no file can be opened */
422 fmt = av_probe_input_format(pd, 0);
425 /* do not open file if the format does not need it. XXX: specific
426 hack needed to handle RTSP/TCP */
428 if (fmt && (fmt->flags & AVFMT_NOFILE)) {
430 pb= NULL; //FIXME this or memset(pb, 0, sizeof(ByteIOContext)); otherwise it is uninitialized
433 if (!fmt || must_open_file) {
434 /* if no file needed do not try to open one */
435 if ((err=url_fopen(pb, filename, URL_RDONLY)) < 0) {
440 url_setbufsize(pb, buf_size);
443 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
444 int score= probe_size < PROBE_BUF_MAX ? AVPROBE_SCORE_MAX/4 : 0;
445 /* read probe data */
446 pd->buf= av_realloc(pd->buf, probe_size + AVPROBE_PADDING_SIZE);
447 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
448 if (url_fseek(pb, 0, SEEK_SET) < 0) {
450 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
456 /* guess file format */
457 fmt = av_probe_input_format2(pd, 1, &score);
462 /* if still no format found, error */
468 /* XXX: suppress this hack for redirectors */
469 #ifdef CONFIG_REDIR_DEMUXER
470 if (fmt == &redir_demuxer) {
471 err = redir_open(ic_ptr, pb);
477 /* check filename in case of an image number is expected */
478 if (fmt->flags & AVFMT_NEEDNUMBER) {
479 if (!av_filename_number_test(filename)) {
480 err = AVERROR_NUMEXPECTED;
484 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
497 /*******************************************************/
499 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
502 return s->iformat->read_packet(s, pkt);
505 /**********************************************************/
508 * Get the number of samples of an audio frame. Return (-1) if error.
510 static int get_audio_frame_size(AVCodecContext *enc, int size)
514 if (enc->frame_size <= 1) {
515 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
517 if (bits_per_sample) {
518 if (enc->channels == 0)
520 frame_size = (size << 3) / (bits_per_sample * enc->channels);
522 /* used for example by ADPCM codecs */
523 if (enc->bit_rate == 0)
525 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
528 frame_size = enc->frame_size;
535 * Return the frame duration in seconds, return 0 if not available.
537 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
538 AVCodecParserContext *pc, AVPacket *pkt)
544 switch(st->codec->codec_type) {
545 case CODEC_TYPE_VIDEO:
546 if(st->time_base.num*1000LL > st->time_base.den){
547 *pnum = st->time_base.num;
548 *pden = st->time_base.den;
549 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
550 *pnum = st->codec->time_base.num;
551 *pden = st->codec->time_base.den;
552 if (pc && pc->repeat_pict) {
554 *pnum = (*pnum) * (2 + pc->repeat_pict);
558 case CODEC_TYPE_AUDIO:
559 frame_size = get_audio_frame_size(st->codec, pkt->size);
563 *pden = st->codec->sample_rate;
570 static int is_intra_only(AVCodecContext *enc){
571 if(enc->codec_type == CODEC_TYPE_AUDIO){
573 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
574 switch(enc->codec_id){
576 case CODEC_ID_MJPEGB:
578 case CODEC_ID_RAWVIDEO:
579 case CODEC_ID_DVVIDEO:
580 case CODEC_ID_HUFFYUV:
581 case CODEC_ID_FFVHUFF:
592 static int64_t lsb2full(int64_t lsb, int64_t last_ts, int lsb_bits){
593 int64_t mask = lsb_bits < 64 ? (1LL<<lsb_bits)-1 : -1LL;
594 int64_t delta= last_ts - mask/2;
595 return ((lsb - delta)&mask) + delta;
598 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
599 AVCodecParserContext *pc, AVPacket *pkt)
601 int num, den, presentation_delayed, delay, i;
603 /* handle wrapping */
604 if(st->cur_dts != AV_NOPTS_VALUE){
605 if(pkt->pts != AV_NOPTS_VALUE)
606 pkt->pts= lsb2full(pkt->pts, st->cur_dts, st->pts_wrap_bits);
607 if(pkt->dts != AV_NOPTS_VALUE)
608 pkt->dts= lsb2full(pkt->dts, st->cur_dts, st->pts_wrap_bits);
611 if (pkt->duration == 0) {
612 compute_frame_duration(&num, &den, st, pc, pkt);
614 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
618 /* correct timestamps with byte offset if demuxers only have timestamps on packet boundaries */
619 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
620 /* this will estimate bitrate based on this frame's duration and size */
621 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
622 if(pkt->pts != AV_NOPTS_VALUE)
624 if(pkt->dts != AV_NOPTS_VALUE)
628 if(is_intra_only(st->codec))
629 pkt->flags |= PKT_FLAG_KEY;
631 /* do we have a video B frame ? */
632 delay= st->codec->has_b_frames;
633 presentation_delayed = 0;
634 /* XXX: need has_b_frame, but cannot get it if the codec is
637 pc && pc->pict_type != FF_B_TYPE)
638 presentation_delayed = 1;
639 /* This may be redundant, but it should not hurt. */
640 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
641 presentation_delayed = 1;
643 if(st->cur_dts == AV_NOPTS_VALUE){
644 st->cur_dts = -delay * pkt->duration;
647 // av_log(NULL, AV_LOG_DEBUG, "IN delayed:%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64" st:%d pc:%p\n", presentation_delayed, pkt->pts, pkt->dts, st->cur_dts, pkt->stream_index, pc);
648 /* interpolate PTS and DTS if they are not present */
650 if (presentation_delayed) {
651 /* DTS = decompression time stamp */
652 /* PTS = presentation time stamp */
653 if (pkt->dts == AV_NOPTS_VALUE)
654 pkt->dts = st->last_IP_pts;
655 if (pkt->dts == AV_NOPTS_VALUE)
656 pkt->dts = st->cur_dts;
658 /* this is tricky: the dts must be incremented by the duration
659 of the frame we are displaying, i.e. the last I or P frame */
660 if (st->last_IP_duration == 0)
661 st->last_IP_duration = pkt->duration;
662 st->cur_dts = pkt->dts + st->last_IP_duration;
663 st->last_IP_duration = pkt->duration;
664 st->last_IP_pts= pkt->pts;
665 /* cannot compute PTS if not present (we can compute it only
666 by knowing the futur */
667 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
668 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
669 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
670 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
671 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
672 pkt->pts += pkt->duration;
673 // av_log(NULL, AV_LOG_DEBUG, "id:%d old:%"PRId64" new:%"PRId64" dur:%d cur:%"PRId64" size:%d\n", pkt->stream_index, old_diff, new_diff, pkt->duration, st->cur_dts, pkt->size);
677 /* presentation is not delayed : PTS and DTS are the same */
678 if(pkt->pts == AV_NOPTS_VALUE)
680 if(pkt->pts == AV_NOPTS_VALUE)
681 pkt->pts = st->cur_dts;
683 st->cur_dts = pkt->pts + pkt->duration;
687 if(pkt->pts != AV_NOPTS_VALUE){
688 st->pts_buffer[0]= pkt->pts;
689 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
690 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
691 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
692 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
693 if(pkt->dts == AV_NOPTS_VALUE)
694 pkt->dts= st->pts_buffer[0];
695 if(pkt->dts > st->cur_dts)
696 st->cur_dts = pkt->dts;
699 // av_log(NULL, AV_LOG_ERROR, "OUTdelayed:%d/%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64"\n", presentation_delayed, delay, pkt->pts, pkt->dts, st->cur_dts);
704 /* key frame computation */
705 if (pc->pict_type == FF_I_TYPE)
706 pkt->flags |= PKT_FLAG_KEY;
710 void av_destruct_packet_nofree(AVPacket *pkt)
712 pkt->data = NULL; pkt->size = 0;
715 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
723 /* select current input stream component */
726 if (!st->need_parsing || !st->parser) {
727 /* no parsing needed: we just output the packet as is */
728 /* raw data support */
730 compute_pkt_fields(s, st, NULL, pkt);
733 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
734 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
735 s->cur_ptr, s->cur_len,
736 s->cur_pkt.pts, s->cur_pkt.dts);
737 s->cur_pkt.pts = AV_NOPTS_VALUE;
738 s->cur_pkt.dts = AV_NOPTS_VALUE;
739 /* increment read pointer */
743 /* return packet if any */
746 pkt->pos = s->cur_pkt.pos; // Isn't quite accurate but close.
748 pkt->stream_index = st->index;
749 pkt->pts = st->parser->pts;
750 pkt->dts = st->parser->dts;
751 pkt->destruct = av_destruct_packet_nofree;
752 compute_pkt_fields(s, st, st->parser, pkt);
754 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
755 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
756 0, 0, AVINDEX_KEYFRAME);
763 av_free_packet(&s->cur_pkt);
767 /* read next packet */
768 ret = av_read_packet(s, &s->cur_pkt);
770 if (ret == AVERROR(EAGAIN))
772 /* return the last frames, if any */
773 for(i = 0; i < s->nb_streams; i++) {
775 if (st->parser && st->need_parsing) {
776 av_parser_parse(st->parser, st->codec,
777 &pkt->data, &pkt->size,
779 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
784 /* no more packets: really terminates parsing */
788 st = s->streams[s->cur_pkt.stream_index];
789 if(st->codec->debug & FF_DEBUG_PTS)
790 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
791 s->cur_pkt.stream_index,
797 s->cur_ptr = s->cur_pkt.data;
798 s->cur_len = s->cur_pkt.size;
799 if (st->need_parsing && !st->parser) {
800 st->parser = av_parser_init(st->codec->codec_id);
802 /* no parser available : just output the raw packets */
803 st->need_parsing = AVSTREAM_PARSE_NONE;
804 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
805 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
807 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
808 st->parser->last_frame_offset=
809 st->parser->cur_offset= s->cur_pkt.pos;
814 if(st->codec->debug & FF_DEBUG_PTS)
815 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
824 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
828 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
831 pktl = s->packet_buffer;
833 AVPacket *next_pkt= &pktl->pkt;
835 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
836 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
837 if( pktl->pkt.stream_index == next_pkt->stream_index
838 && next_pkt->dts < pktl->pkt.dts
839 && pktl->pkt.pts != pktl->pkt.dts //not b frame
840 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
841 next_pkt->pts= pktl->pkt.dts;
845 pktl = s->packet_buffer;
848 if( next_pkt->pts != AV_NOPTS_VALUE
849 || next_pkt->dts == AV_NOPTS_VALUE
851 /* read packet from packet buffer, if there is data */
853 s->packet_buffer = pktl->next;
859 AVPacketList **plast_pktl= &s->packet_buffer;
860 int ret= av_read_frame_internal(s, pkt);
862 if(pktl && ret != AVERROR(EAGAIN)){
869 /* duplicate the packet */
870 if (av_dup_packet(pkt) < 0)
871 return AVERROR_NOMEM;
873 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
875 pktl = av_mallocz(sizeof(AVPacketList));
877 return AVERROR_NOMEM;
879 /* add the packet in the buffered packet list */
883 assert(!s->packet_buffer);
884 return av_read_frame_internal(s, pkt);
889 /* XXX: suppress the packet queue */
890 static void flush_packet_queue(AVFormatContext *s)
895 pktl = s->packet_buffer;
898 s->packet_buffer = pktl->next;
899 av_free_packet(&pktl->pkt);
904 /*******************************************************/
907 int av_find_default_stream_index(AVFormatContext *s)
912 if (s->nb_streams <= 0)
914 for(i = 0; i < s->nb_streams; i++) {
916 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
924 * Flush the frame reader.
926 static void av_read_frame_flush(AVFormatContext *s)
931 flush_packet_queue(s);
933 /* free previous packet */
935 if (s->cur_st->parser)
936 av_free_packet(&s->cur_pkt);
943 /* for each stream, reset read state */
944 for(i = 0; i < s->nb_streams; i++) {
948 av_parser_close(st->parser);
951 st->last_IP_pts = AV_NOPTS_VALUE;
952 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
956 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
959 for(i = 0; i < s->nb_streams; i++) {
960 AVStream *st = s->streams[i];
962 st->cur_dts = av_rescale(timestamp,
963 st->time_base.den * (int64_t)ref_st->time_base.num,
964 st->time_base.num * (int64_t)ref_st->time_base.den);
968 int av_add_index_entry(AVStream *st,
969 int64_t pos, int64_t timestamp, int size, int distance, int flags)
971 AVIndexEntry *entries, *ie;
974 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
977 entries = av_fast_realloc(st->index_entries,
978 &st->index_entries_allocated_size,
979 (st->nb_index_entries + 1) *
980 sizeof(AVIndexEntry));
984 st->index_entries= entries;
986 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
989 index= st->nb_index_entries++;
991 assert(index==0 || ie[-1].timestamp < timestamp);
994 if(ie->timestamp != timestamp){
995 if(ie->timestamp <= timestamp)
997 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
998 st->nb_index_entries++;
999 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1000 distance= ie->min_distance;
1004 ie->timestamp = timestamp;
1005 ie->min_distance= distance;
1012 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1015 AVIndexEntry *entries= st->index_entries;
1016 int nb_entries= st->nb_index_entries;
1025 timestamp = entries[m].timestamp;
1026 if(timestamp >= wanted_timestamp)
1028 if(timestamp <= wanted_timestamp)
1031 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1033 if(!(flags & AVSEEK_FLAG_ANY)){
1034 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1035 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1046 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1047 AVInputFormat *avif= s->iformat;
1048 int64_t pos_min, pos_max, pos, pos_limit;
1049 int64_t ts_min, ts_max, ts;
1053 if (stream_index < 0)
1057 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1061 ts_min= AV_NOPTS_VALUE;
1062 pos_limit= -1; //gcc falsely says it may be uninitialized
1064 st= s->streams[stream_index];
1065 if(st->index_entries){
1068 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()
1069 index= FFMAX(index, 0);
1070 e= &st->index_entries[index];
1072 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1074 ts_min= e->timestamp;
1076 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1083 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1084 assert(index < st->nb_index_entries);
1086 e= &st->index_entries[index];
1087 assert(e->timestamp >= target_ts);
1089 ts_max= e->timestamp;
1090 pos_limit= pos_max - e->min_distance;
1092 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1093 pos_max,pos_limit, ts_max);
1098 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1103 url_fseek(&s->pb, pos, SEEK_SET);
1105 av_update_cur_dts(s, st, ts);
1110 int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, int64_t pos_min, int64_t pos_max, int64_t pos_limit, int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret, int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t )){
1112 int64_t start_pos, filesize;
1116 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1119 if(ts_min == AV_NOPTS_VALUE){
1120 pos_min = s->data_offset;
1121 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1122 if (ts_min == AV_NOPTS_VALUE)
1126 if(ts_max == AV_NOPTS_VALUE){
1128 filesize = url_fsize(&s->pb);
1129 pos_max = filesize - 1;
1132 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1134 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1135 if (ts_max == AV_NOPTS_VALUE)
1139 int64_t tmp_pos= pos_max + 1;
1140 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1141 if(tmp_ts == AV_NOPTS_VALUE)
1145 if(tmp_pos >= filesize)
1151 if(ts_min > ts_max){
1153 }else if(ts_min == ts_max){
1158 while (pos_min < pos_limit) {
1160 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1164 assert(pos_limit <= pos_max);
1167 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1168 // interpolate position (better than dichotomy)
1169 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1170 + pos_min - approximate_keyframe_distance;
1171 }else if(no_change==1){
1172 // bisection, if interpolation failed to change min or max pos last time
1173 pos = (pos_min + pos_limit)>>1;
1175 // linear search if bisection failed, can only happen if there are very few or no keframes between min/max
1180 else if(pos > pos_limit)
1184 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1190 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);
1192 if(ts == AV_NOPTS_VALUE){
1193 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1196 assert(ts != AV_NOPTS_VALUE);
1197 if (target_ts <= ts) {
1198 pos_limit = start_pos - 1;
1202 if (target_ts >= ts) {
1208 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1209 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1212 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1214 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1215 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1216 pos, ts_min, target_ts, ts_max);
1222 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1223 int64_t pos_min, pos_max;
1227 if (stream_index < 0)
1230 st= s->streams[stream_index];
1233 pos_min = s->data_offset;
1234 pos_max = url_fsize(&s->pb) - 1;
1236 if (pos < pos_min) pos= pos_min;
1237 else if(pos > pos_max) pos= pos_max;
1239 url_fseek(&s->pb, pos, SEEK_SET);
1242 av_update_cur_dts(s, st, ts);
1247 static int av_seek_frame_generic(AVFormatContext *s,
1248 int stream_index, int64_t timestamp, int flags)
1254 st = s->streams[stream_index];
1256 index = av_index_search_timestamp(st, timestamp, flags);
1258 if(index < 0 || index==st->nb_index_entries-1){
1262 if(st->index_entries && st->nb_index_entries){
1263 ie= &st->index_entries[st->nb_index_entries-1];
1264 url_fseek(&s->pb, ie->pos, SEEK_SET);
1265 av_update_cur_dts(s, st, ie->timestamp);
1267 url_fseek(&s->pb, 0, SEEK_SET);
1270 int ret = av_read_frame(s, &pkt);
1273 av_free_packet(&pkt);
1274 if(stream_index == pkt.stream_index){
1275 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1279 index = av_index_search_timestamp(st, timestamp, flags);
1284 av_read_frame_flush(s);
1285 if (s->iformat->read_seek){
1286 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1289 ie = &st->index_entries[index];
1290 url_fseek(&s->pb, ie->pos, SEEK_SET);
1292 av_update_cur_dts(s, st, ie->timestamp);
1297 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1302 av_read_frame_flush(s);
1304 if(flags & AVSEEK_FLAG_BYTE)
1305 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1307 if(stream_index < 0){
1308 stream_index= av_find_default_stream_index(s);
1309 if(stream_index < 0)
1312 st= s->streams[stream_index];
1313 /* timestamp for default must be expressed in AV_TIME_BASE units */
1314 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1316 st= s->streams[stream_index];
1318 /* first, we try the format specific seek */
1319 if (s->iformat->read_seek)
1320 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1327 if(s->iformat->read_timestamp)
1328 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1330 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1333 /*******************************************************/
1336 * Returns TRUE if the stream has accurate timings in any stream.
1338 * @return TRUE if the stream has accurate timings for at least one component.
1340 static int av_has_timings(AVFormatContext *ic)
1345 for(i = 0;i < ic->nb_streams; i++) {
1346 st = ic->streams[i];
1347 if (st->start_time != AV_NOPTS_VALUE &&
1348 st->duration != AV_NOPTS_VALUE)
1355 * Estimate the stream timings from the one of each components.
1357 * Also computes the global bitrate if possible.
1359 static void av_update_stream_timings(AVFormatContext *ic)
1361 int64_t start_time, start_time1, end_time, end_time1;
1365 start_time = INT64_MAX;
1366 end_time = INT64_MIN;
1367 for(i = 0;i < ic->nb_streams; i++) {
1368 st = ic->streams[i];
1369 if (st->start_time != AV_NOPTS_VALUE) {
1370 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1371 if (start_time1 < start_time)
1372 start_time = start_time1;
1373 if (st->duration != AV_NOPTS_VALUE) {
1374 end_time1 = start_time1
1375 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1376 if (end_time1 > end_time)
1377 end_time = end_time1;
1381 if (start_time != INT64_MAX) {
1382 ic->start_time = start_time;
1383 if (end_time != INT64_MIN) {
1384 ic->duration = end_time - start_time;
1385 if (ic->file_size > 0) {
1386 /* compute the bit rate */
1387 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1388 (double)ic->duration;
1395 static void fill_all_stream_timings(AVFormatContext *ic)
1400 av_update_stream_timings(ic);
1401 for(i = 0;i < ic->nb_streams; i++) {
1402 st = ic->streams[i];
1403 if (st->start_time == AV_NOPTS_VALUE) {
1404 if(ic->start_time != AV_NOPTS_VALUE)
1405 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1406 if(ic->duration != AV_NOPTS_VALUE)
1407 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1412 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1414 int64_t filesize, duration;
1418 /* if bit_rate is already set, we believe it */
1419 if (ic->bit_rate == 0) {
1421 for(i=0;i<ic->nb_streams;i++) {
1422 st = ic->streams[i];
1423 bit_rate += st->codec->bit_rate;
1425 ic->bit_rate = bit_rate;
1428 /* if duration is already set, we believe it */
1429 if (ic->duration == AV_NOPTS_VALUE &&
1430 ic->bit_rate != 0 &&
1431 ic->file_size != 0) {
1432 filesize = ic->file_size;
1434 for(i = 0; i < ic->nb_streams; i++) {
1435 st = ic->streams[i];
1436 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1437 if (st->start_time == AV_NOPTS_VALUE ||
1438 st->duration == AV_NOPTS_VALUE) {
1440 st->duration = duration;
1447 #define DURATION_MAX_READ_SIZE 250000
1449 /* only usable for MPEG-PS streams */
1450 static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offset)
1452 AVPacket pkt1, *pkt = &pkt1;
1454 int read_size, i, ret;
1456 int64_t filesize, offset, duration;
1458 /* free previous packet */
1459 if (ic->cur_st && ic->cur_st->parser)
1460 av_free_packet(&ic->cur_pkt);
1463 /* flush packet queue */
1464 flush_packet_queue(ic);
1466 for(i=0;i<ic->nb_streams;i++) {
1467 st = ic->streams[i];
1469 av_parser_close(st->parser);
1474 /* we read the first packets to get the first PTS (not fully
1475 accurate, but it is enough now) */
1476 url_fseek(&ic->pb, 0, SEEK_SET);
1479 if (read_size >= DURATION_MAX_READ_SIZE)
1481 /* if all info is available, we can stop */
1482 for(i = 0;i < ic->nb_streams; i++) {
1483 st = ic->streams[i];
1484 if (st->start_time == AV_NOPTS_VALUE)
1487 if (i == ic->nb_streams)
1490 ret = av_read_packet(ic, pkt);
1493 read_size += pkt->size;
1494 st = ic->streams[pkt->stream_index];
1495 if (pkt->pts != AV_NOPTS_VALUE) {
1496 if (st->start_time == AV_NOPTS_VALUE)
1497 st->start_time = pkt->pts;
1499 av_free_packet(pkt);
1502 /* estimate the end time (duration) */
1503 /* XXX: may need to support wrapping */
1504 filesize = ic->file_size;
1505 offset = filesize - DURATION_MAX_READ_SIZE;
1509 url_fseek(&ic->pb, offset, SEEK_SET);
1512 if (read_size >= DURATION_MAX_READ_SIZE)
1514 /* if all info is available, we can stop */
1515 for(i = 0;i < ic->nb_streams; i++) {
1516 st = ic->streams[i];
1517 if (st->duration == AV_NOPTS_VALUE)
1520 if (i == ic->nb_streams)
1523 ret = av_read_packet(ic, pkt);
1526 read_size += pkt->size;
1527 st = ic->streams[pkt->stream_index];
1528 if (pkt->pts != AV_NOPTS_VALUE) {
1529 end_time = pkt->pts;
1530 duration = end_time - st->start_time;
1532 if (st->duration == AV_NOPTS_VALUE ||
1533 st->duration < duration)
1534 st->duration = duration;
1537 av_free_packet(pkt);
1540 fill_all_stream_timings(ic);
1542 url_fseek(&ic->pb, old_offset, SEEK_SET);
1545 static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
1549 /* get the file size, if possible */
1550 if (ic->iformat->flags & AVFMT_NOFILE) {
1553 file_size = url_fsize(&ic->pb);
1557 ic->file_size = file_size;
1559 if ((!strcmp(ic->iformat->name, "mpeg") ||
1560 !strcmp(ic->iformat->name, "mpegts")) &&
1561 file_size && !ic->pb.is_streamed) {
1562 /* get accurate estimate from the PTSes */
1563 av_estimate_timings_from_pts(ic, old_offset);
1564 } else if (av_has_timings(ic)) {
1565 /* at least one components has timings - we use them for all
1567 fill_all_stream_timings(ic);
1569 /* less precise: use bit rate info */
1570 av_estimate_timings_from_bit_rate(ic);
1572 av_update_stream_timings(ic);
1578 for(i = 0;i < ic->nb_streams; i++) {
1579 st = ic->streams[i];
1580 printf("%d: start_time: %0.3f duration: %0.3f\n",
1581 i, (double)st->start_time / AV_TIME_BASE,
1582 (double)st->duration / AV_TIME_BASE);
1584 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1585 (double)ic->start_time / AV_TIME_BASE,
1586 (double)ic->duration / AV_TIME_BASE,
1587 ic->bit_rate / 1000);
1592 static int has_codec_parameters(AVCodecContext *enc)
1595 switch(enc->codec_type) {
1596 case CODEC_TYPE_AUDIO:
1597 val = enc->sample_rate;
1599 case CODEC_TYPE_VIDEO:
1600 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1609 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1613 int got_picture, data_size, ret=0;
1616 if(!st->codec->codec){
1617 codec = avcodec_find_decoder(st->codec->codec_id);
1620 ret = avcodec_open(st->codec, codec);
1625 if(!has_codec_parameters(st->codec)){
1626 switch(st->codec->codec_type) {
1627 case CODEC_TYPE_VIDEO:
1628 ret = avcodec_decode_video(st->codec, &picture,
1629 &got_picture, (uint8_t *)data, size);
1631 case CODEC_TYPE_AUDIO:
1632 data_size = FFMAX(size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1633 samples = av_malloc(data_size);
1636 ret = avcodec_decode_audio2(st->codec, samples,
1637 &data_size, (uint8_t *)data, size);
1648 static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score)
1651 fmt = av_probe_input_format2(pd, 1, &score);
1654 if (strncmp(fmt->name, "mp3", 3) == 0)
1655 st->codec->codec_id = CODEC_ID_MP3;
1656 else if (strncmp(fmt->name, "ac3", 3) == 0)
1657 st->codec->codec_id = CODEC_ID_AC3;
1662 unsigned int codec_get_tag(const AVCodecTag *tags, int id)
1664 while (tags->id != CODEC_ID_NONE) {
1672 enum CodecID codec_get_id(const AVCodecTag *tags, unsigned int tag)
1674 while (tags->id != CODEC_ID_NONE) {
1675 if( toupper((tag >> 0)&0xFF) == toupper((tags->tag >> 0)&0xFF)
1676 && toupper((tag >> 8)&0xFF) == toupper((tags->tag >> 8)&0xFF)
1677 && toupper((tag >>16)&0xFF) == toupper((tags->tag >>16)&0xFF)
1678 && toupper((tag >>24)&0xFF) == toupper((tags->tag >>24)&0xFF))
1682 return CODEC_ID_NONE;
1685 unsigned int av_codec_get_tag(const AVCodecTag *tags[4], enum CodecID id)
1688 for(i=0; tags && tags[i]; i++){
1689 int tag= codec_get_tag(tags[i], id);
1695 enum CodecID av_codec_get_id(const AVCodecTag *tags[4], unsigned int tag)
1698 for(i=0; tags && tags[i]; i++){
1699 enum CodecID id= codec_get_id(tags[i], tag);
1700 if(id!=CODEC_ID_NONE) return id;
1702 return CODEC_ID_NONE;
1705 /* absolute maximum size we read until we abort */
1706 #define MAX_READ_SIZE 5000000
1708 #define MAX_STD_TIMEBASES (60*12+5)
1709 static int get_std_framerate(int i){
1710 if(i<60*12) return i*1001;
1711 else return ((int[]){24,30,60,12,15})[i-60*12]*1000*12;
1714 int av_find_stream_info(AVFormatContext *ic)
1716 int i, count, ret, read_size, j;
1718 AVPacket pkt1, *pkt;
1719 AVPacketList *pktl=NULL, **ppktl;
1720 int64_t last_dts[MAX_STREAMS];
1721 int duration_count[MAX_STREAMS]={0};
1722 double (*duration_error)[MAX_STD_TIMEBASES];
1723 offset_t old_offset = url_ftell(&ic->pb);
1724 int64_t codec_info_duration[MAX_STREAMS]={0};
1725 int codec_info_nb_frames[MAX_STREAMS]={0};
1726 AVProbeData probe_data[MAX_STREAMS];
1727 int codec_identified[MAX_STREAMS]={0};
1729 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
1730 if (!duration_error) return AVERROR_NOMEM;
1732 for(i=0;i<ic->nb_streams;i++) {
1733 st = ic->streams[i];
1734 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1735 /* if(!st->time_base.num)
1737 if(!st->codec->time_base.num)
1738 st->codec->time_base= st->time_base;
1740 //only for the split stuff
1742 st->parser = av_parser_init(st->codec->codec_id);
1743 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
1744 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1749 for(i=0;i<MAX_STREAMS;i++){
1750 last_dts[i]= AV_NOPTS_VALUE;
1753 memset(probe_data, 0, sizeof(probe_data));
1756 ppktl = &ic->packet_buffer;
1758 /* check if one codec still needs to be handled */
1759 for(i=0;i<ic->nb_streams;i++) {
1760 st = ic->streams[i];
1761 if (!has_codec_parameters(st->codec))
1763 /* variable fps and no guess at the real fps */
1764 if( (st->codec->time_base.den >= 101LL*st->codec->time_base.num || st->codec->codec_id == CODEC_ID_MPEG2VIDEO)
1765 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1767 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1769 if (st->codec->codec_type == CODEC_TYPE_AUDIO &&
1770 st->codec->codec_id == CODEC_ID_NONE)
1773 if (i == ic->nb_streams) {
1774 /* NOTE: if the format has no header, then we need to read
1775 some packets to get most of the streams, so we cannot
1777 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1778 /* if we found the info for all the codecs, we can stop */
1783 /* we did not get all the codec info, but we read too much data */
1784 if (read_size >= MAX_READ_SIZE) {
1789 /* NOTE: a new stream can be added there if no header in file
1790 (AVFMTCTX_NOHEADER) */
1791 ret = av_read_frame_internal(ic, &pkt1);
1794 ret = -1; /* we could not have all the codec parameters before EOF */
1795 for(i=0;i<ic->nb_streams;i++) {
1796 st = ic->streams[i];
1797 if (!has_codec_parameters(st->codec)){
1799 avcodec_string(buf, sizeof(buf), st->codec, 0);
1800 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
1808 pktl = av_mallocz(sizeof(AVPacketList));
1810 ret = AVERROR_NOMEM;
1814 /* add the packet in the buffered packet list */
1816 ppktl = &pktl->next;
1821 /* duplicate the packet */
1822 if (av_dup_packet(pkt) < 0) {
1823 ret = AVERROR_NOMEM;
1827 read_size += pkt->size;
1829 st = ic->streams[pkt->stream_index];
1830 if(codec_info_nb_frames[st->index]>1)
1831 codec_info_duration[st->index] += pkt->duration;
1832 if (pkt->duration != 0)
1833 codec_info_nb_frames[st->index]++;
1836 int index= pkt->stream_index;
1837 int64_t last= last_dts[index];
1838 int64_t duration= pkt->dts - last;
1840 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
1841 double dur= duration * av_q2d(st->time_base);
1843 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1844 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
1845 if(duration_count[index] < 2)
1846 memset(duration_error, 0, MAX_STREAMS * sizeof(*duration_error));
1847 for(i=1; i<MAX_STD_TIMEBASES; i++){
1848 int framerate= get_std_framerate(i);
1849 int ticks= lrintf(dur*framerate/(1001*12));
1850 double error= dur - ticks*1001*12/(double)framerate;
1851 duration_error[index][i] += error*error;
1853 duration_count[index]++;
1855 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
1856 last_dts[pkt->stream_index]= pkt->dts;
1858 if (st->codec->codec_id == CODEC_ID_NONE) {
1859 AVProbeData *pd = &(probe_data[st->index]);
1860 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size);
1861 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
1862 pd->buf_size += pkt->size;
1865 if(st->parser && st->parser->parser->split && !st->codec->extradata){
1866 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
1868 st->codec->extradata_size= i;
1869 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
1870 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
1871 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1875 /* if still no information, we try to open the codec and to
1876 decompress the frame. We try to avoid that in most cases as
1877 it takes longer and uses more memory. For MPEG4, we need to
1878 decompress for Quicktime. */
1879 if (!has_codec_parameters(st->codec) /*&&
1880 (st->codec->codec_id == CODEC_ID_FLV1 ||
1881 st->codec->codec_id == CODEC_ID_H264 ||
1882 st->codec->codec_id == CODEC_ID_H263 ||
1883 st->codec->codec_id == CODEC_ID_H261 ||
1884 st->codec->codec_id == CODEC_ID_VORBIS ||
1885 st->codec->codec_id == CODEC_ID_MJPEG ||
1886 st->codec->codec_id == CODEC_ID_PNG ||
1887 st->codec->codec_id == CODEC_ID_PAM ||
1888 st->codec->codec_id == CODEC_ID_PGM ||
1889 st->codec->codec_id == CODEC_ID_PGMYUV ||
1890 st->codec->codec_id == CODEC_ID_PBM ||
1891 st->codec->codec_id == CODEC_ID_PPM ||
1892 st->codec->codec_id == CODEC_ID_SHORTEN ||
1893 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
1894 try_decode_frame(st, pkt->data, pkt->size);
1896 if (st->time_base.den > 0 && av_rescale_q(codec_info_duration[st->index], st->time_base, AV_TIME_BASE_Q) >= ic->max_analyze_duration) {
1902 // close codecs which where opened in try_decode_frame()
1903 for(i=0;i<ic->nb_streams;i++) {
1904 st = ic->streams[i];
1905 if(st->codec->codec)
1906 avcodec_close(st->codec);
1908 for(i=0;i<ic->nb_streams;i++) {
1909 st = ic->streams[i];
1910 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1911 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
1912 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
1914 if(duration_count[i]
1915 && (st->codec->time_base.num*101LL <= st->codec->time_base.den || st->codec->codec_id == CODEC_ID_MPEG2VIDEO) /*&&
1916 //FIXME we should not special case mpeg2, but this needs testing with non mpeg2 ...
1917 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
1918 double best_error= 2*av_q2d(st->time_base);
1919 best_error= best_error*best_error*duration_count[i]*1000*12*30;
1921 for(j=1; j<MAX_STD_TIMEBASES; j++){
1922 double error= duration_error[i][j] * get_std_framerate(j);
1923 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1924 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
1925 if(error < best_error){
1927 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, get_std_framerate(j), 12*1001, INT_MAX);
1932 if (!st->r_frame_rate.num){
1933 if( st->codec->time_base.den * (int64_t)st->time_base.num
1934 <= st->codec->time_base.num * (int64_t)st->time_base.den){
1935 st->r_frame_rate.num = st->codec->time_base.den;
1936 st->r_frame_rate.den = st->codec->time_base.num;
1938 st->r_frame_rate.num = st->time_base.den;
1939 st->r_frame_rate.den = st->time_base.num;
1942 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
1943 if (st->codec->codec_id == CODEC_ID_NONE && probe_data[st->index].buf_size > 0) {
1944 codec_identified[st->index] = set_codec_from_probe_data(st, &(probe_data[st->index]), 0);
1945 if (codec_identified[st->index]) {
1946 st->need_parsing = AVSTREAM_PARSE_FULL;
1949 if(!st->codec->bits_per_sample)
1950 st->codec->bits_per_sample= av_get_bits_per_sample(st->codec->codec_id);
1954 av_estimate_timings(ic, old_offset);
1956 for(i=0;i<ic->nb_streams;i++) {
1957 st = ic->streams[i];
1958 if (codec_identified[st->index]) {
1959 av_read_frame_flush(ic);
1960 av_seek_frame(ic, st->index, 0.0, 0);
1961 url_fseek(&ic->pb, ic->data_offset, SEEK_SET);
1966 /* correct DTS for b frame streams with no timestamps */
1967 for(i=0;i<ic->nb_streams;i++) {
1968 st = ic->streams[i];
1969 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1971 ppktl = &ic->packet_buffer;
1973 if(ppkt1->stream_index != i)
1975 if(ppkt1->pkt->dts < 0)
1977 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
1979 ppkt1->pkt->dts -= delta;
1984 st->cur_dts -= delta;
1990 av_free(duration_error);
1991 for(i=0;i<MAX_STREAMS;i++){
1992 av_freep(&(probe_data[i].buf));
1998 /*******************************************************/
2000 int av_read_play(AVFormatContext *s)
2002 if (!s->iformat->read_play)
2003 return AVERROR_NOTSUPP;
2004 return s->iformat->read_play(s);
2007 int av_read_pause(AVFormatContext *s)
2009 if (!s->iformat->read_pause)
2010 return AVERROR_NOTSUPP;
2011 return s->iformat->read_pause(s);
2014 void av_close_input_file(AVFormatContext *s)
2016 int i, must_open_file;
2019 /* free previous packet */
2020 if (s->cur_st && s->cur_st->parser)
2021 av_free_packet(&s->cur_pkt);
2023 if (s->iformat->read_close)
2024 s->iformat->read_close(s);
2025 for(i=0;i<s->nb_streams;i++) {
2026 /* free all data in a stream component */
2029 av_parser_close(st->parser);
2031 av_free(st->index_entries);
2032 av_free(st->codec->extradata);
2036 flush_packet_queue(s);
2038 if (s->iformat->flags & AVFMT_NOFILE) {
2041 if (must_open_file) {
2044 av_freep(&s->priv_data);
2048 AVStream *av_new_stream(AVFormatContext *s, int id)
2053 if (s->nb_streams >= MAX_STREAMS)
2056 st = av_mallocz(sizeof(AVStream));
2060 st->codec= avcodec_alloc_context();
2062 /* no default bitrate if decoding */
2063 st->codec->bit_rate = 0;
2065 st->index = s->nb_streams;
2067 st->start_time = AV_NOPTS_VALUE;
2068 st->duration = AV_NOPTS_VALUE;
2069 st->cur_dts = AV_NOPTS_VALUE;
2071 /* default pts settings is MPEG like */
2072 av_set_pts_info(st, 33, 1, 90000);
2073 st->last_IP_pts = AV_NOPTS_VALUE;
2074 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2075 st->pts_buffer[i]= AV_NOPTS_VALUE;
2077 s->streams[s->nb_streams++] = st;
2081 /************************************************************/
2082 /* output media file */
2084 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2088 if (s->oformat->priv_data_size > 0) {
2089 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2091 return AVERROR_NOMEM;
2093 s->priv_data = NULL;
2095 if (s->oformat->set_parameters) {
2096 ret = s->oformat->set_parameters(s, ap);
2103 int av_write_header(AVFormatContext *s)
2108 // some sanity checks
2109 for(i=0;i<s->nb_streams;i++) {
2112 switch (st->codec->codec_type) {
2113 case CODEC_TYPE_AUDIO:
2114 if(st->codec->sample_rate<=0){
2115 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2119 case CODEC_TYPE_VIDEO:
2120 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2121 av_log(s, AV_LOG_ERROR, "time base not set\n");
2124 if(st->codec->width<=0 || st->codec->height<=0){
2125 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2131 if(s->oformat->codec_tag){
2132 if(st->codec->codec_tag){
2134 //check that tag + id is in the table
2135 //if neither is in the table -> ok
2136 //if tag is in the table with another id -> FAIL
2137 //if id is in the table with another tag -> FAIL unless strict < ?
2139 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2143 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2144 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2146 return AVERROR_NOMEM;
2149 if(s->oformat->write_header){
2150 ret = s->oformat->write_header(s);
2155 /* init PTS generation */
2156 for(i=0;i<s->nb_streams;i++) {
2157 int64_t den = AV_NOPTS_VALUE;
2160 switch (st->codec->codec_type) {
2161 case CODEC_TYPE_AUDIO:
2162 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2164 case CODEC_TYPE_VIDEO:
2165 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2170 if (den != AV_NOPTS_VALUE) {
2172 return AVERROR_INVALIDDATA;
2173 av_frac_init(&st->pts, 0, 0, den);
2179 //FIXME merge with compute_pkt_fields
2180 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2181 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2182 int num, den, frame_size, i;
2184 // av_log(st->codec, AV_LOG_DEBUG, "av_write_frame: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n", pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
2186 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2189 /* duration field */
2190 if (pkt->duration == 0) {
2191 compute_frame_duration(&num, &den, st, NULL, pkt);
2193 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2197 //XXX/FIXME this is a temporary hack until all encoders output pts
2198 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2200 // pkt->pts= st->cur_dts;
2201 pkt->pts= st->pts.val;
2204 //calculate dts from pts
2205 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2206 st->pts_buffer[0]= pkt->pts;
2207 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2208 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2209 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2210 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2212 pkt->dts= st->pts_buffer[0];
2215 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2216 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2219 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2220 av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n");
2224 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2225 st->cur_dts= pkt->dts;
2226 st->pts.val= pkt->dts;
2229 switch (st->codec->codec_type) {
2230 case CODEC_TYPE_AUDIO:
2231 frame_size = get_audio_frame_size(st->codec, pkt->size);
2233 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
2234 but it would be better if we had the real timestamps from the encoder */
2235 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2236 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2239 case CODEC_TYPE_VIDEO:
2240 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2248 static void truncate_ts(AVStream *st, AVPacket *pkt){
2249 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2252 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here
2254 if (pkt->pts != AV_NOPTS_VALUE)
2255 pkt->pts &= pts_mask;
2256 if (pkt->dts != AV_NOPTS_VALUE)
2257 pkt->dts &= pts_mask;
2260 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2264 ret=compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2265 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2268 truncate_ts(s->streams[pkt->stream_index], pkt);
2270 ret= s->oformat->write_packet(s, pkt);
2272 ret= url_ferror(&s->pb);
2276 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2277 AVPacketList *pktl, **next_point, *this_pktl;
2279 int streams[MAX_STREAMS];
2282 AVStream *st= s->streams[ pkt->stream_index];
2284 // assert(pkt->destruct != av_destruct_packet); //FIXME
2286 this_pktl = av_mallocz(sizeof(AVPacketList));
2287 this_pktl->pkt= *pkt;
2288 if(pkt->destruct == av_destruct_packet)
2289 pkt->destruct= NULL; // non shared -> must keep original from being freed
2291 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2293 next_point = &s->packet_buffer;
2295 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2296 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2297 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2298 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2300 next_point= &(*next_point)->next;
2302 this_pktl->next= *next_point;
2303 *next_point= this_pktl;
2306 memset(streams, 0, sizeof(streams));
2307 pktl= s->packet_buffer;
2309 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2310 if(streams[ pktl->pkt.stream_index ] == 0)
2312 streams[ pktl->pkt.stream_index ]++;
2316 if(s->nb_streams == stream_count || (flush && stream_count)){
2317 pktl= s->packet_buffer;
2320 s->packet_buffer= pktl->next;
2324 av_init_packet(out);
2330 * Interleaves a AVPacket correctly so it can be muxed.
2331 * @param out the interleaved packet will be output here
2332 * @param in the input packet
2333 * @param flush 1 if no further packets are available as input and all
2334 * remaining packets should be output
2335 * @return 1 if a packet was output, 0 if no packet could be output,
2336 * < 0 if an error occured
2338 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2339 if(s->oformat->interleave_packet)
2340 return s->oformat->interleave_packet(s, out, in, flush);
2342 return av_interleave_packet_per_dts(s, out, in, flush);
2345 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2346 AVStream *st= s->streams[ pkt->stream_index];
2348 //FIXME/XXX/HACK drop zero sized packets
2349 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2352 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2353 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2356 if(pkt->dts == AV_NOPTS_VALUE)
2361 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2362 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2365 truncate_ts(s->streams[opkt.stream_index], &opkt);
2366 ret= s->oformat->write_packet(s, &opkt);
2368 av_free_packet(&opkt);
2373 if(url_ferror(&s->pb))
2374 return url_ferror(&s->pb);
2378 int av_write_trailer(AVFormatContext *s)
2384 ret= av_interleave_packet(s, &pkt, NULL, 1);
2385 if(ret<0) //FIXME cleanup needed for ret<0 ?
2390 truncate_ts(s->streams[pkt.stream_index], &pkt);
2391 ret= s->oformat->write_packet(s, &pkt);
2393 av_free_packet(&pkt);
2397 if(url_ferror(&s->pb))
2401 if(s->oformat->write_trailer)
2402 ret = s->oformat->write_trailer(s);
2405 ret=url_ferror(&s->pb);
2406 for(i=0;i<s->nb_streams;i++)
2407 av_freep(&s->streams[i]->priv_data);
2408 av_freep(&s->priv_data);
2412 /* "user interface" functions */
2414 void dump_format(AVFormatContext *ic,
2422 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2423 is_output ? "Output" : "Input",
2425 is_output ? ic->oformat->name : ic->iformat->name,
2426 is_output ? "to" : "from", url);
2428 av_log(NULL, AV_LOG_INFO, " Duration: ");
2429 if (ic->duration != AV_NOPTS_VALUE) {
2430 int hours, mins, secs, us;
2431 secs = ic->duration / AV_TIME_BASE;
2432 us = ic->duration % AV_TIME_BASE;
2437 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%01d", hours, mins, secs,
2438 (10 * us) / AV_TIME_BASE);
2440 av_log(NULL, AV_LOG_INFO, "N/A");
2442 if (ic->start_time != AV_NOPTS_VALUE) {
2444 av_log(NULL, AV_LOG_INFO, ", start: ");
2445 secs = ic->start_time / AV_TIME_BASE;
2446 us = ic->start_time % AV_TIME_BASE;
2447 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2448 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2450 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2452 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2454 av_log(NULL, AV_LOG_INFO, "N/A");
2456 av_log(NULL, AV_LOG_INFO, "\n");
2458 for(i=0;i<ic->nb_streams;i++) {
2459 AVStream *st = ic->streams[i];
2460 int g= ff_gcd(st->time_base.num, st->time_base.den);
2461 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2462 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2463 /* the pid is an important information, so we display it */
2464 /* XXX: add a generic system */
2466 flags = ic->oformat->flags;
2468 flags = ic->iformat->flags;
2469 if (flags & AVFMT_SHOW_IDS) {
2470 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2472 if (strlen(st->language) > 0) {
2473 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2475 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2476 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2477 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2478 if(st->r_frame_rate.den && st->r_frame_rate.num)
2479 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(r)", av_q2d(st->r_frame_rate));
2480 /* else if(st->time_base.den && st->time_base.num)
2481 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(m)", 1/av_q2d(st->time_base));*/
2483 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(c)", 1/av_q2d(st->codec->time_base));
2485 av_log(NULL, AV_LOG_INFO, "\n");
2489 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2491 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2494 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2496 AVRational frame_rate;
2497 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2498 *frame_rate_num= frame_rate.num;
2499 *frame_rate_den= frame_rate.den;
2504 * gets the current time in micro seconds.
2506 int64_t av_gettime(void)
2509 gettimeofday(&tv,NULL);
2510 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
2513 int64_t parse_date(const char *datestr, int duration)
2519 static const char *date_fmt[] = {
2523 static const char *time_fmt[] = {
2533 time_t now = time(0);
2535 len = strlen(datestr);
2537 lastch = datestr[len - 1];
2540 is_utc = (lastch == 'z' || lastch == 'Z');
2542 memset(&dt, 0, sizeof(dt));
2547 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2548 q = small_strptime(p, date_fmt[i], &dt);
2558 dt = *localtime(&now);
2560 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2565 if (*p == 'T' || *p == 't' || *p == ' ')
2568 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2569 q = small_strptime(p, time_fmt[i], &dt);
2579 q = small_strptime(p, time_fmt[0], &dt);
2581 dt.tm_sec = strtol(p, (char **)&q, 10);
2587 /* Now we have all the fields that we can get */
2592 return now * INT64_C(1000000);
2596 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2598 dt.tm_isdst = -1; /* unknown */
2611 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2614 val += n * (*q - '0');
2618 return negative ? -t : t;
2621 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2631 while (*p != '\0' && *p != '=' && *p != '&') {
2632 if ((q - tag) < sizeof(tag) - 1)
2640 while (*p != '&' && *p != '\0') {
2641 if ((q - arg) < arg_size - 1) {
2651 if (!strcmp(tag, tag1))
2660 int av_get_frame_filename(char *buf, int buf_size,
2661 const char *path, int number)
2664 char *q, buf1[20], c;
2665 int nd, len, percentd_found;
2677 while (isdigit(*p)) {
2678 nd = nd * 10 + *p++ - '0';
2681 } while (isdigit(c));
2690 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2692 if ((q - buf + len) > buf_size - 1)
2694 memcpy(q, buf1, len);
2702 if ((q - buf) < buf_size - 1)
2706 if (!percentd_found)
2715 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
2718 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2720 for(i=0;i<size;i+=16) {
2727 PRINT(" %02x", buf[i+j]);
2732 for(j=0;j<len;j++) {
2734 if (c < ' ' || c > '~')
2743 void av_hex_dump(FILE *f, uint8_t *buf, int size)
2745 hex_dump_internal(NULL, f, 0, buf, size);
2748 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
2750 hex_dump_internal(avcl, NULL, level, buf, size);
2753 //FIXME needs to know the time_base
2754 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
2756 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2757 PRINT("stream #%d:\n", pkt->stream_index);
2758 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
2759 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
2760 /* DTS is _always_ valid after av_read_frame() */
2762 if (pkt->dts == AV_NOPTS_VALUE)
2765 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
2766 /* PTS may be not known if B frames are present */
2768 if (pkt->pts == AV_NOPTS_VALUE)
2771 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
2773 PRINT(" size=%d\n", pkt->size);
2776 av_hex_dump(f, pkt->data, pkt->size);
2779 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
2781 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
2784 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
2786 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
2789 void url_split(char *proto, int proto_size,
2790 char *authorization, int authorization_size,
2791 char *hostname, int hostname_size,
2793 char *path, int path_size,
2804 while (*p != ':' && *p != '\0') {
2805 if ((q - proto) < proto_size - 1)
2811 if (authorization_size > 0)
2812 authorization[0] = '\0';
2816 if (hostname_size > 0)
2820 char *at,*slash; // PETR: position of '@' character and '/' character
2827 at = strchr(p,'@'); // PETR: get the position of '@'
2828 slash = strchr(p,'/'); // PETR: get position of '/' - end of hostname
2829 if (at && slash && at > slash) at = NULL; // PETR: not interested in '@' behind '/'
2831 q = at ? authorization : hostname; // PETR: if '@' exists starting with auth.
2833 while ((at || *p != ':') && *p != '/' && *p != '?' && *p != '\0') { // PETR:
2834 if (*p == '@') { // PETR: passed '@'
2835 if (authorization_size > 0)
2839 } else if (!at) { // PETR: hostname
2840 if ((q - hostname) < hostname_size - 1)
2843 if ((q - authorization) < authorization_size - 1)
2848 if (hostname_size > 0)
2852 port = strtoul(p, (char **)&p, 10);
2857 av_strlcpy(path, p, path_size);
2860 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
2861 int pts_num, int pts_den)
2863 s->pts_wrap_bits = pts_wrap_bits;
2864 s->time_base.num = pts_num;
2865 s->time_base.den = pts_den;
2868 /* fraction handling */
2871 * f = val + (num / den) + 0.5.
2873 * 'num' is normalized so that it is such as 0 <= num < den.
2875 * @param f fractional number
2876 * @param val integer value
2877 * @param num must be >= 0
2878 * @param den must be >= 1
2880 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
2893 * Fractionnal addition to f: f = f + (incr / f->den).
2895 * @param f fractional number
2896 * @param incr increment, can be positive or negative
2898 static void av_frac_add(AVFrac *f, int64_t incr)
2902 num = f->num + incr;
2905 f->val += num / den;
2911 } else if (num >= den) {
2912 f->val += num / den;