The V4L2VideoDeviceTest class configures the capture pipeline with parameters that are partly hardcoded, and partly come from the current configuration of the device. In particular, with the vimc pipeline, the sensor subdevice is configured with the size retrieved from the capture video node, and the video node is then reconfigured to 640x480. Relying on the current (and thus possibly random) device configuration can lead to broken pipes when starting streaming. This currently causes failures of the dequeue_watchdog test when run after the formats test. Fix it by explicitly setting the same size for both the vimc subdevs and the video capture device. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Tested-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
103 lines
2 KiB
C++
103 lines
2 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Copyright (C) 2019, Google Inc.
|
|
*
|
|
* libcamera V4L2 API tests
|
|
*/
|
|
|
|
#include <iostream>
|
|
|
|
#include <linux/media-bus-format.h>
|
|
|
|
#include "libcamera/internal/device_enumerator.h"
|
|
#include "libcamera/internal/media_device.h"
|
|
|
|
#include "v4l2_videodevice_test.h"
|
|
|
|
using namespace std;
|
|
using namespace libcamera;
|
|
|
|
int V4L2VideoDeviceTest::init()
|
|
{
|
|
enumerator_ = DeviceEnumerator::create();
|
|
if (!enumerator_) {
|
|
cerr << "Failed to create device enumerator" << endl;
|
|
return TestFail;
|
|
}
|
|
|
|
if (enumerator_->enumerate()) {
|
|
cerr << "Failed to enumerate media devices" << endl;
|
|
return TestFail;
|
|
}
|
|
|
|
DeviceMatch dm(driver_);
|
|
dm.add(entity_);
|
|
|
|
media_ = enumerator_->search(dm);
|
|
if (!media_)
|
|
return TestSkip;
|
|
|
|
MediaEntity *entity = media_->getEntityByName(entity_);
|
|
if (!entity)
|
|
return TestSkip;
|
|
|
|
capture_ = new V4L2VideoDevice(entity);
|
|
if (!capture_)
|
|
return TestFail;
|
|
|
|
if (!media_->acquire())
|
|
return TestFail;
|
|
|
|
int ret = media_->disableLinks();
|
|
media_->release();
|
|
if (ret)
|
|
return TestFail;
|
|
|
|
if (capture_->open())
|
|
return TestFail;
|
|
|
|
V4L2DeviceFormat format = {};
|
|
if (capture_->getFormat(&format))
|
|
return TestFail;
|
|
|
|
format.size.width = 640;
|
|
format.size.height = 480;
|
|
|
|
if (driver_ == "vimc") {
|
|
sensor_ = new CameraSensor(media_->getEntityByName("Sensor A"));
|
|
if (sensor_->init())
|
|
return TestFail;
|
|
|
|
debayer_ = new V4L2Subdevice(media_->getEntityByName("Debayer A"));
|
|
if (debayer_->open())
|
|
return TestFail;
|
|
|
|
format.fourcc = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR8);
|
|
|
|
V4L2SubdeviceFormat subformat = {};
|
|
subformat.mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8;
|
|
subformat.size = format.size;
|
|
|
|
if (sensor_->setFormat(&subformat))
|
|
return TestFail;
|
|
|
|
if (debayer_->setFormat(0, &subformat))
|
|
return TestFail;
|
|
}
|
|
|
|
if (capture_->setFormat(&format))
|
|
return TestFail;
|
|
|
|
return TestPass;
|
|
}
|
|
|
|
void V4L2VideoDeviceTest::cleanup()
|
|
{
|
|
capture_->streamOff();
|
|
capture_->releaseBuffers();
|
|
capture_->close();
|
|
|
|
delete debayer_;
|
|
delete sensor_;
|
|
delete capture_;
|
|
}
|