[libcamera-devel] [RFC PATCH v2 6/9] libcamera: request: Add a ControlList

Kieran Bingham kieran.bingham at ideasonboard.com
Wed Jun 26 13:30:21 CEST 2019


Hi Laurent,

On 23/06/2019 23:31, Laurent Pinchart wrote:
> Hi Kieran,
> 
> Thank you for the patch.
> 
> On Sun, Jun 23, 2019 at 05:36:52PM +0200, Niklas Söderlund wrote:
>> On 2019-06-21 17:13:58 +0100, Kieran Bingham wrote:
>>> Provide a ControlList on request objects to facilitate setting controls
>>>
>>> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>>> ---
>>>  include/libcamera/request.h |  3 +++
>>>  src/libcamera/request.cpp   | 10 ++++++++++
>>>  2 files changed, 13 insertions(+)
>>>
>>> diff --git a/include/libcamera/request.h b/include/libcamera/request.h
>>> index 58de6f00a554..8075270a9a12 100644
>>> --- a/include/libcamera/request.h
>>> +++ b/include/libcamera/request.h
>>> @@ -11,6 +11,7 @@
>>>  #include <unordered_set>
>>>  
>>>  #include <libcamera/signal.h>
>>> +#include <libcamera/controls.h>
>>
>> Alphabetical order please.
>>
>> With this fixed,
>>
>> Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
>>
>>>  
>>>  namespace libcamera {
>>>  
>>> @@ -32,6 +33,7 @@ public:
>>>  	Request(const Request &) = delete;
>>>  	Request &operator=(const Request &) = delete;
>>>  
>>> +	ControlList &controls() { return controls_; }
>>>  	const std::map<Stream *, Buffer *> &buffers() const { return bufferMap_; }
>>>  	int setBuffers(const std::map<Stream *, Buffer *> &streamMap);
>>>  	Buffer *findBuffer(Stream *stream) const;
>>> @@ -50,6 +52,7 @@ private:
>>>  	bool completeBuffer(Buffer *buffer);
>>>  
>>>  	Camera *camera_;
>>> +	ControlList controls_;
>>>  	std::map<Stream *, Buffer *> bufferMap_;
>>>  	std::unordered_set<Buffer *> pending_;
>>>  
>>> diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
>>> index fa3ee46da440..9a0409b46017 100644
>>> --- a/src/libcamera/request.cpp
>>> +++ b/src/libcamera/request.cpp
>>> @@ -52,6 +52,16 @@ Request::Request(Camera *camera)
>>>  {
>>>  }
>>>  
>>> +/**
>>> + * \fn Request::controls()
>>> + * \brief Retrieve the request's ControlList
>>> + *
>>> + * Return a reference to the ControlList that stores all the controls relevant
>>> + * to this request.
>>> + *
>>> + * \return A reference to the ControlList in this request
>>> + */
> 
> We need more documentation, with a focus on how this API should be used
> by applications.


Sure. RFC==WIP right? Maybe I am using RFC too strongly?

I'm trying to get the underlying implementation right before fully
documenting (and re-documenting for every change)

This exposes the list, so I think is a good place for documenting how
the Controls should be added to the request.

I wonder if we're going to need some more 'higher level' documentation
somewhere describing how to write a libcamera application in the first
place... (as well, I'm not saying instead of this).


>  I also expect that you will need to reset the controls
> once the request complete, as request objects can be reused.

I don't think requests can be reused currently:

/**
 * \brief Handle request completion and notify application
 * \param[in] request The request that has completed
 *
 * This function is called by the pipeline handler to notify the camera that
 * the request has completed. It emits the requestCompleted signal and
deletes
 * the request.
 */
void Camera::requestComplete(Request *request)
{
	std::map<Stream *, Buffer *> buffers(std::move(request->bufferMap_));
	requestCompleted.emit(request, buffers);
	delete request;
}


If that changes, then probably yes, the ControlList should be cleared at
some point during requestComplete();


-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list