[libcamera-devel] [PATCH v3 8/9] libcamera: pipeline: virtual: Queue requests
Harvey Yang
chenghaoyang at chromium.org
Thu Jan 5 05:37:25 CET 2023
[todo Use UDMA to allocate buffers in the exportFrameBuffers API]
[todo Read frames from the virtual video if any]
Currently we only use external buffers and complete them immediately
with green frames.
Signed-off-by: Harvey Yang <chenghaoyang at chromium.org>
---
src/libcamera/pipeline/virtual/virtual.cpp | 29 +++++++++++++++++++---
1 file changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/libcamera/pipeline/virtual/virtual.cpp b/src/libcamera/pipeline/virtual/virtual.cpp
index ef2901e7..db6fe14c 100644
--- a/src/libcamera/pipeline/virtual/virtual.cpp
+++ b/src/libcamera/pipeline/virtual/virtual.cpp
@@ -8,6 +8,8 @@
#include <libcamera/base/log.h>
#include <libcamera/camera.h>
+#include <libcamera/control_ids.h>
+#include <libcamera/controls.h>
#include <libcamera/formats.h>
#include "libcamera/internal/camera.h"
@@ -18,6 +20,17 @@ namespace libcamera {
LOG_DEFINE_CATEGORY(VIRTUAL)
+uint64_t CurrentTimestamp()
+{
+ struct timespec ts;
+ if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0) {
+ LOG(VIRTUAL, Error) << "Get clock time fails";
+ return 0;
+ }
+
+ return ts.tv_sec * 1'000'000'000LL + ts.tv_nsec;
+}
+
class VirtualCameraData : public Camera::Private
{
public:
@@ -214,6 +227,7 @@ int PipelineHandlerVirtual::exportFrameBuffers(Camera *camera, Stream *stream,
(void)camera;
(void)stream;
(void)buffers;
+ // TODO: Use UDMA to allocate buffers.
return -1;
}
@@ -221,19 +235,28 @@ int PipelineHandlerVirtual::start(Camera *camera, const ControlList *controls)
{
(void)camera;
(void)controls;
- return -1;
+ // TODO: Start reading the virtual video if any.
+ return 0;
}
void PipelineHandlerVirtual::stopDevice(Camera *camera)
{
(void)camera;
+ // TODO: Reset the virtual video if any.
}
int PipelineHandlerVirtual::queueRequestDevice(Camera *camera, Request *request)
{
(void)camera;
- (void)request;
- return -1;
+
+ // TODO: Read from the virtual video if any.
+ for (auto it : request->buffers())
+ completeBuffer(request, it.second);
+
+ request->metadata().set(controls::SensorTimestamp, CurrentTimestamp());
+ completeRequest(request);
+
+ return 0;
}
bool PipelineHandlerVirtual::match(DeviceEnumerator *enumerator)
--
2.39.0.314.g84b9a713c41-goog
More information about the libcamera-devel
mailing list