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

Commit 00bbd4fa authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "SoftOpus: fix handling of EOS coming with CSD" into oc-mr1-dev

parents c3cee64d a8ca1d16
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ cc_library_shared {
        "liblog",
    ],

    cflags: ["-Werror"],

    sanitize: {
        misc_undefined: [
            "signed-integer-overflow",
+115 −87
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ SoftOpus::SoftOpus(
      mSeekPreRoll(0),
      mAnchorTimeUs(0),
      mNumFramesOutput(0),
      mHaveEOS(false),
      mOutputPortSettingsChange(NONE) {
    initPorts();
    CHECK_EQ(initDecoder(), (status_t)OK);
@@ -384,7 +385,31 @@ static uint64_t ns_to_samples(uint64_t ns, int kRate) {
    return static_cast<double>(ns) * kRate / 1000000000;
}

void SoftOpus::onQueueFilled(OMX_U32 portIndex) {
void SoftOpus::handleEOS() {
    List<BufferInfo *> &inQueue = getPortQueue(0);
    List<BufferInfo *> &outQueue = getPortQueue(1);
    CHECK(!inQueue.empty() && !outQueue.empty());

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

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

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

    ++mInputBufferCount;
}

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

@@ -392,12 +417,18 @@ void SoftOpus::onQueueFilled(OMX_U32 portIndex) {
        return;
    }

    if (portIndex == 0 && mInputBufferCount < 3) {
        BufferInfo *info = *inQueue.begin();
        OMX_BUFFERHEADERTYPE *header = info->mHeader;
    while (!mHaveEOS && !inQueue.empty() && !outQueue.empty()) {
        BufferInfo *inInfo = *inQueue.begin();
        OMX_BUFFERHEADERTYPE *inHeader = inInfo->mHeader;

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

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

            if (mInputBufferCount == 0) {
                CHECK(mHeader == NULL);
@@ -444,52 +475,50 @@ void SoftOpus::onQueueFilled(OMX_U32 portIndex) {
                }
            } else if (mInputBufferCount == 1) {
                mCodecDelay = ns_to_samples(
                              *(reinterpret_cast<int64_t*>(header->pBuffer +
                                                           header->nOffset)),
                                  *(reinterpret_cast<int64_t*>(inHeader->pBuffer +
                                                               inHeader->nOffset)),
                                  kRate);
                mSamplesToDiscard = mCodecDelay;
            } else {
                mSeekPreRoll = ns_to_samples(
                               *(reinterpret_cast<int64_t*>(header->pBuffer +
                                                            header->nOffset)),
                                   *(reinterpret_cast<int64_t*>(inHeader->pBuffer +
                                                                inHeader->nOffset)),
                                   kRate);
                notify(OMX_EventPortSettingsChanged, 1, 0, NULL);
                mOutputPortSettingsChange = AWAITING_DISABLED;
            }

        inQueue.erase(inQueue.begin());
        info->mOwnedByUs = false;
        notifyEmptyBufferDone(header);
        ++mInputBufferCount;
            if (inHeader->nFlags & OMX_BUFFERFLAG_EOS) {
                handleEOS();
                return;
            }

    while (!inQueue.empty() && !outQueue.empty()) {
        BufferInfo *inInfo = *inQueue.begin();
        OMX_BUFFERHEADERTYPE *inHeader = inInfo->mHeader;

        // Ignore CSD re-submissions.
        if (inHeader->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
            inQueue.erase(inQueue.begin());
            inInfo->mOwnedByUs = false;
            notifyEmptyBufferDone(inHeader);
            return;
            ++mInputBufferCount;

            continue;
        }

        BufferInfo *outInfo = *outQueue.begin();
        OMX_BUFFERHEADERTYPE *outHeader = outInfo->mHeader;
        // Ignore CSD re-submissions.
        if (mInputBufferCount >= 3 && (inHeader->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
            if (inHeader->nFlags & OMX_BUFFERFLAG_EOS) {
                handleEOS();
                return;
            }

        if ((inHeader->nFlags & OMX_BUFFERFLAG_EOS) && inHeader->nFilledLen == 0) {
            inQueue.erase(inQueue.begin());
            inInfo->mOwnedByUs = false;
            notifyEmptyBufferDone(inHeader);
            continue;
        }

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

            outQueue.erase(outQueue.begin());
            outInfo->mOwnedByUs = false;
            notifyFillBufferDone(outHeader);
        if ((inHeader->nFlags & OMX_BUFFERFLAG_EOS) && inHeader->nFilledLen == 0) {
            handleEOS();
            return;
        }

@@ -539,7 +568,6 @@ void SoftOpus::onQueueFilled(OMX_U32 portIndex) {
        }

        outHeader->nFilledLen = numFrames * sizeof(int16_t) * mHeader->channels;
        outHeader->nFlags = 0;

        outHeader->nTimeStamp = mAnchorTimeUs +
                                (mNumFramesOutput * 1000000ll) /
@@ -548,22 +576,20 @@ void SoftOpus::onQueueFilled(OMX_U32 portIndex) {
        mNumFramesOutput += numFrames;

        if (inHeader->nFlags & OMX_BUFFERFLAG_EOS) {
            inHeader->nFilledLen = 0;
            outHeader->nFlags = OMX_BUFFERFLAG_EOS;
            mHaveEOS = true;
        } else {
            outHeader->nFlags = 0;
        }

        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;
    }
}

@@ -575,6 +601,7 @@ void SoftOpus::onPortFlushCompleted(OMX_U32 portIndex) {
        opus_multistream_decoder_ctl(mDecoder, OPUS_RESET_STATE);
        mAnchorTimeUs = 0;
        mSamplesToDiscard = mSeekPreRoll;
        mHaveEOS = false;
    }
}

@@ -591,6 +618,7 @@ void SoftOpus::onReset() {
    }

    mOutputPortSettingsChange = NONE;
    mHaveEOS = false;
}

void SoftOpus::onPortEnableCompleted(OMX_U32 portIndex, bool enabled) {
+2 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ private:
    int64_t mSamplesToDiscard;
    int64_t mAnchorTimeUs;
    int64_t mNumFramesOutput;
    bool mHaveEOS;

    enum {
        NONE,
@@ -85,6 +86,7 @@ private:
    void initPorts();
    status_t initDecoder();
    bool isConfigured() const;
    void handleEOS();

    DISALLOW_EVIL_CONSTRUCTORS(SoftOpus);
};