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 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
449 if (url_fseek(pb, 0, SEEK_SET) < 0) {
451 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
457 /* guess file format */
458 fmt = av_probe_input_format2(pd, 1, &score);
463 /* if still no format found, error */
469 /* XXX: suppress this hack for redirectors */
470 #ifdef CONFIG_REDIR_DEMUXER
471 if (fmt == &redir_demuxer) {
472 err = redir_open(ic_ptr, pb);
478 /* check filename in case of an image number is expected */
479 if (fmt->flags & AVFMT_NEEDNUMBER) {
480 if (!av_filename_number_test(filename)) {
481 err = AVERROR_NUMEXPECTED;
485 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
498 /*******************************************************/
500 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
503 return s->iformat->read_packet(s, pkt);
506 /**********************************************************/
509 * Get the number of samples of an audio frame. Return (-1) if error.
511 static int get_audio_frame_size(AVCodecContext *enc, int size)
515 if (enc->frame_size <= 1) {
516 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
518 if (bits_per_sample) {
519 if (enc->channels == 0)
521 frame_size = (size << 3) / (bits_per_sample * enc->channels);
523 /* used for example by ADPCM codecs */
524 if (enc->bit_rate == 0)
526 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
529 frame_size = enc->frame_size;
536 * Return the frame duration in seconds, return 0 if not available.
538 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
539 AVCodecParserContext *pc, AVPacket *pkt)
545 switch(st->codec->codec_type) {
546 case CODEC_TYPE_VIDEO:
547 if(st->time_base.num*1000LL > st->time_base.den){
548 *pnum = st->time_base.num;
549 *pden = st->time_base.den;
550 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
551 *pnum = st->codec->time_base.num;
552 *pden = st->codec->time_base.den;
553 if (pc && pc->repeat_pict) {
555 *pnum = (*pnum) * (2 + pc->repeat_pict);
559 case CODEC_TYPE_AUDIO:
560 frame_size = get_audio_frame_size(st->codec, pkt->size);
564 *pden = st->codec->sample_rate;
571 static int is_intra_only(AVCodecContext *enc){
572 if(enc->codec_type == CODEC_TYPE_AUDIO){
574 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
575 switch(enc->codec_id){
577 case CODEC_ID_MJPEGB:
579 case CODEC_ID_RAWVIDEO:
580 case CODEC_ID_DVVIDEO:
581 case CODEC_ID_HUFFYUV:
582 case CODEC_ID_FFVHUFF:
593 static void update_initial_timestamps(AVFormatContext *s, int stream_index, int64_t dts){
594 AVStream *st= s->streams[stream_index];
595 AVPacketList *pktl= s->packet_buffer;
597 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE)
600 st->first_dts= dts - st->cur_dts;
603 for(; pktl; pktl= pktl->next){
604 if(pktl->pkt.stream_index != stream_index)
606 //FIXME think more about this check
607 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
608 pktl->pkt.pts += st->first_dts;
610 if(pktl->pkt.dts != AV_NOPTS_VALUE)
611 pktl->pkt.dts += st->first_dts;
613 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
614 st->start_time= pktl->pkt.pts;
618 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
619 AVCodecParserContext *pc, AVPacket *pkt)
621 int num, den, presentation_delayed, delay, i;
624 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
625 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
626 pkt->dts -= 1LL<<st->pts_wrap_bits;
629 if (pkt->duration == 0) {
630 compute_frame_duration(&num, &den, st, pc, pkt);
632 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
636 /* correct timestamps with byte offset if demuxers only have timestamps on packet boundaries */
637 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
638 /* this will estimate bitrate based on this frame's duration and size */
639 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
640 if(pkt->pts != AV_NOPTS_VALUE)
642 if(pkt->dts != AV_NOPTS_VALUE)
646 if(is_intra_only(st->codec))
647 pkt->flags |= PKT_FLAG_KEY;
649 /* do we have a video B frame ? */
650 delay= st->codec->has_b_frames;
651 presentation_delayed = 0;
652 /* XXX: need has_b_frame, but cannot get it if the codec is
655 pc && pc->pict_type != FF_B_TYPE)
656 presentation_delayed = 1;
657 /* This may be redundant, but it should not hurt. */
658 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
659 presentation_delayed = 1;
661 if(st->cur_dts == AV_NOPTS_VALUE){
662 st->cur_dts = 0; //FIXME maybe set it to 0 during init
665 // 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);
666 /* interpolate PTS and DTS if they are not present */
668 if (presentation_delayed) {
669 /* DTS = decompression time stamp */
670 /* PTS = presentation time stamp */
671 if (pkt->dts == AV_NOPTS_VALUE)
672 pkt->dts = st->last_IP_pts;
673 update_initial_timestamps(s, pkt->stream_index, pkt->dts);
674 if (pkt->dts == AV_NOPTS_VALUE)
675 pkt->dts = st->cur_dts;
677 /* this is tricky: the dts must be incremented by the duration
678 of the frame we are displaying, i.e. the last I or P frame */
679 if (st->last_IP_duration == 0)
680 st->last_IP_duration = pkt->duration;
681 st->cur_dts = pkt->dts + st->last_IP_duration;
682 st->last_IP_duration = pkt->duration;
683 st->last_IP_pts= pkt->pts;
684 /* cannot compute PTS if not present (we can compute it only
685 by knowing the futur */
686 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
687 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
688 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
689 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
690 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
691 pkt->pts += pkt->duration;
692 // 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);
696 /* presentation is not delayed : PTS and DTS are the same */
697 if(pkt->pts == AV_NOPTS_VALUE)
699 update_initial_timestamps(s, pkt->stream_index, pkt->pts);
700 if(pkt->pts == AV_NOPTS_VALUE)
701 pkt->pts = st->cur_dts;
703 st->cur_dts = pkt->pts + pkt->duration;
707 if(pkt->pts != AV_NOPTS_VALUE){
708 st->pts_buffer[0]= pkt->pts;
709 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
710 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
711 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
712 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
713 if(pkt->dts == AV_NOPTS_VALUE)
714 pkt->dts= st->pts_buffer[0];
716 update_initial_timestamps(s, pkt->stream_index, pkt->dts); // this should happen on the first packet
718 if(pkt->dts > st->cur_dts)
719 st->cur_dts = pkt->dts;
722 // 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);
727 /* key frame computation */
728 if (pc->pict_type == FF_I_TYPE)
729 pkt->flags |= PKT_FLAG_KEY;
733 void av_destruct_packet_nofree(AVPacket *pkt)
735 pkt->data = NULL; pkt->size = 0;
738 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
746 /* select current input stream component */
749 if (!st->need_parsing || !st->parser) {
750 /* no parsing needed: we just output the packet as is */
751 /* raw data support */
753 compute_pkt_fields(s, st, NULL, pkt);
756 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
757 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
758 s->cur_ptr, s->cur_len,
759 s->cur_pkt.pts, s->cur_pkt.dts);
760 s->cur_pkt.pts = AV_NOPTS_VALUE;
761 s->cur_pkt.dts = AV_NOPTS_VALUE;
762 /* increment read pointer */
766 /* return packet if any */
769 pkt->pos = s->cur_pkt.pos; // Isn't quite accurate but close.
771 pkt->stream_index = st->index;
772 pkt->pts = st->parser->pts;
773 pkt->dts = st->parser->dts;
774 pkt->destruct = av_destruct_packet_nofree;
775 compute_pkt_fields(s, st, st->parser, pkt);
777 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
778 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
779 0, 0, AVINDEX_KEYFRAME);
786 av_free_packet(&s->cur_pkt);
790 /* read next packet */
791 ret = av_read_packet(s, &s->cur_pkt);
793 if (ret == AVERROR(EAGAIN))
795 /* return the last frames, if any */
796 for(i = 0; i < s->nb_streams; i++) {
798 if (st->parser && st->need_parsing) {
799 av_parser_parse(st->parser, st->codec,
800 &pkt->data, &pkt->size,
802 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
807 /* no more packets: really terminates parsing */
811 st = s->streams[s->cur_pkt.stream_index];
812 if(st->codec->debug & FF_DEBUG_PTS)
813 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
814 s->cur_pkt.stream_index,
820 s->cur_ptr = s->cur_pkt.data;
821 s->cur_len = s->cur_pkt.size;
822 if (st->need_parsing && !st->parser) {
823 st->parser = av_parser_init(st->codec->codec_id);
825 /* no parser available : just output the raw packets */
826 st->need_parsing = AVSTREAM_PARSE_NONE;
827 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
828 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
830 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
831 st->parser->last_frame_offset=
832 st->parser->cur_offset= s->cur_pkt.pos;
837 if(st->codec->debug & FF_DEBUG_PTS)
838 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
847 static AVPacket *add_to_pktbuf(AVFormatContext *s, AVPacket *pkt){
848 AVPacketList *pktl= s->packet_buffer;
849 AVPacketList **plast_pktl= &s->packet_buffer;
851 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
853 pktl = av_mallocz(sizeof(AVPacketList));
857 /* add the packet in the buffered packet list */
863 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
867 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
870 pktl = s->packet_buffer;
872 AVPacket *next_pkt= &pktl->pkt;
874 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
875 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
876 if( pktl->pkt.stream_index == next_pkt->stream_index
877 && next_pkt->dts < pktl->pkt.dts
878 && pktl->pkt.pts != pktl->pkt.dts //not b frame
879 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
880 next_pkt->pts= pktl->pkt.dts;
884 pktl = s->packet_buffer;
887 if( next_pkt->pts != AV_NOPTS_VALUE
888 || next_pkt->dts == AV_NOPTS_VALUE
890 /* read packet from packet buffer, if there is data */
892 s->packet_buffer = pktl->next;
898 int ret= av_read_frame_internal(s, pkt);
900 if(pktl && ret != AVERROR(EAGAIN)){
907 if(av_dup_packet(add_to_pktbuf(s, pkt)) < 0)
908 return AVERROR(ENOMEM);
910 assert(!s->packet_buffer);
911 return av_read_frame_internal(s, pkt);
916 /* XXX: suppress the packet queue */
917 static void flush_packet_queue(AVFormatContext *s)
922 pktl = s->packet_buffer;
925 s->packet_buffer = pktl->next;
926 av_free_packet(&pktl->pkt);
931 /*******************************************************/
934 int av_find_default_stream_index(AVFormatContext *s)
939 if (s->nb_streams <= 0)
941 for(i = 0; i < s->nb_streams; i++) {
943 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
951 * Flush the frame reader.
953 static void av_read_frame_flush(AVFormatContext *s)
958 flush_packet_queue(s);
960 /* free previous packet */
962 if (s->cur_st->parser)
963 av_free_packet(&s->cur_pkt);
970 /* for each stream, reset read state */
971 for(i = 0; i < s->nb_streams; i++) {
975 av_parser_close(st->parser);
978 st->last_IP_pts = AV_NOPTS_VALUE;
979 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
983 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
986 for(i = 0; i < s->nb_streams; i++) {
987 AVStream *st = s->streams[i];
989 st->cur_dts = av_rescale(timestamp,
990 st->time_base.den * (int64_t)ref_st->time_base.num,
991 st->time_base.num * (int64_t)ref_st->time_base.den);
995 int av_add_index_entry(AVStream *st,
996 int64_t pos, int64_t timestamp, int size, int distance, int flags)
998 AVIndexEntry *entries, *ie;
1001 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1004 entries = av_fast_realloc(st->index_entries,
1005 &st->index_entries_allocated_size,
1006 (st->nb_index_entries + 1) *
1007 sizeof(AVIndexEntry));
1011 st->index_entries= entries;
1013 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1016 index= st->nb_index_entries++;
1017 ie= &entries[index];
1018 assert(index==0 || ie[-1].timestamp < timestamp);
1020 ie= &entries[index];
1021 if(ie->timestamp != timestamp){
1022 if(ie->timestamp <= timestamp)
1024 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1025 st->nb_index_entries++;
1026 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1027 distance= ie->min_distance;
1031 ie->timestamp = timestamp;
1032 ie->min_distance= distance;
1039 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1042 AVIndexEntry *entries= st->index_entries;
1043 int nb_entries= st->nb_index_entries;
1052 timestamp = entries[m].timestamp;
1053 if(timestamp >= wanted_timestamp)
1055 if(timestamp <= wanted_timestamp)
1058 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1060 if(!(flags & AVSEEK_FLAG_ANY)){
1061 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1062 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1073 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1074 AVInputFormat *avif= s->iformat;
1075 int64_t pos_min, pos_max, pos, pos_limit;
1076 int64_t ts_min, ts_max, ts;
1080 if (stream_index < 0)
1084 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1088 ts_min= AV_NOPTS_VALUE;
1089 pos_limit= -1; //gcc falsely says it may be uninitialized
1091 st= s->streams[stream_index];
1092 if(st->index_entries){
1095 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()
1096 index= FFMAX(index, 0);
1097 e= &st->index_entries[index];
1099 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1101 ts_min= e->timestamp;
1103 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1110 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1111 assert(index < st->nb_index_entries);
1113 e= &st->index_entries[index];
1114 assert(e->timestamp >= target_ts);
1116 ts_max= e->timestamp;
1117 pos_limit= pos_max - e->min_distance;
1119 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1120 pos_max,pos_limit, ts_max);
1125 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1130 url_fseek(&s->pb, pos, SEEK_SET);
1132 av_update_cur_dts(s, st, ts);
1137 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 )){
1139 int64_t start_pos, filesize;
1143 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1146 if(ts_min == AV_NOPTS_VALUE){
1147 pos_min = s->data_offset;
1148 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1149 if (ts_min == AV_NOPTS_VALUE)
1153 if(ts_max == AV_NOPTS_VALUE){
1155 filesize = url_fsize(&s->pb);
1156 pos_max = filesize - 1;
1159 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1161 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1162 if (ts_max == AV_NOPTS_VALUE)
1166 int64_t tmp_pos= pos_max + 1;
1167 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1168 if(tmp_ts == AV_NOPTS_VALUE)
1172 if(tmp_pos >= filesize)
1178 if(ts_min > ts_max){
1180 }else if(ts_min == ts_max){
1185 while (pos_min < pos_limit) {
1187 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1191 assert(pos_limit <= pos_max);
1194 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1195 // interpolate position (better than dichotomy)
1196 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1197 + pos_min - approximate_keyframe_distance;
1198 }else if(no_change==1){
1199 // bisection, if interpolation failed to change min or max pos last time
1200 pos = (pos_min + pos_limit)>>1;
1202 // linear search if bisection failed, can only happen if there are very few or no keframes between min/max
1207 else if(pos > pos_limit)
1211 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1217 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);
1219 if(ts == AV_NOPTS_VALUE){
1220 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1223 assert(ts != AV_NOPTS_VALUE);
1224 if (target_ts <= ts) {
1225 pos_limit = start_pos - 1;
1229 if (target_ts >= ts) {
1235 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1236 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1239 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1241 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1242 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1243 pos, ts_min, target_ts, ts_max);
1249 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1250 int64_t pos_min, pos_max;
1254 if (stream_index < 0)
1257 st= s->streams[stream_index];
1260 pos_min = s->data_offset;
1261 pos_max = url_fsize(&s->pb) - 1;
1263 if (pos < pos_min) pos= pos_min;
1264 else if(pos > pos_max) pos= pos_max;
1266 url_fseek(&s->pb, pos, SEEK_SET);
1269 av_update_cur_dts(s, st, ts);
1274 static int av_seek_frame_generic(AVFormatContext *s,
1275 int stream_index, int64_t timestamp, int flags)
1281 st = s->streams[stream_index];
1283 index = av_index_search_timestamp(st, timestamp, flags);
1285 if(index < 0 || index==st->nb_index_entries-1){
1289 if(st->index_entries && st->nb_index_entries){
1290 ie= &st->index_entries[st->nb_index_entries-1];
1291 url_fseek(&s->pb, ie->pos, SEEK_SET);
1292 av_update_cur_dts(s, st, ie->timestamp);
1294 url_fseek(&s->pb, 0, SEEK_SET);
1297 int ret = av_read_frame(s, &pkt);
1300 av_free_packet(&pkt);
1301 if(stream_index == pkt.stream_index){
1302 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1306 index = av_index_search_timestamp(st, timestamp, flags);
1311 av_read_frame_flush(s);
1312 if (s->iformat->read_seek){
1313 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1316 ie = &st->index_entries[index];
1317 url_fseek(&s->pb, ie->pos, SEEK_SET);
1319 av_update_cur_dts(s, st, ie->timestamp);
1324 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1329 av_read_frame_flush(s);
1331 if(flags & AVSEEK_FLAG_BYTE)
1332 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1334 if(stream_index < 0){
1335 stream_index= av_find_default_stream_index(s);
1336 if(stream_index < 0)
1339 st= s->streams[stream_index];
1340 /* timestamp for default must be expressed in AV_TIME_BASE units */
1341 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1343 st= s->streams[stream_index];
1345 /* first, we try the format specific seek */
1346 if (s->iformat->read_seek)
1347 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1354 if(s->iformat->read_timestamp)
1355 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1357 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1360 /*******************************************************/
1363 * Returns TRUE if the stream has accurate timings in any stream.
1365 * @return TRUE if the stream has accurate timings for at least one component.
1367 static int av_has_timings(AVFormatContext *ic)
1372 for(i = 0;i < ic->nb_streams; i++) {
1373 st = ic->streams[i];
1374 if (st->start_time != AV_NOPTS_VALUE &&
1375 st->duration != AV_NOPTS_VALUE)
1382 * Estimate the stream timings from the one of each components.
1384 * Also computes the global bitrate if possible.
1386 static void av_update_stream_timings(AVFormatContext *ic)
1388 int64_t start_time, start_time1, end_time, end_time1;
1392 start_time = INT64_MAX;
1393 end_time = INT64_MIN;
1394 for(i = 0;i < ic->nb_streams; i++) {
1395 st = ic->streams[i];
1396 if (st->start_time != AV_NOPTS_VALUE) {
1397 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1398 if (start_time1 < start_time)
1399 start_time = start_time1;
1400 if (st->duration != AV_NOPTS_VALUE) {
1401 end_time1 = start_time1
1402 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1403 if (end_time1 > end_time)
1404 end_time = end_time1;
1408 if (start_time != INT64_MAX) {
1409 ic->start_time = start_time;
1410 if (end_time != INT64_MIN) {
1411 ic->duration = end_time - start_time;
1412 if (ic->file_size > 0) {
1413 /* compute the bit rate */
1414 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1415 (double)ic->duration;
1422 static void fill_all_stream_timings(AVFormatContext *ic)
1427 av_update_stream_timings(ic);
1428 for(i = 0;i < ic->nb_streams; i++) {
1429 st = ic->streams[i];
1430 if (st->start_time == AV_NOPTS_VALUE) {
1431 if(ic->start_time != AV_NOPTS_VALUE)
1432 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1433 if(ic->duration != AV_NOPTS_VALUE)
1434 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1439 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1441 int64_t filesize, duration;
1445 /* if bit_rate is already set, we believe it */
1446 if (ic->bit_rate == 0) {
1448 for(i=0;i<ic->nb_streams;i++) {
1449 st = ic->streams[i];
1450 bit_rate += st->codec->bit_rate;
1452 ic->bit_rate = bit_rate;
1455 /* if duration is already set, we believe it */
1456 if (ic->duration == AV_NOPTS_VALUE &&
1457 ic->bit_rate != 0 &&
1458 ic->file_size != 0) {
1459 filesize = ic->file_size;
1461 for(i = 0; i < ic->nb_streams; i++) {
1462 st = ic->streams[i];
1463 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1464 if (st->duration == AV_NOPTS_VALUE)
1465 st->duration = duration;
1471 #define DURATION_MAX_READ_SIZE 250000
1473 /* only usable for MPEG-PS streams */
1474 static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offset)
1476 AVPacket pkt1, *pkt = &pkt1;
1478 int read_size, i, ret;
1480 int64_t filesize, offset, duration;
1482 /* free previous packet */
1483 if (ic->cur_st && ic->cur_st->parser)
1484 av_free_packet(&ic->cur_pkt);
1487 /* flush packet queue */
1488 flush_packet_queue(ic);
1490 for(i=0;i<ic->nb_streams;i++) {
1491 st = ic->streams[i];
1493 av_parser_close(st->parser);
1498 /* we read the first packets to get the first PTS (not fully
1499 accurate, but it is enough now) */
1500 url_fseek(&ic->pb, 0, SEEK_SET);
1503 if (read_size >= DURATION_MAX_READ_SIZE)
1505 /* if all info is available, we can stop */
1506 for(i = 0;i < ic->nb_streams; i++) {
1507 st = ic->streams[i];
1508 if (st->start_time == AV_NOPTS_VALUE)
1511 if (i == ic->nb_streams)
1514 ret = av_read_packet(ic, pkt);
1517 read_size += pkt->size;
1518 st = ic->streams[pkt->stream_index];
1519 if (pkt->pts != AV_NOPTS_VALUE) {
1520 if (st->start_time == AV_NOPTS_VALUE)
1521 st->start_time = pkt->pts;
1523 av_free_packet(pkt);
1526 /* estimate the end time (duration) */
1527 /* XXX: may need to support wrapping */
1528 filesize = ic->file_size;
1529 offset = filesize - DURATION_MAX_READ_SIZE;
1533 url_fseek(&ic->pb, offset, SEEK_SET);
1536 if (read_size >= DURATION_MAX_READ_SIZE)
1539 ret = av_read_packet(ic, pkt);
1542 read_size += pkt->size;
1543 st = ic->streams[pkt->stream_index];
1544 if (pkt->pts != AV_NOPTS_VALUE &&
1545 st->start_time != AV_NOPTS_VALUE) {
1546 end_time = pkt->pts;
1547 duration = end_time - st->start_time;
1549 if (st->duration == AV_NOPTS_VALUE ||
1550 st->duration < duration)
1551 st->duration = duration;
1554 av_free_packet(pkt);
1557 fill_all_stream_timings(ic);
1559 url_fseek(&ic->pb, old_offset, SEEK_SET);
1560 for(i=0; i<ic->nb_streams; i++){
1562 st->cur_dts= st->first_dts;
1566 static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
1570 /* get the file size, if possible */
1571 if (ic->iformat->flags & AVFMT_NOFILE) {
1574 file_size = url_fsize(&ic->pb);
1578 ic->file_size = file_size;
1580 if ((!strcmp(ic->iformat->name, "mpeg") ||
1581 !strcmp(ic->iformat->name, "mpegts")) &&
1582 file_size && !ic->pb.is_streamed) {
1583 /* get accurate estimate from the PTSes */
1584 av_estimate_timings_from_pts(ic, old_offset);
1585 } else if (av_has_timings(ic)) {
1586 /* at least one components has timings - we use them for all
1588 fill_all_stream_timings(ic);
1590 /* less precise: use bit rate info */
1591 av_estimate_timings_from_bit_rate(ic);
1593 av_update_stream_timings(ic);
1599 for(i = 0;i < ic->nb_streams; i++) {
1600 st = ic->streams[i];
1601 printf("%d: start_time: %0.3f duration: %0.3f\n",
1602 i, (double)st->start_time / AV_TIME_BASE,
1603 (double)st->duration / AV_TIME_BASE);
1605 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1606 (double)ic->start_time / AV_TIME_BASE,
1607 (double)ic->duration / AV_TIME_BASE,
1608 ic->bit_rate / 1000);
1613 static int has_codec_parameters(AVCodecContext *enc)
1616 switch(enc->codec_type) {
1617 case CODEC_TYPE_AUDIO:
1618 val = enc->sample_rate;
1620 case CODEC_TYPE_VIDEO:
1621 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1630 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1634 int got_picture, data_size, ret=0;
1637 if(!st->codec->codec){
1638 codec = avcodec_find_decoder(st->codec->codec_id);
1641 ret = avcodec_open(st->codec, codec);
1646 if(!has_codec_parameters(st->codec)){
1647 switch(st->codec->codec_type) {
1648 case CODEC_TYPE_VIDEO:
1649 ret = avcodec_decode_video(st->codec, &picture,
1650 &got_picture, (uint8_t *)data, size);
1652 case CODEC_TYPE_AUDIO:
1653 data_size = FFMAX(size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1654 samples = av_malloc(data_size);
1657 ret = avcodec_decode_audio2(st->codec, samples,
1658 &data_size, (uint8_t *)data, size);
1669 static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score)
1672 fmt = av_probe_input_format2(pd, 1, &score);
1675 if (strncmp(fmt->name, "mp3", 3) == 0)
1676 st->codec->codec_id = CODEC_ID_MP3;
1677 else if (strncmp(fmt->name, "ac3", 3) == 0)
1678 st->codec->codec_id = CODEC_ID_AC3;
1683 unsigned int codec_get_tag(const AVCodecTag *tags, int id)
1685 while (tags->id != CODEC_ID_NONE) {
1693 enum CodecID codec_get_id(const AVCodecTag *tags, unsigned int tag)
1696 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1697 if(tag == tags[i].tag)
1700 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1701 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1702 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1703 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1704 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1707 return CODEC_ID_NONE;
1710 unsigned int av_codec_get_tag(const AVCodecTag *tags[4], enum CodecID id)
1713 for(i=0; tags && tags[i]; i++){
1714 int tag= codec_get_tag(tags[i], id);
1720 enum CodecID av_codec_get_id(const AVCodecTag *tags[4], unsigned int tag)
1723 for(i=0; tags && tags[i]; i++){
1724 enum CodecID id= codec_get_id(tags[i], tag);
1725 if(id!=CODEC_ID_NONE) return id;
1727 return CODEC_ID_NONE;
1730 /* absolute maximum size we read until we abort */
1731 #define MAX_READ_SIZE 5000000
1733 #define MAX_STD_TIMEBASES (60*12+5)
1734 static int get_std_framerate(int i){
1735 if(i<60*12) return i*1001;
1736 else return ((int[]){24,30,60,12,15})[i-60*12]*1000*12;
1739 int av_find_stream_info(AVFormatContext *ic)
1741 int i, count, ret, read_size, j;
1743 AVPacket pkt1, *pkt;
1744 int64_t last_dts[MAX_STREAMS];
1745 int duration_count[MAX_STREAMS]={0};
1746 double (*duration_error)[MAX_STD_TIMEBASES];
1747 offset_t old_offset = url_ftell(&ic->pb);
1748 int64_t codec_info_duration[MAX_STREAMS]={0};
1749 int codec_info_nb_frames[MAX_STREAMS]={0};
1750 AVProbeData probe_data[MAX_STREAMS];
1751 int codec_identified[MAX_STREAMS]={0};
1753 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
1754 if (!duration_error) return AVERROR(ENOMEM);
1756 for(i=0;i<ic->nb_streams;i++) {
1757 st = ic->streams[i];
1758 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1759 /* if(!st->time_base.num)
1761 if(!st->codec->time_base.num)
1762 st->codec->time_base= st->time_base;
1764 //only for the split stuff
1766 st->parser = av_parser_init(st->codec->codec_id);
1767 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
1768 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1773 for(i=0;i<MAX_STREAMS;i++){
1774 last_dts[i]= AV_NOPTS_VALUE;
1777 memset(probe_data, 0, sizeof(probe_data));
1781 /* check if one codec still needs to be handled */
1782 for(i=0;i<ic->nb_streams;i++) {
1783 st = ic->streams[i];
1784 if (!has_codec_parameters(st->codec))
1786 /* variable fps and no guess at the real fps */
1787 if( (st->codec->time_base.den >= 101LL*st->codec->time_base.num || st->codec->codec_id == CODEC_ID_MPEG2VIDEO)
1788 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1790 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1792 if (st->codec->codec_type == CODEC_TYPE_AUDIO &&
1793 st->codec->codec_id == CODEC_ID_NONE)
1795 if(st->first_dts == AV_NOPTS_VALUE)
1798 if (i == ic->nb_streams) {
1799 /* NOTE: if the format has no header, then we need to read
1800 some packets to get most of the streams, so we cannot
1802 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1803 /* if we found the info for all the codecs, we can stop */
1808 /* we did not get all the codec info, but we read too much data */
1809 if (read_size >= MAX_READ_SIZE) {
1814 /* NOTE: a new stream can be added there if no header in file
1815 (AVFMTCTX_NOHEADER) */
1816 ret = av_read_frame_internal(ic, &pkt1);
1819 ret = -1; /* we could not have all the codec parameters before EOF */
1820 for(i=0;i<ic->nb_streams;i++) {
1821 st = ic->streams[i];
1822 if (!has_codec_parameters(st->codec)){
1824 avcodec_string(buf, sizeof(buf), st->codec, 0);
1825 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
1833 pkt= add_to_pktbuf(ic, &pkt1);
1834 if(av_dup_packet(pkt) < 0)
1835 return AVERROR(ENOMEM);
1837 read_size += pkt->size;
1839 st = ic->streams[pkt->stream_index];
1840 if(codec_info_nb_frames[st->index]>1)
1841 codec_info_duration[st->index] += pkt->duration;
1842 if (pkt->duration != 0)
1843 codec_info_nb_frames[st->index]++;
1846 int index= pkt->stream_index;
1847 int64_t last= last_dts[index];
1848 int64_t duration= pkt->dts - last;
1850 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
1851 double dur= duration * av_q2d(st->time_base);
1853 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1854 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
1855 if(duration_count[index] < 2)
1856 memset(duration_error, 0, MAX_STREAMS * sizeof(*duration_error));
1857 for(i=1; i<MAX_STD_TIMEBASES; i++){
1858 int framerate= get_std_framerate(i);
1859 int ticks= lrintf(dur*framerate/(1001*12));
1860 double error= dur - ticks*1001*12/(double)framerate;
1861 duration_error[index][i] += error*error;
1863 duration_count[index]++;
1865 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
1866 last_dts[pkt->stream_index]= pkt->dts;
1868 if (st->codec->codec_id == CODEC_ID_NONE) {
1869 AVProbeData *pd = &(probe_data[st->index]);
1870 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
1871 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
1872 pd->buf_size += pkt->size;
1873 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
1876 if(st->parser && st->parser->parser->split && !st->codec->extradata){
1877 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
1879 st->codec->extradata_size= i;
1880 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
1881 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
1882 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1886 /* if still no information, we try to open the codec and to
1887 decompress the frame. We try to avoid that in most cases as
1888 it takes longer and uses more memory. For MPEG4, we need to
1889 decompress for Quicktime. */
1890 if (!has_codec_parameters(st->codec) /*&&
1891 (st->codec->codec_id == CODEC_ID_FLV1 ||
1892 st->codec->codec_id == CODEC_ID_H264 ||
1893 st->codec->codec_id == CODEC_ID_H263 ||
1894 st->codec->codec_id == CODEC_ID_H261 ||
1895 st->codec->codec_id == CODEC_ID_VORBIS ||
1896 st->codec->codec_id == CODEC_ID_MJPEG ||
1897 st->codec->codec_id == CODEC_ID_PNG ||
1898 st->codec->codec_id == CODEC_ID_PAM ||
1899 st->codec->codec_id == CODEC_ID_PGM ||
1900 st->codec->codec_id == CODEC_ID_PGMYUV ||
1901 st->codec->codec_id == CODEC_ID_PBM ||
1902 st->codec->codec_id == CODEC_ID_PPM ||
1903 st->codec->codec_id == CODEC_ID_SHORTEN ||
1904 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
1905 try_decode_frame(st, pkt->data, pkt->size);
1907 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) {
1913 // close codecs which where opened in try_decode_frame()
1914 for(i=0;i<ic->nb_streams;i++) {
1915 st = ic->streams[i];
1916 if(st->codec->codec)
1917 avcodec_close(st->codec);
1919 for(i=0;i<ic->nb_streams;i++) {
1920 st = ic->streams[i];
1921 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1922 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
1923 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
1925 if(duration_count[i]
1926 && (st->codec->time_base.num*101LL <= st->codec->time_base.den || st->codec->codec_id == CODEC_ID_MPEG2VIDEO) /*&&
1927 //FIXME we should not special case mpeg2, but this needs testing with non mpeg2 ...
1928 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
1929 double best_error= 2*av_q2d(st->time_base);
1930 best_error= best_error*best_error*duration_count[i]*1000*12*30;
1932 for(j=1; j<MAX_STD_TIMEBASES; j++){
1933 double error= duration_error[i][j] * get_std_framerate(j);
1934 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1935 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
1936 if(error < best_error){
1938 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, get_std_framerate(j), 12*1001, INT_MAX);
1943 if (!st->r_frame_rate.num){
1944 if( st->codec->time_base.den * (int64_t)st->time_base.num
1945 <= st->codec->time_base.num * (int64_t)st->time_base.den){
1946 st->r_frame_rate.num = st->codec->time_base.den;
1947 st->r_frame_rate.den = st->codec->time_base.num;
1949 st->r_frame_rate.num = st->time_base.den;
1950 st->r_frame_rate.den = st->time_base.num;
1953 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
1954 if (st->codec->codec_id == CODEC_ID_NONE && probe_data[st->index].buf_size > 0) {
1955 codec_identified[st->index] = set_codec_from_probe_data(st, &(probe_data[st->index]), 1);
1956 if (codec_identified[st->index]) {
1957 st->need_parsing = AVSTREAM_PARSE_FULL;
1960 if(!st->codec->bits_per_sample)
1961 st->codec->bits_per_sample= av_get_bits_per_sample(st->codec->codec_id);
1965 av_estimate_timings(ic, old_offset);
1967 for(i=0;i<ic->nb_streams;i++) {
1968 st = ic->streams[i];
1969 if (codec_identified[st->index])
1972 //FIXME this is a mess
1973 if(i!=ic->nb_streams){
1974 av_read_frame_flush(ic);
1975 for(i=0;i<ic->nb_streams;i++) {
1976 st = ic->streams[i];
1977 if (codec_identified[st->index]) {
1978 av_seek_frame(ic, st->index, 0.0, 0);
1980 st->cur_dts= st->first_dts;
1982 url_fseek(&ic->pb, ic->data_offset, SEEK_SET);
1986 /* correct DTS for b frame streams with no timestamps */
1987 for(i=0;i<ic->nb_streams;i++) {
1988 st = ic->streams[i];
1989 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1991 ppktl = &ic->packet_buffer;
1993 if(ppkt1->stream_index != i)
1995 if(ppkt1->pkt->dts < 0)
1997 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
1999 ppkt1->pkt->dts -= delta;
2004 st->cur_dts -= delta;
2010 av_free(duration_error);
2011 for(i=0;i<MAX_STREAMS;i++){
2012 av_freep(&(probe_data[i].buf));
2018 /*******************************************************/
2020 int av_read_play(AVFormatContext *s)
2022 if (!s->iformat->read_play)
2023 return AVERROR(ENOSYS);
2024 return s->iformat->read_play(s);
2027 int av_read_pause(AVFormatContext *s)
2029 if (!s->iformat->read_pause)
2030 return AVERROR(ENOSYS);
2031 return s->iformat->read_pause(s);
2034 void av_close_input_file(AVFormatContext *s)
2036 int i, must_open_file;
2039 /* free previous packet */
2040 if (s->cur_st && s->cur_st->parser)
2041 av_free_packet(&s->cur_pkt);
2043 if (s->iformat->read_close)
2044 s->iformat->read_close(s);
2045 for(i=0;i<s->nb_streams;i++) {
2046 /* free all data in a stream component */
2049 av_parser_close(st->parser);
2051 av_free(st->index_entries);
2052 av_free(st->codec->extradata);
2056 flush_packet_queue(s);
2058 if (s->iformat->flags & AVFMT_NOFILE) {
2061 if (must_open_file) {
2064 av_freep(&s->priv_data);
2068 AVStream *av_new_stream(AVFormatContext *s, int id)
2073 if (s->nb_streams >= MAX_STREAMS)
2076 st = av_mallocz(sizeof(AVStream));
2080 st->codec= avcodec_alloc_context();
2082 /* no default bitrate if decoding */
2083 st->codec->bit_rate = 0;
2085 st->index = s->nb_streams;
2087 st->start_time = AV_NOPTS_VALUE;
2088 st->duration = AV_NOPTS_VALUE;
2089 st->cur_dts = AV_NOPTS_VALUE;
2090 st->first_dts = AV_NOPTS_VALUE;
2092 /* default pts settings is MPEG like */
2093 av_set_pts_info(st, 33, 1, 90000);
2094 st->last_IP_pts = AV_NOPTS_VALUE;
2095 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2096 st->pts_buffer[i]= AV_NOPTS_VALUE;
2098 s->streams[s->nb_streams++] = st;
2102 /************************************************************/
2103 /* output media file */
2105 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2109 if (s->oformat->priv_data_size > 0) {
2110 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2112 return AVERROR(ENOMEM);
2114 s->priv_data = NULL;
2116 if (s->oformat->set_parameters) {
2117 ret = s->oformat->set_parameters(s, ap);
2124 int av_write_header(AVFormatContext *s)
2129 // some sanity checks
2130 for(i=0;i<s->nb_streams;i++) {
2133 switch (st->codec->codec_type) {
2134 case CODEC_TYPE_AUDIO:
2135 if(st->codec->sample_rate<=0){
2136 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2140 case CODEC_TYPE_VIDEO:
2141 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2142 av_log(s, AV_LOG_ERROR, "time base not set\n");
2145 if(st->codec->width<=0 || st->codec->height<=0){
2146 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2152 if(s->oformat->codec_tag){
2153 if(st->codec->codec_tag){
2155 //check that tag + id is in the table
2156 //if neither is in the table -> ok
2157 //if tag is in the table with another id -> FAIL
2158 //if id is in the table with another tag -> FAIL unless strict < ?
2160 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2164 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2165 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2167 return AVERROR(ENOMEM);
2170 if(s->oformat->write_header){
2171 ret = s->oformat->write_header(s);
2176 /* init PTS generation */
2177 for(i=0;i<s->nb_streams;i++) {
2178 int64_t den = AV_NOPTS_VALUE;
2181 switch (st->codec->codec_type) {
2182 case CODEC_TYPE_AUDIO:
2183 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2185 case CODEC_TYPE_VIDEO:
2186 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2191 if (den != AV_NOPTS_VALUE) {
2193 return AVERROR_INVALIDDATA;
2194 av_frac_init(&st->pts, 0, 0, den);
2200 //FIXME merge with compute_pkt_fields
2201 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2202 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2203 int num, den, frame_size, i;
2205 // 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);
2207 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2210 /* duration field */
2211 if (pkt->duration == 0) {
2212 compute_frame_duration(&num, &den, st, NULL, pkt);
2214 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2218 //XXX/FIXME this is a temporary hack until all encoders output pts
2219 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2221 // pkt->pts= st->cur_dts;
2222 pkt->pts= st->pts.val;
2225 //calculate dts from pts
2226 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2227 st->pts_buffer[0]= pkt->pts;
2228 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2229 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2230 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2231 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2233 pkt->dts= st->pts_buffer[0];
2236 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2237 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2240 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2241 av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n");
2245 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2246 st->cur_dts= pkt->dts;
2247 st->pts.val= pkt->dts;
2250 switch (st->codec->codec_type) {
2251 case CODEC_TYPE_AUDIO:
2252 frame_size = get_audio_frame_size(st->codec, pkt->size);
2254 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
2255 but it would be better if we had the real timestamps from the encoder */
2256 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2257 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2260 case CODEC_TYPE_VIDEO:
2261 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2269 static void truncate_ts(AVStream *st, AVPacket *pkt){
2270 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2273 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here
2275 if (pkt->pts != AV_NOPTS_VALUE)
2276 pkt->pts &= pts_mask;
2277 if (pkt->dts != AV_NOPTS_VALUE)
2278 pkt->dts &= pts_mask;
2281 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2285 ret=compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2286 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2289 truncate_ts(s->streams[pkt->stream_index], pkt);
2291 ret= s->oformat->write_packet(s, pkt);
2293 ret= url_ferror(&s->pb);
2297 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2298 AVPacketList *pktl, **next_point, *this_pktl;
2300 int streams[MAX_STREAMS];
2303 AVStream *st= s->streams[ pkt->stream_index];
2305 // assert(pkt->destruct != av_destruct_packet); //FIXME
2307 this_pktl = av_mallocz(sizeof(AVPacketList));
2308 this_pktl->pkt= *pkt;
2309 if(pkt->destruct == av_destruct_packet)
2310 pkt->destruct= NULL; // non shared -> must keep original from being freed
2312 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2314 next_point = &s->packet_buffer;
2316 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2317 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2318 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2319 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2321 next_point= &(*next_point)->next;
2323 this_pktl->next= *next_point;
2324 *next_point= this_pktl;
2327 memset(streams, 0, sizeof(streams));
2328 pktl= s->packet_buffer;
2330 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2331 if(streams[ pktl->pkt.stream_index ] == 0)
2333 streams[ pktl->pkt.stream_index ]++;
2337 if(s->nb_streams == stream_count || (flush && stream_count)){
2338 pktl= s->packet_buffer;
2341 s->packet_buffer= pktl->next;
2345 av_init_packet(out);
2351 * Interleaves a AVPacket correctly so it can be muxed.
2352 * @param out the interleaved packet will be output here
2353 * @param in the input packet
2354 * @param flush 1 if no further packets are available as input and all
2355 * remaining packets should be output
2356 * @return 1 if a packet was output, 0 if no packet could be output,
2357 * < 0 if an error occured
2359 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2360 if(s->oformat->interleave_packet)
2361 return s->oformat->interleave_packet(s, out, in, flush);
2363 return av_interleave_packet_per_dts(s, out, in, flush);
2366 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2367 AVStream *st= s->streams[ pkt->stream_index];
2369 //FIXME/XXX/HACK drop zero sized packets
2370 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2373 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2374 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2377 if(pkt->dts == AV_NOPTS_VALUE)
2382 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2383 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2386 truncate_ts(s->streams[opkt.stream_index], &opkt);
2387 ret= s->oformat->write_packet(s, &opkt);
2389 av_free_packet(&opkt);
2394 if(url_ferror(&s->pb))
2395 return url_ferror(&s->pb);
2399 int av_write_trailer(AVFormatContext *s)
2405 ret= av_interleave_packet(s, &pkt, NULL, 1);
2406 if(ret<0) //FIXME cleanup needed for ret<0 ?
2411 truncate_ts(s->streams[pkt.stream_index], &pkt);
2412 ret= s->oformat->write_packet(s, &pkt);
2414 av_free_packet(&pkt);
2418 if(url_ferror(&s->pb))
2422 if(s->oformat->write_trailer)
2423 ret = s->oformat->write_trailer(s);
2426 ret=url_ferror(&s->pb);
2427 for(i=0;i<s->nb_streams;i++)
2428 av_freep(&s->streams[i]->priv_data);
2429 av_freep(&s->priv_data);
2433 /* "user interface" functions */
2435 void dump_format(AVFormatContext *ic,
2443 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2444 is_output ? "Output" : "Input",
2446 is_output ? ic->oformat->name : ic->iformat->name,
2447 is_output ? "to" : "from", url);
2449 av_log(NULL, AV_LOG_INFO, " Duration: ");
2450 if (ic->duration != AV_NOPTS_VALUE) {
2451 int hours, mins, secs, us;
2452 secs = ic->duration / AV_TIME_BASE;
2453 us = ic->duration % AV_TIME_BASE;
2458 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%01d", hours, mins, secs,
2459 (10 * us) / AV_TIME_BASE);
2461 av_log(NULL, AV_LOG_INFO, "N/A");
2463 if (ic->start_time != AV_NOPTS_VALUE) {
2465 av_log(NULL, AV_LOG_INFO, ", start: ");
2466 secs = ic->start_time / AV_TIME_BASE;
2467 us = ic->start_time % AV_TIME_BASE;
2468 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2469 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2471 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2473 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2475 av_log(NULL, AV_LOG_INFO, "N/A");
2477 av_log(NULL, AV_LOG_INFO, "\n");
2479 for(i=0;i<ic->nb_streams;i++) {
2480 AVStream *st = ic->streams[i];
2481 int g= ff_gcd(st->time_base.num, st->time_base.den);
2482 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2483 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2484 /* the pid is an important information, so we display it */
2485 /* XXX: add a generic system */
2487 flags = ic->oformat->flags;
2489 flags = ic->iformat->flags;
2490 if (flags & AVFMT_SHOW_IDS) {
2491 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2493 if (strlen(st->language) > 0) {
2494 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2496 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2497 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2498 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2499 if(st->r_frame_rate.den && st->r_frame_rate.num)
2500 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(r)", av_q2d(st->r_frame_rate));
2501 /* else if(st->time_base.den && st->time_base.num)
2502 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(m)", 1/av_q2d(st->time_base));*/
2504 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(c)", 1/av_q2d(st->codec->time_base));
2506 av_log(NULL, AV_LOG_INFO, "\n");
2510 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2512 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2515 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2517 AVRational frame_rate;
2518 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2519 *frame_rate_num= frame_rate.num;
2520 *frame_rate_den= frame_rate.den;
2525 * gets the current time in micro seconds.
2527 int64_t av_gettime(void)
2530 gettimeofday(&tv,NULL);
2531 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
2534 int64_t parse_date(const char *datestr, int duration)
2540 static const char *date_fmt[] = {
2544 static const char *time_fmt[] = {
2554 time_t now = time(0);
2556 len = strlen(datestr);
2558 lastch = datestr[len - 1];
2561 is_utc = (lastch == 'z' || lastch == 'Z');
2563 memset(&dt, 0, sizeof(dt));
2568 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2569 q = small_strptime(p, date_fmt[i], &dt);
2579 dt = *localtime(&now);
2581 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2586 if (*p == 'T' || *p == 't' || *p == ' ')
2589 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2590 q = small_strptime(p, time_fmt[i], &dt);
2600 q = small_strptime(p, time_fmt[0], &dt);
2602 dt.tm_sec = strtol(p, (char **)&q, 10);
2608 /* Now we have all the fields that we can get */
2613 return now * INT64_C(1000000);
2617 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2619 dt.tm_isdst = -1; /* unknown */
2632 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2635 val += n * (*q - '0');
2639 return negative ? -t : t;
2642 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2652 while (*p != '\0' && *p != '=' && *p != '&') {
2653 if ((q - tag) < sizeof(tag) - 1)
2661 while (*p != '&' && *p != '\0') {
2662 if ((q - arg) < arg_size - 1) {
2672 if (!strcmp(tag, tag1))
2681 int av_get_frame_filename(char *buf, int buf_size,
2682 const char *path, int number)
2685 char *q, buf1[20], c;
2686 int nd, len, percentd_found;
2698 while (isdigit(*p)) {
2699 nd = nd * 10 + *p++ - '0';
2702 } while (isdigit(c));
2711 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2713 if ((q - buf + len) > buf_size - 1)
2715 memcpy(q, buf1, len);
2723 if ((q - buf) < buf_size - 1)
2727 if (!percentd_found)
2736 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
2739 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2741 for(i=0;i<size;i+=16) {
2748 PRINT(" %02x", buf[i+j]);
2753 for(j=0;j<len;j++) {
2755 if (c < ' ' || c > '~')
2764 void av_hex_dump(FILE *f, uint8_t *buf, int size)
2766 hex_dump_internal(NULL, f, 0, buf, size);
2769 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
2771 hex_dump_internal(avcl, NULL, level, buf, size);
2774 //FIXME needs to know the time_base
2775 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
2777 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2778 PRINT("stream #%d:\n", pkt->stream_index);
2779 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
2780 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
2781 /* DTS is _always_ valid after av_read_frame() */
2783 if (pkt->dts == AV_NOPTS_VALUE)
2786 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
2787 /* PTS may be not known if B frames are present */
2789 if (pkt->pts == AV_NOPTS_VALUE)
2792 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
2794 PRINT(" size=%d\n", pkt->size);
2797 av_hex_dump(f, pkt->data, pkt->size);
2800 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
2802 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
2805 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
2807 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
2810 void url_split(char *proto, int proto_size,
2811 char *authorization, int authorization_size,
2812 char *hostname, int hostname_size,
2814 char *path, int path_size,
2825 while (*p != ':' && *p != '\0') {
2826 if ((q - proto) < proto_size - 1)
2832 if (authorization_size > 0)
2833 authorization[0] = '\0';
2837 if (hostname_size > 0)
2841 char *at,*slash; // PETR: position of '@' character and '/' character
2848 at = strchr(p,'@'); // PETR: get the position of '@'
2849 slash = strchr(p,'/'); // PETR: get position of '/' - end of hostname
2850 if (at && slash && at > slash) at = NULL; // PETR: not interested in '@' behind '/'
2852 q = at ? authorization : hostname; // PETR: if '@' exists starting with auth.
2854 while ((at || *p != ':') && *p != '/' && *p != '?' && *p != '\0') { // PETR:
2855 if (*p == '@') { // PETR: passed '@'
2856 if (authorization_size > 0)
2860 } else if (!at) { // PETR: hostname
2861 if ((q - hostname) < hostname_size - 1)
2864 if ((q - authorization) < authorization_size - 1)
2869 if (hostname_size > 0)
2873 port = strtoul(p, (char **)&p, 10);
2878 av_strlcpy(path, p, path_size);
2881 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
2882 int pts_num, int pts_den)
2884 s->pts_wrap_bits = pts_wrap_bits;
2885 s->time_base.num = pts_num;
2886 s->time_base.den = pts_den;
2889 /* fraction handling */
2892 * f = val + (num / den) + 0.5.
2894 * 'num' is normalized so that it is such as 0 <= num < den.
2896 * @param f fractional number
2897 * @param val integer value
2898 * @param num must be >= 0
2899 * @param den must be >= 1
2901 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
2914 * Fractionnal addition to f: f = f + (incr / f->den).
2916 * @param f fractional number
2917 * @param incr increment, can be positive or negative
2919 static void av_frac_add(AVFrac *f, int64_t incr)
2923 num = f->num + incr;
2926 f->val += num / den;
2932 } else if (num >= den) {
2933 f->val += num / den;