[PATCH v4 7/7] android: Remove Camera3RequestDescriptor::streamsProcessMutex_

Cheng-Hao Yang chenghaoyang at chromium.org
Mon Jan 20 22:25:27 CET 2025


Friendly ping for Laurent, please take a look when available.

Thanks,
Harvey

On Thu, Jan 2, 2025 at 2:17 PM Cheng-Hao Yang <chenghaoyang at chromium.org> wrote:
>
> Hi Laurent,
>
> I think Jacopo left this to your review. Could you take a look when
> you've got some time?
> This should be the last patch in this series that hasn't been reviewed.
>
> Thanks,
> Harvey
>
> On Tue, Dec 10, 2024 at 3:26 PM Harvey Yang <chenghaoyang at chromium.org> wrote:
> >
> > This mutex was needed when CameraStream's worker thread posts a result
> > back to CameraDevice. We can simplify it by calling CameraDevice's
> > function on libcamera::Camera's owner thread. With this delegation,
> > `Camera3RequestDescriptor::pendingStreamsToProcess_` will be firstly
> > setup in the application's thread in processCaptureRequest(), and the
> > rest accesses will be done in libcamera::CameraManager's thread.
> >
> > Signed-off-by: Han-Lin Chen <hanlinchen at chromium.org>
> > Co-developed-by: Harvey Yang <chenghaoyang at chromium.org>
> > Signed-off-by: Harvey Yang <chenghaoyang at chromium.org>
> > ---
> >  src/android/camera_device.cpp | 33 +++++++++++++++++----------------
> >  src/android/camera_device.h   |  6 ++++--
> >  src/android/camera_request.h  |  4 +---
> >  src/android/camera_stream.cpp |  4 ++--
> >  4 files changed, 24 insertions(+), 23 deletions(-)
> >
> > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> > index a95114c8d..cb819938a 100644
> > --- a/src/android/camera_device.cpp
> > +++ b/src/android/camera_device.cpp
> > @@ -989,8 +989,6 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
> >                 FrameBuffer *frameBuffer = nullptr;
> >                 UniqueFD acquireFence;
> >
> > -               MutexLocker lock(descriptor->streamsProcessMutex_);
> > -
> >                 switch (cameraStream->type()) {
> >                 case CameraStream::Type::Mapped:
> >                         /* Mapped streams will be handled in the next loop. */
> > @@ -1066,7 +1064,6 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
> >                                 << cameraStream->configuration().pixelFormat << "]"
> >                                 << " (mapped)";
> >
> > -               MutexLocker lock(descriptor->streamsProcessMutex_);
> >                 descriptor->pendingStreamsToProcess_.insert({ cameraStream, &buffer });
> >
> >                 /*
> > @@ -1252,9 +1249,6 @@ void CameraDevice::requestComplete(Request *request)
> >                 descriptor->resultMetadata_ = std::make_unique<CameraMetadata>(0, 0);
> >         }
> >
> > -       /* Handle post-processing. */
> > -       MutexLocker locker(descriptor->streamsProcessMutex_);
> > -
> >         /*
> >          * Queue all the post-processing streams request at once. The completion
> >          * slot streamProcessingComplete() can only execute when we are out
> > @@ -1288,10 +1282,8 @@ void CameraDevice::requestComplete(Request *request)
> >                 }
> >         }
> >
> > -       if (descriptor->pendingStreamsToProcess_.empty()) {
> > -               locker.unlock();
> > +       if (descriptor->pendingStreamsToProcess_.empty())
> >                 completeDescriptor(descriptor);
> > -       }
> >  }
> >
> >  /**
> > @@ -1398,6 +1390,19 @@ void CameraDevice::setBufferStatus(StreamBuffer &streamBuffer,
> >         }
> >  }
> >
> > +void CameraDevice::streamProcessingCompleteDelegate(StreamBuffer *streamBuffer,
> > +                                                   StreamBuffer::Status status)
> > +{
> > +       /*
> > +        * Delegate the callback to the camera manager thread to simplify race condition.
> > +        */
> > +       auto *method = new BoundMethodMember{
> > +               this, camera_.get(), &CameraDevice::streamProcessingComplete, ConnectionTypeQueued
> > +       };
> > +
> > +       method->activate(streamBuffer, status);
> > +}
> > +
> >  /**
> >   * \brief Handle post-processing completion of a stream in a capture request
> >   * \param[in] streamBuffer The StreamBuffer for which processing is complete
> > @@ -1418,13 +1423,9 @@ void CameraDevice::streamProcessingComplete(StreamBuffer *streamBuffer,
> >
> >         Camera3RequestDescriptor *request = streamBuffer->request;
> >
> > -       {
> > -               MutexLocker locker(request->streamsProcessMutex_);
> > -
> > -               request->pendingStreamsToProcess_.erase(streamBuffer->stream);
> > -               if (!request->pendingStreamsToProcess_.empty())
> > -                       return;
> > -       }
> > +       request->pendingStreamsToProcess_.erase(streamBuffer->stream);
> > +       if (!request->pendingStreamsToProcess_.empty())
> > +               return;
> >
> >         completeDescriptor(streamBuffer->request);
> >  }
> > diff --git a/src/android/camera_device.h b/src/android/camera_device.h
> > index 699aa8f17..69d163d76 100644
> > --- a/src/android/camera_device.h
> > +++ b/src/android/camera_device.h
> > @@ -65,8 +65,8 @@ public:
> >         int configureStreams(camera3_stream_configuration_t *stream_list);
> >         int processCaptureRequest(camera3_capture_request_t *request);
> >         void requestComplete(libcamera::Request *request);
> > -       void streamProcessingComplete(StreamBuffer *bufferStream,
> > -                                     StreamBuffer::Status status);
> > +       void streamProcessingCompleteDelegate(StreamBuffer *bufferStream,
> > +                                             StreamBuffer::Status status);
> >
> >  protected:
> >         std::string logPrefix() const override;
> > @@ -96,6 +96,8 @@ private:
> >         int processControls(Camera3RequestDescriptor *descriptor);
> >         void completeDescriptor(Camera3RequestDescriptor *descriptor)
> >                 LIBCAMERA_TSA_EXCLUDES(descriptorsMutex_);
> > +       void streamProcessingComplete(StreamBuffer *bufferStream,
> > +                                     StreamBuffer::Status status);
> >         void sendCaptureResults() LIBCAMERA_TSA_REQUIRES(descriptorsMutex_);
> >         void sendCaptureResult(Camera3RequestDescriptor *request) const;
> >         void setBufferStatus(StreamBuffer &buffer,
> > diff --git a/src/android/camera_request.h b/src/android/camera_request.h
> > index 6b2a00795..bd75d4595 100644
> > --- a/src/android/camera_request.h
> > +++ b/src/android/camera_request.h
> > @@ -66,9 +66,7 @@ public:
> >         };
> >
> >         /* Keeps track of streams requiring post-processing. */
> > -       std::map<CameraStream *, StreamBuffer *> pendingStreamsToProcess_
> > -               LIBCAMERA_TSA_GUARDED_BY(streamsProcessMutex_);
> > -       libcamera::Mutex streamsProcessMutex_;
> > +       std::map<CameraStream *, StreamBuffer *> pendingStreamsToProcess_;
> >
> >         Camera3RequestDescriptor(libcamera::Camera *camera,
> >                                  const camera3_capture_request_t *camera3Request);
> > diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
> > index 53f292d4b..7837fd7aa 100644
> > --- a/src/android/camera_stream.cpp
> > +++ b/src/android/camera_stream.cpp
> > @@ -121,8 +121,8 @@ int CameraStream::configure()
> >                                 else
> >                                         bufferStatus = StreamBuffer::Status::Error;
> >
> > -                               cameraDevice_->streamProcessingComplete(streamBuffer,
> > -                                                                       bufferStatus);
> > +                               cameraDevice_->streamProcessingCompleteDelegate(streamBuffer,
> > +                                                                               bufferStatus);
> >                         });
> >
> >                 worker_->start();
> > --
> > 2.47.0.338.g60cca15819-goog
> >


More information about the libcamera-devel mailing list