[libcamera-devel] [PATCH v6 15/15] libcamera: apps: lcc: Add stream hints test
Kieran Bingham
kieran.bingham at ideasonboard.com
Mon Jan 30 15:03:58 CET 2023
Quoting Naushir Patuck via libcamera-devel (2023-01-27 15:43:22)
> Add a new test class, MultiCaptureHints. This tests the MandatoryStream
> hint flag and ensures that requests are cancelled correctly if the flag
> is set and no buffer is provided.
I was going to say that as this is validated in core, it could be
handled by the main unit tests under test/ however I do think this is
appropriate here - as more hints will likely certainly require pipeline
validation.
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> ---
> src/apps/lc-compliance/capture_test.cpp | 21 +++++++++++
> src/apps/lc-compliance/multi_capture.cpp | 48 ++++++++++++++++++++++++
> src/apps/lc-compliance/multi_capture.h | 17 +++++++++
> 3 files changed, 86 insertions(+)
>
> diff --git a/src/apps/lc-compliance/capture_test.cpp b/src/apps/lc-compliance/capture_test.cpp
> index c6a09a63248a..9239e8b5fc8a 100644
> --- a/src/apps/lc-compliance/capture_test.cpp
> +++ b/src/apps/lc-compliance/capture_test.cpp
> @@ -229,6 +229,27 @@ TEST_P(MultiStream, CaptureOptional)
> capture.capture(numRequests, NumStreams, 1);
> }
>
> +/*
> + * Test mandatory stream hints
> + *
> + * Mark a single stream as mandatory, and don't provide a buffer for it in the
> + * request. This should case the queueRequest call to fail.
> + */
> +TEST_P(MultiStream, CaptureHints)
> +{
> + constexpr unsigned int NumStreams = 2;
> +
> + auto [roles, numRequests] = GetParam();
> +
> + MultiCaptureHints capture0(camera_, 0);
> + capture0.configure({ roles.first, roles.second });
> + capture0.capture(NumStreams);
> +
> + MultiCaptureHints capture1(camera_, 1);
> + capture1.configure({ roles.first, roles.second });
> + capture1.capture(NumStreams);
> +}
> +
> INSTANTIATE_TEST_SUITE_P(MultiCaptureTests,
> MultiStream,
> testing::Combine(testing::ValuesIn(MULTIROLES),
> diff --git a/src/apps/lc-compliance/multi_capture.cpp b/src/apps/lc-compliance/multi_capture.cpp
> index a011dfb285c8..6aa39b7e281f 100644
> --- a/src/apps/lc-compliance/multi_capture.cpp
> +++ b/src/apps/lc-compliance/multi_capture.cpp
> @@ -238,3 +238,51 @@ void MultiCaptureOptional::capture(unsigned int numRequests, unsigned int numStr
>
> ASSERT_EQ(captureCount_, captureLimit_);
> }
> +
> +/* MultiCaptureHints */
> +
> +MultiCaptureHints::MultiCaptureHints(std::shared_ptr<Camera> camera,
> + unsigned int mandatoryStream)
> + : MultiCaptureBase(camera), mandatoryStream_(mandatoryStream)
> +{
> +}
> +
> +void MultiCaptureHints::capture(unsigned int numStreams)
> +{
> + start();
> +
> + std::vector<const FrameBufferList *>
> + buffers = prepareBuffers(config_->at(0).bufferCount, numStreams);
> +
> + if (!buffers.size())
> + GTEST_SKIP();
> +
> + /* Queue a single request */
> + std::unique_ptr<Request> request = camera_->createRequest();
> + ASSERT_TRUE(request) << "Can't create request";
> +
> + for (unsigned int j = 0; j < numStreams; j++) {
> + const FrameBufferList *bufferList = buffers[j];
> + Stream *stream = config_->at(j).stream();
> +
> + /*
> + * Do not add a buffer for the mandatory stream to cause a
> + * deliberate failure.
> + */
> + if (j == mandatoryStream_)
> + continue;
> +
> + ASSERT_EQ(request->addBuffer(stream, (*bufferList)[0].get()), 0)
> + << "Can't set buffer for request";
> + }
> +
> + ASSERT_EQ(camera_->queueRequest(request.get()), -ENOMEM)
> + << "queueRequest did not fail!";
> +
> + stop();
> +}
> +
> +void MultiCaptureHints::updateConfig()
> +{
> + config_.get()->at(mandatoryStream_).hints = StreamConfiguration::Hint::MandatoryStream;
> +}
> diff --git a/src/apps/lc-compliance/multi_capture.h b/src/apps/lc-compliance/multi_capture.h
> index 3d92ba3d4c10..c48c16e7565d 100644
> --- a/src/apps/lc-compliance/multi_capture.h
> +++ b/src/apps/lc-compliance/multi_capture.h
> @@ -68,3 +68,20 @@ public:
> void capture(unsigned int numRequests, unsigned int numStreams,
> unsigned int optionalStream);
> };
> +
> +class MultiCaptureHints : public MultiCaptureBase
> +{
> +public:
> + MultiCaptureHints(std::shared_ptr<libcamera::Camera> camera,
> + unsigned int mandatoryStream);
> +
> + void capture(unsigned int numStreams);
> +
> +private:
> + void updateConfig() override;
> + void requestComplete([[maybe_unused]] libcamera::Request *request) override
> + {
> + }
> +
> + unsigned int mandatoryStream_;
> +};
> --
> 2.25.1
>
More information about the libcamera-devel
mailing list