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(ENOMEM);
199 data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
201 return AVERROR(ENOMEM);
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(ENOMEM);
237 data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
239 return AVERROR(ENOMEM);
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();
361 err = AVERROR(ENOMEM);
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) {
375 err = AVERROR(ENOMEM);
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 void compute_pkt_fields(AVFormatContext *s, AVStream *st,
593 AVCodecParserContext *pc, AVPacket *pkt)
595 int num, den, presentation_delayed, delay, i;
598 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
599 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
600 pkt->dts -= 1LL<<st->pts_wrap_bits;
603 if (pkt->duration == 0) {
604 compute_frame_duration(&num, &den, st, pc, pkt);
606 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
610 /* correct timestamps with byte offset if demuxers only have timestamps on packet boundaries */
611 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
612 /* this will estimate bitrate based on this frame's duration and size */
613 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
614 if(pkt->pts != AV_NOPTS_VALUE)
616 if(pkt->dts != AV_NOPTS_VALUE)
620 if(is_intra_only(st->codec))
621 pkt->flags |= PKT_FLAG_KEY;
623 /* do we have a video B frame ? */
624 delay= st->codec->has_b_frames;
625 presentation_delayed = 0;
626 /* XXX: need has_b_frame, but cannot get it if the codec is
629 pc && pc->pict_type != FF_B_TYPE)
630 presentation_delayed = 1;
631 /* This may be redundant, but it should not hurt. */
632 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
633 presentation_delayed = 1;
635 if(st->cur_dts == AV_NOPTS_VALUE){
636 st->cur_dts = -delay * pkt->duration;
639 // 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);
640 /* interpolate PTS and DTS if they are not present */
642 if (presentation_delayed) {
643 /* DTS = decompression time stamp */
644 /* PTS = presentation time stamp */
645 if (pkt->dts == AV_NOPTS_VALUE)
646 pkt->dts = st->last_IP_pts;
647 if (pkt->dts == AV_NOPTS_VALUE)
648 pkt->dts = st->cur_dts;
650 /* this is tricky: the dts must be incremented by the duration
651 of the frame we are displaying, i.e. the last I or P frame */
652 if (st->last_IP_duration == 0)
653 st->last_IP_duration = pkt->duration;
654 st->cur_dts = pkt->dts + st->last_IP_duration;
655 st->last_IP_duration = pkt->duration;
656 st->last_IP_pts= pkt->pts;
657 /* cannot compute PTS if not present (we can compute it only
658 by knowing the futur */
659 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
660 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
661 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
662 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
663 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
664 pkt->pts += pkt->duration;
665 // 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);
669 /* presentation is not delayed : PTS and DTS are the same */
670 if(pkt->pts == AV_NOPTS_VALUE)
672 if(pkt->pts == AV_NOPTS_VALUE)
673 pkt->pts = st->cur_dts;
675 st->cur_dts = pkt->pts + pkt->duration;
679 if(pkt->pts != AV_NOPTS_VALUE){
680 st->pts_buffer[0]= pkt->pts;
681 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
682 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
683 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
684 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
685 if(pkt->dts == AV_NOPTS_VALUE)
686 pkt->dts= st->pts_buffer[0];
687 if(pkt->dts > st->cur_dts)
688 st->cur_dts = pkt->dts;
691 // 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);
696 /* key frame computation */
697 if (pc->pict_type == FF_I_TYPE)
698 pkt->flags |= PKT_FLAG_KEY;
702 void av_destruct_packet_nofree(AVPacket *pkt)
704 pkt->data = NULL; pkt->size = 0;
707 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
715 /* select current input stream component */
718 if (!st->need_parsing || !st->parser) {
719 /* no parsing needed: we just output the packet as is */
720 /* raw data support */
722 compute_pkt_fields(s, st, NULL, pkt);
725 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
726 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
727 s->cur_ptr, s->cur_len,
728 s->cur_pkt.pts, s->cur_pkt.dts);
729 s->cur_pkt.pts = AV_NOPTS_VALUE;
730 s->cur_pkt.dts = AV_NOPTS_VALUE;
731 /* increment read pointer */
735 /* return packet if any */
738 pkt->pos = s->cur_pkt.pos; // Isn't quite accurate but close.
740 pkt->stream_index = st->index;
741 pkt->pts = st->parser->pts;
742 pkt->dts = st->parser->dts;
743 pkt->destruct = av_destruct_packet_nofree;
744 compute_pkt_fields(s, st, st->parser, pkt);
746 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
747 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
748 0, 0, AVINDEX_KEYFRAME);
755 av_free_packet(&s->cur_pkt);
759 /* read next packet */
760 ret = av_read_packet(s, &s->cur_pkt);
762 if (ret == AVERROR(EAGAIN))
764 /* return the last frames, if any */
765 for(i = 0; i < s->nb_streams; i++) {
767 if (st->parser && st->need_parsing) {
768 av_parser_parse(st->parser, st->codec,
769 &pkt->data, &pkt->size,
771 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
776 /* no more packets: really terminates parsing */
780 st = s->streams[s->cur_pkt.stream_index];
781 if(st->codec->debug & FF_DEBUG_PTS)
782 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
783 s->cur_pkt.stream_index,
789 s->cur_ptr = s->cur_pkt.data;
790 s->cur_len = s->cur_pkt.size;
791 if (st->need_parsing && !st->parser) {
792 st->parser = av_parser_init(st->codec->codec_id);
794 /* no parser available : just output the raw packets */
795 st->need_parsing = AVSTREAM_PARSE_NONE;
796 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
797 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
799 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
800 st->parser->last_frame_offset=
801 st->parser->cur_offset= s->cur_pkt.pos;
806 if(st->codec->debug & FF_DEBUG_PTS)
807 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
816 static AVPacket *add_to_pktbuf(AVFormatContext *s, AVPacket *pkt){
817 AVPacketList *pktl= s->packet_buffer;
818 AVPacketList **plast_pktl= &s->packet_buffer;
820 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
822 pktl = av_mallocz(sizeof(AVPacketList));
826 /* add the packet in the buffered packet list */
832 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
836 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
839 pktl = s->packet_buffer;
841 AVPacket *next_pkt= &pktl->pkt;
843 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
844 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
845 if( pktl->pkt.stream_index == next_pkt->stream_index
846 && next_pkt->dts < pktl->pkt.dts
847 && pktl->pkt.pts != pktl->pkt.dts //not b frame
848 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
849 next_pkt->pts= pktl->pkt.dts;
853 pktl = s->packet_buffer;
856 if( next_pkt->pts != AV_NOPTS_VALUE
857 || next_pkt->dts == AV_NOPTS_VALUE
859 /* read packet from packet buffer, if there is data */
861 s->packet_buffer = pktl->next;
867 int ret= av_read_frame_internal(s, pkt);
869 if(pktl && ret != AVERROR(EAGAIN)){
876 if(av_dup_packet(add_to_pktbuf(s, pkt)) < 0)
877 return AVERROR(ENOMEM);
879 assert(!s->packet_buffer);
880 return av_read_frame_internal(s, pkt);
885 /* XXX: suppress the packet queue */
886 static void flush_packet_queue(AVFormatContext *s)
891 pktl = s->packet_buffer;
894 s->packet_buffer = pktl->next;
895 av_free_packet(&pktl->pkt);
900 /*******************************************************/
903 int av_find_default_stream_index(AVFormatContext *s)
908 if (s->nb_streams <= 0)
910 for(i = 0; i < s->nb_streams; i++) {
912 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
920 * Flush the frame reader.
922 static void av_read_frame_flush(AVFormatContext *s)
927 flush_packet_queue(s);
929 /* free previous packet */
931 if (s->cur_st->parser)
932 av_free_packet(&s->cur_pkt);
939 /* for each stream, reset read state */
940 for(i = 0; i < s->nb_streams; i++) {
944 av_parser_close(st->parser);
947 st->last_IP_pts = AV_NOPTS_VALUE;
948 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
952 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
955 for(i = 0; i < s->nb_streams; i++) {
956 AVStream *st = s->streams[i];
958 st->cur_dts = av_rescale(timestamp,
959 st->time_base.den * (int64_t)ref_st->time_base.num,
960 st->time_base.num * (int64_t)ref_st->time_base.den);
964 int av_add_index_entry(AVStream *st,
965 int64_t pos, int64_t timestamp, int size, int distance, int flags)
967 AVIndexEntry *entries, *ie;
970 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
973 entries = av_fast_realloc(st->index_entries,
974 &st->index_entries_allocated_size,
975 (st->nb_index_entries + 1) *
976 sizeof(AVIndexEntry));
980 st->index_entries= entries;
982 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
985 index= st->nb_index_entries++;
987 assert(index==0 || ie[-1].timestamp < timestamp);
990 if(ie->timestamp != timestamp){
991 if(ie->timestamp <= timestamp)
993 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
994 st->nb_index_entries++;
995 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
996 distance= ie->min_distance;
1000 ie->timestamp = timestamp;
1001 ie->min_distance= distance;
1008 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1011 AVIndexEntry *entries= st->index_entries;
1012 int nb_entries= st->nb_index_entries;
1021 timestamp = entries[m].timestamp;
1022 if(timestamp >= wanted_timestamp)
1024 if(timestamp <= wanted_timestamp)
1027 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1029 if(!(flags & AVSEEK_FLAG_ANY)){
1030 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1031 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1042 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1043 AVInputFormat *avif= s->iformat;
1044 int64_t pos_min, pos_max, pos, pos_limit;
1045 int64_t ts_min, ts_max, ts;
1049 if (stream_index < 0)
1053 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1057 ts_min= AV_NOPTS_VALUE;
1058 pos_limit= -1; //gcc falsely says it may be uninitialized
1060 st= s->streams[stream_index];
1061 if(st->index_entries){
1064 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()
1065 index= FFMAX(index, 0);
1066 e= &st->index_entries[index];
1068 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1070 ts_min= e->timestamp;
1072 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1079 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1080 assert(index < st->nb_index_entries);
1082 e= &st->index_entries[index];
1083 assert(e->timestamp >= target_ts);
1085 ts_max= e->timestamp;
1086 pos_limit= pos_max - e->min_distance;
1088 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1089 pos_max,pos_limit, ts_max);
1094 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1099 url_fseek(&s->pb, pos, SEEK_SET);
1101 av_update_cur_dts(s, st, ts);
1106 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 )){
1108 int64_t start_pos, filesize;
1112 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1115 if(ts_min == AV_NOPTS_VALUE){
1116 pos_min = s->data_offset;
1117 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1118 if (ts_min == AV_NOPTS_VALUE)
1122 if(ts_max == AV_NOPTS_VALUE){
1124 filesize = url_fsize(&s->pb);
1125 pos_max = filesize - 1;
1128 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1130 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1131 if (ts_max == AV_NOPTS_VALUE)
1135 int64_t tmp_pos= pos_max + 1;
1136 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1137 if(tmp_ts == AV_NOPTS_VALUE)
1141 if(tmp_pos >= filesize)
1147 if(ts_min > ts_max){
1149 }else if(ts_min == ts_max){
1154 while (pos_min < pos_limit) {
1156 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1160 assert(pos_limit <= pos_max);
1163 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1164 // interpolate position (better than dichotomy)
1165 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1166 + pos_min - approximate_keyframe_distance;
1167 }else if(no_change==1){
1168 // bisection, if interpolation failed to change min or max pos last time
1169 pos = (pos_min + pos_limit)>>1;
1171 // linear search if bisection failed, can only happen if there are very few or no keframes between min/max
1176 else if(pos > pos_limit)
1180 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1186 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);
1188 if(ts == AV_NOPTS_VALUE){
1189 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1192 assert(ts != AV_NOPTS_VALUE);
1193 if (target_ts <= ts) {
1194 pos_limit = start_pos - 1;
1198 if (target_ts >= ts) {
1204 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1205 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1208 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1210 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1211 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1212 pos, ts_min, target_ts, ts_max);
1218 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1219 int64_t pos_min, pos_max;
1223 if (stream_index < 0)
1226 st= s->streams[stream_index];
1229 pos_min = s->data_offset;
1230 pos_max = url_fsize(&s->pb) - 1;
1232 if (pos < pos_min) pos= pos_min;
1233 else if(pos > pos_max) pos= pos_max;
1235 url_fseek(&s->pb, pos, SEEK_SET);
1238 av_update_cur_dts(s, st, ts);
1243 static int av_seek_frame_generic(AVFormatContext *s,
1244 int stream_index, int64_t timestamp, int flags)
1250 st = s->streams[stream_index];
1252 index = av_index_search_timestamp(st, timestamp, flags);
1254 if(index < 0 || index==st->nb_index_entries-1){
1258 if(st->index_entries && st->nb_index_entries){
1259 ie= &st->index_entries[st->nb_index_entries-1];
1260 url_fseek(&s->pb, ie->pos, SEEK_SET);
1261 av_update_cur_dts(s, st, ie->timestamp);
1263 url_fseek(&s->pb, 0, SEEK_SET);
1266 int ret = av_read_frame(s, &pkt);
1269 av_free_packet(&pkt);
1270 if(stream_index == pkt.stream_index){
1271 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1275 index = av_index_search_timestamp(st, timestamp, flags);
1280 av_read_frame_flush(s);
1281 if (s->iformat->read_seek){
1282 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1285 ie = &st->index_entries[index];
1286 url_fseek(&s->pb, ie->pos, SEEK_SET);
1288 av_update_cur_dts(s, st, ie->timestamp);
1293 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1298 av_read_frame_flush(s);
1300 if(flags & AVSEEK_FLAG_BYTE)
1301 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1303 if(stream_index < 0){
1304 stream_index= av_find_default_stream_index(s);
1305 if(stream_index < 0)
1308 st= s->streams[stream_index];
1309 /* timestamp for default must be expressed in AV_TIME_BASE units */
1310 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1312 st= s->streams[stream_index];
1314 /* first, we try the format specific seek */
1315 if (s->iformat->read_seek)
1316 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1323 if(s->iformat->read_timestamp)
1324 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1326 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1329 /*******************************************************/
1332 * Returns TRUE if the stream has accurate timings in any stream.
1334 * @return TRUE if the stream has accurate timings for at least one component.
1336 static int av_has_timings(AVFormatContext *ic)
1341 for(i = 0;i < ic->nb_streams; i++) {
1342 st = ic->streams[i];
1343 if (st->start_time != AV_NOPTS_VALUE &&
1344 st->duration != AV_NOPTS_VALUE)
1351 * Estimate the stream timings from the one of each components.
1353 * Also computes the global bitrate if possible.
1355 static void av_update_stream_timings(AVFormatContext *ic)
1357 int64_t start_time, start_time1, end_time, end_time1;
1361 start_time = INT64_MAX;
1362 end_time = INT64_MIN;
1363 for(i = 0;i < ic->nb_streams; i++) {
1364 st = ic->streams[i];
1365 if (st->start_time != AV_NOPTS_VALUE) {
1366 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1367 if (start_time1 < start_time)
1368 start_time = start_time1;
1369 if (st->duration != AV_NOPTS_VALUE) {
1370 end_time1 = start_time1
1371 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1372 if (end_time1 > end_time)
1373 end_time = end_time1;
1377 if (start_time != INT64_MAX) {
1378 ic->start_time = start_time;
1379 if (end_time != INT64_MIN) {
1380 ic->duration = end_time - start_time;
1381 if (ic->file_size > 0) {
1382 /* compute the bit rate */
1383 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1384 (double)ic->duration;
1391 static void fill_all_stream_timings(AVFormatContext *ic)
1396 av_update_stream_timings(ic);
1397 for(i = 0;i < ic->nb_streams; i++) {
1398 st = ic->streams[i];
1399 if (st->start_time == AV_NOPTS_VALUE) {
1400 if(ic->start_time != AV_NOPTS_VALUE)
1401 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1402 if(ic->duration != AV_NOPTS_VALUE)
1403 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1408 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1410 int64_t filesize, duration;
1414 /* if bit_rate is already set, we believe it */
1415 if (ic->bit_rate == 0) {
1417 for(i=0;i<ic->nb_streams;i++) {
1418 st = ic->streams[i];
1419 bit_rate += st->codec->bit_rate;
1421 ic->bit_rate = bit_rate;
1424 /* if duration is already set, we believe it */
1425 if (ic->duration == AV_NOPTS_VALUE &&
1426 ic->bit_rate != 0 &&
1427 ic->file_size != 0) {
1428 filesize = ic->file_size;
1430 for(i = 0; i < ic->nb_streams; i++) {
1431 st = ic->streams[i];
1432 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1433 if (st->start_time == AV_NOPTS_VALUE ||
1434 st->duration == AV_NOPTS_VALUE) {
1436 st->duration = duration;
1443 #define DURATION_MAX_READ_SIZE 250000
1445 /* only usable for MPEG-PS streams */
1446 static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offset)
1448 AVPacket pkt1, *pkt = &pkt1;
1450 int read_size, i, ret;
1452 int64_t filesize, offset, duration;
1454 /* free previous packet */
1455 if (ic->cur_st && ic->cur_st->parser)
1456 av_free_packet(&ic->cur_pkt);
1459 /* flush packet queue */
1460 flush_packet_queue(ic);
1462 for(i=0;i<ic->nb_streams;i++) {
1463 st = ic->streams[i];
1465 av_parser_close(st->parser);
1470 /* we read the first packets to get the first PTS (not fully
1471 accurate, but it is enough now) */
1472 url_fseek(&ic->pb, 0, SEEK_SET);
1475 if (read_size >= DURATION_MAX_READ_SIZE)
1477 /* if all info is available, we can stop */
1478 for(i = 0;i < ic->nb_streams; i++) {
1479 st = ic->streams[i];
1480 if (st->start_time == AV_NOPTS_VALUE)
1483 if (i == ic->nb_streams)
1486 ret = av_read_packet(ic, pkt);
1489 read_size += pkt->size;
1490 st = ic->streams[pkt->stream_index];
1491 if (pkt->pts != AV_NOPTS_VALUE) {
1492 if (st->start_time == AV_NOPTS_VALUE)
1493 st->start_time = pkt->pts;
1495 av_free_packet(pkt);
1498 /* estimate the end time (duration) */
1499 /* XXX: may need to support wrapping */
1500 filesize = ic->file_size;
1501 offset = filesize - DURATION_MAX_READ_SIZE;
1505 url_fseek(&ic->pb, offset, SEEK_SET);
1508 if (read_size >= DURATION_MAX_READ_SIZE)
1510 /* if all info is available, we can stop */
1511 for(i = 0;i < ic->nb_streams; i++) {
1512 st = ic->streams[i];
1513 if (st->duration == AV_NOPTS_VALUE)
1516 if (i == ic->nb_streams)
1519 ret = av_read_packet(ic, pkt);
1522 read_size += pkt->size;
1523 st = ic->streams[pkt->stream_index];
1524 if (pkt->pts != AV_NOPTS_VALUE) {
1525 end_time = pkt->pts;
1526 duration = end_time - st->start_time;
1528 if (st->duration == AV_NOPTS_VALUE ||
1529 st->duration < duration)
1530 st->duration = duration;
1533 av_free_packet(pkt);
1536 fill_all_stream_timings(ic);
1538 url_fseek(&ic->pb, old_offset, SEEK_SET);
1541 static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
1545 /* get the file size, if possible */
1546 if (ic->iformat->flags & AVFMT_NOFILE) {
1549 file_size = url_fsize(&ic->pb);
1553 ic->file_size = file_size;
1555 if ((!strcmp(ic->iformat->name, "mpeg") ||
1556 !strcmp(ic->iformat->name, "mpegts")) &&
1557 file_size && !ic->pb.is_streamed) {
1558 /* get accurate estimate from the PTSes */
1559 av_estimate_timings_from_pts(ic, old_offset);
1560 } else if (av_has_timings(ic)) {
1561 /* at least one components has timings - we use them for all
1563 fill_all_stream_timings(ic);
1565 /* less precise: use bit rate info */
1566 av_estimate_timings_from_bit_rate(ic);
1568 av_update_stream_timings(ic);
1574 for(i = 0;i < ic->nb_streams; i++) {
1575 st = ic->streams[i];
1576 printf("%d: start_time: %0.3f duration: %0.3f\n",
1577 i, (double)st->start_time / AV_TIME_BASE,
1578 (double)st->duration / AV_TIME_BASE);
1580 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1581 (double)ic->start_time / AV_TIME_BASE,
1582 (double)ic->duration / AV_TIME_BASE,
1583 ic->bit_rate / 1000);
1588 static int has_codec_parameters(AVCodecContext *enc)
1591 switch(enc->codec_type) {
1592 case CODEC_TYPE_AUDIO:
1593 val = enc->sample_rate;
1595 case CODEC_TYPE_VIDEO:
1596 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1605 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1609 int got_picture, data_size, ret=0;
1612 if(!st->codec->codec){
1613 codec = avcodec_find_decoder(st->codec->codec_id);
1616 ret = avcodec_open(st->codec, codec);
1621 if(!has_codec_parameters(st->codec)){
1622 switch(st->codec->codec_type) {
1623 case CODEC_TYPE_VIDEO:
1624 ret = avcodec_decode_video(st->codec, &picture,
1625 &got_picture, (uint8_t *)data, size);
1627 case CODEC_TYPE_AUDIO:
1628 data_size = FFMAX(size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1629 samples = av_malloc(data_size);
1632 ret = avcodec_decode_audio2(st->codec, samples,
1633 &data_size, (uint8_t *)data, size);
1644 static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score)
1647 fmt = av_probe_input_format2(pd, 1, &score);
1650 if (strncmp(fmt->name, "mp3", 3) == 0)
1651 st->codec->codec_id = CODEC_ID_MP3;
1652 else if (strncmp(fmt->name, "ac3", 3) == 0)
1653 st->codec->codec_id = CODEC_ID_AC3;
1658 unsigned int codec_get_tag(const AVCodecTag *tags, int id)
1660 while (tags->id != CODEC_ID_NONE) {
1668 enum CodecID codec_get_id(const AVCodecTag *tags, unsigned int tag)
1671 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1672 if(tag == tags[i].tag)
1675 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1676 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1677 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1678 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1679 && toupper((tag >>24)&0xFF) == toupper((tags[i].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 int64_t last_dts[MAX_STREAMS];
1720 int duration_count[MAX_STREAMS]={0};
1721 double (*duration_error)[MAX_STD_TIMEBASES];
1722 offset_t old_offset = url_ftell(&ic->pb);
1723 int64_t codec_info_duration[MAX_STREAMS]={0};
1724 int codec_info_nb_frames[MAX_STREAMS]={0};
1725 AVProbeData probe_data[MAX_STREAMS];
1726 int codec_identified[MAX_STREAMS]={0};
1728 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
1729 if (!duration_error) return AVERROR(ENOMEM);
1731 for(i=0;i<ic->nb_streams;i++) {
1732 st = ic->streams[i];
1733 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1734 /* if(!st->time_base.num)
1736 if(!st->codec->time_base.num)
1737 st->codec->time_base= st->time_base;
1739 //only for the split stuff
1741 st->parser = av_parser_init(st->codec->codec_id);
1742 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
1743 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1748 for(i=0;i<MAX_STREAMS;i++){
1749 last_dts[i]= AV_NOPTS_VALUE;
1752 memset(probe_data, 0, sizeof(probe_data));
1756 /* check if one codec still needs to be handled */
1757 for(i=0;i<ic->nb_streams;i++) {
1758 st = ic->streams[i];
1759 if (!has_codec_parameters(st->codec))
1761 /* variable fps and no guess at the real fps */
1762 if( (st->codec->time_base.den >= 101LL*st->codec->time_base.num || st->codec->codec_id == CODEC_ID_MPEG2VIDEO)
1763 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1765 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1767 if (st->codec->codec_type == CODEC_TYPE_AUDIO &&
1768 st->codec->codec_id == CODEC_ID_NONE)
1771 if (i == ic->nb_streams) {
1772 /* NOTE: if the format has no header, then we need to read
1773 some packets to get most of the streams, so we cannot
1775 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1776 /* if we found the info for all the codecs, we can stop */
1781 /* we did not get all the codec info, but we read too much data */
1782 if (read_size >= MAX_READ_SIZE) {
1787 /* NOTE: a new stream can be added there if no header in file
1788 (AVFMTCTX_NOHEADER) */
1789 ret = av_read_frame_internal(ic, &pkt1);
1792 ret = -1; /* we could not have all the codec parameters before EOF */
1793 for(i=0;i<ic->nb_streams;i++) {
1794 st = ic->streams[i];
1795 if (!has_codec_parameters(st->codec)){
1797 avcodec_string(buf, sizeof(buf), st->codec, 0);
1798 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
1806 pkt= add_to_pktbuf(ic, &pkt1);
1807 if(av_dup_packet(pkt) < 0)
1808 return AVERROR(ENOMEM);
1810 read_size += pkt->size;
1812 st = ic->streams[pkt->stream_index];
1813 if(codec_info_nb_frames[st->index]>1)
1814 codec_info_duration[st->index] += pkt->duration;
1815 if (pkt->duration != 0)
1816 codec_info_nb_frames[st->index]++;
1819 int index= pkt->stream_index;
1820 int64_t last= last_dts[index];
1821 int64_t duration= pkt->dts - last;
1823 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
1824 double dur= duration * av_q2d(st->time_base);
1826 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1827 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
1828 if(duration_count[index] < 2)
1829 memset(duration_error, 0, MAX_STREAMS * sizeof(*duration_error));
1830 for(i=1; i<MAX_STD_TIMEBASES; i++){
1831 int framerate= get_std_framerate(i);
1832 int ticks= lrintf(dur*framerate/(1001*12));
1833 double error= dur - ticks*1001*12/(double)framerate;
1834 duration_error[index][i] += error*error;
1836 duration_count[index]++;
1838 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
1839 last_dts[pkt->stream_index]= pkt->dts;
1841 if (st->codec->codec_id == CODEC_ID_NONE) {
1842 AVProbeData *pd = &(probe_data[st->index]);
1843 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size);
1844 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
1845 pd->buf_size += pkt->size;
1848 if(st->parser && st->parser->parser->split && !st->codec->extradata){
1849 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
1851 st->codec->extradata_size= i;
1852 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
1853 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
1854 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1858 /* if still no information, we try to open the codec and to
1859 decompress the frame. We try to avoid that in most cases as
1860 it takes longer and uses more memory. For MPEG4, we need to
1861 decompress for Quicktime. */
1862 if (!has_codec_parameters(st->codec) /*&&
1863 (st->codec->codec_id == CODEC_ID_FLV1 ||
1864 st->codec->codec_id == CODEC_ID_H264 ||
1865 st->codec->codec_id == CODEC_ID_H263 ||
1866 st->codec->codec_id == CODEC_ID_H261 ||
1867 st->codec->codec_id == CODEC_ID_VORBIS ||
1868 st->codec->codec_id == CODEC_ID_MJPEG ||
1869 st->codec->codec_id == CODEC_ID_PNG ||
1870 st->codec->codec_id == CODEC_ID_PAM ||
1871 st->codec->codec_id == CODEC_ID_PGM ||
1872 st->codec->codec_id == CODEC_ID_PGMYUV ||
1873 st->codec->codec_id == CODEC_ID_PBM ||
1874 st->codec->codec_id == CODEC_ID_PPM ||
1875 st->codec->codec_id == CODEC_ID_SHORTEN ||
1876 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
1877 try_decode_frame(st, pkt->data, pkt->size);
1879 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) {
1885 // close codecs which where opened in try_decode_frame()
1886 for(i=0;i<ic->nb_streams;i++) {
1887 st = ic->streams[i];
1888 if(st->codec->codec)
1889 avcodec_close(st->codec);
1891 for(i=0;i<ic->nb_streams;i++) {
1892 st = ic->streams[i];
1893 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1894 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
1895 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
1897 if(duration_count[i]
1898 && (st->codec->time_base.num*101LL <= st->codec->time_base.den || st->codec->codec_id == CODEC_ID_MPEG2VIDEO) /*&&
1899 //FIXME we should not special case mpeg2, but this needs testing with non mpeg2 ...
1900 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
1901 double best_error= 2*av_q2d(st->time_base);
1902 best_error= best_error*best_error*duration_count[i]*1000*12*30;
1904 for(j=1; j<MAX_STD_TIMEBASES; j++){
1905 double error= duration_error[i][j] * get_std_framerate(j);
1906 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1907 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
1908 if(error < best_error){
1910 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, get_std_framerate(j), 12*1001, INT_MAX);
1915 if (!st->r_frame_rate.num){
1916 if( st->codec->time_base.den * (int64_t)st->time_base.num
1917 <= st->codec->time_base.num * (int64_t)st->time_base.den){
1918 st->r_frame_rate.num = st->codec->time_base.den;
1919 st->r_frame_rate.den = st->codec->time_base.num;
1921 st->r_frame_rate.num = st->time_base.den;
1922 st->r_frame_rate.den = st->time_base.num;
1925 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
1926 if (st->codec->codec_id == CODEC_ID_NONE && probe_data[st->index].buf_size > 0) {
1927 codec_identified[st->index] = set_codec_from_probe_data(st, &(probe_data[st->index]), 1);
1928 if (codec_identified[st->index]) {
1929 st->need_parsing = AVSTREAM_PARSE_FULL;
1932 if(!st->codec->bits_per_sample)
1933 st->codec->bits_per_sample= av_get_bits_per_sample(st->codec->codec_id);
1937 av_estimate_timings(ic, old_offset);
1939 for(i=0;i<ic->nb_streams;i++) {
1940 st = ic->streams[i];
1941 if (codec_identified[st->index]) {
1942 av_read_frame_flush(ic);
1943 av_seek_frame(ic, st->index, 0.0, 0);
1944 url_fseek(&ic->pb, ic->data_offset, SEEK_SET);
1949 /* correct DTS for b frame streams with no timestamps */
1950 for(i=0;i<ic->nb_streams;i++) {
1951 st = ic->streams[i];
1952 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1954 ppktl = &ic->packet_buffer;
1956 if(ppkt1->stream_index != i)
1958 if(ppkt1->pkt->dts < 0)
1960 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
1962 ppkt1->pkt->dts -= delta;
1967 st->cur_dts -= delta;
1973 av_free(duration_error);
1974 for(i=0;i<MAX_STREAMS;i++){
1975 av_freep(&(probe_data[i].buf));
1981 /*******************************************************/
1983 int av_read_play(AVFormatContext *s)
1985 if (!s->iformat->read_play)
1986 return AVERROR(ENOSYS);
1987 return s->iformat->read_play(s);
1990 int av_read_pause(AVFormatContext *s)
1992 if (!s->iformat->read_pause)
1993 return AVERROR(ENOSYS);
1994 return s->iformat->read_pause(s);
1997 void av_close_input_file(AVFormatContext *s)
1999 int i, must_open_file;
2002 /* free previous packet */
2003 if (s->cur_st && s->cur_st->parser)
2004 av_free_packet(&s->cur_pkt);
2006 if (s->iformat->read_close)
2007 s->iformat->read_close(s);
2008 for(i=0;i<s->nb_streams;i++) {
2009 /* free all data in a stream component */
2012 av_parser_close(st->parser);
2014 av_free(st->index_entries);
2015 av_free(st->codec->extradata);
2019 flush_packet_queue(s);
2021 if (s->iformat->flags & AVFMT_NOFILE) {
2024 if (must_open_file) {
2027 av_freep(&s->priv_data);
2031 AVStream *av_new_stream(AVFormatContext *s, int id)
2036 if (s->nb_streams >= MAX_STREAMS)
2039 st = av_mallocz(sizeof(AVStream));
2043 st->codec= avcodec_alloc_context();
2045 /* no default bitrate if decoding */
2046 st->codec->bit_rate = 0;
2048 st->index = s->nb_streams;
2050 st->start_time = AV_NOPTS_VALUE;
2051 st->duration = AV_NOPTS_VALUE;
2052 st->cur_dts = AV_NOPTS_VALUE;
2054 /* default pts settings is MPEG like */
2055 av_set_pts_info(st, 33, 1, 90000);
2056 st->last_IP_pts = AV_NOPTS_VALUE;
2057 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2058 st->pts_buffer[i]= AV_NOPTS_VALUE;
2060 s->streams[s->nb_streams++] = st;
2064 /************************************************************/
2065 /* output media file */
2067 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2071 if (s->oformat->priv_data_size > 0) {
2072 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2074 return AVERROR(ENOMEM);
2076 s->priv_data = NULL;
2078 if (s->oformat->set_parameters) {
2079 ret = s->oformat->set_parameters(s, ap);
2086 int av_write_header(AVFormatContext *s)
2091 // some sanity checks
2092 for(i=0;i<s->nb_streams;i++) {
2095 switch (st->codec->codec_type) {
2096 case CODEC_TYPE_AUDIO:
2097 if(st->codec->sample_rate<=0){
2098 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2102 case CODEC_TYPE_VIDEO:
2103 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2104 av_log(s, AV_LOG_ERROR, "time base not set\n");
2107 if(st->codec->width<=0 || st->codec->height<=0){
2108 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2114 if(s->oformat->codec_tag){
2115 if(st->codec->codec_tag){
2117 //check that tag + id is in the table
2118 //if neither is in the table -> ok
2119 //if tag is in the table with another id -> FAIL
2120 //if id is in the table with another tag -> FAIL unless strict < ?
2122 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2126 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2127 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2129 return AVERROR(ENOMEM);
2132 if(s->oformat->write_header){
2133 ret = s->oformat->write_header(s);
2138 /* init PTS generation */
2139 for(i=0;i<s->nb_streams;i++) {
2140 int64_t den = AV_NOPTS_VALUE;
2143 switch (st->codec->codec_type) {
2144 case CODEC_TYPE_AUDIO:
2145 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2147 case CODEC_TYPE_VIDEO:
2148 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2153 if (den != AV_NOPTS_VALUE) {
2155 return AVERROR_INVALIDDATA;
2156 av_frac_init(&st->pts, 0, 0, den);
2162 //FIXME merge with compute_pkt_fields
2163 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2164 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2165 int num, den, frame_size, i;
2167 // 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);
2169 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2172 /* duration field */
2173 if (pkt->duration == 0) {
2174 compute_frame_duration(&num, &den, st, NULL, pkt);
2176 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2180 //XXX/FIXME this is a temporary hack until all encoders output pts
2181 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2183 // pkt->pts= st->cur_dts;
2184 pkt->pts= st->pts.val;
2187 //calculate dts from pts
2188 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2189 st->pts_buffer[0]= pkt->pts;
2190 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2191 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2192 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2193 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2195 pkt->dts= st->pts_buffer[0];
2198 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2199 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2202 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2203 av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n");
2207 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2208 st->cur_dts= pkt->dts;
2209 st->pts.val= pkt->dts;
2212 switch (st->codec->codec_type) {
2213 case CODEC_TYPE_AUDIO:
2214 frame_size = get_audio_frame_size(st->codec, pkt->size);
2216 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
2217 but it would be better if we had the real timestamps from the encoder */
2218 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2219 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2222 case CODEC_TYPE_VIDEO:
2223 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2231 static void truncate_ts(AVStream *st, AVPacket *pkt){
2232 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2235 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here
2237 if (pkt->pts != AV_NOPTS_VALUE)
2238 pkt->pts &= pts_mask;
2239 if (pkt->dts != AV_NOPTS_VALUE)
2240 pkt->dts &= pts_mask;
2243 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2247 ret=compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2248 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2251 truncate_ts(s->streams[pkt->stream_index], pkt);
2253 ret= s->oformat->write_packet(s, pkt);
2255 ret= url_ferror(&s->pb);
2259 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2260 AVPacketList *pktl, **next_point, *this_pktl;
2262 int streams[MAX_STREAMS];
2265 AVStream *st= s->streams[ pkt->stream_index];
2267 // assert(pkt->destruct != av_destruct_packet); //FIXME
2269 this_pktl = av_mallocz(sizeof(AVPacketList));
2270 this_pktl->pkt= *pkt;
2271 if(pkt->destruct == av_destruct_packet)
2272 pkt->destruct= NULL; // non shared -> must keep original from being freed
2274 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2276 next_point = &s->packet_buffer;
2278 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2279 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2280 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2281 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2283 next_point= &(*next_point)->next;
2285 this_pktl->next= *next_point;
2286 *next_point= this_pktl;
2289 memset(streams, 0, sizeof(streams));
2290 pktl= s->packet_buffer;
2292 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2293 if(streams[ pktl->pkt.stream_index ] == 0)
2295 streams[ pktl->pkt.stream_index ]++;
2299 if(s->nb_streams == stream_count || (flush && stream_count)){
2300 pktl= s->packet_buffer;
2303 s->packet_buffer= pktl->next;
2307 av_init_packet(out);
2313 * Interleaves a AVPacket correctly so it can be muxed.
2314 * @param out the interleaved packet will be output here
2315 * @param in the input packet
2316 * @param flush 1 if no further packets are available as input and all
2317 * remaining packets should be output
2318 * @return 1 if a packet was output, 0 if no packet could be output,
2319 * < 0 if an error occured
2321 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2322 if(s->oformat->interleave_packet)
2323 return s->oformat->interleave_packet(s, out, in, flush);
2325 return av_interleave_packet_per_dts(s, out, in, flush);
2328 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2329 AVStream *st= s->streams[ pkt->stream_index];
2331 //FIXME/XXX/HACK drop zero sized packets
2332 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2335 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2336 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2339 if(pkt->dts == AV_NOPTS_VALUE)
2344 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2345 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2348 truncate_ts(s->streams[opkt.stream_index], &opkt);
2349 ret= s->oformat->write_packet(s, &opkt);
2351 av_free_packet(&opkt);
2356 if(url_ferror(&s->pb))
2357 return url_ferror(&s->pb);
2361 int av_write_trailer(AVFormatContext *s)
2367 ret= av_interleave_packet(s, &pkt, NULL, 1);
2368 if(ret<0) //FIXME cleanup needed for ret<0 ?
2373 truncate_ts(s->streams[pkt.stream_index], &pkt);
2374 ret= s->oformat->write_packet(s, &pkt);
2376 av_free_packet(&pkt);
2380 if(url_ferror(&s->pb))
2384 if(s->oformat->write_trailer)
2385 ret = s->oformat->write_trailer(s);
2388 ret=url_ferror(&s->pb);
2389 for(i=0;i<s->nb_streams;i++)
2390 av_freep(&s->streams[i]->priv_data);
2391 av_freep(&s->priv_data);
2395 /* "user interface" functions */
2397 void dump_format(AVFormatContext *ic,
2405 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2406 is_output ? "Output" : "Input",
2408 is_output ? ic->oformat->name : ic->iformat->name,
2409 is_output ? "to" : "from", url);
2411 av_log(NULL, AV_LOG_INFO, " Duration: ");
2412 if (ic->duration != AV_NOPTS_VALUE) {
2413 int hours, mins, secs, us;
2414 secs = ic->duration / AV_TIME_BASE;
2415 us = ic->duration % AV_TIME_BASE;
2420 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%01d", hours, mins, secs,
2421 (10 * us) / AV_TIME_BASE);
2423 av_log(NULL, AV_LOG_INFO, "N/A");
2425 if (ic->start_time != AV_NOPTS_VALUE) {
2427 av_log(NULL, AV_LOG_INFO, ", start: ");
2428 secs = ic->start_time / AV_TIME_BASE;
2429 us = ic->start_time % AV_TIME_BASE;
2430 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2431 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2433 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2435 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2437 av_log(NULL, AV_LOG_INFO, "N/A");
2439 av_log(NULL, AV_LOG_INFO, "\n");
2441 for(i=0;i<ic->nb_streams;i++) {
2442 AVStream *st = ic->streams[i];
2443 int g= ff_gcd(st->time_base.num, st->time_base.den);
2444 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2445 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2446 /* the pid is an important information, so we display it */
2447 /* XXX: add a generic system */
2449 flags = ic->oformat->flags;
2451 flags = ic->iformat->flags;
2452 if (flags & AVFMT_SHOW_IDS) {
2453 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2455 if (strlen(st->language) > 0) {
2456 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2458 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2459 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2460 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2461 if(st->r_frame_rate.den && st->r_frame_rate.num)
2462 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(r)", av_q2d(st->r_frame_rate));
2463 /* else if(st->time_base.den && st->time_base.num)
2464 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(m)", 1/av_q2d(st->time_base));*/
2466 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(c)", 1/av_q2d(st->codec->time_base));
2468 av_log(NULL, AV_LOG_INFO, "\n");
2472 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2474 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2477 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2479 AVRational frame_rate;
2480 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2481 *frame_rate_num= frame_rate.num;
2482 *frame_rate_den= frame_rate.den;
2487 * gets the current time in micro seconds.
2489 int64_t av_gettime(void)
2492 gettimeofday(&tv,NULL);
2493 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
2496 int64_t parse_date(const char *datestr, int duration)
2502 static const char *date_fmt[] = {
2506 static const char *time_fmt[] = {
2516 time_t now = time(0);
2518 len = strlen(datestr);
2520 lastch = datestr[len - 1];
2523 is_utc = (lastch == 'z' || lastch == 'Z');
2525 memset(&dt, 0, sizeof(dt));
2530 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2531 q = small_strptime(p, date_fmt[i], &dt);
2541 dt = *localtime(&now);
2543 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2548 if (*p == 'T' || *p == 't' || *p == ' ')
2551 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2552 q = small_strptime(p, time_fmt[i], &dt);
2562 q = small_strptime(p, time_fmt[0], &dt);
2564 dt.tm_sec = strtol(p, (char **)&q, 10);
2570 /* Now we have all the fields that we can get */
2575 return now * INT64_C(1000000);
2579 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2581 dt.tm_isdst = -1; /* unknown */
2594 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2597 val += n * (*q - '0');
2601 return negative ? -t : t;
2604 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2614 while (*p != '\0' && *p != '=' && *p != '&') {
2615 if ((q - tag) < sizeof(tag) - 1)
2623 while (*p != '&' && *p != '\0') {
2624 if ((q - arg) < arg_size - 1) {
2634 if (!strcmp(tag, tag1))
2643 int av_get_frame_filename(char *buf, int buf_size,
2644 const char *path, int number)
2647 char *q, buf1[20], c;
2648 int nd, len, percentd_found;
2660 while (isdigit(*p)) {
2661 nd = nd * 10 + *p++ - '0';
2664 } while (isdigit(c));
2673 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2675 if ((q - buf + len) > buf_size - 1)
2677 memcpy(q, buf1, len);
2685 if ((q - buf) < buf_size - 1)
2689 if (!percentd_found)
2698 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
2701 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2703 for(i=0;i<size;i+=16) {
2710 PRINT(" %02x", buf[i+j]);
2715 for(j=0;j<len;j++) {
2717 if (c < ' ' || c > '~')
2726 void av_hex_dump(FILE *f, uint8_t *buf, int size)
2728 hex_dump_internal(NULL, f, 0, buf, size);
2731 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
2733 hex_dump_internal(avcl, NULL, level, buf, size);
2736 //FIXME needs to know the time_base
2737 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
2739 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2740 PRINT("stream #%d:\n", pkt->stream_index);
2741 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
2742 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
2743 /* DTS is _always_ valid after av_read_frame() */
2745 if (pkt->dts == AV_NOPTS_VALUE)
2748 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
2749 /* PTS may be not known if B frames are present */
2751 if (pkt->pts == AV_NOPTS_VALUE)
2754 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
2756 PRINT(" size=%d\n", pkt->size);
2759 av_hex_dump(f, pkt->data, pkt->size);
2762 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
2764 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
2767 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
2769 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
2772 void url_split(char *proto, int proto_size,
2773 char *authorization, int authorization_size,
2774 char *hostname, int hostname_size,
2776 char *path, int path_size,
2787 while (*p != ':' && *p != '\0') {
2788 if ((q - proto) < proto_size - 1)
2794 if (authorization_size > 0)
2795 authorization[0] = '\0';
2799 if (hostname_size > 0)
2803 char *at,*slash; // PETR: position of '@' character and '/' character
2810 at = strchr(p,'@'); // PETR: get the position of '@'
2811 slash = strchr(p,'/'); // PETR: get position of '/' - end of hostname
2812 if (at && slash && at > slash) at = NULL; // PETR: not interested in '@' behind '/'
2814 q = at ? authorization : hostname; // PETR: if '@' exists starting with auth.
2816 while ((at || *p != ':') && *p != '/' && *p != '?' && *p != '\0') { // PETR:
2817 if (*p == '@') { // PETR: passed '@'
2818 if (authorization_size > 0)
2822 } else if (!at) { // PETR: hostname
2823 if ((q - hostname) < hostname_size - 1)
2826 if ((q - authorization) < authorization_size - 1)
2831 if (hostname_size > 0)
2835 port = strtoul(p, (char **)&p, 10);
2840 av_strlcpy(path, p, path_size);
2843 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
2844 int pts_num, int pts_den)
2846 s->pts_wrap_bits = pts_wrap_bits;
2847 s->time_base.num = pts_num;
2848 s->time_base.den = pts_den;
2851 /* fraction handling */
2854 * f = val + (num / den) + 0.5.
2856 * 'num' is normalized so that it is such as 0 <= num < den.
2858 * @param f fractional number
2859 * @param val integer value
2860 * @param num must be >= 0
2861 * @param den must be >= 1
2863 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
2876 * Fractionnal addition to f: f = f + (incr / f->den).
2878 * @param f fractional number
2879 * @param incr increment, can be positive or negative
2881 static void av_frac_add(AVFrac *f, int64_t incr)
2885 num = f->num + incr;
2888 f->val += num / den;
2894 } else if (num >= den) {
2895 f->val += num / den;