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

Commit a9605efa authored by Andreas Huber's avatar Andreas Huber
Browse files

Add "support" for AMR WB comfort noise, no data and speech lost frame types

by emitting silence.

Change-Id: I27b7f31051f0c9a14adde866305bbc91a827a00c
related-to-bug: 6478154
parent 5c36fc87
Loading
Loading
Loading
Loading
+42 −21
Original line number Diff line number Diff line
@@ -258,10 +258,14 @@ bool SoftAMR::isConfigured() const {
}

static size_t getFrameSize(unsigned FT) {
    static const size_t kFrameSizeWB[9] = {
        132, 177, 253, 285, 317, 365, 397, 461, 477
    static const size_t kFrameSizeWB[10] = {
        132, 177, 253, 285, 317, 365, 397, 461, 477, 40
    };

    if (FT >= 10) {
        return 1;
    }

    size_t frameSize = kFrameSizeWB[FT];

    // Round up bits to bytes and add 1 for the header byte.
@@ -336,9 +340,27 @@ void SoftAMR::onQueueFilled(OMX_U32 portIndex) {
            }
        } else {
            int16 mode = ((inputPtr[0] >> 3) & 0x0f);

            if (mode >= 10 && mode <= 13) {
                ALOGE("encountered illegal frame type %d in AMR WB content.",
                      mode);

                notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
                mSignalledError = true;

                return;
            }

            size_t frameSize = getFrameSize(mode);
            CHECK_GE(inHeader->nFilledLen, frameSize);

            int16_t *outPtr = (int16_t *)outHeader->pBuffer;

            if (mode >= 9) {
                // Produce silence instead of comfort noise and for
                // speech lost/no data.
                memset(outPtr, 0, kNumSamplesPerFrameWB * sizeof(int16_t));
            } else if (mode < 9) {
                int16 frameType;
                RX_State_wb rx_state;
                mime_unsorting(
@@ -346,8 +368,6 @@ void SoftAMR::onQueueFilled(OMX_U32 portIndex) {
                        mInputSampleBuffer,
                        &frameType, &mode, 1, &rx_state);

            int16_t *outPtr = (int16_t *)outHeader->pBuffer;

                int16_t numSamplesOutput;
                pvDecoder_AmrWb(
                        mode, mInputSampleBuffer,
@@ -361,6 +381,7 @@ void SoftAMR::onQueueFilled(OMX_U32 portIndex) {
                    /* Delete the 2 LSBs (14-bit output) */
                    outPtr[i] &= 0xfffC;
                }
            }

            numBytesRead = frameSize;
        }