Loading media/codec2/vndk/C2AllocatorIon.cpp +32 −7 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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); Loading @@ -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, size, 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, size, bufferFd, id, ret); } } Loading media/codec2/vndk/C2DmaBufAllocator.cpp +22 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 =========================== */ Loading Loading @@ -249,9 +252,23 @@ C2DmaBufAllocation::C2DmaBufAllocation(BufferAllocator& alloc, size_t size, C2St int bufferFd = -1; int ret = 0; bufferFd = alloc.Alloc(heap_name, size, flags); if (bufferFd < 0) ret = bufferFd; // 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) { // size would overflow ALOGD("dmabuf_alloc: size #%zx cannot accommodate padding #%zx", size, sPadding); ret = -ENOMEM; } else { size_t allocSize = size + sPadding; bufferFd = alloc.Alloc(heap_name, allocSize, flags); 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)); Loading Loading
media/codec2/vndk/C2AllocatorIon.cpp +32 −7 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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); Loading @@ -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, size, 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, size, bufferFd, id, ret); } } Loading
media/codec2/vndk/C2DmaBufAllocator.cpp +22 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 =========================== */ Loading Loading @@ -249,9 +252,23 @@ C2DmaBufAllocation::C2DmaBufAllocation(BufferAllocator& alloc, size_t size, C2St int bufferFd = -1; int ret = 0; bufferFd = alloc.Alloc(heap_name, size, flags); if (bufferFd < 0) ret = bufferFd; // 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) { // size would overflow ALOGD("dmabuf_alloc: size #%zx cannot accommodate padding #%zx", size, sPadding); ret = -ENOMEM; } else { size_t allocSize = size + sPadding; bufferFd = alloc.Alloc(heap_name, allocSize, flags); 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)); Loading