Loading media/codec2/components/opus/C2SoftOpusEnc.cpp +8 −7 Original line number Original line Diff line number Diff line Loading @@ -29,7 +29,6 @@ extern "C" { #include <opus_multistream.h> #include <opus_multistream.h> } } #define DEFAULT_FRAME_DURATION_MS 20 namespace android { namespace android { namespace { namespace { Loading @@ -38,7 +37,6 @@ constexpr char COMPONENT_NAME[] = "c2.android.opus.encoder"; } // namespace } // namespace static const int kMaxNumChannelsSupported = 2; class C2SoftOpusEnc::IntfImpl : public SimpleInterface<void>::BaseParams { class C2SoftOpusEnc::IntfImpl : public SimpleInterface<void>::BaseParams { public: public: Loading Loading @@ -248,10 +246,11 @@ c2_status_t C2SoftOpusEnc::initEncoder() { mAnchorTimeStamp = 0; mAnchorTimeStamp = 0; mProcessedSamples = 0; mProcessedSamples = 0; mFilledLen = 0; mFilledLen = 0; mFrameDurationMs = DEFAULT_FRAME_DURATION_MS; mFrameDurationMs = kDefaultFrameDurationMs; if (!mInputBufferPcm16) { if (!mInputBufferPcm16) { size_t frameSize = (mFrameDurationMs * kMaxSampleRateSupported) / 1000; mInputBufferPcm16 = mInputBufferPcm16 = (int16_t*)malloc(kFrameSize * kMaxNumChannels * sizeof(int16_t)); (int16_t*)malloc(frameSize * kMaxNumChannelsSupported * sizeof(int16_t)); } } if (!mInputBufferPcm16) return C2_NO_MEMORY; if (!mInputBufferPcm16) return C2_NO_MEMORY; Loading Loading @@ -368,7 +367,9 @@ void C2SoftOpusEnc::process(const std::unique_ptr<C2Work>& work, } } C2MemoryUsage usage = {C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE}; C2MemoryUsage usage = {C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE}; err = pool->fetchLinearBlock(kMaxPayload, usage, &mOutputBlock); int outCapacity = kMaxPayload * ((inSize + mNumPcmBytesPerInputFrame) / mNumPcmBytesPerInputFrame); err = pool->fetchLinearBlock(outCapacity, usage, &mOutputBlock); if (err != C2_OK) { if (err != C2_OK) { ALOGE("fetchLinearBlock for Output failed with status %d", err); ALOGE("fetchLinearBlock for Output failed with status %d", err); work->result = C2_NO_MEMORY; work->result = C2_NO_MEMORY; Loading Loading @@ -497,11 +498,11 @@ void C2SoftOpusEnc::process(const std::unique_ptr<C2Work>& work, uint8_t* outPtr = wView.data() + mBytesEncoded; uint8_t* outPtr = wView.data() + mBytesEncoded; int encodedBytes = int encodedBytes = opus_multistream_encode(mEncoder, mInputBufferPcm16, opus_multistream_encode(mEncoder, mInputBufferPcm16, mNumSamplesPerFrame, outPtr, kMaxPayload - mBytesEncoded); mNumSamplesPerFrame, outPtr, outCapacity - mBytesEncoded); ALOGV("encoded %i Opus bytes from %zu PCM bytes", encodedBytes, ALOGV("encoded %i Opus bytes from %zu PCM bytes", encodedBytes, processSize); processSize); if (encodedBytes < 0 || encodedBytes > (kMaxPayload - mBytesEncoded)) { if (encodedBytes < 0 || encodedBytes > (outCapacity - mBytesEncoded)) { ALOGE("opus_encode failed, encodedBytes : %d", encodedBytes); ALOGE("opus_encode failed, encodedBytes : %d", encodedBytes); mSignalledError = true; mSignalledError = true; work->result = C2_CORRUPTED; work->result = C2_CORRUPTED; Loading media/codec2/components/opus/C2SoftOpusEnc.h +7 −6 Original line number Original line Diff line number Diff line Loading @@ -45,12 +45,13 @@ struct C2SoftOpusEnc : public SimpleC2Component { uint32_t drainMode, uint32_t drainMode, const std::shared_ptr<C2BlockPool> &pool) override; const std::shared_ptr<C2BlockPool> &pool) override; private: private: /* OPUS_FRAMESIZE_20_MS */ static const int kMaxNumChannelsSupported = 2; const int kFrameSize = 960; static const int kMaxSampleRateSupported = 48000; const int kMaxSampleRate = 48000; static const int kDefaultFrameDurationMs = 20; const int kMinSampleRate = 8000; // For a frame duration of 20ms, payload recommended size is 1276 as per const int kMaxPayload = (4000 * kMaxSampleRate) / kMinSampleRate; // https://www.opus-codec.org/docs/html_api/group__opusencoder.html. const int kMaxNumChannels = 8; // For 40ms, 60ms, .. payload size will change proportionately, 1276 x 2, 1276 x 3, .. static const int kMaxPayload = 1500; // from tests/test_opus_encode.c std::shared_ptr<IntfImpl> mIntf; std::shared_ptr<IntfImpl> mIntf; std::shared_ptr<C2LinearBlock> mOutputBlock; std::shared_ptr<C2LinearBlock> mOutputBlock; Loading Loading
media/codec2/components/opus/C2SoftOpusEnc.cpp +8 −7 Original line number Original line Diff line number Diff line Loading @@ -29,7 +29,6 @@ extern "C" { #include <opus_multistream.h> #include <opus_multistream.h> } } #define DEFAULT_FRAME_DURATION_MS 20 namespace android { namespace android { namespace { namespace { Loading @@ -38,7 +37,6 @@ constexpr char COMPONENT_NAME[] = "c2.android.opus.encoder"; } // namespace } // namespace static const int kMaxNumChannelsSupported = 2; class C2SoftOpusEnc::IntfImpl : public SimpleInterface<void>::BaseParams { class C2SoftOpusEnc::IntfImpl : public SimpleInterface<void>::BaseParams { public: public: Loading Loading @@ -248,10 +246,11 @@ c2_status_t C2SoftOpusEnc::initEncoder() { mAnchorTimeStamp = 0; mAnchorTimeStamp = 0; mProcessedSamples = 0; mProcessedSamples = 0; mFilledLen = 0; mFilledLen = 0; mFrameDurationMs = DEFAULT_FRAME_DURATION_MS; mFrameDurationMs = kDefaultFrameDurationMs; if (!mInputBufferPcm16) { if (!mInputBufferPcm16) { size_t frameSize = (mFrameDurationMs * kMaxSampleRateSupported) / 1000; mInputBufferPcm16 = mInputBufferPcm16 = (int16_t*)malloc(kFrameSize * kMaxNumChannels * sizeof(int16_t)); (int16_t*)malloc(frameSize * kMaxNumChannelsSupported * sizeof(int16_t)); } } if (!mInputBufferPcm16) return C2_NO_MEMORY; if (!mInputBufferPcm16) return C2_NO_MEMORY; Loading Loading @@ -368,7 +367,9 @@ void C2SoftOpusEnc::process(const std::unique_ptr<C2Work>& work, } } C2MemoryUsage usage = {C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE}; C2MemoryUsage usage = {C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE}; err = pool->fetchLinearBlock(kMaxPayload, usage, &mOutputBlock); int outCapacity = kMaxPayload * ((inSize + mNumPcmBytesPerInputFrame) / mNumPcmBytesPerInputFrame); err = pool->fetchLinearBlock(outCapacity, usage, &mOutputBlock); if (err != C2_OK) { if (err != C2_OK) { ALOGE("fetchLinearBlock for Output failed with status %d", err); ALOGE("fetchLinearBlock for Output failed with status %d", err); work->result = C2_NO_MEMORY; work->result = C2_NO_MEMORY; Loading Loading @@ -497,11 +498,11 @@ void C2SoftOpusEnc::process(const std::unique_ptr<C2Work>& work, uint8_t* outPtr = wView.data() + mBytesEncoded; uint8_t* outPtr = wView.data() + mBytesEncoded; int encodedBytes = int encodedBytes = opus_multistream_encode(mEncoder, mInputBufferPcm16, opus_multistream_encode(mEncoder, mInputBufferPcm16, mNumSamplesPerFrame, outPtr, kMaxPayload - mBytesEncoded); mNumSamplesPerFrame, outPtr, outCapacity - mBytesEncoded); ALOGV("encoded %i Opus bytes from %zu PCM bytes", encodedBytes, ALOGV("encoded %i Opus bytes from %zu PCM bytes", encodedBytes, processSize); processSize); if (encodedBytes < 0 || encodedBytes > (kMaxPayload - mBytesEncoded)) { if (encodedBytes < 0 || encodedBytes > (outCapacity - mBytesEncoded)) { ALOGE("opus_encode failed, encodedBytes : %d", encodedBytes); ALOGE("opus_encode failed, encodedBytes : %d", encodedBytes); mSignalledError = true; mSignalledError = true; work->result = C2_CORRUPTED; work->result = C2_CORRUPTED; Loading
media/codec2/components/opus/C2SoftOpusEnc.h +7 −6 Original line number Original line Diff line number Diff line Loading @@ -45,12 +45,13 @@ struct C2SoftOpusEnc : public SimpleC2Component { uint32_t drainMode, uint32_t drainMode, const std::shared_ptr<C2BlockPool> &pool) override; const std::shared_ptr<C2BlockPool> &pool) override; private: private: /* OPUS_FRAMESIZE_20_MS */ static const int kMaxNumChannelsSupported = 2; const int kFrameSize = 960; static const int kMaxSampleRateSupported = 48000; const int kMaxSampleRate = 48000; static const int kDefaultFrameDurationMs = 20; const int kMinSampleRate = 8000; // For a frame duration of 20ms, payload recommended size is 1276 as per const int kMaxPayload = (4000 * kMaxSampleRate) / kMinSampleRate; // https://www.opus-codec.org/docs/html_api/group__opusencoder.html. const int kMaxNumChannels = 8; // For 40ms, 60ms, .. payload size will change proportionately, 1276 x 2, 1276 x 3, .. static const int kMaxPayload = 1500; // from tests/test_opus_encode.c std::shared_ptr<IntfImpl> mIntf; std::shared_ptr<IntfImpl> mIntf; std::shared_ptr<C2LinearBlock> mOutputBlock; std::shared_ptr<C2LinearBlock> mOutputBlock; Loading