[FFmpeg-devel] [PATCH] make analyze_duration work for streams with incomplete timestamps (mp3)
Reimar Döffinger
Reimar.Doeffinger
Sun Sep 13 21:44:59 CEST 2009
On Sun, Sep 13, 2009 at 12:16:04PM -0700, Baptiste Coudurier wrote:
> Hi,
>
> On 09/13/2009 03:41 AM, Reimar D?ffinger wrote:
> >Hello,
> >currently max_analyze_duration does not work for e.g.
> >http://208.80.52.108:80/KDLDFM because the mpeg audio parser is very
> >thorough in making a mess of timestamps.
> >Basically, only every 4th packet has a timestamp and thus none at all
> >have any duration.
> >Attached patch handles this case by using the difference between the
> >minimum and current dts for comparing against max_analyze_duration when
> >we have no other duration info.
> >
> >
> >------------------------------------------------------------------------
> >
> >Index: libavformat/utils.c
> >===================================================================
> >--- libavformat/utils.c (revision 19824)
> >+++ libavformat/utils.c (working copy)
> >@@ -2015,6 +2015,7 @@
> > AVStream *st;
> > AVPacket pkt1, *pkt;
> > int64_t last_dts[MAX_STREAMS];
> >+ int64_t min_dts[MAX_STREAMS];
> > int64_t duration_gcd[MAX_STREAMS]={0};
> > int duration_count[MAX_STREAMS]={0};
> > double (*duration_error)[MAX_STD_TIMEBASES];
> >@@ -2043,12 +2044,14 @@
> > }
> >
> > for(i=0;i<MAX_STREAMS;i++){
> >+ min_dts[i] =
> > last_dts[i]= AV_NOPTS_VALUE;
> > }
> >
> > count = 0;
> > read_size = 0;
> > for(;;) {
> >+ int64_t analyze_duration = AV_NOPTS_VALUE;
> > if(url_interrupt_cb()){
> > ret= AVERROR(EINTR);
> > av_log(ic, AV_LOG_DEBUG, "interrupted\n");
> >@@ -2117,12 +2120,20 @@
> > read_size += pkt->size;
> >
> > st = ic->streams[pkt->stream_index];
> >+
> >+ if (min_dts[st->index] == AV_NOPTS_VALUE || (pkt->dts != AV_NOPTS_VALUE&& pkt->dts< min_dts[st->index]))
> >+ min_dts[st->index] = pkt->dts;
>
> Can st->first_dts be used ?
No idea, anything remotely related to that is completely undocumented and reverse-engineering it
would take a good deal more than just a few minutes.
Though I think using first_dts would at least need extra code to handle timestamp resets/wraps.
More information about the ffmpeg-devel
mailing list