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

Commit 5fb6f67e authored by Arun Johnson's avatar Arun Johnson
Browse files

Enable reuse of LinearBlock for during secure playback

 The mapping of the linearblock is kept open until a call to
 recycle() is done. Users are allowed to use the space in the linear
 block if available. Behaviour of using overlapping memory location
 is undefined.

Bug: 331921194
Test: atest  CtsMediaDrmFrameworkTestCases

Change-Id: I5d81be242a2187fe3a57a5474804482e64a5b083
parent 209c1cda
Loading
Loading
Loading
Loading
+17 −10
Original line number Diff line number Diff line
@@ -2886,6 +2886,10 @@ static void extractMemoryFromContext(
        jint offset,
        jint size,
        sp<hardware::HidlMemory> *memory) {
    if ((offset + size) > context->capacity()) {
        ALOGW("extractMemoryFromContext: offset + size provided exceed capacity");
        return;
    }
    *memory = context->toHidlMemory();
    if (*memory == nullptr) {
        if (!context->mBlock) {
@@ -2899,17 +2903,20 @@ static void extractMemoryFromContext(
            ALOGW("extractMemoryFromContext: failed to obtain secure block");
            return;
        }
        C2WriteView view = context->mBlock->map().get();
        if (view.error() != C2_OK) {
            ALOGW("extractMemoryFromContext: failed to map C2Block (%d)", view.error());
        *memory = context->toHidlMemory();
    }
    if (context->mBlock == nullptr || context->mReadWriteMapping == nullptr) {
        ALOGW("extractMemoryFromContext: Cannot extract memory as C2Block is not created/mapped");
        return;
    }
        uint8_t *memoryPtr = static_cast<uint8_t *>(context->mMemory->unsecurePointer());
        memcpy(memoryPtr + offset, view.base() + offset, size);
        context->mBlock.reset();
        context->mReadWriteMapping.reset();
        *memory = context->toHidlMemory();
    if (context->mReadWriteMapping->error() != C2_OK) {
        ALOGW("extractMemoryFromContext: failed to map C2Block (%d)",
                context->mReadWriteMapping->error());
        return;
    }
    // We are proceeding to extract memory from C2Block
    uint8_t *memoryPtr = static_cast<uint8_t *>(context->mMemory->unsecurePointer());
    memcpy(memoryPtr + offset, context->mReadWriteMapping->base() + offset, size);
}

static void extractBufferFromContext(