Loading media/libstagefright/codecs/vorbis/dec/SoftVorbis.cpp +100 −67 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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"); Loading @@ -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); Loading Loading @@ -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; } Loading @@ -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) { Loading Loading @@ -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 Loading Loading @@ -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; } } Loading media/libstagefright/codecs/vorbis/dec/SoftVorbis.h +1 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ private: void initPorts(); status_t initDecoder(); bool isConfigured() const; void handleEOS(); DISALLOW_EVIL_CONSTRUCTORS(SoftVorbis); }; Loading Loading
media/libstagefright/codecs/vorbis/dec/SoftVorbis.cpp +100 −67 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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"); Loading @@ -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); Loading Loading @@ -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; } Loading @@ -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) { Loading Loading @@ -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 Loading Loading @@ -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; } } Loading
media/libstagefright/codecs/vorbis/dec/SoftVorbis.h +1 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ private: void initPorts(); status_t initDecoder(); bool isConfigured() const; void handleEOS(); DISALLOW_EVIL_CONSTRUCTORS(SoftVorbis); }; Loading