summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/OggExtractor.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-05-11 10:11:55 -0700
committerAndreas Huber <andih@google.com>2010-05-11 10:11:55 -0700
commit96f52cde23982f668592418a9548045237d5e327 (patch)
treea5502e0e6b6ca85dab03308a117324261a9caa00 /media/libstagefright/OggExtractor.cpp
parentadbda96f6a05507788bb4163d7fbe8a95948f0a5 (diff)
downloadframeworks_av-96f52cde23982f668592418a9548045237d5e327.zip
frameworks_av-96f52cde23982f668592418a9548045237d5e327.tar.gz
frameworks_av-96f52cde23982f668592418a9548045237d5e327.tar.bz2
Better seek handling and proper reset of the vorbis decoder after a discontinuity (seek)
Change-Id: I3c76d35da48e0964f7a0fa2816f8573b5e1a9436 related-to-bug: 2674036 QA-impact: low, only affects ogg-vorbis playback through http
Diffstat (limited to 'media/libstagefright/OggExtractor.cpp')
-rw-r--r--media/libstagefright/OggExtractor.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/media/libstagefright/OggExtractor.cpp b/media/libstagefright/OggExtractor.cpp
index 699b955..d0d1b14 100644
--- a/media/libstagefright/OggExtractor.cpp
+++ b/media/libstagefright/OggExtractor.cpp
@@ -94,6 +94,8 @@ private:
size_t mCurrentPageSize;
size_t mNextLaceIndex;
+ off_t mFirstDataOffset;
+
vorbis_info mVi;
vorbis_comment mVc;
@@ -183,7 +185,8 @@ MyVorbisExtractor::MyVorbisExtractor(const sp<DataSource> &source)
: mSource(source),
mOffset(0),
mCurrentPageSize(0),
- mNextLaceIndex(0) {
+ mNextLaceIndex(0),
+ mFirstDataOffset(-1) {
mCurrentPage.mNumSegments = 0;
}
@@ -222,6 +225,12 @@ status_t MyVorbisExtractor::findNextPage(
}
status_t MyVorbisExtractor::seekToOffset(off_t offset) {
+ if (mFirstDataOffset >= 0 && offset < mFirstDataOffset) {
+ // Once we know where the actual audio data starts (past the headers)
+ // don't ever seek to anywhere before that.
+ offset = mFirstDataOffset;
+ }
+
off_t pageOffset;
status_t err = findNextPage(offset, &pageOffset);
@@ -438,6 +447,8 @@ void MyVorbisExtractor::init() {
verifyHeader(packet, 5);
packet->release();
packet = NULL;
+
+ mFirstDataOffset = mOffset + mCurrentPageSize;
}
void MyVorbisExtractor::verifyHeader(