From 1f95ad48ff158ac3a7419efc98e9153a4fac1dc6 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Fri, 4 May 2012 22:37:51 +0200 Subject: oggvorbisdec: redesign special handling of first frames timestamp. This also will make it possible to use the code for cases other than the start of a stream Signed-off-by: Michael Niedermayer --- libavformat/oggparsevorbis.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'libavformat') diff --git a/libavformat/oggparsevorbis.c b/libavformat/oggparsevorbis.c index f764e3f5be..57af4a1807 100644 --- a/libavformat/oggparsevorbis.c +++ b/libavformat/oggparsevorbis.c @@ -297,28 +297,33 @@ static int vorbis_packet(AVFormatContext *s, int idx) the total duration to the page granule to find the encoder delay and set the first timestamp */ if (!os->lastpts) { - int seg; + int seg, d; uint8_t *last_pkt = os->buf + os->pstart; uint8_t *next_pkt = last_pkt; - int first_duration = 0; avpriv_vorbis_parse_reset(&priv->vp); duration = 0; - for (seg = 0; seg < os->nsegs; seg++) { + seg = os->segp; + d = avpriv_vorbis_parse_frame(&priv->vp, last_pkt, 1); + if (d < 0) { + os->pflags |= AV_PKT_FLAG_CORRUPT; + return 0; + } + duration += d; + last_pkt = next_pkt = next_pkt + os->psize; + for (; seg < os->nsegs; seg++) { if (os->segments[seg] < 255) { int d = avpriv_vorbis_parse_frame(&priv->vp, last_pkt, 1); if (d < 0) { duration = os->granule; break; } - if (!duration) - first_duration = d; duration += d; last_pkt = next_pkt + os->segments[seg]; } next_pkt += os->segments[seg]; } - os->lastpts = os->lastdts = os->granule - duration + first_duration; + os->lastpts = os->lastdts = os->granule - duration; s->streams[idx]->start_time = os->lastpts; if (s->streams[idx]->duration) s->streams[idx]->duration -= s->streams[idx]->start_time; @@ -329,7 +334,7 @@ static int vorbis_packet(AVFormatContext *s, int idx) /* parse packet duration */ if (os->psize > 0) { duration = avpriv_vorbis_parse_frame(&priv->vp, os->buf + os->pstart, 1); - if (duration <= 0) { + if (duration < 0) { os->pflags |= AV_PKT_FLAG_CORRUPT; return 0; } -- cgit v1.2.3