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

Commit 881a266f authored by Harish Mahendrakar's avatar Harish Mahendrakar Committed by Wonsik Kim
Browse files

C2SoftOpusEnc: Fix higher bitrate encoding at lower sample rates

Output buffer allocated was not large enough to hold higher bitrate
outputs for lower sample rates (eg: 512kbps at 8000 Hz)

Also pass remaining bytes in the allocated output buffer correctly
to encoder.

Bug: 134087860
Test: Apply CTS cl mentioned in the bug
Test: atest android.media.cts.EncoderTest#testOpusEncoders

Change-Id: I01a75cb76d15b733690e35fa107ec973668d19bb
parent 90d1d538
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -471,11 +471,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);
                                    mNumSamplesPerFrame, outPtr, kMaxPayload - mBytesEncoded);
        ALOGV("encoded %i Opus bytes from %zu PCM bytes", encodedBytes,
              processSize);

        if (encodedBytes < 0 || encodedBytes > kMaxPayload) {
        if (encodedBytes < 0 || encodedBytes > (kMaxPayload - mBytesEncoded)) {
            ALOGE("opus_encode failed, encodedBytes : %d", encodedBytes);
            mSignalledError = true;
            work->result = C2_CORRUPTED;
+3 −1
Original line number Diff line number Diff line
@@ -47,7 +47,9 @@ struct C2SoftOpusEnc : public SimpleC2Component {
private:
    /* OPUS_FRAMESIZE_20_MS */
    const int kFrameSize = 960;
    const int kMaxPayload = 4000;
    const int kMaxSampleRate = 48000;
    const int kMinSampleRate = 8000;
    const int kMaxPayload = (4000 * kMaxSampleRate) / kMinSampleRate;
    const int kMaxNumChannels = 8;

    std::shared_ptr<IntfImpl> mIntf;