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

Commit c0652c6d authored by Jyoti Bhayana's avatar Jyoti Bhayana Committed by Android (Google) Code Review
Browse files

Merge changes Id014f996,I0dceb7e5 into main

* changes:
  Fix shared stream leak in camera2 shared device
  Camera2 multi-client: Store clients based on PID.
parents 201c700b f8d2547d
Loading
Loading
Loading
Loading
+21 −13
Original line number Original line Diff line number Diff line
@@ -2556,11 +2556,20 @@ std::vector<PhysicalCaptureResultInfo> CameraDeviceClient::convertToFMQ(


bool CameraDeviceClient::matchClientRequest(const CaptureResultExtras& resultExtras,
bool CameraDeviceClient::matchClientRequest(const CaptureResultExtras& resultExtras,
        int* clientReqId) {
        int* clientReqId) {
    if (flags::camera_multi_client() && mSharedMode) {
    if (!flags::camera_multi_client() || !mSharedMode) {
        *clientReqId = resultExtras.requestId;
        return true;
    }

    // In shared mode, check if the result req id matches the streaming request
    // sent by client.
    if (resultExtras.requestId == mSharedStreamingRequest.first) {
    if (resultExtras.requestId == mSharedStreamingRequest.first) {
        *clientReqId = mSharedStreamingRequest.second;
        *clientReqId = mSharedStreamingRequest.second;
        return true;
        return true;
    }
    }
    // In shared mode, only primary clients can send the capture request. If the
    // result req id does not match the streaming request id, check against the
    // capture request ids sent by the primary client.
    if (mIsPrimaryClient) {
    if (mIsPrimaryClient) {
        auto iter = mSharedRequestMap.find(resultExtras.requestId);
        auto iter = mSharedRequestMap.find(resultExtras.requestId);
        if (iter != mSharedRequestMap.end()) {
        if (iter != mSharedRequestMap.end()) {
@@ -2568,8 +2577,7 @@ bool CameraDeviceClient::matchClientRequest(const CaptureResultExtras& resultExt
            return true;
            return true;
        }
        }
    }
    }
    }
    return false;
    return true;
}
}


void CameraDeviceClient::onResultAvailable(const CaptureResult& result) {
void CameraDeviceClient::onResultAvailable(const CaptureResult& result) {
+18 −20
Original line number Original line Diff line number Diff line
@@ -221,7 +221,6 @@ status_t AidlCamera3SharedDevice::beginConfigure() {
    mSharedSurfaces.clear();
    mSharedSurfaces.clear();
    mOpaqueConsumers.clear();
    mOpaqueConsumers.clear();
    mSharedSurfaceIds.clear();
    mSharedSurfaceIds.clear();
    mSharedStreams.clear();
    mStreamInfoMap.clear();
    mStreamInfoMap.clear();


    for (auto config : mSharedOutputConfigurations) {
    for (auto config : mSharedOutputConfigurations) {
@@ -266,24 +265,24 @@ status_t AidlCamera3SharedDevice::beginConfigure() {
                mOpaqueConsumers[i]);
                mOpaqueConsumers[i]);
        mOpaqueConsumers[i]->setFrameAvailableListener(consumerListener);
        mOpaqueConsumers[i]->setFrameAvailableListener(consumerListener);
        consumers.push_back({mSharedSurfaces[i], config.getMirrorMode()});
        consumers.push_back({mSharedSurfaces[i], config.getMirrorMode()});
        mSharedStreams.push_back(new Camera3SharedOutputStream(mNextStreamId, consumers,
        sp<Camera3SharedOutputStream> newStream = new Camera3SharedOutputStream(mNextStreamId, consumers,
                config.getWidth(),config.getHeight(), config.getFormat(), config.getUsage(),
                config.getWidth(),config.getHeight(), config.getFormat(), config.getUsage(),
                dataspace, static_cast<camera_stream_rotation_t>(config.getRotation()),
                dataspace, static_cast<camera_stream_rotation_t>(config.getRotation()),
                mTimestampOffset, config.getPhysicalCameraId(), overriddenSensorPixelModes,
                mTimestampOffset, config.getPhysicalCameraId(), overriddenSensorPixelModes,
                getTransportType(), config.getSurfaceSetID(), mUseHalBufManager,
                getTransportType(), config.getSurfaceSetID(), mUseHalBufManager,
                config.getDynamicRangeProfile(), config.getStreamUseCase(),
                config.getDynamicRangeProfile(), config.getStreamUseCase(),
                mDeviceTimeBaseIsRealtime, config.getTimestampBase(),
                mDeviceTimeBaseIsRealtime, config.getTimestampBase(),
                config.getColorSpace(), config.useReadoutTimestamp()));
                config.getColorSpace(), config.useReadoutTimestamp());
        int id = mSharedStreams[i]->getSurfaceId(consumers[0].mSurface);
        int id = newStream->getSurfaceId(consumers[0].mSurface);
        if (id < 0) {
        if (id < 0) {
            SET_ERR_L("Invalid surface id");
            SET_ERR_L("Invalid surface id");
            return BAD_VALUE;
            return BAD_VALUE;
        }
        }
        mSharedSurfaceIds.push_back(id);
        mSharedSurfaceIds.push_back(id);
        mSharedStreams[i]->setStatusTracker(mStatusTracker);
        newStream->setStatusTracker(mStatusTracker);
        mSharedStreams[i]->setBufferManager(mBufferManager);
        newStream->setBufferManager(mBufferManager);
        mSharedStreams[i]->setImageDumpMask(mImageDumpMask);
        newStream->setImageDumpMask(mImageDumpMask);
        res = mOutputStreams.add(mNextStreamId, mSharedStreams[i]);
        res = mOutputStreams.add(mNextStreamId, newStream);
        if (res < 0) {
        if (res < 0) {
            SET_ERR_L("Can't add new stream to set: %s (%d)", strerror(-res), res);
            SET_ERR_L("Can't add new stream to set: %s (%d)", strerror(-res), res);
            return res;
            return res;
@@ -343,7 +342,6 @@ status_t AidlCamera3SharedDevice::addSharedSurfaces(int streamId,
              streamId, res, strerror(-res));
              streamId, res, strerror(-res));
        return res;
        return res;
    }
    }

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


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


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


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


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


+4 −5
Original line number Original line Diff line number Diff line
@@ -38,7 +38,7 @@ class AidlCamera3SharedDevice :
            bool legacyClient = false);
            bool legacyClient = false);
    status_t initialize(sp<CameraProviderManager> manager,
    status_t initialize(sp<CameraProviderManager> manager,
            const std::string& monitorTags) override;
            const std::string& monitorTags) override;
    status_t disconnectClient(int clientUid) override;
    status_t disconnectClient(int clientPid) override;
    status_t beginConfigure() override;
    status_t beginConfigure() override;
    status_t getSharedStreamId(const OutputStreamInfo &config, int *streamId) override;
    status_t getSharedStreamId(const OutputStreamInfo &config, int *streamId) override;
    status_t addSharedSurfaces(int streamId,
    status_t addSharedSurfaces(int streamId,
@@ -94,15 +94,14 @@ class AidlCamera3SharedDevice :
    std::vector<int> mSharedSurfaceIds;
    std::vector<int> mSharedSurfaceIds;
    std::vector<sp<Surface>> mSharedSurfaces;
    std::vector<sp<Surface>> mSharedSurfaces;
    std::vector<sp<BufferItemConsumer>> mOpaqueConsumers;
    std::vector<sp<BufferItemConsumer>> mOpaqueConsumers;
    std::vector<sp<Camera3SharedOutputStream>> mSharedStreams;
    std::unordered_map<int32_t, OutputStreamInfo> mStreamInfoMap;
    std::unordered_map<int32_t, OutputStreamInfo> mStreamInfoMap;
    // Streaming request ID
    // Streaming request ID
    int32_t mStreamingRequestId;
    int32_t mStreamingRequestId;
    static const int32_t REQUEST_ID_NONE = -1;
    static const int32_t REQUEST_ID_NONE = -1;
    int32_t mRequestIdCounter;
    int32_t mRequestIdCounter;
    std::unordered_map<uid_t, int32_t> mClientRequestIds;
    std::unordered_map<int, int32_t> mClientRequestIds;
    std::unordered_map<uid_t, SurfaceMap> mClientSurfaces;
    std::unordered_map<int, SurfaceMap> mClientSurfaces;
    std::unordered_map<uid_t, wp<NotificationListener>> mClientListeners;
    std::unordered_map<int, wp<NotificationListener>> mClientListeners;
    SurfaceMap mergeSurfaceMaps(const SurfaceMap& map1, const SurfaceMap& map2);
    SurfaceMap mergeSurfaceMaps(const SurfaceMap& map1, const SurfaceMap& map2);
    SurfaceMap removeClientSurfaceMap(const SurfaceMap& map1, const SurfaceMap& map2);
    SurfaceMap removeClientSurfaceMap(const SurfaceMap& map1, const SurfaceMap& map2);
    Mutex mSharedDeviceLock;
    Mutex mSharedDeviceLock;