[libcamera-devel] [PATCH v2 04/16] libcamera: request: Add cookie to make request tracking easier
Niklas Söderlund
niklas.soderlund at ragnatech.se
Sun Jul 14 09:07:11 CEST 2019
Hi Laurent,
Thanks for your patch.
On 2019-07-13 20:23:39 +0300, Laurent Pinchart wrote:
> Applications often have to map requests queued to a camera to external
> resources. To make this easy, add a 64-bit integer cookie to the Request
> class that is set when the request is created and can be retrieved at
> any time, especially in the request completion handler. The cookie is
> completely transparent for libcamera and is never modified.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> include/libcamera/camera.h | 3 ++-
> include/libcamera/request.h | 5 ++++-
> src/libcamera/camera.cpp | 10 ++++++++--
> src/libcamera/request.cpp | 18 ++++++++++++++++--
> 4 files changed, 30 insertions(+), 6 deletions(-)
>
> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
> index 6d693d9a6c7a..21fac550f412 100644
> --- a/include/libcamera/camera.h
> +++ b/include/libcamera/camera.h
> @@ -10,6 +10,7 @@
> #include <map>
> #include <memory>
> #include <set>
> +#include <stdint.h>
> #include <string>
>
> #include <libcamera/controls.h>
> @@ -93,7 +94,7 @@ public:
> int allocateBuffers();
> int freeBuffers();
>
> - Request *createRequest();
> + Request *createRequest(uint64_t cookie = 0);
> int queueRequest(Request *request);
>
> int start();
> diff --git a/include/libcamera/request.h b/include/libcamera/request.h
> index a93468d7c8b7..dd165bc21c03 100644
> --- a/include/libcamera/request.h
> +++ b/include/libcamera/request.h
> @@ -8,6 +8,7 @@
> #define __LIBCAMERA_REQUEST_H__
>
> #include <map>
> +#include <stdint.h>
> #include <unordered_set>
>
> #include <libcamera/controls.h>
> @@ -29,7 +30,7 @@ public:
> RequestCancelled,
> };
>
> - explicit Request(Camera *camera);
> + Request(Camera *camera, uint64_t cookie = 0);
> Request(const Request &) = delete;
> Request &operator=(const Request &) = delete;
>
> @@ -38,6 +39,7 @@ public:
> int setBuffers(const std::map<Stream *, Buffer *> &streamMap);
> Buffer *findBuffer(Stream *stream) const;
>
> + uint64_t cookie() const { return cookie_; }
> Status status() const { return status_; }
>
> bool hasPendingBuffers() const { return !pending_.empty(); }
> @@ -56,6 +58,7 @@ private:
> std::map<Stream *, Buffer *> bufferMap_;
> std::unordered_set<Buffer *> pending_;
>
> + uint64_t cookie_;
I think this should be const uint64_t, with this fixed.
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> Status status_;
> };
>
> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
> index 810cb1295f34..1f307654ab01 100644
> --- a/src/libcamera/camera.cpp
> +++ b/src/libcamera/camera.cpp
> @@ -754,10 +754,16 @@ int Camera::freeBuffers()
>
> /**
> * \brief Create a request object for the camera
> + * \param[in] cookie Opaque cookie for application use
> *
> * This method creates an empty request for the application to fill with
> * buffers and paramaters, and queue for capture.
> *
> + * The \a cookie is stored in the request and is accessible through the
> + * Request::cookie() method at any time. It is typically used by applications
> + * to map the request to an external resource in the request completion
> + * handler, and is completely opaque to libcamera.
> + *
> * The ownership of the returned request is passed to the caller, which is
> * responsible for either queueing the request or deleting it.
> *
> @@ -766,12 +772,12 @@ int Camera::freeBuffers()
> *
> * \return A pointer to the newly created request, or nullptr on error
> */
> -Request *Camera::createRequest()
> +Request *Camera::createRequest(uint64_t cookie)
> {
> if (disconnected_ || !stateBetween(CameraPrepared, CameraRunning))
> return nullptr;
>
> - return new Request(this);
> + return new Request(this, cookie);
> }
>
> /**
> diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
> index f0b5985814bd..8cf41a43a80e 100644
> --- a/src/libcamera/request.cpp
> +++ b/src/libcamera/request.cpp
> @@ -46,9 +46,17 @@ LOG_DEFINE_CATEGORY(Request)
> /**
> * \brief Create a capture request for a camera
> * \param[in] camera The camera that creates the request
> + * \param[in] cookie Opaque cookie for application use
> + *
> + * The \a cookie is stored in the request and is accessible through the
> + * cookie() method at any time. It is typically used by applications to map the
> + * request to an external resource in the request completion handler, and is
> + * completely opaque to libcamera.
> + *
> */
> -Request::Request(Camera *camera)
> - : camera_(camera), controls_(camera), status_(RequestPending)
> +Request::Request(Camera *camera, uint64_t cookie)
> + : camera_(camera), controls_(camera), cookie_(cookie),
> + status_(RequestPending)
> {
> }
>
> @@ -119,6 +127,12 @@ Buffer *Request::findBuffer(Stream *stream) const
> return it->second;
> }
>
> +/**
> + * \fn Request::cookie()
> + * \brief Retrieve the cookie set when the request was created
> + * \return The request cookie
> + */
> +
> /**
> * \fn Request::status()
> * \brief Retrieve the request completion status
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list