[{"id":25953,"web_url":"https://patchwork.libcamera.org/comment/25953/","msgid":"<Y4iQLdYZtxUpV649@pyrite.rasen.tech>","date":"2022-12-01T11:29:49","subject":"Re: [libcamera-devel] [PATCH v8 12/17] lc-compliance: Factor common\n\tcapture code into SimpleCapture","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"On Tue, Aug 24, 2021 at 04:56:31PM -0300, Nícolas F. R. A. Prado wrote:\n> Factor common code from SimpleCapture* subclasses into the SimpleCapture\n> parent class in order to avoid duplicated code.\n> \n> Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n> \n> ---\n> \n> Changes in v8:\n> - Added requests_ member to SimpleCapture to hold ownership of queued\n>   requests during capture\n> - Made queueRequest() virtual and removed SimpleCaptureBalanced::queueRequests()\n> \n> Changes in v6:\n> - Switched queueRequests()'s 'buffers' and 'requests' parameters order, since\n>   'requests' is an output variable\n> - Added comment to runCaptureSession()\n> - Added missing blank line before return in captureCompleted()\n> - Added blank line to runCaptureSession()\n> \n>  src/lc-compliance/simple_capture.cpp | 93 +++++++++++++++-------------\n>  src/lc-compliance/simple_capture.h   | 16 +++--\n>  2 files changed, 61 insertions(+), 48 deletions(-)\n> \n> diff --git a/src/lc-compliance/simple_capture.cpp b/src/lc-compliance/simple_capture.cpp\n> index 041a2a4cbb5a..e4f70974dd2c 100644\n> --- a/src/lc-compliance/simple_capture.cpp\n> +++ b/src/lc-compliance/simple_capture.cpp\n> @@ -70,12 +70,57 @@ void SimpleCapture::stop()\n>  \n>  \tcamera_->stop();\n>  \n> +\trequests_.clear();\n> +\n>  \tcamera_->requestCompleted.disconnect(this, &SimpleCapture::requestComplete);\n>  \n>  \tStream *stream = config_->at(0).stream();\n>  \tallocator_->free(stream);\n>  }\n>  \n> +bool SimpleCapture::captureCompleted()\n> +{\n> +\tcaptureCount_++;\n> +\tif (captureCount_ >= captureLimit_) {\n> +\t\tloop_->exit(0);\n> +\t\treturn true;\n> +\t}\n> +\n> +\treturn false;\n> +}\n> +\n> +int SimpleCapture::queueRequest(Request *request)\n> +{\n> +\treturn camera_->queueRequest(request);\n> +}\n> +\n> +void SimpleCapture::queueRequests(Stream *stream,\n> +\t\t\t\t  const std::vector<std::unique_ptr<FrameBuffer>> &buffers)\n> +{\n> +\tfor (const std::unique_ptr<FrameBuffer> &buffer : buffers) {\n> +\t\tstd::unique_ptr<Request> request = camera_->createRequest();\n> +\t\tASSERT_TRUE(request) << \"Can't create request\";\n> +\n> +\t\tASSERT_EQ(request->addBuffer(stream, buffer.get()), 0) << \"Can't set buffer for request\";\n> +\n> +\t\tASSERT_EQ(queueRequest(request.get()), 0) << \"Failed to queue request\";\n> +\n> +\t\trequests_.push_back(std::move(request));\n> +\t}\n> +}\n> +\n> +int SimpleCapture::runCaptureSession()\n> +{\n> +\tloop_ = new EventLoop();\n> +\tint status = loop_->exec();\n> +\n> +\t/* After session ended */\n> +\tstop();\n> +\tdelete loop_;\n> +\n> +\treturn status;\n> +}\n> +\n>  /* SimpleCaptureBalanced */\n>  \n>  SimpleCaptureBalanced::SimpleCaptureBalanced(std::shared_ptr<Camera> camera)\n> @@ -102,24 +147,9 @@ void SimpleCaptureBalanced::capture(unsigned int numRequests)\n>  \tcaptureCount_ = 0;\n>  \tcaptureLimit_ = numRequests;\n>  \n> -\t/* Queue the recommended number of reqeuests. */\n> -\tstd::vector<std::unique_ptr<libcamera::Request>> requests;\n> -\tfor (const std::unique_ptr<FrameBuffer> &buffer : buffers) {\n> -\t\tstd::unique_ptr<Request> request = camera_->createRequest();\n> -\t\tASSERT_TRUE(request) << \"Can't create request\";\n> +\tqueueRequests(stream, buffers);\n>  \n> -\t\tASSERT_EQ(request->addBuffer(stream, buffer.get()), 0) << \"Can't set buffer for request\";\n> -\n> -\t\tASSERT_EQ(queueRequest(request.get()), 0) << \"Failed to queue request\";\n> -\n> -\t\trequests.push_back(std::move(request));\n> -\t}\n> -\n> -\t/* Run capture session. */\n> -\tloop_ = new EventLoop();\n> -\tloop_->exec();\n> -\tstop();\n> -\tdelete loop_;\n> +\trunCaptureSession();\n>  \n>  \tASSERT_EQ(captureCount_, captureLimit_);\n>  }\n> @@ -135,11 +165,8 @@ int SimpleCaptureBalanced::queueRequest(Request *request)\n>  \n>  void SimpleCaptureBalanced::requestComplete(Request *request)\n>  {\n> -\tcaptureCount_++;\n> -\tif (captureCount_ >= captureLimit_) {\n> -\t\tloop_->exit(0);\n> +\tif (captureCompleted())\n>  \t\treturn;\n> -\t}\n>  \n>  \trequest->reuse(Request::ReuseBuffers);\n>  \tif (queueRequest(request))\n> @@ -163,35 +190,17 @@ void SimpleCaptureUnbalanced::capture(unsigned int numRequests)\n>  \tcaptureCount_ = 0;\n>  \tcaptureLimit_ = numRequests;\n>  \n> -\t/* Queue the recommended number of reqeuests. */\n> -\tstd::vector<std::unique_ptr<libcamera::Request>> requests;\n> -\tfor (const std::unique_ptr<FrameBuffer> &buffer : buffers) {\n> -\t\tstd::unique_ptr<Request> request = camera_->createRequest();\n> -\t\tASSERT_TRUE(request) << \"Can't create request\";\n> -\n> -\t\tASSERT_EQ(request->addBuffer(stream, buffer.get()), 0) << \"Can't set buffer for request\";\n> -\n> -\t\tASSERT_EQ(camera_->queueRequest(request.get()), 0) << \"Failed to queue request\";\n> -\n> -\t\trequests.push_back(std::move(request));\n> -\t}\n> +\tqueueRequests(stream, buffers);\n>  \n> -\t/* Run capture session. */\n> -\tloop_ = new EventLoop();\n> -\tint status = loop_->exec();\n> -\tstop();\n> -\tdelete loop_;\n> +\tint status = runCaptureSession();\n>  \n>  \tASSERT_EQ(status, 0);\n>  }\n>  \n>  void SimpleCaptureUnbalanced::requestComplete(Request *request)\n>  {\n> -\tcaptureCount_++;\n> -\tif (captureCount_ >= captureLimit_) {\n> -\t\tloop_->exit(0);\n> +\tif (captureCompleted())\n>  \t\treturn;\n> -\t}\n>  \n>  \trequest->reuse(Request::ReuseBuffers);\n>  \tif (camera_->queueRequest(request))\n> diff --git a/src/lc-compliance/simple_capture.h b/src/lc-compliance/simple_capture.h\n> index 401ba8273da8..8a6db2a355f6 100644\n> --- a/src/lc-compliance/simple_capture.h\n> +++ b/src/lc-compliance/simple_capture.h\n> @@ -25,14 +25,23 @@ protected:\n>  \n>  \tvoid start();\n>  \tvoid stop();\n> +\tvirtual int queueRequest(libcamera::Request *request);\n> +\tvoid queueRequests(libcamera::Stream *stream,\n> +\t\t\t   const std::vector<std::unique_ptr<libcamera::FrameBuffer>> &buffers);\n> +\tbool captureCompleted();\n> +\tint runCaptureSession();\n>  \n>  \tvirtual void requestComplete(libcamera::Request *request) = 0;\n>  \n>  \tEventLoop *loop_;\n>  \n> +\tunsigned int captureCount_;\n> +\tunsigned int captureLimit_;\n> +\n>  \tstd::shared_ptr<libcamera::Camera> camera_;\n>  \tstd::unique_ptr<libcamera::FrameBufferAllocator> allocator_;\n>  \tstd::unique_ptr<libcamera::CameraConfiguration> config_;\n> +\tstd::vector<std::unique_ptr<libcamera::Request>> requests_;\n>  };\n>  \n>  class SimpleCaptureBalanced : public SimpleCapture\n> @@ -43,12 +52,10 @@ public:\n>  \tvoid capture(unsigned int numRequests);\n>  \n>  private:\n> -\tint queueRequest(libcamera::Request *request);\n> +\tint queueRequest(libcamera::Request *request) override;\n>  \tvoid requestComplete(libcamera::Request *request) override;\n>  \n>  \tunsigned int queueCount_;\n> -\tunsigned int captureCount_;\n> -\tunsigned int captureLimit_;\n>  };\n>  \n>  class SimpleCaptureUnbalanced : public SimpleCapture\n> @@ -60,9 +67,6 @@ public:\n>  \n>  private:\n>  \tvoid requestComplete(libcamera::Request *request) override;\n> -\n> -\tunsigned int captureCount_;\n> -\tunsigned int captureLimit_;\n>  };\n>  \n>  #endif /* __LC_COMPLIANCE_SIMPLE_CAPTURE_H__ */\n> -- \n> 2.33.0\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 3632FBDE6B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  1 Dec 2022 11:29:58 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0097F6333F;\n\tThu,  1 Dec 2022 12:29:58 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9780463335\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  1 Dec 2022 12:29:56 +0100 (CET)","from pyrite.rasen.tech (h175-177-042-159.catv02.itscom.jp\n\t[175.177.42.159])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D4CE133F;\n\tThu,  1 Dec 2022 12:29:54 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1669894198;\n\tbh=1BNc/EN8a1r7OoMYk2/Ppg+q1w99oEFFW0MiOP/kmhU=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=QIRTKsF9JA7HhaperqCveJQMTKIVFZzK8OCtdCaSPktViJDwyV1KSsomm1CyDs7km\n\tW+rvU52khbIv3Z+W2ag9oWJKJVU+euD5Ns66Ewy+IjvDI+yFM6vpky+sIb2lr9a//I\n\tZcNPOfn6y0A4J4Zh9R/Q2M3wVKsa/DubWYbMZalwikdtAoS0dSEStqKqKuh0poA1nw\n\t3W+omygfHezW2GnTDorqaKPjcxRNkBr9sN2xT6lk00zAz6O09PqZLiGKkIcFx76Ar4\n\tyQtIQ1TwWyupPOUJJrKczR5h3js8Y7QThss3QJeHSCI9cxmI1NjbOo1WYtqmdlKh9M\n\tx5550nYB1mjyA==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1669894196;\n\tbh=1BNc/EN8a1r7OoMYk2/Ppg+q1w99oEFFW0MiOP/kmhU=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=OM+iVpLk4dTBSFNk7bm/oTze9fAH2he4tul+/GPoYk4GkKkR08Uj9e5YUHO1eKu4v\n\tdFI+3yGv0rRVckJR1ArJ+qJbnPeDsKXtgMtCbQiEcoVpy0W2LppGvUcXq062WkIwoP\n\t5Ft8U11CAeNW/bdvJilndGj6oJR3o9K9d/m4Mo4U="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"OM+iVpLk\"; dkim-atps=neutral","Date":"Thu, 1 Dec 2022 20:29:49 +0900","To":"=?iso-8859-1?q?N=EDcolas_F=2E_R=2E_A=2E?= Prado <nfraprado@collabora.com>","Message-ID":"<Y4iQLdYZtxUpV649@pyrite.rasen.tech>","References":"<20210824195636.1110845-1-nfraprado@collabora.com>\n\t<20210824195636.1110845-13-nfraprado@collabora.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20210824195636.1110845-13-nfraprado@collabora.com>","Subject":"Re: [libcamera-devel] [PATCH v8 12/17] lc-compliance: Factor common\n\tcapture code into SimpleCapture","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Paul Elder via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org, kernel@collabora.com,\n\t=?iso-8859-1?q?Andr=E9?= Almeida <andrealmeid@collabora.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]