From b2b3599b5b0673901bbce958bd9802b9d6313fcf Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Tue, 11 Jun 2019 16:13:39 +0300 Subject: tests: Add CameraSensor class test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a test to verify media bus codes, sizes and resolution retrieval through the CameraSensor API based on the Sensor A in the vimc pipeline. Also check that the getFormat() method returns the expected media bus code and size. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- test/camera-sensor.cpp | 112 +++++++++++++++++++++++++++++++++++++++++++++++++ test/meson.build | 1 + 2 files changed, 113 insertions(+) create mode 100644 test/camera-sensor.cpp (limited to 'test') diff --git a/test/camera-sensor.cpp b/test/camera-sensor.cpp new file mode 100644 index 00000000..092cbdd8 --- /dev/null +++ b/test/camera-sensor.cpp @@ -0,0 +1,112 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * camera-sensor.cpp - Camera sensor tests + */ + +#include +#include + +#include + +#include "camera_sensor.h" +#include "device_enumerator.h" +#include "media_device.h" +#include "v4l2_subdevice.h" + +#include "test.h" + +using namespace std; +using namespace libcamera; + +class CameraSensorTest : public Test +{ +protected: + int 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("vimc"); + media_ = enumerator_->search(dm); + if (!media_) { + cerr << "Unable to find \'vimc\' media device node" << endl; + return TestSkip; + } + + MediaEntity *entity = media_->getEntityByName("Sensor A"); + if (!entity) { + cerr << "Unable to find media entity 'Sensor A'" << endl; + return TestFail; + } + + sensor_ = new CameraSensor(entity); + if (sensor_->init() < 0) { + cerr << "Unable to initialise camera sensor" << endl; + return TestFail; + } + + return TestPass; + } + + int run() + { + const std::vector &codes = sensor_->mbusCodes(); + auto iter = std::find(codes.begin(), codes.end(), + MEDIA_BUS_FMT_ARGB8888_1X32); + if (iter == codes.end()) { + cerr << "Sensor doesn't support ARGB8888_1X32" << endl; + return TestFail; + } + + const std::vector &sizes = sensor_->sizes(); + auto iter2 = std::find(sizes.begin(), sizes.end(), + Size(4096, 2160)); + if (iter2 == sizes.end()) { + cerr << "Sensor doesn't support 4096x2160" << endl; + return TestFail; + } + + const Size &resolution = sensor_->resolution(); + if (resolution != Size(4096, 2160)) { + cerr << "Incorrect sensor resolution " + << resolution.toString() << endl; + return TestFail; + } + + V4L2SubdeviceFormat format = sensor_->getFormat({ MEDIA_BUS_FMT_UYVY8_2X8, + MEDIA_BUS_FMT_SBGGR10_1X10, + MEDIA_BUS_FMT_BGR888_1X24 }, + Size(1024, 768)); + if (format.mbus_code != MEDIA_BUS_FMT_SBGGR10_1X10 || + format.size != Size(4096, 2160)) { + cerr << "Failed to get a suitable format, expected 4096x2160-0x" + << std::hex << MEDIA_BUS_FMT_SBGGR10_1X10 + << ", got " << format.toString() << endl; + return TestFail; + } + + return TestPass; + } + + void cleanup() + { + delete sensor_; + } + +private: + std::unique_ptr enumerator_; + std::shared_ptr media_; + CameraSensor *sensor_; +}; + +TEST_REGISTER(CameraSensorTest) diff --git a/test/meson.build b/test/meson.build index 609aeab8..25f181c2 100644 --- a/test/meson.build +++ b/test/meson.build @@ -17,6 +17,7 @@ public_tests = [ ] internal_tests = [ + ['camera-sensor', 'camera-sensor.cpp'], ] foreach t : public_tests -- cgit v1.2.1