From patchwork Wed Nov 20 01:54:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 2332 Return-Path: Received: from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net [195.74.38.227]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 6D8B36137A for ; Wed, 20 Nov 2019 02:55:28 +0100 (CET) X-Halon-ID: d2d06f89-0b38-11ea-a00b-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (p54ac5865.dip0.t-ipconnect.de [84.172.88.101]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id d2d06f89-0b38-11ea-a00b-005056917a89; Wed, 20 Nov 2019 02:55:27 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Wed, 20 Nov 2019 02:54:57 +0100 Message-Id: <20191120015506.362440-2-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> References: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 01/10] libcamera: buffer: Drop forward declaration of BufferPool X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Nov 2019 01:55:28 -0000 There is no need to forward declare BufferPool, drop it. Signed-off-by: Niklas Söderlund Reviewed-by: Jacopo Mondi Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- include/libcamera/buffer.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/libcamera/buffer.h b/include/libcamera/buffer.h index 7b657509ab5f5d41..e14c9bd390a13bfc 100644 --- a/include/libcamera/buffer.h +++ b/include/libcamera/buffer.h @@ -13,7 +13,6 @@ namespace libcamera { -class BufferPool; class Request; class Stream; From patchwork Wed Nov 20 01:54:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 2333 Return-Path: Received: from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net [195.74.38.227]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 1B2F7617A0 for ; Wed, 20 Nov 2019 02:55:29 +0100 (CET) X-Halon-ID: d3534330-0b38-11ea-a00b-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (p54ac5865.dip0.t-ipconnect.de [84.172.88.101]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id d3534330-0b38-11ea-a00b-005056917a89; Wed, 20 Nov 2019 02:55:28 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Wed, 20 Nov 2019 02:54:58 +0100 Message-Id: <20191120015506.362440-3-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> References: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 02/10] libcamera: buffer: Plane: Drop friend statement X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Nov 2019 01:55:29 -0000 The Plane class do not need to friend Stream, drop it. Signed-off-by: Niklas Söderlund Reviewed-by: Jacopo Mondi Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- include/libcamera/buffer.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/libcamera/buffer.h b/include/libcamera/buffer.h index e14c9bd390a13bfc..d7784d9d24ab3f41 100644 --- a/include/libcamera/buffer.h +++ b/include/libcamera/buffer.h @@ -29,8 +29,6 @@ public: unsigned int length() const { return length_; } private: - friend class Stream; - int mmap(); int munmap(); From patchwork Wed Nov 20 01:54:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 2334 Return-Path: Received: from bin-mail-out-05.binero.net (bin-mail-out-05.binero.net [195.74.38.228]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E186F613A0 for ; Wed, 20 Nov 2019 02:55:29 +0100 (CET) X-Halon-ID: d3c8c19d-0b38-11ea-a00b-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (p54ac5865.dip0.t-ipconnect.de [84.172.88.101]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id d3c8c19d-0b38-11ea-a00b-005056917a89; Wed, 20 Nov 2019 02:55:29 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Wed, 20 Nov 2019 02:54:59 +0100 Message-Id: <20191120015506.362440-4-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> References: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 03/10] libcamera: buffer: Drop friend statement X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Nov 2019 01:55:30 -0000 The Buffer class do not need to friend PipelineHandler, drop it. Signed-off-by: Niklas Söderlund Reviewed-by: Jacopo Mondi Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- include/libcamera/buffer.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/libcamera/buffer.h b/include/libcamera/buffer.h index d7784d9d24ab3f41..c349b995e1eb35ee 100644 --- a/include/libcamera/buffer.h +++ b/include/libcamera/buffer.h @@ -88,7 +88,6 @@ public: private: friend class Camera; - friend class PipelineHandler; friend class Request; friend class Stream; friend class V4L2VideoDevice; From patchwork Wed Nov 20 01:55:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 2335 Return-Path: Received: from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net [195.74.38.227]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 14FC26138B for ; Wed, 20 Nov 2019 02:55:31 +0100 (CET) X-Halon-ID: d440ac38-0b38-11ea-a00b-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (p54ac5865.dip0.t-ipconnect.de [84.172.88.101]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id d440ac38-0b38-11ea-a00b-005056917a89; Wed, 20 Nov 2019 02:55:30 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Wed, 20 Nov 2019 02:55:00 +0100 Message-Id: <20191120015506.362440-5-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> References: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 04/10] libcamera: camera: Remove explicit stream to buffer map in requestCompleted signal X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Nov 2019 01:55:31 -0000 The stream to buffer map in the requestCompleted signal is taken directly from the request which is part of the same signal. Remove the map as it can be fetched directly from the request. Signed-off-by: Niklas Söderlund Reviewed-by: Jacopo Mondi Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- include/libcamera/camera.h | 3 +-- src/android/camera_device.cpp | 4 ++-- src/android/camera_device.h | 3 +-- src/cam/capture.cpp | 4 +++- src/cam/capture.h | 3 +-- src/libcamera/camera.cpp | 2 +- src/qcam/main_window.cpp | 5 +++-- src/qcam/main_window.h | 4 +--- test/camera/capture.cpp | 4 +++- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h index 21fac550f4121fdc..ef6a37bb142c83a6 100644 --- a/include/libcamera/camera.h +++ b/include/libcamera/camera.h @@ -7,7 +7,6 @@ #ifndef __LIBCAMERA_CAMERA_H__ #define __LIBCAMERA_CAMERA_H__ -#include #include #include #include @@ -79,7 +78,7 @@ public: const std::string &name() const; Signal bufferCompleted; - Signal &> requestCompleted; + Signal requestCompleted; Signal disconnected; int acquire(); diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 897f545864a94c6d..065e0292e186c2ad 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -769,9 +769,9 @@ error: delete descriptor; } -void CameraDevice::requestComplete(Request *request, - const std::map &buffers) +void CameraDevice::requestComplete(Request *request) { + const std::map &buffers = request->buffers(); Buffer *libcameraBuffer = buffers.begin()->second; camera3_buffer_status status = CAMERA3_BUFFER_STATUS_OK; std::unique_ptr resultMetadata; diff --git a/src/android/camera_device.h b/src/android/camera_device.h index 2105b5b9a1e7f50e..caa617dcbfe19408 100644 --- a/src/android/camera_device.h +++ b/src/android/camera_device.h @@ -34,8 +34,7 @@ public: const camera_metadata_t *constructDefaultRequestSettings(int type); int configureStreams(camera3_stream_configuration_t *stream_list); void processCaptureRequest(camera3_capture_request_t *request); - void requestComplete(libcamera::Request *request, - const std::map &buffers); + void requestComplete(libcamera::Request *request); private: struct Camera3RequestDescriptor { diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp index 0d7854d674e0a78d..27332df1d55a5c2d 100644 --- a/src/cam/capture.cpp +++ b/src/cam/capture.cpp @@ -133,11 +133,13 @@ int Capture::capture(EventLoop *loop) return ret; } -void Capture::requestComplete(Request *request, const std::map &buffers) +void Capture::requestComplete(Request *request) { if (request->status() == Request::RequestCancelled) return; + const std::map &buffers = request->buffers(); + std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now(); double fps = std::chrono::duration_cast(now - last_).count(); fps = last_ != std::chrono::steady_clock::time_point() && fps diff --git a/src/cam/capture.h b/src/cam/capture.h index ee0dc421111197c1..4d396afb8c771a74 100644 --- a/src/cam/capture.h +++ b/src/cam/capture.h @@ -28,8 +28,7 @@ public: private: int capture(EventLoop *loop); - void requestComplete(libcamera::Request *request, - const std::map &buffers); + void requestComplete(libcamera::Request *request); libcamera::Camera *camera_; libcamera::CameraConfiguration *config_; diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index 76c737cb93813115..e810fb725d81350d 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -919,7 +919,7 @@ void Camera::requestComplete(Request *request) stream->unmapBuffer(buffer); } - requestCompleted.emit(request, request->buffers()); + requestCompleted.emit(request); delete request; } diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp index 3d56309227235fec..cca7365ae75687f9 100644 --- a/src/qcam/main_window.cpp +++ b/src/qcam/main_window.cpp @@ -248,12 +248,13 @@ void MainWindow::stopCapture() setWindowTitle(title_); } -void MainWindow::requestComplete(Request *request, - const std::map &buffers) +void MainWindow::requestComplete(Request *request) { if (request->status() == Request::RequestCancelled) return; + const std::map &buffers = request->buffers(); + framesCaptured_++; Buffer *buffer = buffers.begin()->second; diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h index 30dd8743104d75e0..0786e915ec512255 100644 --- a/src/qcam/main_window.h +++ b/src/qcam/main_window.h @@ -7,7 +7,6 @@ #ifndef __QCAM_MAIN_WINDOW_H__ #define __QCAM_MAIN_WINDOW_H__ -#include #include #include @@ -49,8 +48,7 @@ private: int startCapture(); void stopCapture(); - void requestComplete(Request *request, - const std::map &buffers); + void requestComplete(Request *request); int display(Buffer *buffer); QString title_; diff --git a/test/camera/capture.cpp b/test/camera/capture.cpp index 791ccad15f7042f9..83f974749affd3cd 100644 --- a/test/camera/capture.cpp +++ b/test/camera/capture.cpp @@ -27,11 +27,13 @@ protected: completeBuffersCount_++; } - void requestComplete(Request *request, const std::map &buffers) + void requestComplete(Request *request) { if (request->status() != Request::RequestComplete) return; + const std::map &buffers = request->buffers(); + completeRequestsCount_++; /* Create a new request. */ From patchwork Wed Nov 20 01:55:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 2336 Return-Path: Received: from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net [195.74.38.227]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E38C06137A for ; Wed, 20 Nov 2019 02:55:31 +0100 (CET) X-Halon-ID: d4f2ab52-0b38-11ea-a00b-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (p54ac5865.dip0.t-ipconnect.de [84.172.88.101]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id d4f2ab52-0b38-11ea-a00b-005056917a89; Wed, 20 Nov 2019 02:55:31 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Wed, 20 Nov 2019 02:55:01 +0100 Message-Id: <20191120015506.362440-6-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> References: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 05/10] cam: BufferWriter: Use the libcamera namespace X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Nov 2019 01:55:32 -0000 Other parts of the cam utility uses the libcamera namespace, do the same in the buffer writer. Signed-off-by: Niklas Söderlund Reviewed-by: Jacopo Mondi Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- src/cam/buffer_writer.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/cam/buffer_writer.cpp b/src/cam/buffer_writer.cpp index 1c044b0634672d87..c33e99c5f8173db8 100644 --- a/src/cam/buffer_writer.cpp +++ b/src/cam/buffer_writer.cpp @@ -14,12 +14,14 @@ #include "buffer_writer.h" +using namespace libcamera; + BufferWriter::BufferWriter(const std::string &pattern) : pattern_(pattern) { } -int BufferWriter::write(libcamera::Buffer *buffer, const std::string &streamName) +int BufferWriter::write(Buffer *buffer, const std::string &streamName) { std::string filename; size_t pos; @@ -40,8 +42,8 @@ int BufferWriter::write(libcamera::Buffer *buffer, const std::string &streamName if (fd == -1) return -errno; - libcamera::BufferMemory *mem = buffer->mem(); - for (libcamera::Plane &plane : mem->planes()) { + BufferMemory *mem = buffer->mem(); + for (Plane &plane : mem->planes()) { void *data = plane.mem(); unsigned int length = plane.length(); From patchwork Wed Nov 20 01:55:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 2337 Return-Path: Received: from bin-mail-out-05.binero.net (bin-mail-out-05.binero.net [195.74.38.228]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id D7623613A0 for ; Wed, 20 Nov 2019 02:55:32 +0100 (CET) X-Halon-ID: d56d4a16-0b38-11ea-a00b-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (p54ac5865.dip0.t-ipconnect.de [84.172.88.101]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id d56d4a16-0b38-11ea-a00b-005056917a89; Wed, 20 Nov 2019 02:55:31 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Wed, 20 Nov 2019 02:55:02 +0100 Message-Id: <20191120015506.362440-7-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> References: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 06/10] libcamera: v4l2_videodevice: Simplify error checking for requestBuffers() X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Nov 2019 01:55:33 -0000 There is no point in explicitly checking the same error in the only call sites for the internal function, centralize the check and simplify the code. Signed-off-by: Niklas Söderlund Reviewed-by: Jacopo Mondi Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- src/libcamera/v4l2_videodevice.cpp | 31 ++++++++++-------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp index 3f2dc2799796f516..992130751286994c 100644 --- a/src/libcamera/v4l2_videodevice.cpp +++ b/src/libcamera/v4l2_videodevice.cpp @@ -821,9 +821,16 @@ int V4L2VideoDevice::requestBuffers(unsigned int count) return ret; } + if (rb.count < count) { + LOG(V4L2, Error) + << "Not enough buffers provided by V4L2VideoDevice"; + requestBuffers(0); + return -ENOMEM; + } + LOG(V4L2, Debug) << rb.count << " buffers requested."; - return rb.count; + return 0; } /** @@ -834,24 +841,15 @@ int V4L2VideoDevice::requestBuffers(unsigned int count) */ int V4L2VideoDevice::exportBuffers(BufferPool *pool) { - unsigned int allocatedBuffers; unsigned int i; int ret; memoryType_ = V4L2_MEMORY_MMAP; ret = requestBuffers(pool->count()); - if (ret < 0) + if (ret) return ret; - allocatedBuffers = ret; - if (allocatedBuffers < pool->count()) { - LOG(V4L2, Error) - << "Not enough buffers provided by V4L2VideoDevice"; - requestBuffers(0); - return -ENOMEM; - } - /* Map the buffers. */ for (i = 0; i < pool->count(); ++i) { struct v4l2_plane planes[VIDEO_MAX_PLANES] = {}; @@ -938,23 +936,14 @@ int V4L2VideoDevice::createPlane(BufferMemory *buffer, unsigned int index, */ int V4L2VideoDevice::importBuffers(BufferPool *pool) { - unsigned int allocatedBuffers; int ret; memoryType_ = V4L2_MEMORY_DMABUF; ret = requestBuffers(pool->count()); - if (ret < 0) + if (ret) return ret; - allocatedBuffers = ret; - if (allocatedBuffers < pool->count()) { - LOG(V4L2, Error) - << "Not enough buffers provided by V4L2VideoDevice"; - requestBuffers(0); - return -ENOMEM; - } - LOG(V4L2, Debug) << "provided pool of " << pool->count() << " buffers"; bufferPool_ = pool; From patchwork Wed Nov 20 01:55:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 2338 Return-Path: Received: from bin-mail-out-06.binero.net (bin-mail-out-06.binero.net [195.74.38.229]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id BC95661C19 for ; Wed, 20 Nov 2019 02:55:33 +0100 (CET) X-Halon-ID: d5fc48a0-0b38-11ea-a00b-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (p54ac5865.dip0.t-ipconnect.de [84.172.88.101]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id d5fc48a0-0b38-11ea-a00b-005056917a89; Wed, 20 Nov 2019 02:55:32 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Wed, 20 Nov 2019 02:55:03 +0100 Message-Id: <20191120015506.362440-8-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> References: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 07/10] libcamera: pipeline_handler: Do not use argument as local variable X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Nov 2019 01:55:34 -0000 In completeRequest() the request argument is used as a local variable, this is confusing. Add a separate local variable instead of reusing the argument. Signed-off-by: Niklas Söderlund Reviewed-by: Jacopo Mondi Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- src/libcamera/pipeline_handler.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 884feaa6ecbd4851..4349ca8957e403fe 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -409,13 +409,13 @@ void PipelineHandler::completeRequest(Camera *camera, Request *request) CameraData *data = cameraData(camera); while (!data->queuedRequests_.empty()) { - request = data->queuedRequests_.front(); - if (request->status() == Request::RequestPending) + Request *req = data->queuedRequests_.front(); + if (req->status() == Request::RequestPending) break; - ASSERT(!request->hasPendingBuffers()); + ASSERT(!req->hasPendingBuffers()); data->queuedRequests_.pop_front(); - camera->requestComplete(request); + camera->requestComplete(req); } } From patchwork Wed Nov 20 01:55:04 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 2339 X-Patchwork-Delegate: niklas.soderlund@ragnatech.se Return-Path: Received: from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net [195.74.38.227]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 8705D61C1E for ; Wed, 20 Nov 2019 02:55:34 +0100 (CET) X-Halon-ID: d681dded-0b38-11ea-a00b-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (p54ac5865.dip0.t-ipconnect.de [84.172.88.101]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id d681dded-0b38-11ea-a00b-005056917a89; Wed, 20 Nov 2019 02:55:33 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Wed, 20 Nov 2019 02:55:04 +0100 Message-Id: <20191120015506.362440-9-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> References: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 08/10] libcamera: pipeline: Rework PipelineHandler::queueRequest() X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Nov 2019 01:55:34 -0000 Expecting a pipeline handler implementation of queueRequest() to call the base class queueRequest() at the correct point have lead to different behaviors between the pipelines. Fix this by splitting queueRequest() into a base class implementation which handles the bookkeeping and a new queueRequestHardware() that is to be implemented by pipeline handlers and only deals with committing the request to the hardware. Signed-off-by: Niklas Söderlund --- src/libcamera/include/pipeline_handler.h | 4 ++- src/libcamera/pipeline/ipu3/ipu3.cpp | 6 ++-- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 7 ++--- src/libcamera/pipeline/uvcvideo.cpp | 6 ++-- src/libcamera/pipeline/vimc.cpp | 6 ++-- src/libcamera/pipeline_handler.cpp | 35 +++++++++++++++++------- 6 files changed, 37 insertions(+), 27 deletions(-) diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h index 241af58beec0eb13..ad7d08e681d0f28e 100644 --- a/src/libcamera/include/pipeline_handler.h +++ b/src/libcamera/include/pipeline_handler.h @@ -78,7 +78,7 @@ public: virtual int start(Camera *camera) = 0; virtual void stop(Camera *camera) = 0; - virtual int queueRequest(Camera *camera, Request *request); + int queueRequest(Camera *camera, Request *request); bool completeBuffer(Camera *camera, Request *request, Buffer *buffer); void completeRequest(Camera *camera, Request *request); @@ -90,6 +90,8 @@ protected: std::unique_ptr data); void hotplugMediaDevice(MediaDevice *media); + virtual int queueRequestHardware(Camera *camera, Request *request) = 0; + CameraData *cameraData(const Camera *camera); CameraManager *manager_; diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 1c5fccf694289ae9..ad223d9101bdc6ed 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -220,7 +220,7 @@ public: int start(Camera *camera) override; void stop(Camera *camera) override; - int queueRequest(Camera *camera, Request *request) override; + int queueRequestHardware(Camera *camera, Request *request) override; bool match(DeviceEnumerator *enumerator) override; @@ -756,7 +756,7 @@ void PipelineHandlerIPU3::stop(Camera *camera) data->rawBuffers_.clear(); } -int PipelineHandlerIPU3::queueRequest(Camera *camera, Request *request) +int PipelineHandlerIPU3::queueRequestHardware(Camera *camera, Request *request) { int error = 0; @@ -769,8 +769,6 @@ int PipelineHandlerIPU3::queueRequest(Camera *camera, Request *request) error = ret; } - PipelineHandler::queueRequest(camera, request); - return error; } diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index b21cf92435e7bbc9..f5d19dc047aa5a31 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -184,7 +184,7 @@ public: int start(Camera *camera) override; void stop(Camera *camera) override; - int queueRequest(Camera *camera, Request *request) override; + int queueRequestHardware(Camera *camera, Request *request) override; bool match(DeviceEnumerator *enumerator) override; @@ -810,13 +810,12 @@ void PipelineHandlerRkISP1::stop(Camera *camera) activeCamera_ = nullptr; } -int PipelineHandlerRkISP1::queueRequest(Camera *camera, Request *request) +int PipelineHandlerRkISP1::queueRequestHardware(Camera *camera, + Request *request) { RkISP1CameraData *data = cameraData(camera); Stream *stream = &data->stream_; - PipelineHandler::queueRequest(camera, request); - RkISP1FrameInfo *info = data->frameInfo_.create(data->frame_, request, stream); if (!info) diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp index 45448d6f8c05ddf5..76c2d377fb160ce4 100644 --- a/src/libcamera/pipeline/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo.cpp @@ -72,7 +72,7 @@ public: int start(Camera *camera) override; void stop(Camera *camera) override; - int queueRequest(Camera *camera, Request *request) override; + int queueRequestHardware(Camera *camera, Request *request) override; bool match(DeviceEnumerator *enumerator) override; @@ -262,7 +262,7 @@ int PipelineHandlerUVC::processControls(UVCCameraData *data, Request *request) return ret; } -int PipelineHandlerUVC::queueRequest(Camera *camera, Request *request) +int PipelineHandlerUVC::queueRequestHardware(Camera *camera, Request *request) { UVCCameraData *data = cameraData(camera); Buffer *buffer = request->findBuffer(&data->stream_); @@ -281,8 +281,6 @@ int PipelineHandlerUVC::queueRequest(Camera *camera, Request *request) if (ret < 0) return ret; - PipelineHandler::queueRequest(camera, request); - return 0; } diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp index e6ab6a0858247549..13f5a3aca697f566 100644 --- a/src/libcamera/pipeline/vimc.cpp +++ b/src/libcamera/pipeline/vimc.cpp @@ -90,7 +90,7 @@ public: int start(Camera *camera) override; void stop(Camera *camera) override; - int queueRequest(Camera *camera, Request *request) override; + int queueRequestHardware(Camera *camera, Request *request) override; bool match(DeviceEnumerator *enumerator) override; @@ -323,7 +323,7 @@ int PipelineHandlerVimc::processControls(VimcCameraData *data, Request *request) return ret; } -int PipelineHandlerVimc::queueRequest(Camera *camera, Request *request) +int PipelineHandlerVimc::queueRequestHardware(Camera *camera, Request *request) { VimcCameraData *data = cameraData(camera); Buffer *buffer = request->findBuffer(&data->stream_); @@ -342,8 +342,6 @@ int PipelineHandlerVimc::queueRequest(Camera *camera, Request *request) if (ret < 0) return ret; - PipelineHandler::queueRequest(camera, request); - return 0; } diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 4349ca8957e403fe..c9e348b98da7b736 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -345,27 +345,42 @@ const ControlInfoMap &PipelineHandler::controls(Camera *camera) * \param[in] request The request to queue * * This method queues a capture request to the pipeline handler for processing. - * The request contains a set of buffers associated with streams and a set of - * parameters. The pipeline handler shall program the device to ensure that the - * parameters will be applied to the frames captured in the buffers provided in - * the request. - * - * Pipeline handlers shall override this method. The base implementation in the - * PipelineHandler class keeps track of queued requests in order to ensure - * completion of all requests when the pipeline handler is stopped with stop(). - * Requests completion shall be signalled by the pipeline handler using the + * The method keeps track of queued requests in order to ensure completion of + * all requests when the pipeline handler is stopped with stop(). Requests + * completion shall be signalled by the pipeline handler using the * completeRequest() method. * * \return 0 on success or a negative error code otherwise */ int PipelineHandler::queueRequest(Camera *camera, Request *request) { + int ret; + CameraData *data = cameraData(camera); data->queuedRequests_.push_back(request); - return 0; + ret = queueRequestHardware(camera, request); + if (ret) + data->queuedRequests_.remove(request); + + return ret; } +/** + * \fn PipelineHandler::queueRequestHardware() + * \brief Queue a request to the hardware + * \param[in] camera The camera to queue the request to + * \param[in] request The request to queue + * + * This method queues a capture request to the hardware for processing. The + * request contains a set of buffers associated with streams and a set of + * parameters. The pipeline handler shall program the device to ensure that the + * parameters will be applied to the frames captured in the buffers provided in + * the request. + * + * \return 0 on success or a negative error code otherwise + */ + /** * \brief Complete a buffer for a request * \param[in] camera The camera the request belongs to From patchwork Wed Nov 20 01:55:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 2340 Return-Path: Received: from bin-mail-out-06.binero.net (bin-mail-out-06.binero.net [195.74.38.229]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 433476139C for ; Wed, 20 Nov 2019 02:55:35 +0100 (CET) X-Halon-ID: d702a215-0b38-11ea-a00b-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (p54ac5865.dip0.t-ipconnect.de [84.172.88.101]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id d702a215-0b38-11ea-a00b-005056917a89; Wed, 20 Nov 2019 02:55:34 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Wed, 20 Nov 2019 02:55:05 +0100 Message-Id: <20191120015506.362440-10-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> References: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 09/10] cam: Store camera as shared pointer everywhere X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Nov 2019 01:55:35 -0000 Do not store the camera raw pointer in the capture class, this will prevent forwarding the shared pointer in the future. Signed-off-by: Niklas Söderlund Reviewed-by: Jacopo Mondi Reviewed-by: Kieran Bingham --- src/cam/capture.cpp | 2 +- src/cam/capture.h | 4 ++-- src/cam/main.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp index 27332df1d55a5c2d..e665d819fb777a90 100644 --- a/src/cam/capture.cpp +++ b/src/cam/capture.cpp @@ -16,7 +16,7 @@ using namespace libcamera; -Capture::Capture(Camera *camera, CameraConfiguration *config) +Capture::Capture(std::shared_ptr camera, CameraConfiguration *config) : camera_(camera), config_(config), writer_(nullptr) { } diff --git a/src/cam/capture.h b/src/cam/capture.h index 4d396afb8c771a74..c692d48918f2de1d 100644 --- a/src/cam/capture.h +++ b/src/cam/capture.h @@ -21,7 +21,7 @@ class Capture { public: - Capture(libcamera::Camera *camera, + Capture(std::shared_ptr camera, libcamera::CameraConfiguration *config); int run(EventLoop *loop, const OptionsParser::Options &options); @@ -30,7 +30,7 @@ private: void requestComplete(libcamera::Request *request); - libcamera::Camera *camera_; + std::shared_ptr camera_; libcamera::CameraConfiguration *config_; std::map streamName_; diff --git a/src/cam/main.cpp b/src/cam/main.cpp index 9d99f5587cbb77d0..a38cca959aca05ff 100644 --- a/src/cam/main.cpp +++ b/src/cam/main.cpp @@ -319,7 +319,7 @@ int CamApp::run() } if (options_.isSet(OptCapture)) { - Capture capture(camera_.get(), config_.get()); + Capture capture(camera_, config_.get()); return capture.run(loop_, options_); } From patchwork Wed Nov 20 01:55:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 2341 Return-Path: Received: from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net [195.74.38.227]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 0535D6139C for ; Wed, 20 Nov 2019 02:55:35 +0100 (CET) X-Halon-ID: d76ed12b-0b38-11ea-a00b-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (p54ac5865.dip0.t-ipconnect.de [84.172.88.101]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id d76ed12b-0b38-11ea-a00b-005056917a89; Wed, 20 Nov 2019 02:55:35 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Wed, 20 Nov 2019 02:55:06 +0100 Message-Id: <20191120015506.362440-11-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> References: <20191120015506.362440-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 10/10] libcamera: pipeline: Drop forward declaration of BufferPool X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Nov 2019 01:55:36 -0000 There is no need to forward declare BufferPool, drop it. Signed-off-by: Niklas Söderlund Reviewed-by: Jacopo Mondi Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- src/libcamera/include/pipeline_handler.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h index ad7d08e681d0f28e..6ce8ea1c8d31b870 100644 --- a/src/libcamera/include/pipeline_handler.h +++ b/src/libcamera/include/pipeline_handler.h @@ -21,7 +21,6 @@ namespace libcamera { class Buffer; -class BufferPool; class Camera; class CameraConfiguration; class CameraManager;