Message ID | 20230127154322.29019-16-naush@raspberrypi.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
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@ideasonboard.com> > > Signed-off-by: Naushir Patuck <naush@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 >
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_; +};
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. Signed-off-by: Naushir Patuck <naush@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(+)