[libcamera-devel] [PATCH 2/2] test: gstreamer: Check availability of cameras before running

Umang Jain umang.jain at ideasonboard.com
Fri Jul 22 15:04:35 CEST 2022


Hi,

On 7/21/22 19:53, Jacopo Mondi wrote:
> Hi Umang,
>
> 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 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

>
> Thanks
>     j
>> +{
>> +	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);
>>   };
>> --
>> 2.31.1
>>


More information about the libcamera-devel mailing list