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

Commit f4e503bd authored by Wei Jia's avatar Wei Jia
Browse files

SoftVorbis: fix handling of EOS coming with CSD

Test: pass EOSTest_M in VtsHalMediaOmxV1_0TargetAudioDecTest
Bug: 62498353
Change-Id: Ia6437f266d152ac838fc958f5725b3c07fb4f65a
parent 2eddd660
Loading
Loading
Loading
Loading
+100 −67
Original line number Diff line number Diff line
@@ -309,7 +309,33 @@ static void makeBitReader(
    oggpack_readinit(bits, ref);
}

void SoftVorbis::onQueueFilled(OMX_U32 portIndex) {
void SoftVorbis::handleEOS() {
    List<BufferInfo *> &inQueue = getPortQueue(0);
    List<BufferInfo *> &outQueue = getPortQueue(1);

    CHECK(!inQueue.empty() && !outQueue.empty());

    mSawInputEos = true;

    BufferInfo *outInfo = *outQueue.begin();
    OMX_BUFFERHEADERTYPE *outHeader = outInfo->mHeader;
    outHeader->nFilledLen = 0;
    outHeader->nFlags = OMX_BUFFERFLAG_EOS;

    outQueue.erase(outQueue.begin());
    outInfo->mOwnedByUs = false;
    notifyFillBufferDone(outHeader);
    mSignalledOutputEos = true;

    BufferInfo *inInfo = *inQueue.begin();
    OMX_BUFFERHEADERTYPE *inHeader = inInfo->mHeader;
    inQueue.erase(inQueue.begin());
    inInfo->mOwnedByUs = false;
    notifyEmptyBufferDone(inHeader);
    ++mInputBufferCount;
}

void SoftVorbis::onQueueFilled(OMX_U32 /* portIndex */) {
    List<BufferInfo *> &inQueue = getPortQueue(0);
    List<BufferInfo *> &outQueue = getPortQueue(1);

@@ -317,12 +343,29 @@ void SoftVorbis::onQueueFilled(OMX_U32 portIndex) {
        return;
    }

    if (portIndex == 0 && mInputBufferCount < 2) {
        BufferInfo *info = *inQueue.begin();
        OMX_BUFFERHEADERTYPE *header = info->mHeader;
    while (!mSignalledOutputEos && (!inQueue.empty() || mSawInputEos) && !outQueue.empty()) {
        BufferInfo *inInfo = NULL;
        OMX_BUFFERHEADERTYPE *inHeader = NULL;
        if (!inQueue.empty()) {
            inInfo = *inQueue.begin();
            inHeader = inInfo->mHeader;
        }

        BufferInfo *outInfo = *outQueue.begin();
        OMX_BUFFERHEADERTYPE *outHeader = outInfo->mHeader;

        int32_t numPageSamples = 0;

        if (inHeader) {
            if (mInputBufferCount < 2) {
                const uint8_t *data = inHeader->pBuffer + inHeader->nOffset;
                size_t size = inHeader->nFilledLen;

                if ((inHeader->nFlags & OMX_BUFFERFLAG_EOS) && size == 0) {
                    handleEOS();
                    return;
                }

        const uint8_t *data = header->pBuffer + header->nOffset;
        size_t size = header->nFilledLen;
                if (size < 7) {
                    ALOGE("Too small input buffer: %zu bytes", size);
                    android_errorWriteLog(0x534e4554, "27833616");
@@ -335,9 +378,7 @@ void SoftVorbis::onQueueFilled(OMX_U32 portIndex) {
                ogg_reference ref;
                oggpack_buffer bits;

        makeBitReader(
                (const uint8_t *)data + 7, size - 7,
                &buf, &ref, &bits);
                makeBitReader((const uint8_t *)data + 7, size - 7, &buf, &ref, &bits);

                if (mInputBufferCount == 0) {
                    CHECK(mVi == NULL);
@@ -370,29 +411,19 @@ void SoftVorbis::onQueueFilled(OMX_U32 portIndex) {
                    }
                }

        inQueue.erase(inQueue.begin());
        info->mOwnedByUs = false;
        notifyEmptyBufferDone(header);

        ++mInputBufferCount;

                if (inHeader->nFlags & OMX_BUFFERFLAG_EOS) {
                    handleEOS();
                    return;
                }

    while ((!inQueue.empty() || (mSawInputEos && !mSignalledOutputEos)) && !outQueue.empty()) {
        BufferInfo *inInfo = NULL;
        OMX_BUFFERHEADERTYPE *inHeader = NULL;
        if (!inQueue.empty()) {
            inInfo = *inQueue.begin();
            inHeader = inInfo->mHeader;
        }

        BufferInfo *outInfo = *outQueue.begin();
        OMX_BUFFERHEADERTYPE *outHeader = outInfo->mHeader;
                inQueue.erase(inQueue.begin());
                inInfo->mOwnedByUs = false;
                notifyEmptyBufferDone(inHeader);
                ++mInputBufferCount;

        int32_t numPageSamples = 0;
                continue;
            }

        if (inHeader) {
            if (inHeader->nFlags & OMX_BUFFERFLAG_EOS) {
                mSawInputEos = true;
            }
@@ -406,8 +437,7 @@ void SoftVorbis::onQueueFilled(OMX_U32 portIndex) {
                    return;
                }
                memcpy(&numPageSamples,
                       inHeader->pBuffer
                        + inHeader->nOffset + inHeader->nFilledLen - 4,
                       inHeader->pBuffer + inHeader->nOffset + inHeader->nFilledLen - 4,
                       sizeof(numPageSamples));

                if (inHeader->nOffset == 0) {
@@ -446,6 +476,14 @@ void SoftVorbis::onQueueFilled(OMX_U32 portIndex) {
        int numFrames = 0;

        outHeader->nFlags = 0;

        if (mState == nullptr || mVi == nullptr) {
            notify(OMX_EventError, OMX_ErrorStreamCorrupt, 0, NULL);
            mSignalledError = true;
            ALOGE("onQueueFilled, input does not have CSD");
            return;
        }

        int err = vorbis_dsp_synthesis(mState, &pack, 1);
        if (err != 0) {
            // FIXME temporary workaround for log spam
@@ -495,18 +533,13 @@ void SoftVorbis::onQueueFilled(OMX_U32 portIndex) {
        if (inHeader) {
            inInfo->mOwnedByUs = false;
            inQueue.erase(inQueue.begin());
            inInfo = NULL;
            notifyEmptyBufferDone(inHeader);
            inHeader = NULL;
            ++mInputBufferCount;
        }

        outInfo->mOwnedByUs = false;
        outQueue.erase(outQueue.begin());
        outInfo = NULL;
        notifyFillBufferDone(outHeader);
        outHeader = NULL;

        ++mInputBufferCount;
    }
}

+1 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ private:
    void initPorts();
    status_t initDecoder();
    bool isConfigured() const;
    void handleEOS();

    DISALLOW_EVIL_CONSTRUCTORS(SoftVorbis);
};