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->start_time == AV_NOPTS_VALUE ||
1464 st->duration == AV_NOPTS_VALUE) {
1466 st->duration = duration;
1473 #define DURATION_MAX_READ_SIZE 250000
1475 /* only usable for MPEG-PS streams */
1476 static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offset)
1478 AVPacket pkt1, *pkt = &pkt1;
1480 int read_size, i, ret;
1482 int64_t filesize, offset, duration;
1484 /* free previous packet */
1485 if (ic->cur_st && ic->cur_st->parser)
1486 av_free_packet(&ic->cur_pkt);
1489 /* flush packet queue */
1490 flush_packet_queue(ic);
1492 for(i=0;i<ic->nb_streams;i++) {
1493 st = ic->streams[i];
1495 av_parser_close(st->parser);
1500 /* we read the first packets to get the first PTS (not fully
1501 accurate, but it is enough now) */
1502 url_fseek(&ic->pb, 0, SEEK_SET);
1505 if (read_size >= DURATION_MAX_READ_SIZE)
1507 /* if all info is available, we can stop */
1508 for(i = 0;i < ic->nb_streams; i++) {
1509 st = ic->streams[i];
1510 if (st->start_time == AV_NOPTS_VALUE)
1513 if (i == ic->nb_streams)
1516 ret = av_read_packet(ic, pkt);
1519 read_size += pkt->size;
1520 st = ic->streams[pkt->stream_index];
1521 if (pkt->pts != AV_NOPTS_VALUE) {
1522 if (st->start_time == AV_NOPTS_VALUE)
1523 st->start_time = pkt->pts;
1525 av_free_packet(pkt);
1528 /* estimate the end time (duration) */
1529 /* XXX: may need to support wrapping */
1530 filesize = ic->file_size;
1531 offset = filesize - DURATION_MAX_READ_SIZE;
1535 url_fseek(&ic->pb, offset, SEEK_SET);
1538 if (read_size >= DURATION_MAX_READ_SIZE)
1541 ret = av_read_packet(ic, pkt);
1544 read_size += pkt->size;
1545 st = ic->streams[pkt->stream_index];
1546 if (pkt->pts != AV_NOPTS_VALUE &&
1547 st->start_time != AV_NOPTS_VALUE) {
1548 end_time = pkt->pts;
1549 duration = end_time - st->start_time;
1551 if (st->duration == AV_NOPTS_VALUE ||
1552 st->duration < duration)
1553 st->duration = duration;
1556 av_free_packet(pkt);
1559 fill_all_stream_timings(ic);
1561 url_fseek(&ic->pb, old_offset, SEEK_SET);
1562 for(i=0; i<ic->nb_streams; i++){
1564 st->cur_dts= st->first_dts;
1568 static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
1572 /* get the file size, if possible */
1573 if (ic->iformat->flags & AVFMT_NOFILE) {
1576 file_size = url_fsize(&ic->pb);
1580 ic->file_size = file_size;
1582 if ((!strcmp(ic->iformat->name, "mpeg") ||
1583 !strcmp(ic->iformat->name, "mpegts")) &&
1584 file_size && !ic->pb.is_streamed) {
1585 /* get accurate estimate from the PTSes */
1586 av_estimate_timings_from_pts(ic, old_offset);
1587 } else if (av_has_timings(ic)) {
1588 /* at least one components has timings - we use them for all
1590 fill_all_stream_timings(ic);
1592 /* less precise: use bit rate info */
1593 av_estimate_timings_from_bit_rate(ic);
1595 av_update_stream_timings(ic);
1601 for(i = 0;i < ic->nb_streams; i++) {
1602 st = ic->streams[i];
1603 printf("%d: start_time: %0.3f duration: %0.3f\n",
1604 i, (double)st->start_time / AV_TIME_BASE,
1605 (double)st->duration / AV_TIME_BASE);
1607 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1608 (double)ic->start_time / AV_TIME_BASE,
1609 (double)ic->duration / AV_TIME_BASE,
1610 ic->bit_rate / 1000);
1615 static int has_codec_parameters(AVCodecContext *enc)
1618 switch(enc->codec_type) {
1619 case CODEC_TYPE_AUDIO:
1620 val = enc->sample_rate;
1622 case CODEC_TYPE_VIDEO:
1623 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1632 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1636 int got_picture, data_size, ret=0;
1639 if(!st->codec->codec){
1640 codec = avcodec_find_decoder(st->codec->codec_id);
1643 ret = avcodec_open(st->codec, codec);
1648 if(!has_codec_parameters(st->codec)){
1649 switch(st->codec->codec_type) {
1650 case CODEC_TYPE_VIDEO:
1651 ret = avcodec_decode_video(st->codec, &picture,
1652 &got_picture, (uint8_t *)data, size);
1654 case CODEC_TYPE_AUDIO:
1655 data_size = FFMAX(size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1656 samples = av_malloc(data_size);
1659 ret = avcodec_decode_audio2(st->codec, samples,
1660 &data_size, (uint8_t *)data, size);
1671 static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score)
1674 fmt = av_probe_input_format2(pd, 1, &score);
1677 if (strncmp(fmt->name, "mp3", 3) == 0)
1678 st->codec->codec_id = CODEC_ID_MP3;
1679 else if (strncmp(fmt->name, "ac3", 3) == 0)
1680 st->codec->codec_id = CODEC_ID_AC3;
1685 unsigned int codec_get_tag(const AVCodecTag *tags, int id)
1687 while (tags->id != CODEC_ID_NONE) {
1695 enum CodecID codec_get_id(const AVCodecTag *tags, unsigned int tag)
1698 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1699 if(tag == tags[i].tag)
1702 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1703 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1704 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1705 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1706 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1709 return CODEC_ID_NONE;
1712 unsigned int av_codec_get_tag(const AVCodecTag *tags[4], enum CodecID id)
1715 for(i=0; tags && tags[i]; i++){
1716 int tag= codec_get_tag(tags[i], id);
1722 enum CodecID av_codec_get_id(const AVCodecTag *tags[4], unsigned int tag)
1725 for(i=0; tags && tags[i]; i++){
1726 enum CodecID id= codec_get_id(tags[i], tag);
1727 if(id!=CODEC_ID_NONE) return id;
1729 return CODEC_ID_NONE;
1732 /* absolute maximum size we read until we abort */
1733 #define MAX_READ_SIZE 5000000
1735 #define MAX_STD_TIMEBASES (60*12+5)
1736 static int get_std_framerate(int i){
1737 if(i<60*12) return i*1001;
1738 else return ((int[]){24,30,60,12,15})[i-60*12]*1000*12;
1741 int av_find_stream_info(AVFormatContext *ic)
1743 int i, count, ret, read_size, j;
1745 AVPacket pkt1, *pkt;
1746 int64_t last_dts[MAX_STREAMS];
1747 int duration_count[MAX_STREAMS]={0};
1748 double (*duration_error)[MAX_STD_TIMEBASES];
1749 offset_t old_offset = url_ftell(&ic->pb);
1750 int64_t codec_info_duration[MAX_STREAMS]={0};
1751 int codec_info_nb_frames[MAX_STREAMS]={0};
1752 AVProbeData probe_data[MAX_STREAMS];
1753 int codec_identified[MAX_STREAMS]={0};
1755 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
1756 if (!duration_error) return AVERROR(ENOMEM);
1758 for(i=0;i<ic->nb_streams;i++) {
1759 st = ic->streams[i];
1760 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1761 /* if(!st->time_base.num)
1763 if(!st->codec->time_base.num)
1764 st->codec->time_base= st->time_base;
1766 //only for the split stuff
1768 st->parser = av_parser_init(st->codec->codec_id);
1769 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
1770 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1775 for(i=0;i<MAX_STREAMS;i++){
1776 last_dts[i]= AV_NOPTS_VALUE;
1779 memset(probe_data, 0, sizeof(probe_data));
1783 /* check if one codec still needs to be handled */
1784 for(i=0;i<ic->nb_streams;i++) {
1785 st = ic->streams[i];
1786 if (!has_codec_parameters(st->codec))
1788 /* variable fps and no guess at the real fps */
1789 if( (st->codec->time_base.den >= 101LL*st->codec->time_base.num || st->codec->codec_id == CODEC_ID_MPEG2VIDEO)
1790 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1792 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1794 if (st->codec->codec_type == CODEC_TYPE_AUDIO &&
1795 st->codec->codec_id == CODEC_ID_NONE)
1797 if(st->first_dts == AV_NOPTS_VALUE)
1800 if (i == ic->nb_streams) {
1801 /* NOTE: if the format has no header, then we need to read
1802 some packets to get most of the streams, so we cannot
1804 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1805 /* if we found the info for all the codecs, we can stop */
1810 /* we did not get all the codec info, but we read too much data */
1811 if (read_size >= MAX_READ_SIZE) {
1816 /* NOTE: a new stream can be added there if no header in file
1817 (AVFMTCTX_NOHEADER) */
1818 ret = av_read_frame_internal(ic, &pkt1);
1821 ret = -1; /* we could not have all the codec parameters before EOF */
1822 for(i=0;i<ic->nb_streams;i++) {
1823 st = ic->streams[i];
1824 if (!has_codec_parameters(st->codec)){
1826 avcodec_string(buf, sizeof(buf), st->codec, 0);
1827 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
1835 pkt= add_to_pktbuf(ic, &pkt1);
1836 if(av_dup_packet(pkt) < 0)
1837 return AVERROR(ENOMEM);
1839 read_size += pkt->size;
1841 st = ic->streams[pkt->stream_index];
1842 if(codec_info_nb_frames[st->index]>1)
1843 codec_info_duration[st->index] += pkt->duration;
1844 if (pkt->duration != 0)
1845 codec_info_nb_frames[st->index]++;
1848 int index= pkt->stream_index;
1849 int64_t last= last_dts[index];
1850 int64_t duration= pkt->dts - last;
1852 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
1853 double dur= duration * av_q2d(st->time_base);
1855 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1856 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
1857 if(duration_count[index] < 2)
1858 memset(duration_error, 0, MAX_STREAMS * sizeof(*duration_error));
1859 for(i=1; i<MAX_STD_TIMEBASES; i++){
1860 int framerate= get_std_framerate(i);
1861 int ticks= lrintf(dur*framerate/(1001*12));
1862 double error= dur - ticks*1001*12/(double)framerate;
1863 duration_error[index][i] += error*error;
1865 duration_count[index]++;
1867 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
1868 last_dts[pkt->stream_index]= pkt->dts;
1870 if (st->codec->codec_id == CODEC_ID_NONE) {
1871 AVProbeData *pd = &(probe_data[st->index]);
1872 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size);
1873 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
1874 pd->buf_size += pkt->size;
1877 if(st->parser && st->parser->parser->split && !st->codec->extradata){
1878 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
1880 st->codec->extradata_size= i;
1881 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
1882 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
1883 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1887 /* if still no information, we try to open the codec and to
1888 decompress the frame. We try to avoid that in most cases as
1889 it takes longer and uses more memory. For MPEG4, we need to
1890 decompress for Quicktime. */
1891 if (!has_codec_parameters(st->codec) /*&&
1892 (st->codec->codec_id == CODEC_ID_FLV1 ||
1893 st->codec->codec_id == CODEC_ID_H264 ||
1894 st->codec->codec_id == CODEC_ID_H263 ||
1895 st->codec->codec_id == CODEC_ID_H261 ||
1896 st->codec->codec_id == CODEC_ID_VORBIS ||
1897 st->codec->codec_id == CODEC_ID_MJPEG ||
1898 st->codec->codec_id == CODEC_ID_PNG ||
1899 st->codec->codec_id == CODEC_ID_PAM ||
1900 st->codec->codec_id == CODEC_ID_PGM ||
1901 st->codec->codec_id == CODEC_ID_PGMYUV ||
1902 st->codec->codec_id == CODEC_ID_PBM ||
1903 st->codec->codec_id == CODEC_ID_PPM ||
1904 st->codec->codec_id == CODEC_ID_SHORTEN ||
1905 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
1906 try_decode_frame(st, pkt->data, pkt->size);
1908 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) {
1914 // close codecs which where opened in try_decode_frame()
1915 for(i=0;i<ic->nb_streams;i++) {
1916 st = ic->streams[i];
1917 if(st->codec->codec)
1918 avcodec_close(st->codec);
1920 for(i=0;i<ic->nb_streams;i++) {
1921 st = ic->streams[i];
1922 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1923 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
1924 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
1926 if(duration_count[i]
1927 && (st->codec->time_base.num*101LL <= st->codec->time_base.den || st->codec->codec_id == CODEC_ID_MPEG2VIDEO) /*&&
1928 //FIXME we should not special case mpeg2, but this needs testing with non mpeg2 ...
1929 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
1930 double best_error= 2*av_q2d(st->time_base);
1931 best_error= best_error*best_error*duration_count[i]*1000*12*30;
1933 for(j=1; j<MAX_STD_TIMEBASES; j++){
1934 double error= duration_error[i][j] * get_std_framerate(j);
1935 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1936 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
1937 if(error < best_error){
1939 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, get_std_framerate(j), 12*1001, INT_MAX);
1944 if (!st->r_frame_rate.num){
1945 if( st->codec->time_base.den * (int64_t)st->time_base.num
1946 <= st->codec->time_base.num * (int64_t)st->time_base.den){
1947 st->r_frame_rate.num = st->codec->time_base.den;
1948 st->r_frame_rate.den = st->codec->time_base.num;
1950 st->r_frame_rate.num = st->time_base.den;
1951 st->r_frame_rate.den = st->time_base.num;
1954 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
1955 if (st->codec->codec_id == CODEC_ID_NONE && probe_data[st->index].buf_size > 0) {
1956 codec_identified[st->index] = set_codec_from_probe_data(st, &(probe_data[st->index]), 1);
1957 if (codec_identified[st->index]) {
1958 st->need_parsing = AVSTREAM_PARSE_FULL;
1961 if(!st->codec->bits_per_sample)
1962 st->codec->bits_per_sample= av_get_bits_per_sample(st->codec->codec_id);
1966 av_estimate_timings(ic, old_offset);
1968 for(i=0;i<ic->nb_streams;i++) {
1969 st = ic->streams[i];
1970 if (codec_identified[st->index])
1973 //FIXME this is a mess
1974 if(i!=ic->nb_streams){
1975 av_read_frame_flush(ic);
1976 for(i=0;i<ic->nb_streams;i++) {
1977 st = ic->streams[i];
1978 if (codec_identified[st->index]) {
1979 av_seek_frame(ic, st->index, 0.0, 0);
1981 st->cur_dts= st->first_dts;
1983 url_fseek(&ic->pb, ic->data_offset, SEEK_SET);
1987 /* correct DTS for b frame streams with no timestamps */
1988 for(i=0;i<ic->nb_streams;i++) {
1989 st = ic->streams[i];
1990 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1992 ppktl = &ic->packet_buffer;
1994 if(ppkt1->stream_index != i)
1996 if(ppkt1->pkt->dts < 0)
1998 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2000 ppkt1->pkt->dts -= delta;
2005 st->cur_dts -= delta;
2011 av_free(duration_error);
2012 for(i=0;i<MAX_STREAMS;i++){
2013 av_freep(&(probe_data[i].buf));
2019 /*******************************************************/
2021 int av_read_play(AVFormatContext *s)
2023 if (!s->iformat->read_play)
2024 return AVERROR(ENOSYS);
2025 return s->iformat->read_play(s);
2028 int av_read_pause(AVFormatContext *s)
2030 if (!s->iformat->read_pause)
2031 return AVERROR(ENOSYS);
2032 return s->iformat->read_pause(s);
2035 void av_close_input_file(AVFormatContext *s)
2037 int i, must_open_file;
2040 /* free previous packet */
2041 if (s->cur_st && s->cur_st->parser)
2042 av_free_packet(&s->cur_pkt);
2044 if (s->iformat->read_close)
2045 s->iformat->read_close(s);
2046 for(i=0;i<s->nb_streams;i++) {
2047 /* free all data in a stream component */
2050 av_parser_close(st->parser);
2052 av_free(st->index_entries);
2053 av_free(st->codec->extradata);
2057 flush_packet_queue(s);
2059 if (s->iformat->flags & AVFMT_NOFILE) {
2062 if (must_open_file) {
2065 av_freep(&s->priv_data);
2069 AVStream *av_new_stream(AVFormatContext *s, int id)
2074 if (s->nb_streams >= MAX_STREAMS)
2077 st = av_mallocz(sizeof(AVStream));
2081 st->codec= avcodec_alloc_context();
2083 /* no default bitrate if decoding */
2084 st->codec->bit_rate = 0;
2086 st->index = s->nb_streams;
2088 st->start_time = AV_NOPTS_VALUE;
2089 st->duration = AV_NOPTS_VALUE;
2090 st->cur_dts = AV_NOPTS_VALUE;
2091 st->first_dts = AV_NOPTS_VALUE;
2093 /* default pts settings is MPEG like */
2094 av_set_pts_info(st, 33, 1, 90000);
2095 st->last_IP_pts = AV_NOPTS_VALUE;
2096 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2097 st->pts_buffer[i]= AV_NOPTS_VALUE;
2099 s->streams[s->nb_streams++] = st;
2103 /************************************************************/
2104 /* output media file */
2106 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2110 if (s->oformat->priv_data_size > 0) {
2111 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2113 return AVERROR(ENOMEM);
2115 s->priv_data = NULL;
2117 if (s->oformat->set_parameters) {
2118 ret = s->oformat->set_parameters(s, ap);
2125 int av_write_header(AVFormatContext *s)
2130 // some sanity checks
2131 for(i=0;i<s->nb_streams;i++) {
2134 switch (st->codec->codec_type) {
2135 case CODEC_TYPE_AUDIO:
2136 if(st->codec->sample_rate<=0){
2137 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2141 case CODEC_TYPE_VIDEO:
2142 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2143 av_log(s, AV_LOG_ERROR, "time base not set\n");
2146 if(st->codec->width<=0 || st->codec->height<=0){
2147 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2153 if(s->oformat->codec_tag){
2154 if(st->codec->codec_tag){
2156 //check that tag + id is in the table
2157 //if neither is in the table -> ok
2158 //if tag is in the table with another id -> FAIL
2159 //if id is in the table with another tag -> FAIL unless strict < ?
2161 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2165 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2166 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2168 return AVERROR(ENOMEM);
2171 if(s->oformat->write_header){
2172 ret = s->oformat->write_header(s);
2177 /* init PTS generation */
2178 for(i=0;i<s->nb_streams;i++) {
2179 int64_t den = AV_NOPTS_VALUE;
2182 switch (st->codec->codec_type) {
2183 case CODEC_TYPE_AUDIO:
2184 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2186 case CODEC_TYPE_VIDEO:
2187 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2192 if (den != AV_NOPTS_VALUE) {
2194 return AVERROR_INVALIDDATA;
2195 av_frac_init(&st->pts, 0, 0, den);
2201 //FIXME merge with compute_pkt_fields
2202 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2203 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2204 int num, den, frame_size, i;
2206 // 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);
2208 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2211 /* duration field */
2212 if (pkt->duration == 0) {
2213 compute_frame_duration(&num, &den, st, NULL, pkt);
2215 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2219 //XXX/FIXME this is a temporary hack until all encoders output pts
2220 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2222 // pkt->pts= st->cur_dts;
2223 pkt->pts= st->pts.val;
2226 //calculate dts from pts
2227 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2228 st->pts_buffer[0]= pkt->pts;
2229 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2230 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2231 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2232 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2234 pkt->dts= st->pts_buffer[0];
2237 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2238 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2241 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2242 av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n");
2246 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2247 st->cur_dts= pkt->dts;
2248 st->pts.val= pkt->dts;
2251 switch (st->codec->codec_type) {
2252 case CODEC_TYPE_AUDIO:
2253 frame_size = get_audio_frame_size(st->codec, pkt->size);
2255 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
2256 but it would be better if we had the real timestamps from the encoder */
2257 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2258 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2261 case CODEC_TYPE_VIDEO:
2262 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2270 static void truncate_ts(AVStream *st, AVPacket *pkt){
2271 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2274 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here
2276 if (pkt->pts != AV_NOPTS_VALUE)
2277 pkt->pts &= pts_mask;
2278 if (pkt->dts != AV_NOPTS_VALUE)
2279 pkt->dts &= pts_mask;
2282 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2286 ret=compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2287 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2290 truncate_ts(s->streams[pkt->stream_index], pkt);
2292 ret= s->oformat->write_packet(s, pkt);
2294 ret= url_ferror(&s->pb);
2298 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2299 AVPacketList *pktl, **next_point, *this_pktl;
2301 int streams[MAX_STREAMS];
2304 AVStream *st= s->streams[ pkt->stream_index];
2306 // assert(pkt->destruct != av_destruct_packet); //FIXME
2308 this_pktl = av_mallocz(sizeof(AVPacketList));
2309 this_pktl->pkt= *pkt;
2310 if(pkt->destruct == av_destruct_packet)
2311 pkt->destruct= NULL; // non shared -> must keep original from being freed
2313 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2315 next_point = &s->packet_buffer;
2317 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2318 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2319 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2320 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2322 next_point= &(*next_point)->next;
2324 this_pktl->next= *next_point;
2325 *next_point= this_pktl;
2328 memset(streams, 0, sizeof(streams));
2329 pktl= s->packet_buffer;
2331 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2332 if(streams[ pktl->pkt.stream_index ] == 0)
2334 streams[ pktl->pkt.stream_index ]++;
2338 if(s->nb_streams == stream_count || (flush && stream_count)){
2339 pktl= s->packet_buffer;
2342 s->packet_buffer= pktl->next;
2346 av_init_packet(out);
2352 * Interleaves a AVPacket correctly so it can be muxed.
2353 * @param out the interleaved packet will be output here
2354 * @param in the input packet
2355 * @param flush 1 if no further packets are available as input and all
2356 * remaining packets should be output
2357 * @return 1 if a packet was output, 0 if no packet could be output,
2358 * < 0 if an error occured
2360 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2361 if(s->oformat->interleave_packet)
2362 return s->oformat->interleave_packet(s, out, in, flush);
2364 return av_interleave_packet_per_dts(s, out, in, flush);
2367 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2368 AVStream *st= s->streams[ pkt->stream_index];
2370 //FIXME/XXX/HACK drop zero sized packets
2371 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2374 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2375 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2378 if(pkt->dts == AV_NOPTS_VALUE)
2383 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2384 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2387 truncate_ts(s->streams[opkt.stream_index], &opkt);
2388 ret= s->oformat->write_packet(s, &opkt);
2390 av_free_packet(&opkt);
2395 if(url_ferror(&s->pb))
2396 return url_ferror(&s->pb);
2400 int av_write_trailer(AVFormatContext *s)
2406 ret= av_interleave_packet(s, &pkt, NULL, 1);
2407 if(ret<0) //FIXME cleanup needed for ret<0 ?
2412 truncate_ts(s->streams[pkt.stream_index], &pkt);
2413 ret= s->oformat->write_packet(s, &pkt);
2415 av_free_packet(&pkt);
2419 if(url_ferror(&s->pb))
2423 if(s->oformat->write_trailer)
2424 ret = s->oformat->write_trailer(s);
2427 ret=url_ferror(&s->pb);
2428 for(i=0;i<s->nb_streams;i++)
2429 av_freep(&s->streams[i]->priv_data);
2430 av_freep(&s->priv_data);
2434 /* "user interface" functions */
2436 void dump_format(AVFormatContext *ic,
2444 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2445 is_output ? "Output" : "Input",
2447 is_output ? ic->oformat->name : ic->iformat->name,
2448 is_output ? "to" : "from", url);
2450 av_log(NULL, AV_LOG_INFO, " Duration: ");
2451 if (ic->duration != AV_NOPTS_VALUE) {
2452 int hours, mins, secs, us;
2453 secs = ic->duration / AV_TIME_BASE;
2454 us = ic->duration % AV_TIME_BASE;
2459 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%01d", hours, mins, secs,
2460 (10 * us) / AV_TIME_BASE);
2462 av_log(NULL, AV_LOG_INFO, "N/A");
2464 if (ic->start_time != AV_NOPTS_VALUE) {
2466 av_log(NULL, AV_LOG_INFO, ", start: ");
2467 secs = ic->start_time / AV_TIME_BASE;
2468 us = ic->start_time % AV_TIME_BASE;
2469 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2470 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2472 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2474 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2476 av_log(NULL, AV_LOG_INFO, "N/A");
2478 av_log(NULL, AV_LOG_INFO, "\n");
2480 for(i=0;i<ic->nb_streams;i++) {
2481 AVStream *st = ic->streams[i];
2482 int g= ff_gcd(st->time_base.num, st->time_base.den);
2483 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2484 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2485 /* the pid is an important information, so we display it */
2486 /* XXX: add a generic system */
2488 flags = ic->oformat->flags;
2490 flags = ic->iformat->flags;
2491 if (flags & AVFMT_SHOW_IDS) {
2492 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2494 if (strlen(st->language) > 0) {
2495 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2497 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2498 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2499 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2500 if(st->r_frame_rate.den && st->r_frame_rate.num)
2501 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(r)", av_q2d(st->r_frame_rate));
2502 /* else if(st->time_base.den && st->time_base.num)
2503 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(m)", 1/av_q2d(st->time_base));*/
2505 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(c)", 1/av_q2d(st->codec->time_base));
2507 av_log(NULL, AV_LOG_INFO, "\n");
2511 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2513 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2516 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2518 AVRational frame_rate;
2519 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2520 *frame_rate_num= frame_rate.num;
2521 *frame_rate_den= frame_rate.den;
2526 * gets the current time in micro seconds.
2528 int64_t av_gettime(void)
2531 gettimeofday(&tv,NULL);
2532 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
2535 int64_t parse_date(const char *datestr, int duration)
2541 static const char *date_fmt[] = {
2545 static const char *time_fmt[] = {
2555 time_t now = time(0);
2557 len = strlen(datestr);
2559 lastch = datestr[len - 1];
2562 is_utc = (lastch == 'z' || lastch == 'Z');
2564 memset(&dt, 0, sizeof(dt));
2569 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2570 q = small_strptime(p, date_fmt[i], &dt);
2580 dt = *localtime(&now);
2582 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2587 if (*p == 'T' || *p == 't' || *p == ' ')
2590 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2591 q = small_strptime(p, time_fmt[i], &dt);
2601 q = small_strptime(p, time_fmt[0], &dt);
2603 dt.tm_sec = strtol(p, (char **)&q, 10);
2609 /* Now we have all the fields that we can get */
2614 return now * INT64_C(1000000);
2618 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2620 dt.tm_isdst = -1; /* unknown */
2633 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2636 val += n * (*q - '0');
2640 return negative ? -t : t;
2643 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2653 while (*p != '\0' && *p != '=' && *p != '&') {
2654 if ((q - tag) < sizeof(tag) - 1)
2662 while (*p != '&' && *p != '\0') {
2663 if ((q - arg) < arg_size - 1) {
2673 if (!strcmp(tag, tag1))
2682 int av_get_frame_filename(char *buf, int buf_size,
2683 const char *path, int number)
2686 char *q, buf1[20], c;
2687 int nd, len, percentd_found;
2699 while (isdigit(*p)) {
2700 nd = nd * 10 + *p++ - '0';
2703 } while (isdigit(c));
2712 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2714 if ((q - buf + len) > buf_size - 1)
2716 memcpy(q, buf1, len);
2724 if ((q - buf) < buf_size - 1)
2728 if (!percentd_found)
2737 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
2740 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2742 for(i=0;i<size;i+=16) {
2749 PRINT(" %02x", buf[i+j]);
2754 for(j=0;j<len;j++) {
2756 if (c < ' ' || c > '~')
2765 void av_hex_dump(FILE *f, uint8_t *buf, int size)
2767 hex_dump_internal(NULL, f, 0, buf, size);
2770 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
2772 hex_dump_internal(avcl, NULL, level, buf, size);
2775 //FIXME needs to know the time_base
2776 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
2778 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2779 PRINT("stream #%d:\n", pkt->stream_index);
2780 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
2781 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
2782 /* DTS is _always_ valid after av_read_frame() */
2784 if (pkt->dts == AV_NOPTS_VALUE)
2787 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
2788 /* PTS may be not known if B frames are present */
2790 if (pkt->pts == AV_NOPTS_VALUE)
2793 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
2795 PRINT(" size=%d\n", pkt->size);
2798 av_hex_dump(f, pkt->data, pkt->size);
2801 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
2803 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
2806 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
2808 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
2811 void url_split(char *proto, int proto_size,
2812 char *authorization, int authorization_size,
2813 char *hostname, int hostname_size,
2815 char *path, int path_size,
2826 while (*p != ':' && *p != '\0') {
2827 if ((q - proto) < proto_size - 1)
2833 if (authorization_size > 0)
2834 authorization[0] = '\0';
2838 if (hostname_size > 0)
2842 char *at,*slash; // PETR: position of '@' character and '/' character
2849 at = strchr(p,'@'); // PETR: get the position of '@'
2850 slash = strchr(p,'/'); // PETR: get position of '/' - end of hostname
2851 if (at && slash && at > slash) at = NULL; // PETR: not interested in '@' behind '/'
2853 q = at ? authorization : hostname; // PETR: if '@' exists starting with auth.
2855 while ((at || *p != ':') && *p != '/' && *p != '?' && *p != '\0') { // PETR:
2856 if (*p == '@') { // PETR: passed '@'
2857 if (authorization_size > 0)
2861 } else if (!at) { // PETR: hostname
2862 if ((q - hostname) < hostname_size - 1)
2865 if ((q - authorization) < authorization_size - 1)
2870 if (hostname_size > 0)
2874 port = strtoul(p, (char **)&p, 10);
2879 av_strlcpy(path, p, path_size);
2882 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
2883 int pts_num, int pts_den)
2885 s->pts_wrap_bits = pts_wrap_bits;
2886 s->time_base.num = pts_num;
2887 s->time_base.den = pts_den;
2890 /* fraction handling */
2893 * f = val + (num / den) + 0.5.
2895 * 'num' is normalized so that it is such as 0 <= num < den.
2897 * @param f fractional number
2898 * @param val integer value
2899 * @param num must be >= 0
2900 * @param den must be >= 1
2902 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
2915 * Fractionnal addition to f: f = f + (incr / f->den).
2917 * @param f fractional number
2918 * @param incr increment, can be positive or negative
2920 static void av_frac_add(AVFrac *f, int64_t incr)
2924 num = f->num + incr;
2927 f->val += num / den;
2933 } else if (num >= den) {
2934 f->val += num / den;