Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d6ad7c85 authored by Andreas Huber's avatar Andreas Huber Committed by Android (Google) Code Review
Browse files

Merge "Better seek handling and proper reset of the vorbis decoder after a...

Merge "Better seek handling and proper reset of the vorbis decoder after a discontinuity (seek)" into froyo
parents e2055fe4 34c70709
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -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(
+10 −8
Original line number Diff line number Diff line
@@ -173,18 +173,19 @@ int VorbisDecoder::decodePacket(MediaBuffer *packet, MediaBuffer *out) {
    pack.granulepos = 0;
    pack.packetno = 0;

    int numFrames = 0;

    int err = vorbis_dsp_synthesis(mState, &pack, 1);
    if (err != 0) {
        LOGW("vorbis_dsp_synthesis returned %d", err);
        return 0;
    }

    int numFrames = vorbis_dsp_pcmout(
    } else {
        numFrames = vorbis_dsp_pcmout(
                mState, (int16_t *)out->data(), kMaxNumSamplesPerBuffer);

        if (numFrames < 0) {
            LOGE("vorbis_dsp_pcmout returned %d", numFrames);
        return 0;
            numFrames = 0;
        }
    }

    out->set_range(0, numFrames * sizeof(int16_t) * mNumChannels);
@@ -203,6 +204,7 @@ status_t VorbisDecoder::read(
        CHECK(seekTimeUs >= 0);

        mNumFramesOutput = 0;
        vorbis_dsp_restart(mState);
    } else {
        seekTimeUs = -1;
    }