diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-05-04 22:37:51 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-05-04 23:59:26 +0200 |
commit | 1f95ad48ff158ac3a7419efc98e9153a4fac1dc6 (patch) | |
tree | 913ed8a7ccfa1525a4eb9d0d5faf03f297014fe1 /libavformat | |
parent | 9f357e2bcdea20d16c7771eff183414e375d0c7a (diff) | |
download | ffmpeg-1f95ad48ff158ac3a7419efc98e9153a4fac1dc6.tar.gz |
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 <michaelni@gmx.at>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/oggparsevorbis.c | 19 |
1 files changed, 12 insertions, 7 deletions
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; } |