Merge "Better seek handling and proper reset of the vorbis decoder after a discontinuity (seek)" into froyo
This commit is contained in:
committed by
Android (Google) Code Review
commit
d6ad7c85fa
@@ -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(
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user