[libcamera-devel] [PATCH v3 03/11] libcamera: request: Provide a sequence number

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Mar 26 16:50:16 CET 2021


Hi Kieran,

On Fri, Mar 26, 2021 at 02:54:41PM +0000, Kieran Bingham wrote:
> On 26/03/2021 02:05, Laurent Pinchart wrote:
> > On Thu, Mar 25, 2021 at 01:42:23PM +0000, Kieran Bingham wrote:
> >> Provide a sequence number on Requests which are added by the pipeline
> >> handler.
> >>
> >> Each pipeline handler keeps a requestSequence per CameraData and
> >> increments everytime a request is queued on that camera.
> >>
> >> The sequence number is associated with the Request and can be utilised
> >> for assisting with debugging, and printing the queueing sequence of in
> >> flight requests.
> >>
> >> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> >> ---
> >>  include/libcamera/internal/pipeline_handler.h |  4 +++-
> >>  include/libcamera/request.h                   |  2 ++
> >>  src/libcamera/pipeline_handler.cpp            |  2 ++
> >>  src/libcamera/request.cpp                     | 11 +++++++++--
> >>  4 files changed, 16 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
> >> index 6aca0b46f43d..9bdda8f3b799 100644
> >> --- a/include/libcamera/internal/pipeline_handler.h
> >> +++ b/include/libcamera/internal/pipeline_handler.h
> >> @@ -38,7 +38,7 @@ class CameraData
> >>  {
> >>  public:
> >>  	explicit CameraData(PipelineHandler *pipe)
> >> -		: pipe_(pipe)
> >> +		: pipe_(pipe), requestSequence_(0)
> >>  	{
> >>  	}
> >>  	virtual ~CameraData() = default;
> >> @@ -48,6 +48,8 @@ public:
> >>  	ControlInfoMap controlInfo_;
> >>  	ControlList properties_;
> >>  
> >> +	uint32_t requestSequence_;
> >> +
> >>  private:
> >>  	LIBCAMERA_DISABLE_COPY(CameraData)
> >>  };
> >> diff --git a/include/libcamera/request.h b/include/libcamera/request.h
> >> index 6e5aad5f6b75..cd5a24741f8a 100644
> >> --- a/include/libcamera/request.h
> >> +++ b/include/libcamera/request.h
> >> @@ -50,6 +50,7 @@ public:
> >>  	int addBuffer(const Stream *stream, FrameBuffer *buffer);
> >>  	FrameBuffer *findBuffer(const Stream *stream) const;
> >>  
> >> +	uint32_t sequence() const { return sequence_; }
> >>  	uint64_t cookie() const { return cookie_; }
> >>  	Status status() const { return status_; }
> >>  
> >> @@ -71,6 +72,7 @@ private:
> >>  	BufferMap bufferMap_;
> >>  	std::unordered_set<FrameBuffer *> pending_;
> >>  
> >> +	uint32_t sequence_;
> >>  	const uint64_t cookie_;
> >>  	Status status_;
> >>  	bool cancelled_;
> >> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
> >> index d22991d318c9..e3d4975d9ffd 100644
> >> --- a/src/libcamera/pipeline_handler.cpp
> >> +++ b/src/libcamera/pipeline_handler.cpp
> >> @@ -382,6 +382,8 @@ int PipelineHandler::queueRequest(Request *request)
> >>  	CameraData *data = cameraData(camera);
> >>  	data->queuedRequests_.push_back(request);
> >>  
> >> +	request->sequence_ = data->requestSequence_++;
> >> +
> >>  	int ret = queueRequestDevice(camera, request);
> >>  	if (ret)
> >>  		data->queuedRequests_.remove(request);
> >> diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
> >> index 3ad83f3b8418..fc16b148a599 100644
> >> --- a/src/libcamera/request.cpp
> >> +++ b/src/libcamera/request.cpp
> >> @@ -72,8 +72,8 @@ LOG_DEFINE_CATEGORY(Request)
> >>   *
> >>   */
> >>  Request::Request(Camera *camera, uint64_t cookie)
> >> -	: camera_(camera), cookie_(cookie), status_(RequestPending),
> >> -	  cancelled_(false)
> >> +	: camera_(camera), sequence_(0), cookie_(cookie),
> >> +	  status_(RequestPending), cancelled_(false)
> >>  {
> >>  	/**
> >>  	 * \todo Should the Camera expose a validator instance, to avoid
> >> @@ -126,6 +126,7 @@ void Request::reuse(ReuseFlag flags)
> >>  		bufferMap_.clear();
> >>  	}
> >>  
> >> +	sequence_ = 0;
> >>  	status_ = RequestPending;
> >>  	cancelled_ = false;
> >>  
> >> @@ -227,6 +228,12 @@ FrameBuffer *Request::findBuffer(const Stream *stream) const
> >>   * \return The metadata associated with the request
> >>   */
> >>  
> >> +/**
> >> + * \fn Request::sequence()
> >> + * \brief Retrieve the sequence number for the request
> >> + * \return The request sequence number
> > 
> > As the sequence number is exposed in the public API, could you elaborate
> > a bit more, to explain what it is and what it's used for ? Otherwise,
> > the patch looks good to me.
> 
> I can - but I also expect this is likely to move to the private
> structures when Request becomes Extensible. Unless you'd prefer it to be
> part of the public API?
> 
> Maybe it has some value to applications?

Good question. I think it may, but I'm not sure.

> \brief Retrieve the sequence number for the request
> 
> When requests are queued, they are given a sequential number to track
> the order in which requests are queued to a camera. This number counts
> all requests given to a camera through its lifetime, and is not reset to
> zero between camera stop/start sequences.
> 
> It can be used to support debugging and identifying the flow of requests
> through a pipeline, but does not guarantee to represent the sequence
> number of any images in the stream. The sequence number is stored as an
> unsigned integer and will wrap when overflowed.
> 
> \return The request sequence number

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> >> + */
> >> +
> >>  /**
> >>   * \fn Request::cookie()
> >>   * \brief Retrieve the cookie set when the request was created

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list