[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