Loading media/libstagefright/codecs/amrnb/dec/SoftAMR.cpp +42 −21 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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( Loading @@ -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, Loading @@ -361,6 +381,7 @@ void SoftAMR::onQueueFilled(OMX_U32 portIndex) { /* Delete the 2 LSBs (14-bit output) */ outPtr[i] &= 0xfffC; } } numBytesRead = frameSize; } Loading Loading
media/libstagefright/codecs/amrnb/dec/SoftAMR.cpp +42 −21 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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( Loading @@ -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, Loading @@ -361,6 +381,7 @@ void SoftAMR::onQueueFilled(OMX_U32 portIndex) { /* Delete the 2 LSBs (14-bit output) */ outPtr[i] &= 0xfffC; } } numBytesRead = frameSize; } Loading