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

Commit 64ed955f authored by Lajos Molnar's avatar Lajos Molnar Committed by Automerger Merge Worker
Browse files

Merge "RELAND codec2: C2AllocatorIon/DmaBuf: add support for padding" am: 4775e845

Original change: https://android-review.googlesource.com/c/platform/frameworks/av/+/1654487

Change-Id: Ie66c70130353730411046720247ac8b7e0641972
parents 57cc3ae7 4775e845
Loading
Loading
Loading
Loading
+32 −7
Original line number Diff line number Diff line
@@ -30,10 +30,15 @@
#include <C2ErrnoUtils.h>
#include <C2HandleIonInternal.h>

#include <android-base/properties.h>

namespace android {

namespace {
    constexpr size_t USAGE_LRU_CACHE_SIZE = 1024;

    // max padding after ion/dmabuf allocations in bytes
    constexpr uint32_t MAX_PADDING = 0x8000; // 32KB
}

/* size_t <=> int(lo), int(hi) conversions */
@@ -376,14 +381,34 @@ C2AllocationIon::Impl *C2AllocationIon::Impl::Alloc(int ionFd, size_t size, size
        unsigned heapMask, unsigned flags, C2Allocator::id_t id) {
    int bufferFd = -1;
    ion_user_handle_t buffer = -1;
    size_t alignedSize = align == 0 ? size : (size + align - 1) & ~(align - 1);
    // NOTE: read this property directly from the property as this code has to run on
    // Android Q, but the sysprop was only introduced in Android S.
    static size_t sPadding =
        base::GetUintProperty("media.c2.dmabuf.padding", (uint32_t)0, MAX_PADDING);
    if (sPadding > SIZE_MAX - size) {
        ALOGD("ion_alloc: size %#zx cannot accommodate padding %#zx", size, sPadding);
        // use ImplV2 as there is no allocation anyways
        return new ImplV2(ionFd, size, -1, id, -ENOMEM);
    }

    size_t allocSize = size + sPadding;
    if (align) {
        if (align - 1 > SIZE_MAX - allocSize) {
            ALOGD("ion_alloc: size %#zx cannot accommodate padding %#zx and alignment %#zx",
                  size, sPadding, align);
            // use ImplV2 as there is no allocation anyways
            return new ImplV2(ionFd, size, -1, id, -ENOMEM);
        }
        allocSize += align - 1;
        allocSize &= ~(align - 1);
    }
    int ret;

    if (ion_is_legacy(ionFd)) {
        ret = ion_alloc(ionFd, alignedSize, align, heapMask, flags, &buffer);
        ret = ion_alloc(ionFd, allocSize, align, heapMask, flags, &buffer);
        ALOGV("ion_alloc(ionFd = %d, size = %zu, align = %zu, prot = %d, flags = %d) "
              "returned (%d) ; buffer = %d",
              ionFd, alignedSize, align, heapMask, flags, ret, buffer);
              ionFd, allocSize, align, heapMask, flags, ret, buffer);
        if (ret == 0) {
            // get buffer fd for native handle constructor
            ret = ion_share(ionFd, buffer, &bufferFd);
@@ -392,15 +417,15 @@ C2AllocationIon::Impl *C2AllocationIon::Impl::Alloc(int ionFd, size_t size, size
                buffer = -1;
            }
        }
        return new Impl(ionFd, alignedSize, bufferFd, buffer, id, ret);
        return new Impl(ionFd, allocSize, bufferFd, buffer, id, ret);

    } else {
        ret = ion_alloc_fd(ionFd, alignedSize, align, heapMask, flags, &bufferFd);
        ret = ion_alloc_fd(ionFd, allocSize, align, heapMask, flags, &bufferFd);
        ALOGV("ion_alloc_fd(ionFd = %d, size = %zu, align = %zu, prot = %d, flags = %d) "
              "returned (%d) ; bufferFd = %d",
              ionFd, alignedSize, align, heapMask, flags, ret, bufferFd);
              ionFd, allocSize, align, heapMask, flags, ret, bufferFd);

        return new ImplV2(ionFd, alignedSize, bufferFd, id, ret);
        return new ImplV2(ionFd, allocSize, bufferFd, id, ret);
    }
}

+25 −5
Original line number Diff line number Diff line
@@ -16,11 +16,13 @@

//#define LOG_NDEBUG 0
#define LOG_TAG "C2DmaBufAllocator"

#include <BufferAllocator/BufferAllocator.h>
#include <C2Buffer.h>
#include <C2Debug.h>
#include <C2DmaBufAllocator.h>
#include <C2ErrnoUtils.h>

#include <linux/ion.h>
#include <sys/mman.h>
#include <unistd.h>  // getpagesize, size_t, close, dup
@@ -28,14 +30,15 @@

#include <list>

#ifdef __ANDROID_APEX__
#include <android-base/properties.h>
#endif

namespace android {

namespace {
    constexpr size_t USAGE_LRU_CACHE_SIZE = 1024;

    // max padding after ion/dmabuf allocations in bytes
    constexpr uint32_t MAX_PADDING = 0x8000; // 32KB
}

/* =========================== BUFFER HANDLE =========================== */
@@ -250,8 +253,11 @@ C2DmaBufAllocation::C2DmaBufAllocation(BufferAllocator& alloc, size_t size, C2St
    int ret = 0;

    bufferFd = alloc.Alloc(heap_name, size, flags);
    if (bufferFd < 0) ret = bufferFd;
    if (bufferFd < 0) {
        ret = bufferFd;
    }

    // this may be a non-working handle if bufferFd is negative
    mHandle = C2HandleBuf(bufferFd, size);
    mId = id;
    mInit = c2_status_t(c2_map_errno<ENOMEM, EACCES, EINVAL>(ret));
@@ -360,8 +366,22 @@ c2_status_t C2DmaBufAllocator::newLinearAllocation(
        return ret;
    }

    // TODO: should we pad before mapping usage?

    // NOTE: read this property directly from the property as this code has to run on
    // Android Q, but the sysprop was only introduced in Android S.
    static size_t sPadding =
        base::GetUintProperty("media.c2.dmabuf.padding", (uint32_t)0, MAX_PADDING);
    if (sPadding > SIZE_MAX - capacity) {
        // size would overflow
        ALOGD("dmabuf_alloc: size #%x cannot accommodate padding #%zx", capacity, sPadding);
        return C2_NO_MEMORY;
    }

    size_t allocSize = (size_t)capacity + sPadding;
    // TODO: should we align allocation size to mBlockSize to reflect the true allocation size?
    std::shared_ptr<C2DmaBufAllocation> alloc = std::make_shared<C2DmaBufAllocation>(
            mBufferAllocator, capacity, heap_name, flags, getId());
            mBufferAllocator, allocSize, heap_name, flags, getId());
    ret = alloc->status();
    if (ret == C2_OK) {
        *allocation = alloc;