From f5d3fa1254420efb882bbea30db1ff34b8999567 Mon Sep 17 00:00:00 2001 From: Naushir Patuck <naush@raspberrypi.com> Date: Thu, 4 Mar 2021 08:17:28 +0000 Subject: test: delayed_controls: Rename delayed_contols.cpp to delayed_controls.cpp There was a typo in the unit test filename. Fix this typo, no other functional change in this commit. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> --- test/delayed_contols.cpp | 314 ---------------------------------------------- test/delayed_controls.cpp | 314 ++++++++++++++++++++++++++++++++++++++++++++++ test/meson.build | 2 +- 3 files changed, 315 insertions(+), 315 deletions(-) delete mode 100644 test/delayed_contols.cpp create mode 100644 test/delayed_controls.cpp diff --git a/test/delayed_contols.cpp b/test/delayed_contols.cpp deleted file mode 100644 index c6f195b7..00000000 --- a/test/delayed_contols.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ -/* - * Copyright (C) 2020, Google Inc. - * - * delayed_controls.cpp - libcamera delayed controls test - */ - -#include <iostream> - -#include "libcamera/internal/delayed_controls.h" -#include "libcamera/internal/device_enumerator.h" -#include "libcamera/internal/media_device.h" -#include "libcamera/internal/v4l2_videodevice.h" - -#include "test.h" - -using namespace std; -using namespace libcamera; - -class DelayedControlsTest : public Test -{ -public: - DelayedControlsTest() - { - } - -protected: - int init() override - { - 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("vivid"); - dm.add("vivid-000-vid-cap"); - - media_ = enumerator_->search(dm); - if (!media_) { - cerr << "vivid video device found" << endl; - return TestSkip; - } - - dev_ = V4L2VideoDevice::fromEntityName(media_.get(), "vivid-000-vid-cap"); - if (dev_->open()) { - cerr << "Failed to open video device" << endl; - return TestFail; - } - - const ControlInfoMap &infoMap = dev_->controls(); - - /* Make sure the controls we require are present. */ - if (infoMap.empty()) { - cerr << "Failed to enumerate controls" << endl; - return TestFail; - } - - if (infoMap.find(V4L2_CID_BRIGHTNESS) == infoMap.end() || - infoMap.find(V4L2_CID_CONTRAST) == infoMap.end()) { - cerr << "Missing controls" << endl; - return TestFail; - } - - return TestPass; - } - - int singleControlNoDelay() - { - std::unordered_map<uint32_t, DelayedControls::ControlParams> delays = { - { V4L2_CID_BRIGHTNESS, { 0, false } }, - }; - std::unique_ptr<DelayedControls> delayed = - std::make_unique<DelayedControls>(dev_.get(), delays); - ControlList ctrls; - - /* Reset control to value not used in test. */ - ctrls.set(V4L2_CID_BRIGHTNESS, 1); - dev_->setControls(&ctrls); - delayed->reset(); - - /* Trigger the first frame start event */ - delayed->applyControls(0); - - /* Test control without delay are set at once. */ - for (unsigned int i = 1; i < 100; i++) { - int32_t value = 100 + i; - - ctrls.set(V4L2_CID_BRIGHTNESS, value); - delayed->push(ctrls); - - delayed->applyControls(i); - - ControlList result = delayed->get(i); - int32_t brightness = result.get(V4L2_CID_BRIGHTNESS).get<int32_t>(); - if (brightness != value) { - cerr << "Failed single control without delay" - << " frame " << i - << " expected " << value - << " got " << brightness - << endl; - return TestFail; - } - } - - return TestPass; - } - - int singleControlWithDelay() - { - std::unordered_map<uint32_t, DelayedControls::ControlParams> delays = { - { V4L2_CID_BRIGHTNESS, { 1, false } }, - }; - std::unique_ptr<DelayedControls> delayed = - std::make_unique<DelayedControls>(dev_.get(), delays); - ControlList ctrls; - - /* Reset control to value that will be first in test. */ - int32_t expected = 4; - ctrls.set(V4L2_CID_BRIGHTNESS, expected); - dev_->setControls(&ctrls); - delayed->reset(); - - /* Trigger the first frame start event */ - delayed->applyControls(0); - - /* Test single control with delay. */ - for (unsigned int i = 1; i < 100; i++) { - int32_t value = 10 + i; - - ctrls.set(V4L2_CID_BRIGHTNESS, value); - delayed->push(ctrls); - - delayed->applyControls(i); - - ControlList result = delayed->get(i); - int32_t brightness = result.get(V4L2_CID_BRIGHTNESS).get<int32_t>(); - if (brightness != expected) { - cerr << "Failed single control with delay" - << " frame " << i - << " expected " << expected - << " got " << brightness - << endl; - return TestFail; - } - - expected = value; - } - - return TestPass; - } - - int dualControlsWithDelay(uint32_t startOffset) - { - static const unsigned int maxDelay = 2; - - std::unordered_map<uint32_t, DelayedControls::ControlParams> delays = { - { V4L2_CID_BRIGHTNESS, { 1, false } }, - { V4L2_CID_CONTRAST, { maxDelay, false } }, - }; - std::unique_ptr<DelayedControls> delayed = - std::make_unique<DelayedControls>(dev_.get(), delays); - ControlList ctrls; - - /* Reset control to value that will be first two frames in test. */ - int32_t expected = 200; - ctrls.set(V4L2_CID_BRIGHTNESS, expected); - ctrls.set(V4L2_CID_CONTRAST, expected + 1); - dev_->setControls(&ctrls); - delayed->reset(); - - /* Trigger the first frame start event */ - delayed->applyControls(startOffset); - - /* Test dual control with delay. */ - for (unsigned int i = 1; i < 100; i++) { - uint32_t frame = startOffset + i; - int32_t value = 10 + i; - - ctrls.set(V4L2_CID_BRIGHTNESS, value); - ctrls.set(V4L2_CID_CONTRAST, value + 1); - delayed->push(ctrls); - - delayed->applyControls(frame); - - ControlList result = delayed->get(frame); - int32_t brightness = result.get(V4L2_CID_BRIGHTNESS).get<int32_t>(); - int32_t contrast = result.get(V4L2_CID_CONTRAST).get<int32_t>(); - if (brightness != expected || contrast != expected + 1) { - cerr << "Failed dual controls" - << " frame " << frame - << " brightness " << brightness - << " contrast " << contrast - << " expected " << expected - << endl; - return TestFail; - } - - expected = i < maxDelay ? expected : value - 1; - } - - return TestPass; - } - - int dualControlsMultiQueue() - { - static const unsigned int maxDelay = 2; - - std::unordered_map<uint32_t, DelayedControls::ControlParams> delays = { - { V4L2_CID_BRIGHTNESS, { 1, false } }, - { V4L2_CID_CONTRAST, { maxDelay, false } } - }; - std::unique_ptr<DelayedControls> delayed = - std::make_unique<DelayedControls>(dev_.get(), delays); - ControlList ctrls; - - /* Reset control to value that will be first two frames in test. */ - int32_t expected = 100; - ctrls.set(V4L2_CID_BRIGHTNESS, expected); - ctrls.set(V4L2_CID_CONTRAST, expected); - dev_->setControls(&ctrls); - delayed->reset(); - - /* Trigger the first frame start event */ - delayed->applyControls(0); - - /* - * Queue all controls before any fake frame start. Note we - * can't queue up more then the delayed controls history size - * which is 16. Where one spot is used by the reset control. - */ - for (unsigned int i = 0; i < 15; i++) { - int32_t value = 10 + i; - - ctrls.set(V4L2_CID_BRIGHTNESS, value); - ctrls.set(V4L2_CID_CONTRAST, value); - delayed->push(ctrls); - } - - /* Process all queued controls. */ - for (unsigned int i = 1; i < 16; i++) { - int32_t value = 10 + i - 1; - - delayed->applyControls(i); - - ControlList result = delayed->get(i); - - int32_t brightness = result.get(V4L2_CID_BRIGHTNESS).get<int32_t>(); - int32_t contrast = result.get(V4L2_CID_CONTRAST).get<int32_t>(); - if (brightness != expected || contrast != expected) { - cerr << "Failed multi queue" - << " frame " << i - << " brightness " << brightness - << " contrast " << contrast - << " expected " << expected - << endl; - return TestFail; - } - - expected = i < maxDelay ? expected : value - 1; - } - - return TestPass; - } - - int run() override - { - int ret; - - /* Test single control without delay. */ - ret = singleControlNoDelay(); - if (ret) - return ret; - - /* Test single control with delay. */ - ret = singleControlWithDelay(); - if (ret) - return ret; - - /* Test dual controls with different delays. */ - ret = dualControlsWithDelay(0); - if (ret) - return ret; - - /* Test dual controls with non-zero sequence start. */ - ret = dualControlsWithDelay(10000); - if (ret) - return ret; - - /* Test dual controls with sequence number wraparound. */ - ret = dualControlsWithDelay(UINT32_MAX - 50); - if (ret) - return ret; - - /* Test control values produced faster than consumed. */ - ret = dualControlsMultiQueue(); - if (ret) - return ret; - - return TestPass; - } - -private: - std::unique_ptr<DeviceEnumerator> enumerator_; - std::shared_ptr<MediaDevice> media_; - std::unique_ptr<V4L2VideoDevice> dev_; -}; - -TEST_REGISTER(DelayedControlsTest) diff --git a/test/delayed_controls.cpp b/test/delayed_controls.cpp new file mode 100644 index 00000000..c6f195b7 --- /dev/null +++ b/test/delayed_controls.cpp @@ -0,0 +1,314 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2020, Google Inc. + * + * delayed_controls.cpp - libcamera delayed controls test + */ + +#include <iostream> + +#include "libcamera/internal/delayed_controls.h" +#include "libcamera/internal/device_enumerator.h" +#include "libcamera/internal/media_device.h" +#include "libcamera/internal/v4l2_videodevice.h" + +#include "test.h" + +using namespace std; +using namespace libcamera; + +class DelayedControlsTest : public Test +{ +public: + DelayedControlsTest() + { + } + +protected: + int init() override + { + 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("vivid"); + dm.add("vivid-000-vid-cap"); + + media_ = enumerator_->search(dm); + if (!media_) { + cerr << "vivid video device found" << endl; + return TestSkip; + } + + dev_ = V4L2VideoDevice::fromEntityName(media_.get(), "vivid-000-vid-cap"); + if (dev_->open()) { + cerr << "Failed to open video device" << endl; + return TestFail; + } + + const ControlInfoMap &infoMap = dev_->controls(); + + /* Make sure the controls we require are present. */ + if (infoMap.empty()) { + cerr << "Failed to enumerate controls" << endl; + return TestFail; + } + + if (infoMap.find(V4L2_CID_BRIGHTNESS) == infoMap.end() || + infoMap.find(V4L2_CID_CONTRAST) == infoMap.end()) { + cerr << "Missing controls" << endl; + return TestFail; + } + + return TestPass; + } + + int singleControlNoDelay() + { + std::unordered_map<uint32_t, DelayedControls::ControlParams> delays = { + { V4L2_CID_BRIGHTNESS, { 0, false } }, + }; + std::unique_ptr<DelayedControls> delayed = + std::make_unique<DelayedControls>(dev_.get(), delays); + ControlList ctrls; + + /* Reset control to value not used in test. */ + ctrls.set(V4L2_CID_BRIGHTNESS, 1); + dev_->setControls(&ctrls); + delayed->reset(); + + /* Trigger the first frame start event */ + delayed->applyControls(0); + + /* Test control without delay are set at once. */ + for (unsigned int i = 1; i < 100; i++) { + int32_t value = 100 + i; + + ctrls.set(V4L2_CID_BRIGHTNESS, value); + delayed->push(ctrls); + + delayed->applyControls(i); + + ControlList result = delayed->get(i); + int32_t brightness = result.get(V4L2_CID_BRIGHTNESS).get<int32_t>(); + if (brightness != value) { + cerr << "Failed single control without delay" + << " frame " << i + << " expected " << value + << " got " << brightness + << endl; + return TestFail; + } + } + + return TestPass; + } + + int singleControlWithDelay() + { + std::unordered_map<uint32_t, DelayedControls::ControlParams> delays = { + { V4L2_CID_BRIGHTNESS, { 1, false } }, + }; + std::unique_ptr<DelayedControls> delayed = + std::make_unique<DelayedControls>(dev_.get(), delays); + ControlList ctrls; + + /* Reset control to value that will be first in test. */ + int32_t expected = 4; + ctrls.set(V4L2_CID_BRIGHTNESS, expected); + dev_->setControls(&ctrls); + delayed->reset(); + + /* Trigger the first frame start event */ + delayed->applyControls(0); + + /* Test single control with delay. */ + for (unsigned int i = 1; i < 100; i++) { + int32_t value = 10 + i; + + ctrls.set(V4L2_CID_BRIGHTNESS, value); + delayed->push(ctrls); + + delayed->applyControls(i); + + ControlList result = delayed->get(i); + int32_t brightness = result.get(V4L2_CID_BRIGHTNESS).get<int32_t>(); + if (brightness != expected) { + cerr << "Failed single control with delay" + << " frame " << i + << " expected " << expected + << " got " << brightness + << endl; + return TestFail; + } + + expected = value; + } + + return TestPass; + } + + int dualControlsWithDelay(uint32_t startOffset) + { + static const unsigned int maxDelay = 2; + + std::unordered_map<uint32_t, DelayedControls::ControlParams> delays = { + { V4L2_CID_BRIGHTNESS, { 1, false } }, + { V4L2_CID_CONTRAST, { maxDelay, false } }, + }; + std::unique_ptr<DelayedControls> delayed = + std::make_unique<DelayedControls>(dev_.get(), delays); + ControlList ctrls; + + /* Reset control to value that will be first two frames in test. */ + int32_t expected = 200; + ctrls.set(V4L2_CID_BRIGHTNESS, expected); + ctrls.set(V4L2_CID_CONTRAST, expected + 1); + dev_->setControls(&ctrls); + delayed->reset(); + + /* Trigger the first frame start event */ + delayed->applyControls(startOffset); + + /* Test dual control with delay. */ + for (unsigned int i = 1; i < 100; i++) { + uint32_t frame = startOffset + i; + int32_t value = 10 + i; + + ctrls.set(V4L2_CID_BRIGHTNESS, value); + ctrls.set(V4L2_CID_CONTRAST, value + 1); + delayed->push(ctrls); + + delayed->applyControls(frame); + + ControlList result = delayed->get(frame); + int32_t brightness = result.get(V4L2_CID_BRIGHTNESS).get<int32_t>(); + int32_t contrast = result.get(V4L2_CID_CONTRAST).get<int32_t>(); + if (brightness != expected || contrast != expected + 1) { + cerr << "Failed dual controls" + << " frame " << frame + << " brightness " << brightness + << " contrast " << contrast + << " expected " << expected + << endl; + return TestFail; + } + + expected = i < maxDelay ? expected : value - 1; + } + + return TestPass; + } + + int dualControlsMultiQueue() + { + static const unsigned int maxDelay = 2; + + std::unordered_map<uint32_t, DelayedControls::ControlParams> delays = { + { V4L2_CID_BRIGHTNESS, { 1, false } }, + { V4L2_CID_CONTRAST, { maxDelay, false } } + }; + std::unique_ptr<DelayedControls> delayed = + std::make_unique<DelayedControls>(dev_.get(), delays); + ControlList ctrls; + + /* Reset control to value that will be first two frames in test. */ + int32_t expected = 100; + ctrls.set(V4L2_CID_BRIGHTNESS, expected); + ctrls.set(V4L2_CID_CONTRAST, expected); + dev_->setControls(&ctrls); + delayed->reset(); + + /* Trigger the first frame start event */ + delayed->applyControls(0); + + /* + * Queue all controls before any fake frame start. Note we + * can't queue up more then the delayed controls history size + * which is 16. Where one spot is used by the reset control. + */ + for (unsigned int i = 0; i < 15; i++) { + int32_t value = 10 + i; + + ctrls.set(V4L2_CID_BRIGHTNESS, value); + ctrls.set(V4L2_CID_CONTRAST, value); + delayed->push(ctrls); + } + + /* Process all queued controls. */ + for (unsigned int i = 1; i < 16; i++) { + int32_t value = 10 + i - 1; + + delayed->applyControls(i); + + ControlList result = delayed->get(i); + + int32_t brightness = result.get(V4L2_CID_BRIGHTNESS).get<int32_t>(); + int32_t contrast = result.get(V4L2_CID_CONTRAST).get<int32_t>(); + if (brightness != expected || contrast != expected) { + cerr << "Failed multi queue" + << " frame " << i + << " brightness " << brightness + << " contrast " << contrast + << " expected " << expected + << endl; + return TestFail; + } + + expected = i < maxDelay ? expected : value - 1; + } + + return TestPass; + } + + int run() override + { + int ret; + + /* Test single control without delay. */ + ret = singleControlNoDelay(); + if (ret) + return ret; + + /* Test single control with delay. */ + ret = singleControlWithDelay(); + if (ret) + return ret; + + /* Test dual controls with different delays. */ + ret = dualControlsWithDelay(0); + if (ret) + return ret; + + /* Test dual controls with non-zero sequence start. */ + ret = dualControlsWithDelay(10000); + if (ret) + return ret; + + /* Test dual controls with sequence number wraparound. */ + ret = dualControlsWithDelay(UINT32_MAX - 50); + if (ret) + return ret; + + /* Test control values produced faster than consumed. */ + ret = dualControlsMultiQueue(); + if (ret) + return ret; + + return TestPass; + } + +private: + std::unique_ptr<DeviceEnumerator> enumerator_; + std::shared_ptr<MediaDevice> media_; + std::unique_ptr<V4L2VideoDevice> dev_; +}; + +TEST_REGISTER(DelayedControlsTest) diff --git a/test/meson.build b/test/meson.build index 89e6ebff..310b7cad 100644 --- a/test/meson.build +++ b/test/meson.build @@ -30,7 +30,7 @@ internal_tests = [ ['bayer-format', 'bayer-format.cpp'], ['byte-stream-buffer', 'byte-stream-buffer.cpp'], ['camera-sensor', 'camera-sensor.cpp'], - ['delayed_contols', 'delayed_contols.cpp'], + ['delayed_controls', 'delayed_controls.cpp'], ['event', 'event.cpp'], ['event-dispatcher', 'event-dispatcher.cpp'], ['event-thread', 'event-thread.cpp'], -- cgit v1.2.1