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

Commit 22441f30 authored by Jayant Chowdhary's avatar Jayant Chowdhary
Browse files

Make Camera3Device transport agnostic.



Add HidlCamera3Device* which seperates out hidl transport specific
functionality from Camera3Device* and related classes.

Bug: 196432585

Test: Camera CTS

Change-Id: Iee940614e261c345202144b9a0ea22a70a6e887b
Signed-off-by: default avatarJayant Chowdhary <jchowdhary@google.com>
parent 0bd3852f
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -81,6 +81,9 @@ cc_library_shared {
        "device3/Camera3DeviceInjectionMethods.cpp",
        "device3/UHRCropAndMeteringRegionMapper.cpp",
        "device3/PreviewFrameScheduler.cpp",
        "device3/hidl/HidlCamera3Device.cpp",
        "device3/hidl/HidlCamera3OfflineSession.cpp",
        "device3/hidl/HidlCamera3OutputUtils.cpp",
        "gui/RingBufferConsumer.cpp",
        "hidl/AidlCameraDeviceCallbacks.cpp",
        "hidl/AidlCameraServiceListener.cpp",
+23 −3
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@
#include "api2/CameraDeviceClient.h"

#include "device3/Camera3Device.h"
#include "device3/hidl/HidlCamera3Device.h"
#include "utils/CameraThreadState.h"
#include "utils/CameraServiceProxyWrapper.h"

@@ -62,14 +63,14 @@ Camera2ClientBase<TClientBase>::Camera2ClientBase(
                servicePid),
        mSharedCameraCallbacks(remoteCallback),
        mDeviceVersion(cameraService->getDeviceVersion(TClientBase::mCameraIdStr)),
        mDevice(new Camera3Device(cameraId, overrideForPerfClass, legacyClient)),
        mDeviceActive(false), mApi1CameraId(api1CameraId)
{
    ALOGI("Camera %s: Opened. Client: %s (PID %d, UID %d)", cameraId.string(),
            String8(clientPackageName).string(), clientPid, clientUid);

    mInitialClientPid = clientPid;
    LOG_ALWAYS_FATAL_IF(mDevice == 0, "Device should never be NULL here.");
    mOverrideForPerfClass = overrideForPerfClass;
    mLegacyClient = legacyClient;
}

template <typename TClientBase>
@@ -104,7 +105,26 @@ status_t Camera2ClientBase<TClientBase>::initializeImpl(TProviderPtr providerPtr
    if (res != OK) {
        return res;
    }

    IPCTransport providerTransport = IPCTransport::INVALID;
    res = providerPtr->getCameraIdIPCTransport(TClientBase::mCameraIdStr.string(),
            &providerTransport);
    if (res != OK) {
        return res;
    }
    switch (providerTransport) {
        case IPCTransport::HIDL:
            mDevice =
                    new HidlCamera3Device(TClientBase::mCameraIdStr, mOverrideForPerfClass,
                            mLegacyClient);
            break;
        case IPCTransport::AIDL:
            ALOGE("%s: AIDL camera3Devices not available yet", __FUNCTION__);
            return NO_INIT;
        default:
            ALOGE("%s Invalid transport for camera id %s", __FUNCTION__,
                    TClientBase::mCameraIdStr.string());
            return NO_INIT;
    }
    if (mDevice == NULL) {
        ALOGE("%s: Camera %s: No device connected",
                __FUNCTION__, TClientBase::mCameraIdStr.string());
+8 −3
Original line number Diff line number Diff line
@@ -126,6 +126,8 @@ protected:

    // The PID provided in the constructor call
    pid_t mInitialClientPid;
    bool mOverrideForPerfClass = false;
    bool mLegacyClient = false;

    virtual sp<IBinder> asBinderWrapper() {
        return IInterface::asBinder(this);
@@ -145,9 +147,12 @@ protected:

    const int mDeviceVersion;

    // Set to const to avoid mDevice being updated (update of sp<> is racy) during
    // dumpDevice (which is important to be lock free for debugging purpose)
    const sp<CameraDeviceBase>  mDevice;
    // Note: This was previously set to const to avoid mDevice being updated -
    // b/112639939 (update of sp<> is racy) during dumpDevice (which is important to be lock free
    // for debugging purpose). The const has been removed since CameraDeviceBase
    // needs to be set during initializeImpl(). This must not be set / cleared
    // anywhere else.
    sp<CameraDeviceBase>  mDevice;

    /** Utility members */

+15 −0
Original line number Diff line number Diff line
@@ -278,6 +278,21 @@ status_t CameraProviderManager::isSessionConfigurationSupported(const std::strin
    return deviceInfo->isSessionConfigurationSupported(configuration, overrideForPerfClass, status);
}

status_t CameraProviderManager::getCameraIdIPCTransport(const std::string &id,
        IPCTransport *providerTransport) const {
    std::lock_guard<std::mutex> lock(mInterfaceMutex);
    auto deviceInfo = findDeviceInfoLocked(id);
    if (deviceInfo == nullptr) {
        return NAME_NOT_FOUND;
    }
    sp<ProviderInfo> parentProvider = deviceInfo->mParentProvider.promote();
    if (parentProvider == nullptr) {
        return DEAD_OBJECT;
    }
    *providerTransport = parentProvider->getIPCTransport();
    return OK;
}

status_t CameraProviderManager::getCameraCharacteristics(const std::string &id,
        bool overrideForPerfClass, CameraMetadata* characteristics) const {
    std::lock_guard<std::mutex> lock(mInterfaceMutex);
+3 −0
Original line number Diff line number Diff line
@@ -189,6 +189,9 @@ public:
    status_t initialize(wp<StatusListener> listener,
            HidlServiceInteractionProxy *hidlProxy = &sHidlServiceInteractionProxy);

    status_t getCameraIdIPCTransport(const std::string &id,
            IPCTransport *providerTransport) const;

    /**
     * Retrieve the total number of available cameras.
     * This value may change dynamically as cameras are added or removed.
Loading