[libcamera-devel] [PATCH 3/4] tests: v4l2_videodevice: Propagate media bus format

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Aug 5 19:37:27 CEST 2019


Hi Niklas,

Thank you for the patch.

On Mon, Aug 05, 2019 at 05:51:32PM +0200, Niklas Söderlund wrote:
> Most of the video device tests are based on vimc and Linux commit
> 85ab1aa1fac17bcd ("media: vimc: deb: fix default sink bayer format")
> changes the default media bus format for the debayer subdevices. This
> leads to a -EPIPE error when trying to use the raw capture video device
> nodes.
> 
> Fix this by propagating the media bus format used on the debayer
> subdevcie to the sensor. This allows the same code to function on

s/subdevcie/subdevice/

And as for patch 2/4, I would propagate it the other way around, from
the sensor to the debayering subdev.

> kernels previous to the change and after it.
> 
> Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
>  .../v4l2_videodevice_test.cpp                 | 22 +++++++++++++++++++
>  test/v4l2_videodevice/v4l2_videodevice_test.h |  7 +++++-
>  2 files changed, 28 insertions(+), 1 deletion(-)
> 
> diff --git a/test/v4l2_videodevice/v4l2_videodevice_test.cpp b/test/v4l2_videodevice/v4l2_videodevice_test.cpp
> index b26d06ad45197c8f..b1d4eaf6e9e4a4b1 100644
> --- a/test/v4l2_videodevice/v4l2_videodevice_test.cpp
> +++ b/test/v4l2_videodevice/v4l2_videodevice_test.cpp
> @@ -62,6 +62,26 @@ int V4L2VideoDeviceTest::init()
>  	if (ret)
>  		return TestFail;
>  
> +	if (driver_ == "vimc") {

A bit hack-ish, but for tests I think we can live with this.

> +		V4L2SubdeviceFormat subformat = {};
> +		subformat.size.width = 640;
> +		subformat.size.height = 480;
> +
> +		sensor_ = new CameraSensor(media_->getEntityByName("Sensor A"));
> +		if (sensor_->init())
> +			return TestFail;
> +
> +		debayer_ = new V4L2Subdevice(media_->getEntityByName("Debayer A"));
> +		if (debayer_->open())
> +			return TestFail;
> +
> +		if (debayer_->setFormat(0, &subformat))
> +			return TestFail;
> +
> +		if (sensor_->setFormat(&subformat))
> +			return TestFail;
> +	}
> +
>  	if (capture_->open())
>  		return TestFail;
>  
> @@ -83,5 +103,7 @@ void V4L2VideoDeviceTest::cleanup()
>  	capture_->releaseBuffers();
>  	capture_->close();
>  
> +	delete debayer_;
> +	delete sensor_;
>  	delete capture_;
>  };
> diff --git a/test/v4l2_videodevice/v4l2_videodevice_test.h b/test/v4l2_videodevice/v4l2_videodevice_test.h
> index 3321b5a4f98fdb1d..34dd231c6d9d108d 100644
> --- a/test/v4l2_videodevice/v4l2_videodevice_test.h
> +++ b/test/v4l2_videodevice/v4l2_videodevice_test.h
> @@ -13,8 +13,10 @@
>  
>  #include "test.h"
>  
> +#include "camera_sensor.h"
>  #include "device_enumerator.h"
>  #include "media_device.h"
> +#include "v4l2_subdevice.h"
>  #include "v4l2_videodevice.h"
>  
>  using namespace libcamera;
> @@ -23,7 +25,8 @@ class V4L2VideoDeviceTest : public Test
>  {
>  public:
>  	V4L2VideoDeviceTest(const char *driver, const char *entity)
> -		: driver_(driver), entity_(entity), capture_(nullptr)
> +		: driver_(driver), entity_(entity), sensor_(nullptr),
> +		  debayer_(nullptr), capture_(nullptr)
>  	{
>  	}
>  
> @@ -35,6 +38,8 @@ protected:
>  	std::string entity_;
>  	std::unique_ptr<DeviceEnumerator> enumerator_;
>  	std::shared_ptr<MediaDevice> media_;
> +	CameraSensor *sensor_;
> +	V4L2Subdevice *debayer_;

Do you need to store these internally, can't they be local variables in
V4L2VideoDeviceTest::init() ?

>  	V4L2VideoDevice *capture_;
>  	BufferPool pool_;
>  };

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list