[libcamera-devel] [PATCH 1/5] libcamera: camera: Make camera state accessible

Jacopo Mondi jacopo at jmondi.org
Tue Aug 6 11:36:21 CEST 2019


Hi Laurent,

On Mon, Aug 05, 2019 at 02:40:05PM +0300, Laurent Pinchart wrote:
> Hi Jacopo,
>
> Thank you for the patch.
>
> On Thu, Aug 01, 2019 at 05:54:16PM +0200, Jacopo Mondi wrote:
> > Make the Camera state accessible by providing an accessor operation and
> > moving the State enumeration definition in the public scope.
> >
> > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
>
> I'm in two minds about this. The state is supposed to be internal, and
> exposing it will create an ABI that will make it more difficult to
> change it later. Looking at the camera HAL implementation, you use the
> state in two places only, once to check if a request is the first one,
> and once to decide if stop() should be called. The latter isn't needed,
> you can call stop() unconditionally. I'm tempted to ask you to drop this
> patch and keep the information you need for the first use inside the
> camera HAL implementation, at least until we find out if there are other
> reasons to expose the state. Would that be OK ?
>

I agree, I could keep the state in the HAL. I tried avoiding doing
that as the internal state would actually replicate the camera state,
and the less places where the same information is replicated the
better, but I can work around it for sure.

Thanks
   j

> > ---
> >  include/libcamera/camera.h | 16 +++++++++-------
> >  src/libcamera/camera.cpp   | 33 +++++++++++++++++++++++++++------
> >  2 files changed, 36 insertions(+), 13 deletions(-)
> >
> > diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
> > index 21fac550f412..6e627943b3f1 100644
> > --- a/include/libcamera/camera.h
> > +++ b/include/libcamera/camera.h
> > @@ -66,6 +66,14 @@ protected:
> >  	std::vector<StreamConfiguration> config_;
> >  };
> >
> > +enum State {
> > +	CameraAvailable,
> > +	CameraAcquired,
> > +	CameraConfigured,
> > +	CameraPrepared,
> > +	CameraRunning,
> > +};
> > +
> >  class Camera final : public std::enable_shared_from_this<Camera>
> >  {
> >  public:
> > @@ -77,6 +85,7 @@ public:
> >  	Camera &operator=(const Camera &) = delete;
> >
> >  	const std::string &name() const;
> > +	State state() const { return state_; }
> >
> >  	Signal<Request *, Buffer *> bufferCompleted;
> >  	Signal<Request *, const std::map<Stream *, Buffer *> &> requestCompleted;
> > @@ -101,13 +110,6 @@ public:
> >  	int stop();
> >
> >  private:
> > -	enum State {
> > -		CameraAvailable,
> > -		CameraAcquired,
> > -		CameraConfigured,
> > -		CameraPrepared,
> > -		CameraRunning,
> > -	};
> >
> >  	Camera(PipelineHandler *pipe, const std::string &name);
> >  	~Camera();
> > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
> > index 76c737cb9381..e924c2085816 100644
> > --- a/src/libcamera/camera.cpp
> > +++ b/src/libcamera/camera.cpp
> > @@ -253,6 +253,21 @@ std::size_t CameraConfiguration::size() const
> >   * \brief The vector of stream configurations
> >   */
> >
> > +/**
> > + * \enum State
> > + * \brief Describe the Camera state as defined in \ref camera_states
> > + * \var State::CameraAvailable
> > + * See \ref camera_available
> > + * \var State::CameraAcquired
> > + * See \ref camera_acquired
> > + * \var State::CameraConfigured
> > + * See \ref camera_configured
> > + * \var State::CameraPrepared
> > + * See \ref camera_prepared
> > + * \var State::CameraRunning
> > + * See \ref camera_running
> > + */
> > +
> >  /**
> >   * \class Camera
> >   * \brief Camera device
> > @@ -284,7 +299,7 @@ std::size_t CameraConfiguration::size() const
> >   * not released. The camera may also be reconfigured provided that all
> >   * resources allocated are freed prior to the reconfiguration.
> >   *
> > - * \subsection Camera States
> > + * \subsection camera_states Camera States
> >   *
> >   * To help manage the sequence of operations needed to control the camera a set
> >   * of states are defined. Each state describes which operations may be performed
> > @@ -318,27 +333,27 @@ std::size_t CameraConfiguration::size() const
> >   * }
> >   * \enddot
> >   *
> > - * \subsubsection Available
> > + * \subsubsection camera_available Available
> >   * The base state of a camera, an application can inspect the properties of the
> >   * camera to determine if it wishes to use it. If an application wishes to use
> >   * a camera it should acquire() it to proceed to the Acquired state.
> >   *
> > - * \subsubsection Acquired
> > + * \subsubsection camera_acquired Acquired
> >   * In the acquired state an application has exclusive access to the camera and
> >   * may modify the camera's parameters to configure it and proceed to the
> >   * Configured state.
> >   *
> > - * \subsubsection Configured
> > + * \subsubsection camera_configured Configured
> >   * The camera is configured and ready for the application to prepare it with
> >   * resources. The camera may be reconfigured multiple times until resources
> >   * are provided and the state progresses to Prepared.
> >   *
> > - * \subsubsection Prepared
> > + * \subsubsection camera_prepared Prepared
> >   * The camera has been configured and provided with resources and is ready to be
> >   * started. The application may free the camera's resources to get back to the
> >   * Configured state or start() it to progress to the Running state.
> >   *
> > - * \subsubsection Running
> > + * \subsubsection camera_running Running
> >   * The camera is running and ready to process requests queued by the
> >   * application. The camera remains in this state until it is stopped and moved
> >   * to the Prepared state.
> > @@ -380,6 +395,12 @@ const std::string &Camera::name() const
> >  	return name_;
> >  }
> >
> > +/**
> > + * \fn Camera::state()
> > + * \brief Retrieve the current camera state as defined in \ref camera_states
> > + * \return The current camera state
> > + */
> > +
> >  /**
> >   * \var Camera::bufferCompleted
> >   * \brief Signal emitted when a buffer for a request queued to the camera has
>
> --
> Regards,
>
> Laurent Pinchart
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20190806/e0a386f9/attachment.sig>


More information about the libcamera-devel mailing list