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

Commit 7c6b0010 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "C2SoftOpusEnc: CleanUp output allocations for opus encoder" into main am: 005302b9

parents 8ef2ca70 005302b9
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ extern "C" {
    #include <opus_multistream.h>
}

#define DEFAULT_FRAME_DURATION_MS 20
namespace android {

namespace {
@@ -38,7 +37,6 @@ constexpr char COMPONENT_NAME[] = "c2.android.opus.encoder";

}  // namespace

static const int kMaxNumChannelsSupported = 2;

class C2SoftOpusEnc::IntfImpl : public SimpleInterface<void>::BaseParams {
public:
@@ -248,10 +246,11 @@ c2_status_t C2SoftOpusEnc::initEncoder() {
    mAnchorTimeStamp = 0;
    mProcessedSamples = 0;
    mFilledLen = 0;
    mFrameDurationMs = DEFAULT_FRAME_DURATION_MS;
    mFrameDurationMs = kDefaultFrameDurationMs;
    if (!mInputBufferPcm16) {
        size_t frameSize = (mFrameDurationMs * kMaxSampleRateSupported) / 1000;
        mInputBufferPcm16 =
            (int16_t*)malloc(kFrameSize * kMaxNumChannels * sizeof(int16_t));
            (int16_t*)malloc(frameSize * kMaxNumChannelsSupported * sizeof(int16_t));
    }
    if (!mInputBufferPcm16) return C2_NO_MEMORY;

@@ -368,7 +367,9 @@ void C2SoftOpusEnc::process(const std::unique_ptr<C2Work>& work,
    }

    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) {
        ALOGE("fetchLinearBlock for Output failed with status %d", err);
        work->result = C2_NO_MEMORY;
@@ -497,11 +498,11 @@ void C2SoftOpusEnc::process(const std::unique_ptr<C2Work>& work,
        uint8_t* outPtr = wView.data() + mBytesEncoded;
        int encodedBytes =
            opus_multistream_encode(mEncoder, mInputBufferPcm16,
                                    mNumSamplesPerFrame, outPtr, kMaxPayload - mBytesEncoded);
                                    mNumSamplesPerFrame, outPtr, outCapacity - mBytesEncoded);
        ALOGV("encoded %i Opus bytes from %zu PCM bytes", encodedBytes,
              processSize);

        if (encodedBytes < 0 || encodedBytes > (kMaxPayload - mBytesEncoded)) {
        if (encodedBytes < 0 || encodedBytes > (outCapacity - mBytesEncoded)) {
            ALOGE("opus_encode failed, encodedBytes : %d", encodedBytes);
            mSignalledError = true;
            work->result = C2_CORRUPTED;
+7 −6
Original line number Diff line number Diff line
@@ -45,12 +45,13 @@ struct C2SoftOpusEnc : public SimpleC2Component {
            uint32_t drainMode,
            const std::shared_ptr<C2BlockPool> &pool) override;
private:
    /* OPUS_FRAMESIZE_20_MS */
    const int kFrameSize = 960;
    const int kMaxSampleRate = 48000;
    const int kMinSampleRate = 8000;
    const int kMaxPayload = (4000 * kMaxSampleRate) / kMinSampleRate;
    const int kMaxNumChannels = 8;
    static const int kMaxNumChannelsSupported = 2;
    static const int kMaxSampleRateSupported = 48000;
    static const int kDefaultFrameDurationMs = 20;
    // For a frame duration of 20ms, payload recommended size is 1276 as per
    // https://www.opus-codec.org/docs/html_api/group__opusencoder.html.
    // 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<C2LinearBlock> mOutputBlock;