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 update_initial_timestamps(AVFormatContext *s, int stream_index, int64_t dts){
593 AVStream *st= s->streams[stream_index];
594 AVPacketList *pktl= s->packet_buffer;
596 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE)
599 st->first_dts= dts - st->cur_dts;
602 for(; pktl; pktl= pktl->next){
603 if(pktl->pkt.stream_index != stream_index)
605 //FIXME think more about this check
606 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
607 pktl->pkt.pts += st->first_dts;
609 if(pktl->pkt.dts != AV_NOPTS_VALUE)
610 pktl->pkt.dts += st->first_dts;
612 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
613 st->start_time= pktl->pkt.pts;
617 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
618 AVCodecParserContext *pc, AVPacket *pkt)
620 int num, den, presentation_delayed, delay, i;
623 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
624 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
625 pkt->dts -= 1LL<<st->pts_wrap_bits;
628 if (pkt->duration == 0) {
629 compute_frame_duration(&num, &den, st, pc, pkt);
631 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
635 /* correct timestamps with byte offset if demuxers only have timestamps on packet boundaries */
636 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
637 /* this will estimate bitrate based on this frame's duration and size */
638 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
639 if(pkt->pts != AV_NOPTS_VALUE)
641 if(pkt->dts != AV_NOPTS_VALUE)
645 if(is_intra_only(st->codec))
646 pkt->flags |= PKT_FLAG_KEY;
648 /* do we have a video B frame ? */
649 delay= st->codec->has_b_frames;
650 presentation_delayed = 0;
651 /* XXX: need has_b_frame, but cannot get it if the codec is
654 pc && pc->pict_type != FF_B_TYPE)
655 presentation_delayed = 1;
656 /* This may be redundant, but it should not hurt. */
657 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
658 presentation_delayed = 1;
660 if(st->cur_dts == AV_NOPTS_VALUE){
661 st->cur_dts = 0; //FIXME maybe set it to 0 during init
664 // 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);
665 /* interpolate PTS and DTS if they are not present */
667 if (presentation_delayed) {
668 /* DTS = decompression time stamp */
669 /* PTS = presentation time stamp */
670 if (pkt->dts == AV_NOPTS_VALUE)
671 pkt->dts = st->last_IP_pts;
672 update_initial_timestamps(s, pkt->stream_index, pkt->dts);
673 if (pkt->dts == AV_NOPTS_VALUE)
674 pkt->dts = st->cur_dts;
676 /* this is tricky: the dts must be incremented by the duration
677 of the frame we are displaying, i.e. the last I or P frame */
678 if (st->last_IP_duration == 0)
679 st->last_IP_duration = pkt->duration;
680 st->cur_dts = pkt->dts + st->last_IP_duration;
681 st->last_IP_duration = pkt->duration;
682 st->last_IP_pts= pkt->pts;
683 /* cannot compute PTS if not present (we can compute it only
684 by knowing the futur */
685 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
686 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
687 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
688 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
689 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
690 pkt->pts += pkt->duration;
691 // 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);
695 /* presentation is not delayed : PTS and DTS are the same */
696 if(pkt->pts == AV_NOPTS_VALUE)
698 update_initial_timestamps(s, pkt->stream_index, pkt->pts);
699 if(pkt->pts == AV_NOPTS_VALUE)
700 pkt->pts = st->cur_dts;
702 st->cur_dts = pkt->pts + pkt->duration;
706 if(pkt->pts != AV_NOPTS_VALUE){
707 st->pts_buffer[0]= pkt->pts;
708 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
709 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
710 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
711 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
712 if(pkt->dts == AV_NOPTS_VALUE)
713 pkt->dts= st->pts_buffer[0];
715 update_initial_timestamps(s, pkt->stream_index, pkt->dts); // this should happen on the first packet
717 if(pkt->dts > st->cur_dts)
718 st->cur_dts = pkt->dts;
721 // 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);
726 /* key frame computation */
727 if (pc->pict_type == FF_I_TYPE)
728 pkt->flags |= PKT_FLAG_KEY;
732 void av_destruct_packet_nofree(AVPacket *pkt)
734 pkt->data = NULL; pkt->size = 0;
737 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
745 /* select current input stream component */
748 if (!st->need_parsing || !st->parser) {
749 /* no parsing needed: we just output the packet as is */
750 /* raw data support */
752 compute_pkt_fields(s, st, NULL, pkt);
755 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
756 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
757 s->cur_ptr, s->cur_len,
758 s->cur_pkt.pts, s->cur_pkt.dts);
759 s->cur_pkt.pts = AV_NOPTS_VALUE;
760 s->cur_pkt.dts = AV_NOPTS_VALUE;
761 /* increment read pointer */
765 /* return packet if any */
768 pkt->pos = s->cur_pkt.pos; // Isn't quite accurate but close.
770 pkt->stream_index = st->index;
771 pkt->pts = st->parser->pts;
772 pkt->dts = st->parser->dts;
773 pkt->destruct = av_destruct_packet_nofree;
774 compute_pkt_fields(s, st, st->parser, pkt);
776 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
777 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
778 0, 0, AVINDEX_KEYFRAME);
785 av_free_packet(&s->cur_pkt);
789 /* read next packet */
790 ret = av_read_packet(s, &s->cur_pkt);
792 if (ret == AVERROR(EAGAIN))
794 /* return the last frames, if any */
795 for(i = 0; i < s->nb_streams; i++) {
797 if (st->parser && st->need_parsing) {
798 av_parser_parse(st->parser, st->codec,
799 &pkt->data, &pkt->size,
801 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
806 /* no more packets: really terminates parsing */
810 st = s->streams[s->cur_pkt.stream_index];
811 if(st->codec->debug & FF_DEBUG_PTS)
812 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
813 s->cur_pkt.stream_index,
819 s->cur_ptr = s->cur_pkt.data;
820 s->cur_len = s->cur_pkt.size;
821 if (st->need_parsing && !st->parser) {
822 st->parser = av_parser_init(st->codec->codec_id);
824 /* no parser available : just output the raw packets */
825 st->need_parsing = AVSTREAM_PARSE_NONE;
826 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
827 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
829 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
830 st->parser->last_frame_offset=
831 st->parser->cur_offset= s->cur_pkt.pos;
836 if(st->codec->debug & FF_DEBUG_PTS)
837 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
846 static AVPacket *add_to_pktbuf(AVFormatContext *s, AVPacket *pkt){
847 AVPacketList *pktl= s->packet_buffer;
848 AVPacketList **plast_pktl= &s->packet_buffer;
850 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
852 pktl = av_mallocz(sizeof(AVPacketList));
856 /* add the packet in the buffered packet list */
862 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
866 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
869 pktl = s->packet_buffer;
871 AVPacket *next_pkt= &pktl->pkt;
873 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
874 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
875 if( pktl->pkt.stream_index == next_pkt->stream_index
876 && next_pkt->dts < pktl->pkt.dts
877 && pktl->pkt.pts != pktl->pkt.dts //not b frame
878 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
879 next_pkt->pts= pktl->pkt.dts;
883 pktl = s->packet_buffer;
886 if( next_pkt->pts != AV_NOPTS_VALUE
887 || next_pkt->dts == AV_NOPTS_VALUE
889 /* read packet from packet buffer, if there is data */
891 s->packet_buffer = pktl->next;
897 int ret= av_read_frame_internal(s, pkt);
899 if(pktl && ret != AVERROR(EAGAIN)){
906 if(av_dup_packet(add_to_pktbuf(s, pkt)) < 0)
907 return AVERROR(ENOMEM);
909 assert(!s->packet_buffer);
910 return av_read_frame_internal(s, pkt);
915 /* XXX: suppress the packet queue */
916 static void flush_packet_queue(AVFormatContext *s)
921 pktl = s->packet_buffer;
924 s->packet_buffer = pktl->next;
925 av_free_packet(&pktl->pkt);
930 /*******************************************************/
933 int av_find_default_stream_index(AVFormatContext *s)
938 if (s->nb_streams <= 0)
940 for(i = 0; i < s->nb_streams; i++) {
942 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
950 * Flush the frame reader.
952 static void av_read_frame_flush(AVFormatContext *s)
957 flush_packet_queue(s);
959 /* free previous packet */
961 if (s->cur_st->parser)
962 av_free_packet(&s->cur_pkt);
969 /* for each stream, reset read state */
970 for(i = 0; i < s->nb_streams; i++) {
974 av_parser_close(st->parser);
977 st->last_IP_pts = AV_NOPTS_VALUE;
978 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
982 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
985 for(i = 0; i < s->nb_streams; i++) {
986 AVStream *st = s->streams[i];
988 st->cur_dts = av_rescale(timestamp,
989 st->time_base.den * (int64_t)ref_st->time_base.num,
990 st->time_base.num * (int64_t)ref_st->time_base.den);
994 int av_add_index_entry(AVStream *st,
995 int64_t pos, int64_t timestamp, int size, int distance, int flags)
997 AVIndexEntry *entries, *ie;
1000 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1003 entries = av_fast_realloc(st->index_entries,
1004 &st->index_entries_allocated_size,
1005 (st->nb_index_entries + 1) *
1006 sizeof(AVIndexEntry));
1010 st->index_entries= entries;
1012 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1015 index= st->nb_index_entries++;
1016 ie= &entries[index];
1017 assert(index==0 || ie[-1].timestamp < timestamp);
1019 ie= &entries[index];
1020 if(ie->timestamp != timestamp){
1021 if(ie->timestamp <= timestamp)
1023 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1024 st->nb_index_entries++;
1025 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1026 distance= ie->min_distance;
1030 ie->timestamp = timestamp;
1031 ie->min_distance= distance;
1038 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1041 AVIndexEntry *entries= st->index_entries;
1042 int nb_entries= st->nb_index_entries;
1051 timestamp = entries[m].timestamp;
1052 if(timestamp >= wanted_timestamp)
1054 if(timestamp <= wanted_timestamp)
1057 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1059 if(!(flags & AVSEEK_FLAG_ANY)){
1060 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1061 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1072 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1073 AVInputFormat *avif= s->iformat;
1074 int64_t pos_min, pos_max, pos, pos_limit;
1075 int64_t ts_min, ts_max, ts;
1079 if (stream_index < 0)
1083 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1087 ts_min= AV_NOPTS_VALUE;
1088 pos_limit= -1; //gcc falsely says it may be uninitialized
1090 st= s->streams[stream_index];
1091 if(st->index_entries){
1094 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()
1095 index= FFMAX(index, 0);
1096 e= &st->index_entries[index];
1098 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1100 ts_min= e->timestamp;
1102 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1109 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1110 assert(index < st->nb_index_entries);
1112 e= &st->index_entries[index];
1113 assert(e->timestamp >= target_ts);
1115 ts_max= e->timestamp;
1116 pos_limit= pos_max - e->min_distance;
1118 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1119 pos_max,pos_limit, ts_max);
1124 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1129 url_fseek(&s->pb, pos, SEEK_SET);
1131 av_update_cur_dts(s, st, ts);
1136 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 )){
1138 int64_t start_pos, filesize;
1142 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1145 if(ts_min == AV_NOPTS_VALUE){
1146 pos_min = s->data_offset;
1147 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1148 if (ts_min == AV_NOPTS_VALUE)
1152 if(ts_max == AV_NOPTS_VALUE){
1154 filesize = url_fsize(&s->pb);
1155 pos_max = filesize - 1;
1158 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1160 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1161 if (ts_max == AV_NOPTS_VALUE)
1165 int64_t tmp_pos= pos_max + 1;
1166 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1167 if(tmp_ts == AV_NOPTS_VALUE)
1171 if(tmp_pos >= filesize)
1177 if(ts_min > ts_max){
1179 }else if(ts_min == ts_max){
1184 while (pos_min < pos_limit) {
1186 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1190 assert(pos_limit <= pos_max);
1193 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1194 // interpolate position (better than dichotomy)
1195 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1196 + pos_min - approximate_keyframe_distance;
1197 }else if(no_change==1){
1198 // bisection, if interpolation failed to change min or max pos last time
1199 pos = (pos_min + pos_limit)>>1;
1201 // linear search if bisection failed, can only happen if there are very few or no keframes between min/max
1206 else if(pos > pos_limit)
1210 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1216 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);
1218 if(ts == AV_NOPTS_VALUE){
1219 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1222 assert(ts != AV_NOPTS_VALUE);
1223 if (target_ts <= ts) {
1224 pos_limit = start_pos - 1;
1228 if (target_ts >= ts) {
1234 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1235 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1238 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1240 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1241 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1242 pos, ts_min, target_ts, ts_max);
1248 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1249 int64_t pos_min, pos_max;
1253 if (stream_index < 0)
1256 st= s->streams[stream_index];
1259 pos_min = s->data_offset;
1260 pos_max = url_fsize(&s->pb) - 1;
1262 if (pos < pos_min) pos= pos_min;
1263 else if(pos > pos_max) pos= pos_max;
1265 url_fseek(&s->pb, pos, SEEK_SET);
1268 av_update_cur_dts(s, st, ts);
1273 static int av_seek_frame_generic(AVFormatContext *s,
1274 int stream_index, int64_t timestamp, int flags)
1280 st = s->streams[stream_index];
1282 index = av_index_search_timestamp(st, timestamp, flags);
1284 if(index < 0 || index==st->nb_index_entries-1){
1288 if(st->index_entries && st->nb_index_entries){
1289 ie= &st->index_entries[st->nb_index_entries-1];
1290 url_fseek(&s->pb, ie->pos, SEEK_SET);
1291 av_update_cur_dts(s, st, ie->timestamp);
1293 url_fseek(&s->pb, 0, SEEK_SET);
1296 int ret = av_read_frame(s, &pkt);
1299 av_free_packet(&pkt);
1300 if(stream_index == pkt.stream_index){
1301 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1305 index = av_index_search_timestamp(st, timestamp, flags);
1310 av_read_frame_flush(s);
1311 if (s->iformat->read_seek){
1312 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1315 ie = &st->index_entries[index];
1316 url_fseek(&s->pb, ie->pos, SEEK_SET);
1318 av_update_cur_dts(s, st, ie->timestamp);
1323 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1328 av_read_frame_flush(s);
1330 if(flags & AVSEEK_FLAG_BYTE)
1331 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1333 if(stream_index < 0){
1334 stream_index= av_find_default_stream_index(s);
1335 if(stream_index < 0)
1338 st= s->streams[stream_index];
1339 /* timestamp for default must be expressed in AV_TIME_BASE units */
1340 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1342 st= s->streams[stream_index];
1344 /* first, we try the format specific seek */
1345 if (s->iformat->read_seek)
1346 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1353 if(s->iformat->read_timestamp)
1354 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1356 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1359 /*******************************************************/
1362 * Returns TRUE if the stream has accurate timings in any stream.
1364 * @return TRUE if the stream has accurate timings for at least one component.
1366 static int av_has_timings(AVFormatContext *ic)
1371 for(i = 0;i < ic->nb_streams; i++) {
1372 st = ic->streams[i];
1373 if (st->start_time != AV_NOPTS_VALUE &&
1374 st->duration != AV_NOPTS_VALUE)
1381 * Estimate the stream timings from the one of each components.
1383 * Also computes the global bitrate if possible.
1385 static void av_update_stream_timings(AVFormatContext *ic)
1387 int64_t start_time, start_time1, end_time, end_time1;
1391 start_time = INT64_MAX;
1392 end_time = INT64_MIN;
1393 for(i = 0;i < ic->nb_streams; i++) {
1394 st = ic->streams[i];
1395 if (st->start_time != AV_NOPTS_VALUE) {
1396 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1397 if (start_time1 < start_time)
1398 start_time = start_time1;
1399 if (st->duration != AV_NOPTS_VALUE) {
1400 end_time1 = start_time1
1401 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1402 if (end_time1 > end_time)
1403 end_time = end_time1;
1407 if (start_time != INT64_MAX) {
1408 ic->start_time = start_time;
1409 if (end_time != INT64_MIN) {
1410 ic->duration = end_time - start_time;
1411 if (ic->file_size > 0) {
1412 /* compute the bit rate */
1413 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1414 (double)ic->duration;
1421 static void fill_all_stream_timings(AVFormatContext *ic)
1426 av_update_stream_timings(ic);
1427 for(i = 0;i < ic->nb_streams; i++) {
1428 st = ic->streams[i];
1429 if (st->start_time == AV_NOPTS_VALUE) {
1430 if(ic->start_time != AV_NOPTS_VALUE)
1431 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1432 if(ic->duration != AV_NOPTS_VALUE)
1433 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1438 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1440 int64_t filesize, duration;
1444 /* if bit_rate is already set, we believe it */
1445 if (ic->bit_rate == 0) {
1447 for(i=0;i<ic->nb_streams;i++) {
1448 st = ic->streams[i];
1449 bit_rate += st->codec->bit_rate;
1451 ic->bit_rate = bit_rate;
1454 /* if duration is already set, we believe it */
1455 if (ic->duration == AV_NOPTS_VALUE &&
1456 ic->bit_rate != 0 &&
1457 ic->file_size != 0) {
1458 filesize = ic->file_size;
1460 for(i = 0; i < ic->nb_streams; i++) {
1461 st = ic->streams[i];
1462 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1463 if (st->duration == AV_NOPTS_VALUE)
1464 st->duration = duration;
1470 #define DURATION_MAX_READ_SIZE 250000
1472 /* only usable for MPEG-PS streams */
1473 static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offset)
1475 AVPacket pkt1, *pkt = &pkt1;
1477 int read_size, i, ret;
1479 int64_t filesize, offset, duration;
1481 /* free previous packet */
1482 if (ic->cur_st && ic->cur_st->parser)
1483 av_free_packet(&ic->cur_pkt);
1486 /* flush packet queue */
1487 flush_packet_queue(ic);
1489 for(i=0;i<ic->nb_streams;i++) {
1490 st = ic->streams[i];
1492 av_parser_close(st->parser);
1497 /* we read the first packets to get the first PTS (not fully
1498 accurate, but it is enough now) */
1499 url_fseek(&ic->pb, 0, SEEK_SET);
1502 if (read_size >= DURATION_MAX_READ_SIZE)
1504 /* if all info is available, we can stop */
1505 for(i = 0;i < ic->nb_streams; i++) {
1506 st = ic->streams[i];
1507 if (st->start_time == AV_NOPTS_VALUE)
1510 if (i == ic->nb_streams)
1513 ret = av_read_packet(ic, pkt);
1516 read_size += pkt->size;
1517 st = ic->streams[pkt->stream_index];
1518 if (pkt->pts != AV_NOPTS_VALUE) {
1519 if (st->start_time == AV_NOPTS_VALUE)
1520 st->start_time = pkt->pts;
1522 av_free_packet(pkt);
1525 /* estimate the end time (duration) */
1526 /* XXX: may need to support wrapping */
1527 filesize = ic->file_size;
1528 offset = filesize - DURATION_MAX_READ_SIZE;
1532 url_fseek(&ic->pb, offset, SEEK_SET);
1535 if (read_size >= DURATION_MAX_READ_SIZE)
1538 ret = av_read_packet(ic, pkt);
1541 read_size += pkt->size;
1542 st = ic->streams[pkt->stream_index];
1543 if (pkt->pts != AV_NOPTS_VALUE &&
1544 st->start_time != AV_NOPTS_VALUE) {
1545 end_time = pkt->pts;
1546 duration = end_time - st->start_time;
1548 if (st->duration == AV_NOPTS_VALUE ||
1549 st->duration < duration)
1550 st->duration = duration;
1553 av_free_packet(pkt);
1556 fill_all_stream_timings(ic);
1558 url_fseek(&ic->pb, old_offset, SEEK_SET);
1559 for(i=0; i<ic->nb_streams; i++){
1561 st->cur_dts= st->first_dts;
1565 static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
1569 /* get the file size, if possible */
1570 if (ic->iformat->flags & AVFMT_NOFILE) {
1573 file_size = url_fsize(&ic->pb);
1577 ic->file_size = file_size;
1579 if ((!strcmp(ic->iformat->name, "mpeg") ||
1580 !strcmp(ic->iformat->name, "mpegts")) &&
1581 file_size && !ic->pb.is_streamed) {
1582 /* get accurate estimate from the PTSes */
1583 av_estimate_timings_from_pts(ic, old_offset);
1584 } else if (av_has_timings(ic)) {
1585 /* at least one components has timings - we use them for all
1587 fill_all_stream_timings(ic);
1589 /* less precise: use bit rate info */
1590 av_estimate_timings_from_bit_rate(ic);
1592 av_update_stream_timings(ic);
1598 for(i = 0;i < ic->nb_streams; i++) {
1599 st = ic->streams[i];
1600 printf("%d: start_time: %0.3f duration: %0.3f\n",
1601 i, (double)st->start_time / AV_TIME_BASE,
1602 (double)st->duration / AV_TIME_BASE);
1604 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1605 (double)ic->start_time / AV_TIME_BASE,
1606 (double)ic->duration / AV_TIME_BASE,
1607 ic->bit_rate / 1000);
1612 static int has_codec_parameters(AVCodecContext *enc)
1615 switch(enc->codec_type) {
1616 case CODEC_TYPE_AUDIO:
1617 val = enc->sample_rate;
1619 case CODEC_TYPE_VIDEO:
1620 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1629 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1633 int got_picture, data_size, ret=0;
1636 if(!st->codec->codec){
1637 codec = avcodec_find_decoder(st->codec->codec_id);
1640 ret = avcodec_open(st->codec, codec);
1645 if(!has_codec_parameters(st->codec)){
1646 switch(st->codec->codec_type) {
1647 case CODEC_TYPE_VIDEO:
1648 ret = avcodec_decode_video(st->codec, &picture,
1649 &got_picture, (uint8_t *)data, size);
1651 case CODEC_TYPE_AUDIO:
1652 data_size = FFMAX(size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1653 samples = av_malloc(data_size);
1656 ret = avcodec_decode_audio2(st->codec, samples,
1657 &data_size, (uint8_t *)data, size);
1668 static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score)
1671 fmt = av_probe_input_format2(pd, 1, &score);
1674 if (strncmp(fmt->name, "mp3", 3) == 0)
1675 st->codec->codec_id = CODEC_ID_MP3;
1676 else if (strncmp(fmt->name, "ac3", 3) == 0)
1677 st->codec->codec_id = CODEC_ID_AC3;
1682 unsigned int codec_get_tag(const AVCodecTag *tags, int id)
1684 while (tags->id != CODEC_ID_NONE) {
1692 enum CodecID codec_get_id(const AVCodecTag *tags, unsigned int tag)
1695 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1696 if(tag == tags[i].tag)
1699 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1700 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1701 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1702 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1703 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1706 return CODEC_ID_NONE;
1709 unsigned int av_codec_get_tag(const AVCodecTag *tags[4], enum CodecID id)
1712 for(i=0; tags && tags[i]; i++){
1713 int tag= codec_get_tag(tags[i], id);
1719 enum CodecID av_codec_get_id(const AVCodecTag *tags[4], unsigned int tag)
1722 for(i=0; tags && tags[i]; i++){
1723 enum CodecID id= codec_get_id(tags[i], tag);
1724 if(id!=CODEC_ID_NONE) return id;
1726 return CODEC_ID_NONE;
1729 /* absolute maximum size we read until we abort */
1730 #define MAX_READ_SIZE 5000000
1732 #define MAX_STD_TIMEBASES (60*12+5)
1733 static int get_std_framerate(int i){
1734 if(i<60*12) return i*1001;
1735 else return ((int[]){24,30,60,12,15})[i-60*12]*1000*12;
1738 int av_find_stream_info(AVFormatContext *ic)
1740 int i, count, ret, read_size, j;
1742 AVPacket pkt1, *pkt;
1743 int64_t last_dts[MAX_STREAMS];
1744 int duration_count[MAX_STREAMS]={0};
1745 double (*duration_error)[MAX_STD_TIMEBASES];
1746 offset_t old_offset = url_ftell(&ic->pb);
1747 int64_t codec_info_duration[MAX_STREAMS]={0};
1748 int codec_info_nb_frames[MAX_STREAMS]={0};
1749 AVProbeData probe_data[MAX_STREAMS];
1750 int codec_identified[MAX_STREAMS]={0};
1752 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
1753 if (!duration_error) return AVERROR(ENOMEM);
1755 for(i=0;i<ic->nb_streams;i++) {
1756 st = ic->streams[i];
1757 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1758 /* if(!st->time_base.num)
1760 if(!st->codec->time_base.num)
1761 st->codec->time_base= st->time_base;
1763 //only for the split stuff
1765 st->parser = av_parser_init(st->codec->codec_id);
1766 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
1767 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1772 for(i=0;i<MAX_STREAMS;i++){
1773 last_dts[i]= AV_NOPTS_VALUE;
1776 memset(probe_data, 0, sizeof(probe_data));
1780 /* check if one codec still needs to be handled */
1781 for(i=0;i<ic->nb_streams;i++) {
1782 st = ic->streams[i];
1783 if (!has_codec_parameters(st->codec))
1785 /* variable fps and no guess at the real fps */
1786 if( (st->codec->time_base.den >= 101LL*st->codec->time_base.num || st->codec->codec_id == CODEC_ID_MPEG2VIDEO)
1787 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1789 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1791 if (st->codec->codec_type == CODEC_TYPE_AUDIO &&
1792 st->codec->codec_id == CODEC_ID_NONE)
1794 if(st->first_dts == AV_NOPTS_VALUE)
1797 if (i == ic->nb_streams) {
1798 /* NOTE: if the format has no header, then we need to read
1799 some packets to get most of the streams, so we cannot
1801 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1802 /* if we found the info for all the codecs, we can stop */
1807 /* we did not get all the codec info, but we read too much data */
1808 if (read_size >= MAX_READ_SIZE) {
1813 /* NOTE: a new stream can be added there if no header in file
1814 (AVFMTCTX_NOHEADER) */
1815 ret = av_read_frame_internal(ic, &pkt1);
1818 ret = -1; /* we could not have all the codec parameters before EOF */
1819 for(i=0;i<ic->nb_streams;i++) {
1820 st = ic->streams[i];
1821 if (!has_codec_parameters(st->codec)){
1823 avcodec_string(buf, sizeof(buf), st->codec, 0);
1824 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
1832 pkt= add_to_pktbuf(ic, &pkt1);
1833 if(av_dup_packet(pkt) < 0)
1834 return AVERROR(ENOMEM);
1836 read_size += pkt->size;
1838 st = ic->streams[pkt->stream_index];
1839 if(codec_info_nb_frames[st->index]>1)
1840 codec_info_duration[st->index] += pkt->duration;
1841 if (pkt->duration != 0)
1842 codec_info_nb_frames[st->index]++;
1845 int index= pkt->stream_index;
1846 int64_t last= last_dts[index];
1847 int64_t duration= pkt->dts - last;
1849 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
1850 double dur= duration * av_q2d(st->time_base);
1852 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1853 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
1854 if(duration_count[index] < 2)
1855 memset(duration_error, 0, MAX_STREAMS * sizeof(*duration_error));
1856 for(i=1; i<MAX_STD_TIMEBASES; i++){
1857 int framerate= get_std_framerate(i);
1858 int ticks= lrintf(dur*framerate/(1001*12));
1859 double error= dur - ticks*1001*12/(double)framerate;
1860 duration_error[index][i] += error*error;
1862 duration_count[index]++;
1864 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
1865 last_dts[pkt->stream_index]= pkt->dts;
1867 if (st->codec->codec_id == CODEC_ID_NONE) {
1868 AVProbeData *pd = &(probe_data[st->index]);
1869 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size);
1870 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
1871 pd->buf_size += pkt->size;
1874 if(st->parser && st->parser->parser->split && !st->codec->extradata){
1875 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
1877 st->codec->extradata_size= i;
1878 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
1879 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
1880 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1884 /* if still no information, we try to open the codec and to
1885 decompress the frame. We try to avoid that in most cases as
1886 it takes longer and uses more memory. For MPEG4, we need to
1887 decompress for Quicktime. */
1888 if (!has_codec_parameters(st->codec) /*&&
1889 (st->codec->codec_id == CODEC_ID_FLV1 ||
1890 st->codec->codec_id == CODEC_ID_H264 ||
1891 st->codec->codec_id == CODEC_ID_H263 ||
1892 st->codec->codec_id == CODEC_ID_H261 ||
1893 st->codec->codec_id == CODEC_ID_VORBIS ||
1894 st->codec->codec_id == CODEC_ID_MJPEG ||
1895 st->codec->codec_id == CODEC_ID_PNG ||
1896 st->codec->codec_id == CODEC_ID_PAM ||
1897 st->codec->codec_id == CODEC_ID_PGM ||
1898 st->codec->codec_id == CODEC_ID_PGMYUV ||
1899 st->codec->codec_id == CODEC_ID_PBM ||
1900 st->codec->codec_id == CODEC_ID_PPM ||
1901 st->codec->codec_id == CODEC_ID_SHORTEN ||
1902 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
1903 try_decode_frame(st, pkt->data, pkt->size);
1905 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) {
1911 // close codecs which where opened in try_decode_frame()
1912 for(i=0;i<ic->nb_streams;i++) {
1913 st = ic->streams[i];
1914 if(st->codec->codec)
1915 avcodec_close(st->codec);
1917 for(i=0;i<ic->nb_streams;i++) {
1918 st = ic->streams[i];
1919 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1920 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
1921 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
1923 if(duration_count[i]
1924 && (st->codec->time_base.num*101LL <= st->codec->time_base.den || st->codec->codec_id == CODEC_ID_MPEG2VIDEO) /*&&
1925 //FIXME we should not special case mpeg2, but this needs testing with non mpeg2 ...
1926 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
1927 double best_error= 2*av_q2d(st->time_base);
1928 best_error= best_error*best_error*duration_count[i]*1000*12*30;
1930 for(j=1; j<MAX_STD_TIMEBASES; j++){
1931 double error= duration_error[i][j] * get_std_framerate(j);
1932 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1933 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
1934 if(error < best_error){
1936 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, get_std_framerate(j), 12*1001, INT_MAX);
1941 if (!st->r_frame_rate.num){
1942 if( st->codec->time_base.den * (int64_t)st->time_base.num
1943 <= st->codec->time_base.num * (int64_t)st->time_base.den){
1944 st->r_frame_rate.num = st->codec->time_base.den;
1945 st->r_frame_rate.den = st->codec->time_base.num;
1947 st->r_frame_rate.num = st->time_base.den;
1948 st->r_frame_rate.den = st->time_base.num;
1951 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
1952 if (st->codec->codec_id == CODEC_ID_NONE && probe_data[st->index].buf_size > 0) {
1953 codec_identified[st->index] = set_codec_from_probe_data(st, &(probe_data[st->index]), 1);
1954 if (codec_identified[st->index]) {
1955 st->need_parsing = AVSTREAM_PARSE_FULL;
1958 if(!st->codec->bits_per_sample)
1959 st->codec->bits_per_sample= av_get_bits_per_sample(st->codec->codec_id);
1963 av_estimate_timings(ic, old_offset);
1965 for(i=0;i<ic->nb_streams;i++) {
1966 st = ic->streams[i];
1967 if (codec_identified[st->index])
1970 //FIXME this is a mess
1971 if(i!=ic->nb_streams){
1972 av_read_frame_flush(ic);
1973 for(i=0;i<ic->nb_streams;i++) {
1974 st = ic->streams[i];
1975 if (codec_identified[st->index]) {
1976 av_seek_frame(ic, st->index, 0.0, 0);
1978 st->cur_dts= st->first_dts;
1980 url_fseek(&ic->pb, ic->data_offset, SEEK_SET);
1984 /* correct DTS for b frame streams with no timestamps */
1985 for(i=0;i<ic->nb_streams;i++) {
1986 st = ic->streams[i];
1987 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1989 ppktl = &ic->packet_buffer;
1991 if(ppkt1->stream_index != i)
1993 if(ppkt1->pkt->dts < 0)
1995 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
1997 ppkt1->pkt->dts -= delta;
2002 st->cur_dts -= delta;
2008 av_free(duration_error);
2009 for(i=0;i<MAX_STREAMS;i++){
2010 av_freep(&(probe_data[i].buf));
2016 /*******************************************************/
2018 int av_read_play(AVFormatContext *s)
2020 if (!s->iformat->read_play)
2021 return AVERROR(ENOSYS);
2022 return s->iformat->read_play(s);
2025 int av_read_pause(AVFormatContext *s)
2027 if (!s->iformat->read_pause)
2028 return AVERROR(ENOSYS);
2029 return s->iformat->read_pause(s);
2032 void av_close_input_file(AVFormatContext *s)
2034 int i, must_open_file;
2037 /* free previous packet */
2038 if (s->cur_st && s->cur_st->parser)
2039 av_free_packet(&s->cur_pkt);
2041 if (s->iformat->read_close)
2042 s->iformat->read_close(s);
2043 for(i=0;i<s->nb_streams;i++) {
2044 /* free all data in a stream component */
2047 av_parser_close(st->parser);
2049 av_free(st->index_entries);
2050 av_free(st->codec->extradata);
2054 flush_packet_queue(s);
2056 if (s->iformat->flags & AVFMT_NOFILE) {
2059 if (must_open_file) {
2062 av_freep(&s->priv_data);
2066 AVStream *av_new_stream(AVFormatContext *s, int id)
2071 if (s->nb_streams >= MAX_STREAMS)
2074 st = av_mallocz(sizeof(AVStream));
2078 st->codec= avcodec_alloc_context();
2080 /* no default bitrate if decoding */
2081 st->codec->bit_rate = 0;
2083 st->index = s->nb_streams;
2085 st->start_time = AV_NOPTS_VALUE;
2086 st->duration = AV_NOPTS_VALUE;
2087 st->cur_dts = AV_NOPTS_VALUE;
2088 st->first_dts = AV_NOPTS_VALUE;
2090 /* default pts settings is MPEG like */
2091 av_set_pts_info(st, 33, 1, 90000);
2092 st->last_IP_pts = AV_NOPTS_VALUE;
2093 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2094 st->pts_buffer[i]= AV_NOPTS_VALUE;
2096 s->streams[s->nb_streams++] = st;
2100 /************************************************************/
2101 /* output media file */
2103 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2107 if (s->oformat->priv_data_size > 0) {
2108 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2110 return AVERROR(ENOMEM);
2112 s->priv_data = NULL;
2114 if (s->oformat->set_parameters) {
2115 ret = s->oformat->set_parameters(s, ap);
2122 int av_write_header(AVFormatContext *s)
2127 // some sanity checks
2128 for(i=0;i<s->nb_streams;i++) {
2131 switch (st->codec->codec_type) {
2132 case CODEC_TYPE_AUDIO:
2133 if(st->codec->sample_rate<=0){
2134 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2138 case CODEC_TYPE_VIDEO:
2139 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2140 av_log(s, AV_LOG_ERROR, "time base not set\n");
2143 if(st->codec->width<=0 || st->codec->height<=0){
2144 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2150 if(s->oformat->codec_tag){
2151 if(st->codec->codec_tag){
2153 //check that tag + id is in the table
2154 //if neither is in the table -> ok
2155 //if tag is in the table with another id -> FAIL
2156 //if id is in the table with another tag -> FAIL unless strict < ?
2158 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2162 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2163 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2165 return AVERROR(ENOMEM);
2168 if(s->oformat->write_header){
2169 ret = s->oformat->write_header(s);
2174 /* init PTS generation */
2175 for(i=0;i<s->nb_streams;i++) {
2176 int64_t den = AV_NOPTS_VALUE;
2179 switch (st->codec->codec_type) {
2180 case CODEC_TYPE_AUDIO:
2181 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2183 case CODEC_TYPE_VIDEO:
2184 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2189 if (den != AV_NOPTS_VALUE) {
2191 return AVERROR_INVALIDDATA;
2192 av_frac_init(&st->pts, 0, 0, den);
2198 //FIXME merge with compute_pkt_fields
2199 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2200 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2201 int num, den, frame_size, i;
2203 // 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);
2205 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2208 /* duration field */
2209 if (pkt->duration == 0) {
2210 compute_frame_duration(&num, &den, st, NULL, pkt);
2212 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2216 //XXX/FIXME this is a temporary hack until all encoders output pts
2217 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2219 // pkt->pts= st->cur_dts;
2220 pkt->pts= st->pts.val;
2223 //calculate dts from pts
2224 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2225 st->pts_buffer[0]= pkt->pts;
2226 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2227 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2228 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2229 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2231 pkt->dts= st->pts_buffer[0];
2234 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2235 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2238 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2239 av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n");
2243 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2244 st->cur_dts= pkt->dts;
2245 st->pts.val= pkt->dts;
2248 switch (st->codec->codec_type) {
2249 case CODEC_TYPE_AUDIO:
2250 frame_size = get_audio_frame_size(st->codec, pkt->size);
2252 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
2253 but it would be better if we had the real timestamps from the encoder */
2254 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2255 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2258 case CODEC_TYPE_VIDEO:
2259 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2267 static void truncate_ts(AVStream *st, AVPacket *pkt){
2268 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2271 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here
2273 if (pkt->pts != AV_NOPTS_VALUE)
2274 pkt->pts &= pts_mask;
2275 if (pkt->dts != AV_NOPTS_VALUE)
2276 pkt->dts &= pts_mask;
2279 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2283 ret=compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2284 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2287 truncate_ts(s->streams[pkt->stream_index], pkt);
2289 ret= s->oformat->write_packet(s, pkt);
2291 ret= url_ferror(&s->pb);
2295 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2296 AVPacketList *pktl, **next_point, *this_pktl;
2298 int streams[MAX_STREAMS];
2301 AVStream *st= s->streams[ pkt->stream_index];
2303 // assert(pkt->destruct != av_destruct_packet); //FIXME
2305 this_pktl = av_mallocz(sizeof(AVPacketList));
2306 this_pktl->pkt= *pkt;
2307 if(pkt->destruct == av_destruct_packet)
2308 pkt->destruct= NULL; // non shared -> must keep original from being freed
2310 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2312 next_point = &s->packet_buffer;
2314 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2315 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2316 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2317 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2319 next_point= &(*next_point)->next;
2321 this_pktl->next= *next_point;
2322 *next_point= this_pktl;
2325 memset(streams, 0, sizeof(streams));
2326 pktl= s->packet_buffer;
2328 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2329 if(streams[ pktl->pkt.stream_index ] == 0)
2331 streams[ pktl->pkt.stream_index ]++;
2335 if(s->nb_streams == stream_count || (flush && stream_count)){
2336 pktl= s->packet_buffer;
2339 s->packet_buffer= pktl->next;
2343 av_init_packet(out);
2349 * Interleaves a AVPacket correctly so it can be muxed.
2350 * @param out the interleaved packet will be output here
2351 * @param in the input packet
2352 * @param flush 1 if no further packets are available as input and all
2353 * remaining packets should be output
2354 * @return 1 if a packet was output, 0 if no packet could be output,
2355 * < 0 if an error occured
2357 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2358 if(s->oformat->interleave_packet)
2359 return s->oformat->interleave_packet(s, out, in, flush);
2361 return av_interleave_packet_per_dts(s, out, in, flush);
2364 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2365 AVStream *st= s->streams[ pkt->stream_index];
2367 //FIXME/XXX/HACK drop zero sized packets
2368 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2371 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2372 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2375 if(pkt->dts == AV_NOPTS_VALUE)
2380 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2381 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2384 truncate_ts(s->streams[opkt.stream_index], &opkt);
2385 ret= s->oformat->write_packet(s, &opkt);
2387 av_free_packet(&opkt);
2392 if(url_ferror(&s->pb))
2393 return url_ferror(&s->pb);
2397 int av_write_trailer(AVFormatContext *s)
2403 ret= av_interleave_packet(s, &pkt, NULL, 1);
2404 if(ret<0) //FIXME cleanup needed for ret<0 ?
2409 truncate_ts(s->streams[pkt.stream_index], &pkt);
2410 ret= s->oformat->write_packet(s, &pkt);
2412 av_free_packet(&pkt);
2416 if(url_ferror(&s->pb))
2420 if(s->oformat->write_trailer)
2421 ret = s->oformat->write_trailer(s);
2424 ret=url_ferror(&s->pb);
2425 for(i=0;i<s->nb_streams;i++)
2426 av_freep(&s->streams[i]->priv_data);
2427 av_freep(&s->priv_data);
2431 /* "user interface" functions */
2433 void dump_format(AVFormatContext *ic,
2441 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2442 is_output ? "Output" : "Input",
2444 is_output ? ic->oformat->name : ic->iformat->name,
2445 is_output ? "to" : "from", url);
2447 av_log(NULL, AV_LOG_INFO, " Duration: ");
2448 if (ic->duration != AV_NOPTS_VALUE) {
2449 int hours, mins, secs, us;
2450 secs = ic->duration / AV_TIME_BASE;
2451 us = ic->duration % AV_TIME_BASE;
2456 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%01d", hours, mins, secs,
2457 (10 * us) / AV_TIME_BASE);
2459 av_log(NULL, AV_LOG_INFO, "N/A");
2461 if (ic->start_time != AV_NOPTS_VALUE) {
2463 av_log(NULL, AV_LOG_INFO, ", start: ");
2464 secs = ic->start_time / AV_TIME_BASE;
2465 us = ic->start_time % AV_TIME_BASE;
2466 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2467 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2469 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2471 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2473 av_log(NULL, AV_LOG_INFO, "N/A");
2475 av_log(NULL, AV_LOG_INFO, "\n");
2477 for(i=0;i<ic->nb_streams;i++) {
2478 AVStream *st = ic->streams[i];
2479 int g= ff_gcd(st->time_base.num, st->time_base.den);
2480 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2481 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2482 /* the pid is an important information, so we display it */
2483 /* XXX: add a generic system */
2485 flags = ic->oformat->flags;
2487 flags = ic->iformat->flags;
2488 if (flags & AVFMT_SHOW_IDS) {
2489 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2491 if (strlen(st->language) > 0) {
2492 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2494 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2495 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2496 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2497 if(st->r_frame_rate.den && st->r_frame_rate.num)
2498 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(r)", av_q2d(st->r_frame_rate));
2499 /* else if(st->time_base.den && st->time_base.num)
2500 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(m)", 1/av_q2d(st->time_base));*/
2502 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(c)", 1/av_q2d(st->codec->time_base));
2504 av_log(NULL, AV_LOG_INFO, "\n");
2508 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2510 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2513 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2515 AVRational frame_rate;
2516 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2517 *frame_rate_num= frame_rate.num;
2518 *frame_rate_den= frame_rate.den;
2523 * gets the current time in micro seconds.
2525 int64_t av_gettime(void)
2528 gettimeofday(&tv,NULL);
2529 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
2532 int64_t parse_date(const char *datestr, int duration)
2538 static const char *date_fmt[] = {
2542 static const char *time_fmt[] = {
2552 time_t now = time(0);
2554 len = strlen(datestr);
2556 lastch = datestr[len - 1];
2559 is_utc = (lastch == 'z' || lastch == 'Z');
2561 memset(&dt, 0, sizeof(dt));
2566 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2567 q = small_strptime(p, date_fmt[i], &dt);
2577 dt = *localtime(&now);
2579 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2584 if (*p == 'T' || *p == 't' || *p == ' ')
2587 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2588 q = small_strptime(p, time_fmt[i], &dt);
2598 q = small_strptime(p, time_fmt[0], &dt);
2600 dt.tm_sec = strtol(p, (char **)&q, 10);
2606 /* Now we have all the fields that we can get */
2611 return now * INT64_C(1000000);
2615 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2617 dt.tm_isdst = -1; /* unknown */
2630 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2633 val += n * (*q - '0');
2637 return negative ? -t : t;
2640 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2650 while (*p != '\0' && *p != '=' && *p != '&') {
2651 if ((q - tag) < sizeof(tag) - 1)
2659 while (*p != '&' && *p != '\0') {
2660 if ((q - arg) < arg_size - 1) {
2670 if (!strcmp(tag, tag1))
2679 int av_get_frame_filename(char *buf, int buf_size,
2680 const char *path, int number)
2683 char *q, buf1[20], c;
2684 int nd, len, percentd_found;
2696 while (isdigit(*p)) {
2697 nd = nd * 10 + *p++ - '0';
2700 } while (isdigit(c));
2709 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2711 if ((q - buf + len) > buf_size - 1)
2713 memcpy(q, buf1, len);
2721 if ((q - buf) < buf_size - 1)
2725 if (!percentd_found)
2734 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
2737 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2739 for(i=0;i<size;i+=16) {
2746 PRINT(" %02x", buf[i+j]);
2751 for(j=0;j<len;j++) {
2753 if (c < ' ' || c > '~')
2762 void av_hex_dump(FILE *f, uint8_t *buf, int size)
2764 hex_dump_internal(NULL, f, 0, buf, size);
2767 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
2769 hex_dump_internal(avcl, NULL, level, buf, size);
2772 //FIXME needs to know the time_base
2773 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
2775 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2776 PRINT("stream #%d:\n", pkt->stream_index);
2777 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
2778 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
2779 /* DTS is _always_ valid after av_read_frame() */
2781 if (pkt->dts == AV_NOPTS_VALUE)
2784 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
2785 /* PTS may be not known if B frames are present */
2787 if (pkt->pts == AV_NOPTS_VALUE)
2790 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
2792 PRINT(" size=%d\n", pkt->size);
2795 av_hex_dump(f, pkt->data, pkt->size);
2798 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
2800 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
2803 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
2805 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
2808 void url_split(char *proto, int proto_size,
2809 char *authorization, int authorization_size,
2810 char *hostname, int hostname_size,
2812 char *path, int path_size,
2823 while (*p != ':' && *p != '\0') {
2824 if ((q - proto) < proto_size - 1)
2830 if (authorization_size > 0)
2831 authorization[0] = '\0';
2835 if (hostname_size > 0)
2839 char *at,*slash; // PETR: position of '@' character and '/' character
2846 at = strchr(p,'@'); // PETR: get the position of '@'
2847 slash = strchr(p,'/'); // PETR: get position of '/' - end of hostname
2848 if (at && slash && at > slash) at = NULL; // PETR: not interested in '@' behind '/'
2850 q = at ? authorization : hostname; // PETR: if '@' exists starting with auth.
2852 while ((at || *p != ':') && *p != '/' && *p != '?' && *p != '\0') { // PETR:
2853 if (*p == '@') { // PETR: passed '@'
2854 if (authorization_size > 0)
2858 } else if (!at) { // PETR: hostname
2859 if ((q - hostname) < hostname_size - 1)
2862 if ((q - authorization) < authorization_size - 1)
2867 if (hostname_size > 0)
2871 port = strtoul(p, (char **)&p, 10);
2876 av_strlcpy(path, p, path_size);
2879 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
2880 int pts_num, int pts_den)
2882 s->pts_wrap_bits = pts_wrap_bits;
2883 s->time_base.num = pts_num;
2884 s->time_base.den = pts_den;
2887 /* fraction handling */
2890 * f = val + (num / den) + 0.5.
2892 * 'num' is normalized so that it is such as 0 <= num < den.
2894 * @param f fractional number
2895 * @param val integer value
2896 * @param num must be >= 0
2897 * @param den must be >= 1
2899 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
2912 * Fractionnal addition to f: f = f + (incr / f->den).
2914 * @param f fractional number
2915 * @param incr increment, can be positive or negative
2917 static void av_frac_add(AVFrac *f, int64_t incr)
2921 num = f->num + incr;
2924 f->val += num / den;
2930 } else if (num >= den) {
2931 f->val += num / den;