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

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

Fix shared stream leak in camera2 shared device

This change fixes two issues:
1) shared stream leak
2) bug discovered in matchClientRequest for shared device client

Flag: com.android.internal.camera.flags.camera_multi_client
Bug: 391456220
Test: run CTS test SharedCameraTest#testSharedSessionCreationDifferentStreams
Change-Id: Id014f99678112ff669e0440de50bfc3c6cc0f6e4
parent 8c22dc7b
Loading
Loading
Loading
Loading
+21 −13
Original line number Diff line number Diff line
@@ -2556,11 +2556,20 @@ std::vector<PhysicalCaptureResultInfo> CameraDeviceClient::convertToFMQ(

bool CameraDeviceClient::matchClientRequest(const CaptureResultExtras& resultExtras,
        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) {
        *clientReqId = mSharedStreamingRequest.second;
        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) {
        auto iter = mSharedRequestMap.find(resultExtras.requestId);
        if (iter != mSharedRequestMap.end()) {
@@ -2568,8 +2577,7 @@ bool CameraDeviceClient::matchClientRequest(const CaptureResultExtras& resultExt
            return true;
        }
    }
    }
    return true;
    return false;
}

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

    for (auto config : mSharedOutputConfigurations) {
@@ -266,24 +265,24 @@ status_t AidlCamera3SharedDevice::beginConfigure() {
                mOpaqueConsumers[i]);
        mOpaqueConsumers[i]->setFrameAvailableListener(consumerListener);
        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(),
                dataspace, static_cast<camera_stream_rotation_t>(config.getRotation()),
                mTimestampOffset, config.getPhysicalCameraId(), overriddenSensorPixelModes,
                getTransportType(), config.getSurfaceSetID(), mUseHalBufManager,
                config.getDynamicRangeProfile(), config.getStreamUseCase(),
                mDeviceTimeBaseIsRealtime, config.getTimestampBase(),
                config.getColorSpace(), config.useReadoutTimestamp()));
        int id = mSharedStreams[i]->getSurfaceId(consumers[0].mSurface);
                config.getColorSpace(), config.useReadoutTimestamp());
        int id = newStream->getSurfaceId(consumers[0].mSurface);
        if (id < 0) {
            SET_ERR_L("Invalid surface id");
            return BAD_VALUE;
        }
        mSharedSurfaceIds.push_back(id);
        mSharedStreams[i]->setStatusTracker(mStatusTracker);
        mSharedStreams[i]->setBufferManager(mBufferManager);
        mSharedStreams[i]->setImageDumpMask(mImageDumpMask);
        res = mOutputStreams.add(mNextStreamId, mSharedStreams[i]);
        newStream->setStatusTracker(mStatusTracker);
        newStream->setBufferManager(mBufferManager);
        newStream->setImageDumpMask(mImageDumpMask);
        res = mOutputStreams.add(mNextStreamId, newStream);
        if (res < 0) {
            SET_ERR_L("Can't add new stream to set: %s (%d)", strerror(-res), res);
            return res;
+0 −1
Original line number Diff line number Diff line
@@ -94,7 +94,6 @@ class AidlCamera3SharedDevice :
    std::vector<int> mSharedSurfaceIds;
    std::vector<sp<Surface>> mSharedSurfaces;
    std::vector<sp<BufferItemConsumer>> mOpaqueConsumers;
    std::vector<sp<Camera3SharedOutputStream>> mSharedStreams;
    std::unordered_map<int32_t, OutputStreamInfo> mStreamInfoMap;
    // Streaming request ID
    int32_t mStreamingRequestId;