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

Commit eda6dca4 authored by Jason Macnak's avatar Jason Macnak
Browse files

Implement lockYCbCr stub for Mapper 4.0

(Includes bpfmt changes from repo hook)

Bug: b/146515640
Test: cts -m CtsCameraTestCases
Change-Id: Ibd882db1883e0976c2baf95257e51c29de6e6853
parent 9a3f5f02
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -8,7 +8,7 @@ cc_library_static {
        "CameraParameters.cpp",
        "CameraParameters.cpp",
        "VendorTagDescriptor.cpp",
        "VendorTagDescriptor.cpp",
        "HandleImporter.cpp",
        "HandleImporter.cpp",
        "Exif.cpp"
        "Exif.cpp",
    ],
    ],
    cflags: [
    cflags: [
        "-Werror",
        "-Werror",
@@ -17,6 +17,7 @@ cc_library_static {
    ],
    ],
    shared_libs: [
    shared_libs: [
        "liblog",
        "liblog",
        "libgralloctypes",
        "libhardware",
        "libhardware",
        "libcamera_metadata",
        "libcamera_metadata",
        "android.hardware.graphics.mapper@2.0",
        "android.hardware.graphics.mapper@2.0",
@@ -25,6 +26,5 @@ cc_library_static {
        "libexif",
        "libexif",
    ],
    ],
    include_dirs: ["system/media/private/camera/include"],
    include_dirs: ["system/media/private/camera/include"],
    export_include_dirs : ["include"]
    export_include_dirs: ["include"],
}
}
+79 −7
Original line number Original line Diff line number Diff line
@@ -16,6 +16,8 @@


#define LOG_TAG "HandleImporter"
#define LOG_TAG "HandleImporter"
#include "HandleImporter.h"
#include "HandleImporter.h"

#include <gralloctypes/Gralloc4.h>
#include <log/log.h>
#include <log/log.h>


namespace android {
namespace android {
@@ -25,6 +27,9 @@ namespace common {
namespace V1_0 {
namespace V1_0 {
namespace helper {
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 MapperErrorV2 = android::hardware::graphics::mapper::V2_0::Error;
using MapperErrorV3 = android::hardware::graphics::mapper::V3_0::Error;
using MapperErrorV3 = android::hardware::graphics::mapper::V3_0::Error;
using MapperErrorV4 = android::hardware::graphics::mapper::V4_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;
    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>
template<class M, class E>
int HandleImporter::unlockInternal(const sp<M> mapper, buffer_handle_t& buf) {
int HandleImporter::unlockInternal(const sp<M> mapper, buffer_handle_t& buf) {
    int releaseFence = -1;
    int releaseFence = -1;
@@ -299,13 +377,7 @@ YCbCrLayout HandleImporter::lockYCbCr(
    }
    }


    if (mMapperV4 != nullptr) {
    if (mMapperV4 != nullptr) {
        // No device currently supports IMapper 4.0 so it is safe to just return an error code here.
        return lockYCbCrInternal<IMapperV4, MapperErrorV4>(mMapperV4, buf, cpuUsage, accessRegion);
        //
        // 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 {};
    }
    }


    if (mMapperV3 != nullptr) {
    if (mMapperV3 != nullptr) {
+3 −3
Original line number Original line Diff line number Diff line
@@ -20,15 +20,15 @@ cc_library_shared {
        "android.hidl.memory@1.0",
        "android.hidl.memory@1.0",
        "libcutils",
        "libcutils",
        "liblog",
        "liblog",
        "libgralloctypes",
        "libhardware",
        "libhardware",
        "libcamera_metadata",
        "libcamera_metadata",
    ],
    ],
    static_libs: [
    static_libs: [
        "android.hardware.camera.common@1.0-helper"
        "android.hardware.camera.common@1.0-helper",
    ],
    ],
    header_libs: [
    header_libs: [
        "media_plugin_headers",
        "media_plugin_headers",
    ],
    ],
    export_include_dirs: ["."]
    export_include_dirs: ["."],
}
}
+9 −6
Original line number Original line Diff line number Diff line
@@ -2,9 +2,11 @@ cc_library_shared {
    name: "camera.device@3.2-impl",
    name: "camera.device@3.2-impl",
    defaults: ["hidl_defaults"],
    defaults: ["hidl_defaults"],
    proprietary: true,
    proprietary: true,
    srcs: ["CameraDevice.cpp",
    srcs: [
        "CameraDevice.cpp",
        "CameraDeviceSession.cpp",
        "CameraDeviceSession.cpp",
           "convert.cpp"],
        "convert.cpp",
    ],
    shared_libs: [
    shared_libs: [
        "libhidlbase",
        "libhidlbase",
        "libutils",
        "libutils",
@@ -15,15 +17,16 @@ cc_library_shared {
        "android.hardware.graphics.mapper@3.0",
        "android.hardware.graphics.mapper@3.0",
        "android.hardware.graphics.mapper@4.0",
        "android.hardware.graphics.mapper@4.0",
        "liblog",
        "liblog",
        "libgralloctypes",
        "libhardware",
        "libhardware",
        "libcamera_metadata",
        "libcamera_metadata",
        "libfmq"
        "libfmq",
    ],
    ],
    static_libs: [
    static_libs: [
        "android.hardware.camera.common@1.0-helper"
        "android.hardware.camera.common@1.0-helper",
    ],
    ],
    export_include_dirs: ["."],
    export_include_dirs: ["."],
    export_shared_lib_headers: [
    export_shared_lib_headers: [
        "libfmq",
        "libfmq",
    ]
    ],
}
}
+9 −6
Original line number Original line Diff line number Diff line
@@ -2,9 +2,11 @@ cc_library_shared {
    name: "camera.device@3.3-impl",
    name: "camera.device@3.3-impl",
    defaults: ["hidl_defaults"],
    defaults: ["hidl_defaults"],
    proprietary: true,
    proprietary: true,
    srcs: ["CameraDevice.cpp",
    srcs: [
        "CameraDevice.cpp",
        "CameraDeviceSession.cpp",
        "CameraDeviceSession.cpp",
           "convert.cpp"],
        "convert.cpp",
    ],
    shared_libs: [
    shared_libs: [
        "libhidlbase",
        "libhidlbase",
        "libutils",
        "libutils",
@@ -17,15 +19,16 @@ cc_library_shared {
        "android.hardware.graphics.mapper@3.0",
        "android.hardware.graphics.mapper@3.0",
        "android.hardware.graphics.mapper@4.0",
        "android.hardware.graphics.mapper@4.0",
        "liblog",
        "liblog",
        "libgralloctypes",
        "libhardware",
        "libhardware",
        "libcamera_metadata",
        "libcamera_metadata",
        "libfmq"
        "libfmq",
    ],
    ],
    static_libs: [
    static_libs: [
        "android.hardware.camera.common@1.0-helper"
        "android.hardware.camera.common@1.0-helper",
    ],
    ],
    export_include_dirs: ["."],
    export_include_dirs: ["."],
    export_shared_lib_headers: [
    export_shared_lib_headers: [
        "libfmq",
        "libfmq",
    ]
    ],
}
}
Loading