summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libcamera/camera.h3
-rw-r--r--include/libcamera/request.h5
-rw-r--r--src/libcamera/camera.cpp10
-rw-r--r--src/libcamera/request.cpp18
4 files changed, 30 insertions, 6 deletions
diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
index 6d693d9a..21fac550 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 a93468d7..4fdb3b51 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_;
+ const uint64_t cookie_;
Status status_;
};
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index 810cb129..1f307654 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 f0b59858..8cf41a43 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)
{
}
@@ -120,6 +128,12 @@ Buffer *Request::findBuffer(Stream *stream) const
}
/**
+ * \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
*