Loading media/libstagefright/codecs/opus/dec/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ cc_library_shared { "liblog", ], cflags: ["-Werror"], sanitize: { misc_undefined: [ "signed-integer-overflow", Loading media/libstagefright/codecs/opus/dec/SoftOpus.cpp +115 −87 Original line number Diff line number Diff line Loading @@ -62,6 +62,7 @@ SoftOpus::SoftOpus( mSeekPreRoll(0), mAnchorTimeUs(0), mNumFramesOutput(0), mHaveEOS(false), mOutputPortSettingsChange(NONE) { initPorts(); CHECK_EQ(initDecoder(), (status_t)OK); Loading Loading @@ -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); Loading @@ -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); Loading Loading @@ -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; } Loading Loading @@ -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) / Loading @@ -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; } } Loading @@ -575,6 +601,7 @@ void SoftOpus::onPortFlushCompleted(OMX_U32 portIndex) { opus_multistream_decoder_ctl(mDecoder, OPUS_RESET_STATE); mAnchorTimeUs = 0; mSamplesToDiscard = mSeekPreRoll; mHaveEOS = false; } } Loading @@ -591,6 +618,7 @@ void SoftOpus::onReset() { } mOutputPortSettingsChange = NONE; mHaveEOS = false; } void SoftOpus::onPortEnableCompleted(OMX_U32 portIndex, bool enabled) { Loading media/libstagefright/codecs/opus/dec/SoftOpus.h +2 −0 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ private: int64_t mSamplesToDiscard; int64_t mAnchorTimeUs; int64_t mNumFramesOutput; bool mHaveEOS; enum { NONE, Loading @@ -85,6 +86,7 @@ private: void initPorts(); status_t initDecoder(); bool isConfigured() const; void handleEOS(); DISALLOW_EVIL_CONSTRUCTORS(SoftOpus); }; Loading Loading
media/libstagefright/codecs/opus/dec/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ cc_library_shared { "liblog", ], cflags: ["-Werror"], sanitize: { misc_undefined: [ "signed-integer-overflow", Loading
media/libstagefright/codecs/opus/dec/SoftOpus.cpp +115 −87 Original line number Diff line number Diff line Loading @@ -62,6 +62,7 @@ SoftOpus::SoftOpus( mSeekPreRoll(0), mAnchorTimeUs(0), mNumFramesOutput(0), mHaveEOS(false), mOutputPortSettingsChange(NONE) { initPorts(); CHECK_EQ(initDecoder(), (status_t)OK); Loading Loading @@ -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); Loading @@ -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); Loading Loading @@ -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; } Loading Loading @@ -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) / Loading @@ -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; } } Loading @@ -575,6 +601,7 @@ void SoftOpus::onPortFlushCompleted(OMX_U32 portIndex) { opus_multistream_decoder_ctl(mDecoder, OPUS_RESET_STATE); mAnchorTimeUs = 0; mSamplesToDiscard = mSeekPreRoll; mHaveEOS = false; } } Loading @@ -591,6 +618,7 @@ void SoftOpus::onReset() { } mOutputPortSettingsChange = NONE; mHaveEOS = false; } void SoftOpus::onPortEnableCompleted(OMX_U32 portIndex, bool enabled) { Loading
media/libstagefright/codecs/opus/dec/SoftOpus.h +2 −0 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ private: int64_t mSamplesToDiscard; int64_t mAnchorTimeUs; int64_t mNumFramesOutput; bool mHaveEOS; enum { NONE, Loading @@ -85,6 +86,7 @@ private: void initPorts(); status_t initDecoder(); bool isConfigured() const; void handleEOS(); DISALLOW_EVIL_CONSTRUCTORS(SoftOpus); }; Loading