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

Commit 61780a95 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Camera: Fill out vndk implementation for physical camera callbacks"

parents 117c6f7d 4fa28d2e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -48,6 +48,6 @@ cc_binary {
    init_rc: ["cameraserver.rc"],

    vintf_fragments: [
        "manifest_android.frameworks.cameraservice.service@2.0.xml",
        "manifest_android.frameworks.cameraservice.service@2.1.xml",
    ],
}
+1 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
    <hal>
        <name>android.frameworks.cameraservice.service</name>
        <transport>hwbinder</transport>
        <version>2.0</version>
        <version>2.1</version>
        <interface>
            <name>ICameraService</name>
            <instance>default</instance>
+6 −2
Original line number Diff line number Diff line
@@ -123,6 +123,7 @@ cc_library_shared {
        "android.frameworks.cameraservice.device@2.0",
        "android.frameworks.cameraservice.common@2.0",
        "android.frameworks.cameraservice.service@2.0",
        "android.frameworks.cameraservice.service@2.1",
    ],
    static_libs: [
        "android.hardware.camera.common@1.0-helper",
@@ -140,9 +141,12 @@ cc_library_shared {
}

cc_test {
    name: "AImageReaderVendorTest",
    name: "ACameraNdkVendorTest",
    vendor: true,
    srcs: ["ndk_vendor/tests/AImageReaderVendorTest.cpp"],
    srcs: [
        "ndk_vendor/tests/AImageReaderVendorTest.cpp",
        "ndk_vendor/tests/ACameraManagerTest.cpp",
    ],
    shared_libs: [
        "libcamera2ndk_vendor",
        "libcamera_metadata",
+43 −14
Original line number Diff line number Diff line
@@ -130,6 +130,11 @@ sp<hardware::ICameraService> CameraManagerGlobal::getCameraServiceLocked() {
        mCameraService->addListener(mCameraServiceListener, &cameraStatuses);
        for (auto& c : cameraStatuses) {
            onStatusChangedLocked(c.status, c.cameraId);

            for (auto& unavailablePhysicalId : c.unavailablePhysicalIds) {
                onStatusChangedLocked(hardware::ICameraServiceListener::STATUS_NOT_PRESENT,
                        c.cameraId, unavailablePhysicalId);
            }
        }

        // setup vendor tags
@@ -200,9 +205,7 @@ void CameraManagerGlobal::DeathNotifier::binderDied(const wp<IBinder>&)

void CameraManagerGlobal::registerExtendedAvailabilityCallback(
        const ACameraManager_ExtendedAvailabilityCallbacks *callback) {
    Mutex::Autolock _l(mLock);
    Callback cb(callback);
    mCallbacks.insert(cb);
    return registerAvailCallback<ACameraManager_ExtendedAvailabilityCallbacks>(callback);
}

void CameraManagerGlobal::unregisterExtendedAvailabilityCallback(
@@ -214,6 +217,18 @@ void CameraManagerGlobal::unregisterExtendedAvailabilityCallback(

void CameraManagerGlobal::registerAvailabilityCallback(
        const ACameraManager_AvailabilityCallbacks *callback) {
    return registerAvailCallback<ACameraManager_AvailabilityCallbacks>(callback);
}

void CameraManagerGlobal::unregisterAvailabilityCallback(
        const ACameraManager_AvailabilityCallbacks *callback) {
    Mutex::Autolock _l(mLock);
    Callback cb(callback);
    mCallbacks.erase(cb);
}

template<class T>
void CameraManagerGlobal::registerAvailCallback(const T *callback) {
    Mutex::Autolock _l(mLock);
    Callback cb(callback);
    auto pair = mCallbacks.insert(cb);
@@ -227,22 +242,31 @@ void CameraManagerGlobal::registerAvailabilityCallback(
            if (!pair.second.supportsHAL3) {
                continue;
            }

            // Camera available/unavailable callback
            sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
            ACameraManager_AvailabilityCallback cb = isStatusAvailable(status) ?
                    callback->onCameraAvailable : callback->onCameraUnavailable;
            msg->setPointer(kCallbackFpKey, (void *) cb);
            msg->setPointer(kContextKey, callback->context);
            ACameraManager_AvailabilityCallback cbFunc = isStatusAvailable(status) ?
                    cb.mAvailable : cb.mUnavailable;
            msg->setPointer(kCallbackFpKey, (void *) cbFunc);
            msg->setPointer(kContextKey, cb.mContext);
            msg->setString(kCameraIdKey, AString(cameraId));
            msg->post();

            // Physical camera unavailable callback
            std::set<String8> unavailablePhysicalCameras =
                    pair.second.getUnavailablePhysicalIds();
            for (const auto& physicalCameraId : unavailablePhysicalCameras) {
                sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler);
                ACameraManager_PhysicalCameraAvailabilityCallback cbFunc =
                        cb.mPhysicalCamUnavailable;
                msg->setPointer(kCallbackFpKey, (void *) cbFunc);
                msg->setPointer(kContextKey, cb.mContext);
                msg->setString(kCameraIdKey, AString(cameraId));
                msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId));
                msg->post();
            }
        }
    }

void CameraManagerGlobal::unregisterAvailabilityCallback(
        const ACameraManager_AvailabilityCallbacks *callback) {
    Mutex::Autolock _l(mLock);
    Callback cb(callback);
    mCallbacks.erase(cb);
}

bool CameraManagerGlobal::supportsCamera2ApiLocked(const String8 &cameraId) {
@@ -550,6 +574,11 @@ bool CameraManagerGlobal::StatusAndHAL3Support::removeUnavailablePhysicalId(
    return count > 0;
}

std::set<String8> CameraManagerGlobal::StatusAndHAL3Support::getUnavailablePhysicalIds() {
    std::lock_guard<std::mutex> lock(mLock);
    return unavailablePhysicalIds;
}

} // namespace acam
} // namespace android

+4 −0
Original line number Diff line number Diff line
@@ -70,6 +70,9 @@ class CameraManagerGlobal final : public RefBase {
    const char*                  kCameraServiceName      = "media.camera";
    Mutex                        mLock;

    template<class T>
    void registerAvailCallback(const T *callback);

    class DeathNotifier : public IBinder::DeathRecipient {
      public:
        explicit DeathNotifier(CameraManagerGlobal* cm) : mCameraManager(cm) {}
@@ -222,6 +225,7 @@ class CameraManagerGlobal final : public RefBase {
        bool removeUnavailablePhysicalId(const String8& physicalCameraId);
        int32_t getStatus();
        void updateStatus(int32_t newStatus);
        std::set<String8> getUnavailablePhysicalIds();
    };

    // Map camera_id -> status
Loading