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

Commit 388455ce authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "CCodecBuffers: fix null buffer PCM conversion" into tm-dev am: 866b6639 am: aa657827

parents 7db80f00 aa657827
Loading
Loading
Loading
Loading
+8 −3
Original line number Original line Diff line number Diff line
@@ -208,7 +208,7 @@ void OutputBuffers::setSkipCutBuffer(int32_t skip, int32_t cut) {


bool OutputBuffers::convert(
bool OutputBuffers::convert(
        const std::shared_ptr<C2Buffer> &src, sp<Codec2Buffer> *dst) {
        const std::shared_ptr<C2Buffer> &src, sp<Codec2Buffer> *dst) {
    if (!src || src->data().type() != C2BufferData::LINEAR) {
    if (src && src->data().type() != C2BufferData::LINEAR) {
        return false;
        return false;
    }
    }
    int32_t configEncoding = kAudioEncodingPcm16bit;
    int32_t configEncoding = kAudioEncodingPcm16bit;
@@ -237,7 +237,12 @@ bool OutputBuffers::convert(
    if (!mDataConverter) {
    if (!mDataConverter) {
        return false;
        return false;
    }
    }
    sp<MediaCodecBuffer> srcBuffer = ConstLinearBlockBuffer::Allocate(mFormat, src);
    sp<MediaCodecBuffer> srcBuffer;
    if (src) {
        srcBuffer = ConstLinearBlockBuffer::Allocate(mFormat, src);
    } else {
        srcBuffer = new MediaCodecBuffer(mFormat, new ABuffer(0));
    }
    if (!srcBuffer) {
    if (!srcBuffer) {
        return false;
        return false;
    }
    }
@@ -1259,8 +1264,8 @@ status_t FlexOutputBuffers::registerBuffer(
        if (newBuffer == nullptr) {
        if (newBuffer == nullptr) {
            return NO_MEMORY;
            return NO_MEMORY;
        }
        }
    }
        newBuffer->setFormat(mFormat);
        newBuffer->setFormat(mFormat);
    }
    *index = mImpl.assignSlot(newBuffer);
    *index = mImpl.assignSlot(newBuffer);
    handleImageData(newBuffer);
    handleImageData(newBuffer);
    *clientBuffer = newBuffer;
    *clientBuffer = newBuffer;
+53 −0
Original line number Original line Diff line number Diff line
@@ -861,4 +861,57 @@ INSTANTIATE_TEST_SUITE_P(
                    + std::to_string(std::get<3>(info.param));
                    + std::to_string(std::get<3>(info.param));
        });
        });


TEST(LinearOutputBuffersTest, PcmConvertFormat) {
    // Prepare LinearOutputBuffers
    std::shared_ptr<LinearOutputBuffers> buffers =
        std::make_shared<LinearOutputBuffers>("test");
    sp<AMessage> format{new AMessage};
    format->setInt32(KEY_CHANNEL_COUNT, 1);
    format->setInt32(KEY_SAMPLE_RATE, 8000);
    format->setInt32(KEY_PCM_ENCODING, kAudioEncodingPcmFloat);
    format->setInt32("android._config-pcm-encoding", kAudioEncodingPcm16bit);
    format->setInt32("android._codec-pcm-encoding", kAudioEncodingPcmFloat);
    buffers->setFormat(format);

    // Prepare a linear C2Buffer
    std::shared_ptr<C2BlockPool> pool;
    ASSERT_EQ(OK, GetCodec2BlockPool(C2BlockPool::BASIC_LINEAR, nullptr, &pool));

    std::shared_ptr<C2LinearBlock> block;
    ASSERT_EQ(OK, pool->fetchLinearBlock(
            1024, C2MemoryUsage{C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE}, &block));
    std::shared_ptr<C2Buffer> c2Buffer =
        C2Buffer::CreateLinearBuffer(block->share(0, 1024, C2Fence()));

    // Test regular buffer convert
    size_t index;
    sp<MediaCodecBuffer> clientBuffer;
    ASSERT_EQ(OK, buffers->registerBuffer(c2Buffer, &index, &clientBuffer));
    int32_t pcmEncoding = 0;
    ASSERT_TRUE(clientBuffer->format()->findInt32(KEY_PCM_ENCODING, &pcmEncoding));
    EXPECT_EQ(kAudioEncodingPcm16bit, pcmEncoding);
    ASSERT_TRUE(buffers->releaseBuffer(clientBuffer, &c2Buffer));

    // Test null buffer convert
    ASSERT_EQ(OK, buffers->registerBuffer(nullptr, &index, &clientBuffer));
    ASSERT_TRUE(clientBuffer->format()->findInt32(KEY_PCM_ENCODING, &pcmEncoding));
    EXPECT_EQ(kAudioEncodingPcm16bit, pcmEncoding);
    ASSERT_TRUE(buffers->releaseBuffer(clientBuffer, &c2Buffer));

    // Do the same test in the array mode
    std::shared_ptr<OutputBuffersArray> array = buffers->toArrayMode(8);

    // Test regular buffer convert
    ASSERT_EQ(OK, buffers->registerBuffer(c2Buffer, &index, &clientBuffer));
    ASSERT_TRUE(clientBuffer->format()->findInt32(KEY_PCM_ENCODING, &pcmEncoding));
    EXPECT_EQ(kAudioEncodingPcm16bit, pcmEncoding);
    ASSERT_TRUE(buffers->releaseBuffer(clientBuffer, &c2Buffer));

    // Test null buffer convert
    ASSERT_EQ(OK, buffers->registerBuffer(nullptr, &index, &clientBuffer));
    ASSERT_TRUE(clientBuffer->format()->findInt32(KEY_PCM_ENCODING, &pcmEncoding));
    EXPECT_EQ(kAudioEncodingPcm16bit, pcmEncoding);
    ASSERT_TRUE(buffers->releaseBuffer(clientBuffer, &c2Buffer));
}

} // namespace android
} // namespace android