[libcamera-devel] [PATCH v5 2/2] lc-compliance: Add test stopping single stream with requests queued
Jean-Michel Hautbois
jeanmichel.hautbois at ideasonboard.com
Sun Apr 11 14:05:00 CEST 2021
Hi Niklas,
Thanks for that patch !
On 09/04/2021 17:00, Niklas Söderlund wrote:
> Add a test which stops a camera while requests are still queued. This
> intends to test cleanup paths where requests are dequeued from video
> devices in an uncompleted state.
>
> Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> Acked-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> Tested-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Tested-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> ---
> * Changes since v4
> - Update commit message.
> ---
> src/lc-compliance/simple_capture.cpp | 63 ++++++++++++++++++++++++++++
> src/lc-compliance/simple_capture.h | 14 +++++++
> src/lc-compliance/single_stream.cpp | 25 ++++++++++-
> 3 files changed, 101 insertions(+), 1 deletion(-)
>
> diff --git a/src/lc-compliance/simple_capture.cpp b/src/lc-compliance/simple_capture.cpp
> index 389dc11fc60225c5..0ff720bfd0052e45 100644
> --- a/src/lc-compliance/simple_capture.cpp
> +++ b/src/lc-compliance/simple_capture.cpp
> @@ -149,3 +149,66 @@ void SimpleCaptureBalanced::requestComplete(Request *request)
> if (queueRequest(request))
> loop_->exit(-EINVAL);
> }
> +
> +/* SimpleCaptureUnbalanced */
> +
> +SimpleCaptureUnbalanced::SimpleCaptureUnbalanced(std::shared_ptr<Camera> camera)
> + : SimpleCapture(camera)
> +{
> +}
> +
> +Results::Result SimpleCaptureUnbalanced::capture(unsigned int numRequests)
> +{
> + Results::Result ret = start();
> + if (ret.first != Results::Pass)
> + return ret;
> +
> + Stream *stream = config_->at(0).stream();
> + const std::vector<std::unique_ptr<FrameBuffer>> &buffers = allocator_->buffers(stream);
> +
> + captureCount_ = 0;
> + captureLimit_ = numRequests;
> +
> + /* Queue the recommended number of reqeuests. */
> + std::vector<std::unique_ptr<libcamera::Request>> requests;
> + for (const std::unique_ptr<FrameBuffer> &buffer : buffers) {
> + std::unique_ptr<Request> request = camera_->createRequest();
> + if (!request) {
> + stop();
> + return { Results::Fail, "Can't create request" };
> + }
> +
> + if (request->addBuffer(stream, buffer.get())) {
> + stop();
> + return { Results::Fail, "Can't set buffer for request" };
> + }
> +
> + if (camera_->queueRequest(request.get()) < 0) {
> + stop();
> + return { Results::Fail, "Failed to queue request" };
> + }
> +
> + requests.push_back(std::move(request));
> + }
> +
> + /* Run capture session. */
> + loop_ = new EventLoop();
> + int status = loop_->exec();
> + stop();
> + delete loop_;
> +
> + return { status ? Results::Fail : Results::Pass, "Unbalanced capture of " + std::to_string(numRequests) + " requests" };
> +}
> +
> +void SimpleCaptureUnbalanced::requestComplete(Request *request)
> +{
> + captureCount_++;
> + if (captureCount_ >= captureLimit_) {
> + loop_->exit(0);
> + return;
> + }
> +
> + request->reuse(Request::ReuseBuffers);
> + if (camera_->queueRequest(request))
> + loop_->exit(-EINVAL);
> +}
> diff --git a/src/lc-compliance/simple_capture.h b/src/lc-compliance/simple_capture.h
> index 3a6afc538c623050..4693c13404cee7d2 100644
> --- a/src/lc-compliance/simple_capture.h
> +++ b/src/lc-compliance/simple_capture.h
> @@ -51,4 +51,18 @@ private:
> unsigned int captureLimit_;
> };
>
> +class SimpleCaptureUnbalanced : public SimpleCapture
> +{
> +public:
> + SimpleCaptureUnbalanced(std::shared_ptr<libcamera::Camera> camera);
> +
> + Results::Result capture(unsigned int numRequests);
> +
> +private:
> + void requestComplete(libcamera::Request *request) override;
> +
> + unsigned int captureCount_;
> + unsigned int captureLimit_;
> +};
> +
> #endif /* __LC_COMPLIANCE_SIMPLE_CAPTURE_H__ */
> diff --git a/src/lc-compliance/single_stream.cpp b/src/lc-compliance/single_stream.cpp
> index e9ca1d58ecb959cd..8318b42f42d640aa 100644
> --- a/src/lc-compliance/single_stream.cpp
> +++ b/src/lc-compliance/single_stream.cpp
> @@ -33,6 +33,18 @@ Results::Result testRequestBalance(std::shared_ptr<Camera> camera,
> std::to_string(startCycles) + " start cycles" };
> }
>
> +Results::Result testRequestUnbalance(std::shared_ptr<Camera> camera,
> + StreamRole role, unsigned int numRequests)
> +{
> + SimpleCaptureUnbalanced capture(camera);
> +
> + Results::Result ret = capture.configure(role);
> + if (ret.first != Results::Pass)
> + return ret;
> +
> + return capture.capture(numRequests);
> +}
> +
> Results testSingleStream(std::shared_ptr<Camera> camera)
> {
> static const std::vector<std::pair<std::string, StreamRole>> roles = {
> @@ -43,7 +55,7 @@ Results testSingleStream(std::shared_ptr<Camera> camera)
> };
> static const std::vector<unsigned int> numRequests = { 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 };
>
> - Results results(numRequests.size() * roles.size() * 2);
> + Results results(numRequests.size() * roles.size() * 3);
>
> for (const auto &role : roles) {
> std::cout << "= Test role " << role.first << std::endl;
> @@ -68,6 +80,17 @@ Results testSingleStream(std::shared_ptr<Camera> camera)
> std::cout << "* Test multiple start/stop cycles" << std::endl;
> for (unsigned int num : numRequests)
> results.add(testRequestBalance(camera, role.second, 3, num));
> +
> + /*
> + * Test unbalanced stop
> + *
> + * Makes sure the camera supports a stop with requests queued.
> + * Example failure is a camera that does not handle cancelation
> + * of buffers coming back from the video device while stopping.
> + */
> + std::cout << "* Test unbalanced stop" << std::endl;
> + for (unsigned int num : numRequests)
> + results.add(testRequestUnbalance(camera, role.second, num));
> }
>
> return results;
>
More information about the libcamera-devel
mailing list