Merge "Better seek handling and proper reset of the vorbis decoder after a discontinuity (seek)" into froyo

This commit is contained in:
Andreas Huber
2010-05-11 12:20:55 -07:00
committed by Android (Google) Code Review
2 changed files with 22 additions and 9 deletions

View File

@@ -94,6 +94,8 @@ private:
size_t mCurrentPageSize; size_t mCurrentPageSize;
size_t mNextLaceIndex; size_t mNextLaceIndex;
off_t mFirstDataOffset;
vorbis_info mVi; vorbis_info mVi;
vorbis_comment mVc; vorbis_comment mVc;
@@ -183,7 +185,8 @@ MyVorbisExtractor::MyVorbisExtractor(const sp<DataSource> &source)
: mSource(source), : mSource(source),
mOffset(0), mOffset(0),
mCurrentPageSize(0), mCurrentPageSize(0),
mNextLaceIndex(0) { mNextLaceIndex(0),
mFirstDataOffset(-1) {
mCurrentPage.mNumSegments = 0; mCurrentPage.mNumSegments = 0;
} }
@@ -222,6 +225,12 @@ status_t MyVorbisExtractor::findNextPage(
} }
status_t MyVorbisExtractor::seekToOffset(off_t offset) { 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; off_t pageOffset;
status_t err = findNextPage(offset, &pageOffset); status_t err = findNextPage(offset, &pageOffset);
@@ -438,6 +447,8 @@ void MyVorbisExtractor::init() {
verifyHeader(packet, 5); verifyHeader(packet, 5);
packet->release(); packet->release();
packet = NULL; packet = NULL;
mFirstDataOffset = mOffset + mCurrentPageSize;
} }
void MyVorbisExtractor::verifyHeader( void MyVorbisExtractor::verifyHeader(

View File

@@ -173,18 +173,19 @@ int VorbisDecoder::decodePacket(MediaBuffer *packet, MediaBuffer *out) {
pack.granulepos = 0; pack.granulepos = 0;
pack.packetno = 0; pack.packetno = 0;
int numFrames = 0;
int err = vorbis_dsp_synthesis(mState, &pack, 1); int err = vorbis_dsp_synthesis(mState, &pack, 1);
if (err != 0) { if (err != 0) {
LOGW("vorbis_dsp_synthesis returned %d", err); LOGW("vorbis_dsp_synthesis returned %d", err);
return 0; } else {
} numFrames = vorbis_dsp_pcmout(
mState, (int16_t *)out->data(), kMaxNumSamplesPerBuffer);
int numFrames = vorbis_dsp_pcmout( if (numFrames < 0) {
mState, (int16_t *)out->data(), kMaxNumSamplesPerBuffer); LOGE("vorbis_dsp_pcmout returned %d", numFrames);
numFrames = 0;
if (numFrames < 0) { }
LOGE("vorbis_dsp_pcmout returned %d", numFrames);
return 0;
} }
out->set_range(0, numFrames * sizeof(int16_t) * mNumChannels); out->set_range(0, numFrames * sizeof(int16_t) * mNumChannels);
@@ -203,6 +204,7 @@ status_t VorbisDecoder::read(
CHECK(seekTimeUs >= 0); CHECK(seekTimeUs >= 0);
mNumFramesOutput = 0; mNumFramesOutput = 0;
vorbis_dsp_restart(mState);
} else { } else {
seekTimeUs = -1; seekTimeUs = -1;
} }