diff options
author | Jason Macnak <natsu@google.com> | 2020-05-14 21:06:54 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-05-14 21:06:54 +0000 |
commit | 2540a38771fdbcc03c2d018dd312811a6bc88ff3 (patch) | |
tree | a11f4d33edc958379a995bff66738ea1c55f7ed3 /camera/common/1.0/default/HandleImporter.cpp | |
parent | 6d9c20019805aaa7b5607806f782737462f6204a (diff) | |
parent | eda6dca45cd406c60318e08233353f6616bc016e (diff) |
Merge "Implement lockYCbCr stub for Mapper 4.0" into rvc-dev
Diffstat (limited to 'camera/common/1.0/default/HandleImporter.cpp')
-rw-r--r-- | camera/common/1.0/default/HandleImporter.cpp | 86 |
1 files changed, 79 insertions, 7 deletions
diff --git a/camera/common/1.0/default/HandleImporter.cpp b/camera/common/1.0/default/HandleImporter.cpp index 40cb4e0dae..05a552cd95 100644 --- a/camera/common/1.0/default/HandleImporter.cpp +++ b/camera/common/1.0/default/HandleImporter.cpp @@ -16,6 +16,8 @@ #define LOG_TAG "HandleImporter" #include "HandleImporter.h" + +#include <gralloctypes/Gralloc4.h> #include <log/log.h> namespace android { @@ -25,6 +27,9 @@ namespace common { namespace V1_0 { namespace helper { +using aidl::android::hardware::graphics::common::PlaneLayout; +using aidl::android::hardware::graphics::common::PlaneLayoutComponent; +using aidl::android::hardware::graphics::common::PlaneLayoutComponentType; using MapperErrorV2 = android::hardware::graphics::mapper::V2_0::Error; using MapperErrorV3 = android::hardware::graphics::mapper::V3_0::Error; using MapperErrorV4 = android::hardware::graphics::mapper::V4_0::Error; @@ -118,6 +123,79 @@ YCbCrLayout HandleImporter::lockYCbCrInternal(const sp<M> mapper, buffer_handle_ return layout; } +template <> +YCbCrLayout HandleImporter::lockYCbCrInternal<IMapperV4, MapperErrorV4>( + const sp<IMapperV4> mapper, buffer_handle_t& buf, uint64_t cpuUsage, + const IMapper::Rect& accessRegion) { + hidl_handle acquireFenceHandle; + auto buffer = const_cast<native_handle_t*>(buf); + YCbCrLayout layout = {}; + void* mapped = nullptr; + + typename IMapperV4::Rect accessRegionV4 = {accessRegion.left, accessRegion.top, + accessRegion.width, accessRegion.height}; + mapper->lock(buffer, cpuUsage, accessRegionV4, acquireFenceHandle, + [&](const auto& tmpError, const auto& tmpPtr) { + if (tmpError == MapperErrorV4::NONE) { + mapped = tmpPtr; + } else { + ALOGE("%s: failed to lock error %d!", __FUNCTION__, tmpError); + } + }); + + if (mapped == nullptr) { + return layout; + } + + hidl_vec<uint8_t> encodedPlaneLayouts; + mapper->get(buffer, gralloc4::MetadataType_PlaneLayouts, + [&](const auto& tmpError, const auto& tmpEncodedPlaneLayouts) { + if (tmpError == MapperErrorV4::NONE) { + encodedPlaneLayouts = tmpEncodedPlaneLayouts; + } else { + ALOGE("%s: failed to get plane layouts %d!", __FUNCTION__, tmpError); + } + }); + + std::vector<PlaneLayout> planeLayouts; + gralloc4::decodePlaneLayouts(encodedPlaneLayouts, &planeLayouts); + + for (const auto& planeLayout : planeLayouts) { + for (const auto& planeLayoutComponent : planeLayout.components) { + const auto& type = planeLayoutComponent.type; + + if (!gralloc4::isStandardPlaneLayoutComponentType(type)) { + continue; + } + + uint8_t* data = reinterpret_cast<uint8_t*>(mapped); + data += planeLayout.offsetInBytes; + data += planeLayoutComponent.offsetInBits / 8; + + switch (static_cast<PlaneLayoutComponentType>(type.value)) { + case PlaneLayoutComponentType::Y: + layout.y = data; + layout.yStride = planeLayout.strideInBytes; + break; + case PlaneLayoutComponentType::CB: + layout.cb = data; + layout.cStride = planeLayout.strideInBytes; + layout.chromaStep = planeLayout.sampleIncrementInBits / 8; + break; + case PlaneLayoutComponentType::CR: + layout.cr = data; + layout.cStride = planeLayout.strideInBytes; + layout.chromaStep = planeLayout.sampleIncrementInBits / 8; + break; + default: + break; + } + } + } + + return layout; +} + template<class M, class E> int HandleImporter::unlockInternal(const sp<M> mapper, buffer_handle_t& buf) { int releaseFence = -1; @@ -306,13 +384,7 @@ YCbCrLayout HandleImporter::lockYCbCr( } if (mMapperV4 != nullptr) { - // No device currently supports IMapper 4.0 so it is safe to just return an error code here. - // - // This will be supported by a combination of lock and BufferMetadata getters. We are going - // to refactor all the IAllocator/IMapper versioning code into a shared library. We will - // then add the IMapper 4.0 lockYCbCr support then. - ALOGE("%s: MapperV4 doesn't support lockYCbCr directly!", __FUNCTION__); - return {}; + return lockYCbCrInternal<IMapperV4, MapperErrorV4>(mMapperV4, buf, cpuUsage, accessRegion); } if (mMapperV3 != nullptr) { |