diff options
| author | Arne Coucheron <arco68@gmail.com> | 2021-06-30 01:44:45 +0200 |
|---|---|---|
| committer | Julian Veit <Claymore1298@gmail.com> | 2021-08-26 12:48:11 +0200 |
| commit | 8e8c5651078aeeb5c2d73964851f769734e3b0cd (patch) | |
| tree | 6c6b674c1291d4a06f537f59bde2683acf4c8398 | |
| parent | f185047c8096837bc6652b0abd90f202943c9e3b (diff) | |
Reverts "Camera: HAL1: remove libbinder usage" from
hardware/interfaces.
Fixes memory and buffer issues with old legacy camera blobs,
as they were designed with libbinder in mind.
One example is when recording MMS videos, which were crashing
with a nullptr setting up a buffer.
Change-Id: I121eb16146befb30cfbf8af2a7963c2e3afe6bac
| -rw-r--r-- | camera/device/Android.bp | 4 | ||||
| -rw-r--r-- | camera/device/CameraDevice.cpp | 95 | ||||
| -rw-r--r-- | camera/device/CameraDevice_1_0.h | 20 | ||||
| -rw-r--r-- | camera/provider/Android.bp | 3 |
4 files changed, 49 insertions, 73 deletions
diff --git a/camera/device/Android.bp b/camera/device/Android.bp index 3c4aea8..76c664a 100644 --- a/camera/device/Android.bp +++ b/camera/device/Android.bp @@ -7,7 +7,6 @@ cc_library_shared { ], shared_libs: [ "libhidlbase", - "libhidlmemory", "libutils", "android.hardware.camera.device@1.0", "android.hardware.camera.common@1.0", @@ -16,13 +15,12 @@ cc_library_shared { "android.hardware.graphics.mapper@3.0", "android.hardware.graphics.mapper@4.0", "android.hardware.graphics.common@1.0", - "android.hidl.allocator@1.0", - "android.hidl.memory@1.0", "libcutils", "liblog", "libgralloctypes", "libhardware", "libcamera_metadata", + "libbinder", ], static_libs: [ "android.hardware.camera.common@1.0-helper", diff --git a/camera/device/CameraDevice.cpp b/camera/device/CameraDevice.cpp index d188d27..d663db4 100644 --- a/camera/device/CameraDevice.cpp +++ b/camera/device/CameraDevice.cpp @@ -17,7 +17,6 @@ #define LOG_TAG "CamDev@1.0-impl" #include <hardware/camera.h> #include <hardware/gralloc1.h> -#include <hidlmemory/mapping.h> #include <log/log.h> #include <utils/Trace.h> @@ -106,12 +105,6 @@ CameraDevice::CameraDevice( __FUNCTION__, mCameraId.c_str()); mInitFail = true; } - - mAshmemAllocator = IAllocator::getService("ashmem"); - if (mAshmemAllocator == nullptr) { - ALOGI("%s: cannot get ashmemAllocator", __FUNCTION__); - mInitFail = true; - } } CameraDevice::~CameraDevice() { @@ -299,66 +292,35 @@ int CameraDevice::sGetMinUndequeuedBufferCount( return getStatusT(s); } -CameraDevice::CameraHeapMemory::CameraHeapMemory( - int fd, size_t buf_size, uint_t num_buffers) : +CameraDevice::CameraHeapMemory::CameraHeapMemory(int fd, size_t buf_size, uint_t num_buffers) : mBufSize(buf_size), mNumBufs(num_buffers) { - mHidlHandle = native_handle_create(1,0); - mHidlHandle->data[0] = fcntl(fd, F_DUPFD_CLOEXEC, 0); - const size_t pagesize = getpagesize(); - size_t size = ((buf_size * num_buffers + pagesize-1) & ~(pagesize-1)); - mHidlHeap = hidl_memory("ashmem", mHidlHandle, size); + mHeap = new MemoryHeapBase(fd, buf_size * num_buffers); commonInitialization(); } -CameraDevice::CameraHeapMemory::CameraHeapMemory( - sp<IAllocator> ashmemAllocator, - size_t buf_size, uint_t num_buffers) : +CameraDevice::CameraHeapMemory::CameraHeapMemory(size_t buf_size, uint_t num_buffers) : mBufSize(buf_size), mNumBufs(num_buffers) { - const size_t pagesize = getpagesize(); - size_t size = ((buf_size * num_buffers + pagesize-1) & ~(pagesize-1)); - ashmemAllocator->allocate(size, - [&](bool success, const hidl_memory& mem) { - if (!success) { - ALOGE("%s: allocating ashmem of %zu bytes failed!", - __FUNCTION__, buf_size * num_buffers); - return; - } - mHidlHandle = native_handle_clone(mem.handle()); - mHidlHeap = hidl_memory("ashmem", mHidlHandle, size); - }); - + mHeap = new MemoryHeapBase(buf_size * num_buffers); commonInitialization(); } void CameraDevice::CameraHeapMemory::commonInitialization() { - mHidlHeapMemory = mapMemory(mHidlHeap); - if (mHidlHeapMemory == nullptr) { - ALOGE("%s: memory map failed!", __FUNCTION__); - native_handle_close(mHidlHandle); // close FD for the shared memory - native_handle_delete(mHidlHandle); - mHidlHeap = hidl_memory(); - mHidlHandle = nullptr; - return; - } - mHidlHeapMemData = mHidlHeapMemory->getPointer(); - handle.data = mHidlHeapMemData; + handle.data = mHeap->base(); handle.size = mBufSize * mNumBufs; handle.handle = this; + + mBuffers = new sp<MemoryBase>[mNumBufs]; + for (uint_t i = 0; i < mNumBufs; i++) { + mBuffers[i] = new MemoryBase(mHeap, i * mBufSize, mBufSize); + } + handle.release = sPutMemory; } CameraDevice::CameraHeapMemory::~CameraHeapMemory() { - if (mHidlHeapMemory != nullptr) { - mHidlHeapMemData = nullptr; - mHidlHeapMemory.clear(); // The destructor will trigger munmap - } - - if (mHidlHandle) { - native_handle_close(mHidlHandle); // close FD for the shared memory - native_handle_delete(mHidlHandle); - } + delete [] mBuffers; } // shared memory methods @@ -372,13 +334,22 @@ camera_memory_t* CameraDevice::sGetMemory(int fd, size_t buf_size, uint_t num_bu } CameraHeapMemory* mem; + native_handle_t* handle = native_handle_create(1,0); + + if (handle == nullptr) { + ALOGE("%s: native_handle_create failed!", __FUNCTION__); + return nullptr; + } + if (fd < 0) { - mem = new CameraHeapMemory(object->mAshmemAllocator, buf_size, num_bufs); + mem = new CameraHeapMemory(buf_size, num_bufs); } else { mem = new CameraHeapMemory(fd, buf_size, num_bufs); } + handle->data[0] = mem->mHeap->getHeapID(); mem->incStrong(mem); - hidl_handle hidlHandle = mem->mHidlHandle; + + hidl_handle hidlHandle = handle; MemoryId id = object->mDeviceCallback->registerMemory(hidlHandle, buf_size, num_bufs); mem->handle.mId = id; @@ -390,6 +361,7 @@ camera_memory_t* CameraDevice::sGetMemory(int fd, size_t buf_size, uint_t num_bu object->mMemoryMap[id] = mem; } mem->handle.mDevice = object; + native_handle_delete(handle); return &mem->handle; } @@ -516,7 +488,7 @@ void CameraDevice::sDataCbTimestamp(nsecs_t timestamp, int32_t msg_type, if (object->mMetadataMode) { if (mem->mBufSize == sizeof(VideoNativeHandleMetadata)) { VideoNativeHandleMetadata* md = (VideoNativeHandleMetadata*) - ((uint8_t*) mem->mHidlHeapMemData + index * mem->mBufSize); + mem->mBuffers[index]->unsecurePointer(); if (md->eType == kMetadataBufferTypeNativeHandleSource) { handle = md->pHandle; } @@ -855,12 +827,27 @@ void CameraDevice::releaseRecordingFrameLocked( } camMemory = it->second; } + sp<MemoryHeapBase> heap = camMemory->mHeap; if (bufferIndex >= camMemory->mNumBufs) { ALOGE("%s: bufferIndex %d exceeds number of buffers %d", __FUNCTION__, bufferIndex, camMemory->mNumBufs); return; } - void *data = ((uint8_t *) camMemory->mHidlHeapMemData) + bufferIndex * camMemory->mBufSize; + sp<IMemory> mem = camMemory->mBuffers[bufferIndex]; + // TODO: simplify below logic once we verify offset is indeed idx * mBufSize + // and heap == heap2 + ssize_t offset; + size_t size; + sp<IMemoryHeap> heap2 = mem->getMemory(&offset, &size); + if ((size_t)offset != bufferIndex * camMemory->mBufSize) { + ALOGI("%s: unexpected offset %zd (was expecting %zu)", + __FUNCTION__, offset, bufferIndex * camMemory->mBufSize); + } + if (heap != heap2) { + ALOGE("%s: heap mismatch!", __FUNCTION__); + return; + } + void *data = ((uint8_t *)heap->base()) + offset; if (handle) { VideoNativeHandleMetadata* md = (VideoNativeHandleMetadata*) data; if (md->eType == kMetadataBufferTypeNativeHandleSource) { diff --git a/camera/device/CameraDevice_1_0.h b/camera/device/CameraDevice_1_0.h index 2c980f0..ee9be9d 100644 --- a/camera/device/CameraDevice_1_0.h +++ b/camera/device/CameraDevice_1_0.h @@ -20,12 +20,12 @@ #include <unordered_map> #include "utils/Mutex.h" #include "utils/SortedVector.h" +#include <binder/MemoryBase.h> +#include <binder/MemoryHeapBase.h> #include "CameraModule.h" #include "HandleImporter.h" #include <android/hardware/camera/device/1.0/ICameraDevice.h> -#include <android/hidl/allocator/1.0/IAllocator.h> -#include <android/hidl/memory/1.0/IMemory.h> #include <hidl/MQDescriptor.h> #include <hidl/Status.h> @@ -47,9 +47,7 @@ using ::android::hardware::camera::device::V1_0::ICameraDevice; using ::android::hardware::camera::device::V1_0::ICameraDeviceCallback; using ::android::hardware::camera::device::V1_0::ICameraDevicePreviewCallback; using ::android::hardware::camera::device::V1_0::MemoryId; -using ::android::hidl::allocator::V1_0::IAllocator; using ::android::hidl::base::V1_0::IBase; -using ::android::hidl::memory::V1_0::IMemory; using ::android::hardware::hidl_array; using ::android::hardware::hidl_memory; using ::android::hardware::hidl_string; @@ -115,23 +113,17 @@ private: class CameraHeapMemory : public RefBase { public: CameraHeapMemory(int fd, size_t buf_size, uint_t num_buffers = 1); - explicit CameraHeapMemory( - sp<IAllocator> ashmemAllocator, size_t buf_size, uint_t num_buffers = 1); + explicit CameraHeapMemory(size_t buf_size, uint_t num_buffers = 1); void commonInitialization(); virtual ~CameraHeapMemory(); size_t mBufSize; uint_t mNumBufs; - - // Shared memory related members - hidl_memory mHidlHeap; - native_handle_t* mHidlHandle; // contains one shared memory FD - void* mHidlHeapMemData; - sp<IMemory> mHidlHeapMemory; // munmap happens in ~IMemory() - + // TODO: b/35887419: use hidl_memory instead and get rid of libbinder + sp<MemoryHeapBase> mHeap; + sp<MemoryBase>* mBuffers; CameraMemory handle; }; - sp<IAllocator> mAshmemAllocator; const sp<CameraModule> mModule; const std::string mCameraId; diff --git a/camera/provider/Android.bp b/camera/provider/Android.bp index 7ed2874..fae87f5 100644 --- a/camera/provider/Android.bp +++ b/camera/provider/Android.bp @@ -12,14 +12,13 @@ cc_library_shared { "android.hardware.graphics.mapper@2.0", "android.hardware.graphics.mapper@3.0", "android.hardware.graphics.mapper@4.0", - "android.hidl.allocator@1.0", - "android.hidl.memory@1.0", "libcamera_metadata", "libcutils", "libhardware", "libhidlbase", "liblog", "libutils", + "libbinder", ], static_libs: [ "android.hardware.camera.common@1.0-helper" |
