[libcamera-devel] [PATCH 2/2] test: gstreamer: Check availability of cameras before running
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Fri Jul 22 16:37:39 CEST 2022
Hi Umang,
On Fri, Jul 22, 2022 at 06:34:35PM +0530, Umang Jain via libcamera-devel wrote:
> On 7/21/22 19:53, Jacopo Mondi wrote:
> > On Thu, Jul 21, 2022 at 07:15:31PM +0530, Umang Jain via libcamera-devel wrote:
> >> Move the logic for checking the availability of cameras from
> >> multi_stream_test to gstreamer test base class. Since
> >> single_stream_class always assumes that a camera is available on the
> >> system (which is not always the case for e.g. RPi in CI/CD environments)
> >> it makes sense to have the availability check in the base class.
> >> If no cameras are available, the behaviour should be to skip instead
> >> of a failure.
> >>
> >> We currently have 2 tests for gstreamer differing based on number
> >> of streams supported by the camera. Hence, the camera availability
> >> is checked in conjunction with the number of the streams required by
> >> the derived class.
> >>
> >> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
> >> ---
> >> .../gstreamer/gstreamer_multi_stream_test.cpp | 20 +----------
> >> test/gstreamer/gstreamer_test.cpp | 33 ++++++++++++++++++-
> >> test/gstreamer/gstreamer_test.h | 4 ++-
> >> 3 files changed, 36 insertions(+), 21 deletions(-)
> >>
> >> diff --git a/test/gstreamer/gstreamer_multi_stream_test.cpp b/test/gstreamer/gstreamer_multi_stream_test.cpp
> >> index 112f1dee..b8387c10 100644
> >> --- a/test/gstreamer/gstreamer_multi_stream_test.cpp
> >> +++ b/test/gstreamer/gstreamer_multi_stream_test.cpp
> >> @@ -29,7 +29,7 @@ class GstreamerMultiStreamTest : public GstreamerTest, public Test
> >> {
> >> public:
> >> GstreamerMultiStreamTest()
> >> - : GstreamerTest()
> >> + : GstreamerTest(2)
> >
> > As this is a test, I think it's ok even if it's a tad rough
> >
> >> {
> >> }
> >>
> >> @@ -39,24 +39,6 @@ protected:
> >> if (status_ != TestPass)
> >> return status_;
> >>
> >> - /* Check if platform supports multistream capture */
> >> - libcamera::CameraManager cm;
> >> - cm.start();
> >> - bool cameraFound = false;
> >> - for (auto &camera : cm.cameras()) {
> >> - if (camera->streams().size() > 1) {
> >> - cameraName_ = camera->id();
> >> - cameraFound = true;
> >> - cm.stop();
> >> - break;
> >> - }
> >> - }
> >> -
> >> - if (!cameraFound) {
> >> - cm.stop();
> >> - return TestSkip;
> >> - }
> >> -
> >> const gchar *streamDescription = "queue ! fakesink";
> >> g_autoptr(GError) error = NULL;
> >>
> >> diff --git a/test/gstreamer/gstreamer_test.cpp b/test/gstreamer/gstreamer_test.cpp
> >> index cfb8afc6..4668aa00 100644
> >> --- a/test/gstreamer/gstreamer_test.cpp
> >> +++ b/test/gstreamer/gstreamer_test.cpp
> >> @@ -5,6 +5,7 @@
> >> * libcamera Gstreamer element API tests
> >> */
> >>
> >> +#include <libcamera/libcamera.h>
> >
> > Empty line ?
> >
> >> #include <libcamera/base/utils.h>
> >>
> >> #include "gstreamer_test.h"
> >> @@ -25,9 +26,10 @@ const char *__asan_default_options()
> >> }
> >> }
> >>
> >> -GstreamerTest::GstreamerTest()
> >> +GstreamerTest::GstreamerTest(unsigned int numStreams)
> >> : pipeline_(nullptr), libcameraSrc_(nullptr)
> >> {
> >> +
> >
> > No empty line :)
> >
> >> /*
> >> * GStreamer by default spawns a process to run the
> >> * gst-plugin-scanner helper. If libcamera is compiled with ASan
> >> @@ -67,9 +69,38 @@ GstreamerTest::GstreamerTest()
> >> return;
> >> }
> >>
> >> + /*
> >> + * Atleast one camera should be available with numStreams streams
> >> + * otherwise, skip the test entirely.
> >> + */
> >> + if (!satisfyCameraStreams(numStreams)) {
> >> + status_ = TestSkip;
> >> + return;
> >> + }
> >> +
> >> status_ = TestPass;
> >> }
> >>
> >> +bool GstreamerTest::satisfyCameraStreams(unsigned int numStreams)
> >
> > Bikeshedding on the function name apart...
> > And with Nicolas comment clarified
>
> For naming, it's tricky as this function checks for 2 things:
> 1) Cameras availability
> 2) Numbers of required streams per camera
>
> It's tricky to combine 1) and 2) in a naming scheme.
>
> checkForStreams() or simple perCameraStreams() or checkMinCameraStreams() ?
>
> I think I'll go with the last one.
I don't mind much, I'm fine with the existing name too.
> I think Nicolas comment doesn't not apply here since, cameraManager
> instance is local to a function.
>
> > Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
>
> Thanks
>
> >> +{
> >> + libcamera::CameraManager cm;
> >> + bool cameraFound = false;
> >> +
> >> + cm.start();
> >> +
> >> + for (auto &camera : cm.cameras()) {
> >> + if (camera->streams().size() < numStreams)
> >> + continue;
> >> +
> >> + cameraFound = true;
> >> + break;
> >> + }
> >> +
> >> + cm.stop();
> >> +
> >> + return cameraFound;
> >> +}
> >> +
> >> GstreamerTest::~GstreamerTest()
> >> {
> >> g_clear_object(&pipeline_);
> >> diff --git a/test/gstreamer/gstreamer_test.h b/test/gstreamer/gstreamer_test.h
> >> index 35adab0e..fa41721f 100644
> >> --- a/test/gstreamer/gstreamer_test.h
> >> +++ b/test/gstreamer/gstreamer_test.h
> >> @@ -15,7 +15,7 @@
> >> class GstreamerTest
> >> {
> >> public:
> >> - GstreamerTest();
> >> + GstreamerTest(unsigned int numStreams = 1);
> >> virtual ~GstreamerTest();
> >>
> >> protected:
> >> @@ -27,4 +27,6 @@ protected:
> >> GstElement *pipeline_;
> >> GstElement *libcameraSrc_;
> >> int status_;
> >> +private:
> >> + bool satisfyCameraStreams(unsigned int numStreams);
> >> };
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list