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

Commit 8c22dc7b 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#testSharedSessionCreationDifferentStreams
Change-Id: I0dceb7e5261031875ac8ee5f5b31c0b5667ce267
parent 10b406c4
Loading
Loading
Loading
Loading
+11 −12
Original line number Diff line number Diff line
@@ -343,7 +343,6 @@ status_t AidlCamera3SharedDevice::addSharedSurfaces(int streamId,
              streamId, res, strerror(-res));
        return res;
    }

    for (size_t i = 0 ; i < outputMap.size(); i++){
        if (surfaceIds != nullptr) {
            surfaceIds->push_back(outputMap.valueAt(i));
@@ -456,9 +455,9 @@ status_t AidlCamera3SharedDevice::setSharedStreamingRequest(
        return err;
    }
    mStreamingRequestId = requestID;
    uid_t clientUid = mAttributionAndPermissionUtils->getCallingUid();
    mClientRequestIds[clientUid] = clientRequestId;
    mClientSurfaces[clientUid] = surfaceMap;
    int clientPid = mAttributionAndPermissionUtils->getCallingPid();
    mClientRequestIds[clientPid] = clientRequestId;
    mClientSurfaces[clientPid] = surfaceMap;
    *sharedReqID = mStreamingRequestId;

    return err;
@@ -466,7 +465,7 @@ status_t AidlCamera3SharedDevice::setSharedStreamingRequest(

status_t AidlCamera3SharedDevice::clearSharedStreamingRequest(int64_t *lastFrameNumber) {
    Mutex::Autolock l(mSharedDeviceLock);
    uid_t clientUid = mAttributionAndPermissionUtils->getCallingUid();
    int clientPid = mAttributionAndPermissionUtils->getCallingPid();
    const sp<CaptureRequest> curRequest = getOngoingRepeatingRequestLocked();
    if (curRequest == nullptr) {
        CLOGE("No streaming ongoing");
@@ -474,9 +473,9 @@ status_t AidlCamera3SharedDevice::clearSharedStreamingRequest(int64_t *lastFrame
    }

    SurfaceMap newSurfaceMap;
    newSurfaceMap = removeClientSurfaceMap(curRequest->mOutputSurfaces, mClientSurfaces[clientUid]);
    mClientRequestIds.erase(clientUid);
    mClientSurfaces.erase(clientUid);
    newSurfaceMap = removeClientSurfaceMap(curRequest->mOutputSurfaces, mClientSurfaces[clientPid]);
    mClientRequestIds.erase(clientPid);
    mClientSurfaces.erase(clientPid);
    if (newSurfaceMap.empty()) {
        status_t err = clearStreamingRequest(lastFrameNumber);
        if (err != OK) {
@@ -563,9 +562,9 @@ status_t AidlCamera3SharedDevice::startStreaming(const int32_t reqId, const Surf
        mStreamingRequestId = requestID;
    }

    uid_t clientUid = mAttributionAndPermissionUtils->getCallingUid();
    mClientRequestIds[clientUid] = reqId;
    mClientSurfaces[clientUid] = surfaceMap;
    int clientPid = mAttributionAndPermissionUtils->getCallingPid();
    mClientRequestIds[clientPid] = reqId;
    mClientSurfaces[clientPid] = surfaceMap;
    *sharedReqID = mStreamingRequestId;
    return OK;
}
@@ -577,7 +576,7 @@ status_t AidlCamera3SharedDevice::setNotifyCallback(wp<NotificationListener> lis
    if (listener == NULL) {
        return BAD_VALUE;
    }
    mClientListeners[mAttributionAndPermissionUtils->getCallingUid()] = listener;
    mClientListeners[mAttributionAndPermissionUtils->getCallingPid()] = listener;
    return OK;
}

+4 −4
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ class AidlCamera3SharedDevice :
            bool legacyClient = false);
    status_t initialize(sp<CameraProviderManager> manager,
            const std::string& monitorTags) override;
    status_t disconnectClient(int clientUid) override;
    status_t disconnectClient(int clientPid) override;
    status_t beginConfigure() override;
    status_t getSharedStreamId(const OutputStreamInfo &config, int *streamId) override;
    status_t addSharedSurfaces(int streamId,
@@ -100,9 +100,9 @@ class AidlCamera3SharedDevice :
    int32_t mStreamingRequestId;
    static const int32_t REQUEST_ID_NONE = -1;
    int32_t mRequestIdCounter;
    std::unordered_map<uid_t, int32_t> mClientRequestIds;
    std::unordered_map<uid_t, SurfaceMap> mClientSurfaces;
    std::unordered_map<uid_t, wp<NotificationListener>> mClientListeners;
    std::unordered_map<int, int32_t> mClientRequestIds;
    std::unordered_map<int, SurfaceMap> mClientSurfaces;
    std::unordered_map<int, wp<NotificationListener>> mClientListeners;
    SurfaceMap mergeSurfaceMaps(const SurfaceMap& map1, const SurfaceMap& map2);
    SurfaceMap removeClientSurfaceMap(const SurfaceMap& map1, const SurfaceMap& map2);
    Mutex mSharedDeviceLock;