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

Commit c57e7100 authored by Jyoti Bhayana's avatar Jyoti Bhayana
Browse files

Camera2 multi-client: Store clients based on PID.

In camera2 multi-client, currently clients are stored in the AidlCamera3SharedDevice
based on uid. That should be changed to PID as the same uid can have multiple processes
which can access the same camera.

Flag: com.android.internal.camera.flags.camera_multi_client
Bug:389159564
Test: run CTS test SharedCameraTest#testCameraDeviceSharingSupported and
verify in the logcat that HAL level camera disconnect only happens when
last client of the camera disconnects.

Change-Id: I6300426caf5bc0a1033e983d0ff3c552e45b625b
parent 13c9c12e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -304,7 +304,7 @@ template <typename TClientBase>
void Camera2ClientBase<TClientBase>::detachDevice() {
    if (mDevice == 0) return;
    if (flags::camera_multi_client() && TClientBase::mSharedMode) {
        mDevice->disconnectClient(TClientBase::getClientUid());
        mDevice->disconnectClient(TClientBase::getClientCallingPid());
    } else {
        mDevice->disconnect();
    }
+7 −7
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ public:
// See android.info.availableSharedOutputConfigurations for details.
static const int SHARED_OUTPUT_CONFIG_NUM_OF_ENTRIES = 11;
std::map<std::string, sp<AidlCamera3SharedDevice>> AidlCamera3SharedDevice::sSharedDevices;
std::map<std::string, std::unordered_set<int>> AidlCamera3SharedDevice::sClientsUid;
std::map<std::string, std::unordered_set<int>> AidlCamera3SharedDevice::sClientsPid;
Mutex AidlCamera3SharedDevice::sSharedClientsLock;
sp<AidlCamera3SharedDevice> AidlCamera3SharedDevice::getInstance(
        std::shared_ptr<CameraServiceProxyWrapper>& cameraServiceProxyWrapper,
@@ -92,14 +92,14 @@ sp<AidlCamera3SharedDevice> AidlCamera3SharedDevice::getInstance(
        const std::string& id, bool overrideForPerfClass, int rotationOverride,
        bool legacyClient) {
    Mutex::Autolock l(sSharedClientsLock);
    if (sClientsUid[id].empty()) {
    if (sClientsPid[id].empty()) {
        AidlCamera3SharedDevice* sharedDevice = new AidlCamera3SharedDevice(
                cameraServiceProxyWrapper, attributionAndPermissionUtils, id, overrideForPerfClass,
                rotationOverride, legacyClient);
        sSharedDevices[id] = sharedDevice;
    }
    if (attributionAndPermissionUtils != nullptr) {
        sClientsUid[id].insert(attributionAndPermissionUtils->getCallingUid());
        sClientsPid[id].insert(attributionAndPermissionUtils->getCallingPid());
    }
    return sSharedDevices[id];
}
@@ -133,14 +133,14 @@ status_t AidlCamera3SharedDevice::initialize(sp<CameraProviderManager> manager,
    return res;
}

status_t AidlCamera3SharedDevice::disconnectClient(int clientUid) {
status_t AidlCamera3SharedDevice::disconnectClient(int clientPid) {
    Mutex::Autolock l(mSharedDeviceLock);
    if (sClientsUid[mId].erase(clientUid) == 0) {
    if (sClientsPid[mId].erase(clientPid) == 0) {
        ALOGW("%s: Camera %s: Client %d is not connected to shared device", __FUNCTION__,
                mId.c_str(), clientUid);
                mId.c_str(), clientPid);
    }

    if (sClientsUid[mId].empty()) {
    if (sClientsPid[mId].empty()) {
        return Camera3Device::disconnect();
    }
    return OK;
+1 −1
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ class AidlCamera3SharedDevice :
    virtual void notifyRepeatingRequestError(long /*lastFrameNumber*/) {};
  private:
    static std::map<std::string, sp<AidlCamera3SharedDevice>> sSharedDevices;
    static std::map<std::string, std::unordered_set<int>> sClientsUid;
    static std::map<std::string, std::unordered_set<int>> sClientsPid;
    static Mutex sSharedClientsLock;
    AidlCamera3SharedDevice(
            std::shared_ptr<CameraServiceProxyWrapper>& cameraServiceProxyWrapper,