Message ID | 20201205103106.242080-10-paul.elder@ideasonboard.com |
---|---|
State | Superseded |
Delegated to: | Paul Elder |
Headers | show |
Series |
|
Related | show |
Hi Paul, Thanks for your patch. On 2020-12-05 19:30:52 +0900, Paul Elder wrote: > Since we will soon no longer use IPA wrappers, remove the test for it. > > Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> > > --- > Changes in v5: > - move earlier in series > > No change in v4 > > No change in v3 > > New in v2 > --- > test/ipa/ipa_wrappers_test.cpp | 452 --------------------------------- > test/ipa/meson.build | 1 - > 2 files changed, 453 deletions(-) > delete mode 100644 test/ipa/ipa_wrappers_test.cpp > > diff --git a/test/ipa/ipa_wrappers_test.cpp b/test/ipa/ipa_wrappers_test.cpp > deleted file mode 100644 > index 59d991cb..00000000 > --- a/test/ipa/ipa_wrappers_test.cpp > +++ /dev/null > @@ -1,452 +0,0 @@ > -/* SPDX-License-Identifier: GPL-2.0-or-later */ > -/* > - * Copyright (C) 2019, Google Inc. > - * > - * ipa_wrappers_test.cpp - Test the IPA interface and context wrappers > - */ > - > -#include <fcntl.h> > -#include <iostream> > -#include <memory> > -#include <linux/videodev2.h> > -#include <sys/stat.h> > -#include <unistd.h> > - > -#include <libcamera/controls.h> > -#include <libipa/ipa_interface_wrapper.h> > - > -#include "libcamera/internal/camera_sensor.h" > -#include "libcamera/internal/device_enumerator.h" > -#include "libcamera/internal/ipa_context_wrapper.h" > -#include "libcamera/internal/media_device.h" > -#include "libcamera/internal/v4l2_subdevice.h" > - > -#include "test.h" > - > -using namespace libcamera; > -using namespace std; > - > -enum Operation { > - Op_init, > - Op_start, > - Op_stop, > - Op_configure, > - Op_mapBuffers, > - Op_unmapBuffers, > - Op_processEvent, > -}; > - > -class TestIPAInterface : public IPAInterface > -{ > -public: > - TestIPAInterface() > - : sequence_(0) > - { > - } > - > - int init(const IPASettings &settings) override > - { > - if (settings.configurationFile != "/ipa/configuration/file") { > - cerr << "init(): Invalid configuration file" << endl; > - report(Op_init, TestFail); > - return 0; > - } > - > - report(Op_init, TestPass); > - return 0; > - } > - > - int start() override > - { > - report(Op_start, TestPass); > - return 0; > - } > - > - void stop() override > - { > - report(Op_stop, TestPass); > - } > - > - void configure(const CameraSensorInfo &sensorInfo, > - const std::map<unsigned int, IPAStream> &streamConfig, > - const std::map<unsigned int, const ControlInfoMap &> &entityControls, > - [[maybe_unused]] const IPAOperationData &ipaConfig, > - [[maybe_unused]] IPAOperationData *result) override > - { > - /* Verify sensorInfo. */ > - if (sensorInfo.outputSize.width != 2560 || > - sensorInfo.outputSize.height != 1940) { > - cerr << "configure(): Invalid sensor info size " > - << sensorInfo.outputSize.toString(); > - } > - > - /* Verify streamConfig. */ > - if (streamConfig.size() != 2) { > - cerr << "configure(): Invalid number of streams " > - << streamConfig.size() << endl; > - return report(Op_configure, TestFail); > - } > - > - auto iter = streamConfig.find(1); > - if (iter == streamConfig.end()) { > - cerr << "configure(): No configuration for stream 1" << endl; > - return report(Op_configure, TestFail); > - } > - const IPAStream *stream = &iter->second; > - if (stream->pixelFormat != V4L2_PIX_FMT_YUYV || > - stream->size != Size{ 1024, 768 }) { > - cerr << "configure(): Invalid configuration for stream 1" << endl; > - return report(Op_configure, TestFail); > - } > - > - iter = streamConfig.find(2); > - if (iter == streamConfig.end()) { > - cerr << "configure(): No configuration for stream 2" << endl; > - return report(Op_configure, TestFail); > - } > - stream = &iter->second; > - if (stream->pixelFormat != V4L2_PIX_FMT_NV12 || > - stream->size != Size{ 800, 600 }) { > - cerr << "configure(): Invalid configuration for stream 2" << endl; > - return report(Op_configure, TestFail); > - } > - > - /* Verify entityControls. */ > - auto ctrlIter = entityControls.find(42); > - if (ctrlIter == entityControls.end()) { > - cerr << "configure(): Controls not found" << endl; > - return report(Op_configure, TestFail); > - } > - > - const ControlInfoMap &infoMap = ctrlIter->second; > - > - if (infoMap.count(V4L2_CID_BRIGHTNESS) != 1 || > - infoMap.count(V4L2_CID_CONTRAST) != 1 || > - infoMap.count(V4L2_CID_SATURATION) != 1) { > - cerr << "configure(): Invalid control IDs" << endl; > - return report(Op_configure, TestFail); > - } > - > - report(Op_configure, TestPass); > - } > - > - void mapBuffers(const std::vector<IPABuffer> &buffers) override > - { > - if (buffers.size() != 2) { > - cerr << "mapBuffers(): Invalid number of buffers " > - << buffers.size() << endl; > - return report(Op_mapBuffers, TestFail); > - } > - > - if (buffers[0].id != 10 || > - buffers[1].id != 11) { > - cerr << "mapBuffers(): Invalid buffer IDs" << endl; > - return report(Op_mapBuffers, TestFail); > - } > - > - if (buffers[0].planes.size() != 3 || > - buffers[1].planes.size() != 3) { > - cerr << "mapBuffers(): Invalid number of planes" << endl; > - return report(Op_mapBuffers, TestFail); > - } > - > - if (buffers[0].planes[0].length != 4096 || > - buffers[0].planes[1].length != 0 || > - buffers[0].planes[2].length != 0 || > - buffers[0].planes[0].length != 4096 || > - buffers[1].planes[1].length != 4096 || > - buffers[1].planes[2].length != 0) { > - cerr << "mapBuffers(): Invalid length" << endl; > - return report(Op_mapBuffers, TestFail); > - } > - > - if (buffers[0].planes[0].fd.fd() == -1 || > - buffers[0].planes[1].fd.fd() != -1 || > - buffers[0].planes[2].fd.fd() != -1 || > - buffers[0].planes[0].fd.fd() == -1 || > - buffers[1].planes[1].fd.fd() == -1 || > - buffers[1].planes[2].fd.fd() != -1) { > - cerr << "mapBuffers(): Invalid dmabuf" << endl; > - return report(Op_mapBuffers, TestFail); > - } > - > - report(Op_mapBuffers, TestPass); > - } > - > - void unmapBuffers(const std::vector<unsigned int> &ids) override > - { > - if (ids.size() != 2) { > - cerr << "unmapBuffers(): Invalid number of ids " > - << ids.size() << endl; > - return report(Op_unmapBuffers, TestFail); > - } > - > - if (ids[0] != 10 || ids[1] != 11) { > - cerr << "unmapBuffers(): Invalid buffer IDs" << endl; > - return report(Op_unmapBuffers, TestFail); > - } > - > - report(Op_unmapBuffers, TestPass); > - } > - > - void processEvent(const IPAOperationData &data) override > - { > - /* Verify operation and data. */ > - if (data.operation != Op_processEvent) { > - cerr << "processEvent(): Invalid operation " > - << data.operation << endl; > - return report(Op_processEvent, TestFail); > - } > - > - if (data.data != std::vector<unsigned int>{ 1, 2, 3, 4 }) { > - cerr << "processEvent(): Invalid data" << endl; > - return report(Op_processEvent, TestFail); > - } > - > - /* Verify controls. */ > - if (data.controls.size() != 1) { > - cerr << "processEvent(): Controls not found" << endl; > - return report(Op_processEvent, TestFail); > - } > - > - const ControlList &controls = data.controls[0]; > - if (controls.get(V4L2_CID_BRIGHTNESS).get<int32_t>() != 10 || > - controls.get(V4L2_CID_CONTRAST).get<int32_t>() != 20 || > - controls.get(V4L2_CID_SATURATION).get<int32_t>() != 30) { > - cerr << "processEvent(): Invalid controls" << endl; > - return report(Op_processEvent, TestFail); > - } > - > - report(Op_processEvent, TestPass); > - } > - > -private: > - void report(Operation op, int status) > - { > - IPAOperationData data; > - data.operation = op; > - data.data.resize(1); > - data.data[0] = status; > - queueFrameAction.emit(sequence_++, data); > - } > - > - unsigned int sequence_; > -}; > - > -#define INVOKE(method, ...) \ > - invoke(&IPAInterface::method, Op_##method, #method, ##__VA_ARGS__) > - > -class IPAWrappersTest : public Test > -{ > -public: > - IPAWrappersTest() > - : subdev_(nullptr), wrapper_(nullptr), sequence_(0), fd_(-1) > - { > - } > - > -protected: > - int init() override > - { > - /* Locate the VIMC Sensor B subdevice. */ > - enumerator_ = unique_ptr<DeviceEnumerator>(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 << "No VIMC media device found: skip test" << endl; > - return TestSkip; > - } > - > - MediaEntity *entity = media_->getEntityByName("Sensor A"); > - if (!entity) { > - cerr << "Unable to find media entity 'Sensor A'" << endl; > - return TestFail; > - } > - > - subdev_ = new V4L2Subdevice(entity); > - if (subdev_->open() < 0) { > - cerr << "Unable to open 'Sensor A' subdevice" << endl; > - return TestFail; > - } > - > - /* Force usage of the C API as that's what we want to test. */ > - int ret = setenv("LIBCAMERA_IPA_FORCE_C_API", "", 1); > - if (ret) > - return TestFail; > - > - std::unique_ptr<IPAInterface> intf = std::make_unique<TestIPAInterface>(); > - wrapper_ = new IPAContextWrapper(new IPAInterfaceWrapper(std::move(intf))); > - wrapper_->queueFrameAction.connect(this, &IPAWrappersTest::queueFrameAction); > - > - /* Create a file descriptor for the buffer-related operations. */ > - fd_ = open("/tmp", O_TMPFILE | O_RDWR, 0600); > - if (fd_ == -1) > - return TestFail; > - > - ret = ftruncate(fd_, 4096); > - if (ret < 0) > - return TestFail; > - > - return TestPass; > - } > - > - int run() override > - { > - int ret; > - > - /* Test configure(). */ > - CameraSensorInfo sensorInfo{ > - .model = "sensor", > - .bitsPerPixel = 8, > - .activeAreaSize = { 2576, 1956 }, > - .analogCrop = { 8, 8, 2560, 1940 }, > - .outputSize = { 2560, 1940 }, > - .pixelRate = 96000000, > - .lineLength = 2918, > - }; > - std::map<unsigned int, IPAStream> config{ > - { 1, { V4L2_PIX_FMT_YUYV, { 1024, 768 } } }, > - { 2, { V4L2_PIX_FMT_NV12, { 800, 600 } } }, > - }; > - std::map<unsigned int, const ControlInfoMap &> controlInfo; > - controlInfo.emplace(42, subdev_->controls()); > - IPAOperationData ipaConfig; > - ret = INVOKE(configure, sensorInfo, config, controlInfo, > - ipaConfig, nullptr); > - if (ret == TestFail) > - return TestFail; > - > - /* Test mapBuffers(). */ > - std::vector<IPABuffer> buffers(2); > - buffers[0].planes.resize(3); > - buffers[0].id = 10; > - buffers[0].planes[0].fd = FileDescriptor(fd_); > - buffers[0].planes[0].length = 4096; > - buffers[1].id = 11; > - buffers[1].planes.resize(3); > - buffers[1].planes[0].fd = FileDescriptor(fd_); > - buffers[1].planes[0].length = 4096; > - buffers[1].planes[1].fd = FileDescriptor(fd_); > - buffers[1].planes[1].length = 4096; > - > - ret = INVOKE(mapBuffers, buffers); > - if (ret == TestFail) > - return TestFail; > - > - /* Test unmapBuffers(). */ > - std::vector<unsigned int> bufferIds = { 10, 11 }; > - ret = INVOKE(unmapBuffers, bufferIds); > - if (ret == TestFail) > - return TestFail; > - > - /* Test processEvent(). */ > - IPAOperationData data; > - data.operation = Op_processEvent; > - data.data = { 1, 2, 3, 4 }; > - data.controls.emplace_back(subdev_->controls()); > - > - ControlList &controls = data.controls.back(); > - controls.set(V4L2_CID_BRIGHTNESS, static_cast<int32_t>(10)); > - controls.set(V4L2_CID_CONTRAST, static_cast<int32_t>(20)); > - controls.set(V4L2_CID_SATURATION, static_cast<int32_t>(30)); > - > - ret = INVOKE(processEvent, data); > - if (ret == TestFail) > - return TestFail; > - > - /* > - * Test init(), start() and stop() last to ensure nothing in the > - * wrappers or serializer depends on them being called first. > - */ > - IPASettings settings{ > - .configurationFile = "/ipa/configuration/file" > - }; > - ret = INVOKE(init, settings); > - if (ret == TestFail) { > - cerr << "Failed to run init()"; > - return TestFail; > - } > - > - ret = INVOKE(start); > - if (ret == TestFail) { > - cerr << "Failed to run start()"; > - return TestFail; > - } > - > - ret = INVOKE(stop); > - if (ret == TestFail) { > - cerr << "Failed to run stop()"; > - return TestFail; > - } > - > - return TestPass; > - } > - > - void cleanup() override > - { > - delete wrapper_; > - delete subdev_; > - > - if (fd_ != -1) > - close(fd_); > - } > - > -private: > - template<typename T, typename... Args1, typename... Args2> > - int invoke(T (IPAInterface::*func)(Args1...), Operation op, > - const char *name, Args2... args) > - { > - data_ = IPAOperationData(); > - (wrapper_->*func)(args...); > - > - if (frame_ != sequence_) { > - cerr << "IPAInterface::" << name > - << "(): invalid frame number " << frame_ > - << ", expected " << sequence_; > - return TestFail; > - } > - > - sequence_++; > - > - if (data_.operation != op) { > - cerr << "IPAInterface::" << name > - << "(): failed to propagate" << endl; > - return TestFail; > - } > - > - if (data_.data[0] != TestPass) { > - cerr << "IPAInterface::" << name > - << "(): reported an error" << endl; > - return TestFail; > - } > - > - return TestPass; > - } > - > - void queueFrameAction(unsigned int frame, const IPAOperationData &data) > - { > - frame_ = frame; > - data_ = data; > - } > - > - std::shared_ptr<MediaDevice> media_; > - std::unique_ptr<DeviceEnumerator> enumerator_; > - V4L2Subdevice *subdev_; > - > - IPAContextWrapper *wrapper_; > - IPAOperationData data_; > - unsigned int sequence_; > - unsigned int frame_; > - int fd_; > -}; > - > -TEST_REGISTER(IPAWrappersTest) > diff --git a/test/ipa/meson.build b/test/ipa/meson.build > index ba672f3f..e4f0818a 100644 > --- a/test/ipa/meson.build > +++ b/test/ipa/meson.build > @@ -3,7 +3,6 @@ > ipa_test = [ > ['ipa_module_test', 'ipa_module_test.cpp'], > ['ipa_interface_test', 'ipa_interface_test.cpp'], > - ['ipa_wrappers_test', 'ipa_wrappers_test.cpp'], > ] > > foreach t : ipa_test > -- > 2.27.0 > > _______________________________________________ > libcamera-devel mailing list > libcamera-devel@lists.libcamera.org > https://lists.libcamera.org/listinfo/libcamera-devel
diff --git a/test/ipa/ipa_wrappers_test.cpp b/test/ipa/ipa_wrappers_test.cpp deleted file mode 100644 index 59d991cb..00000000 --- a/test/ipa/ipa_wrappers_test.cpp +++ /dev/null @@ -1,452 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ -/* - * Copyright (C) 2019, Google Inc. - * - * ipa_wrappers_test.cpp - Test the IPA interface and context wrappers - */ - -#include <fcntl.h> -#include <iostream> -#include <memory> -#include <linux/videodev2.h> -#include <sys/stat.h> -#include <unistd.h> - -#include <libcamera/controls.h> -#include <libipa/ipa_interface_wrapper.h> - -#include "libcamera/internal/camera_sensor.h" -#include "libcamera/internal/device_enumerator.h" -#include "libcamera/internal/ipa_context_wrapper.h" -#include "libcamera/internal/media_device.h" -#include "libcamera/internal/v4l2_subdevice.h" - -#include "test.h" - -using namespace libcamera; -using namespace std; - -enum Operation { - Op_init, - Op_start, - Op_stop, - Op_configure, - Op_mapBuffers, - Op_unmapBuffers, - Op_processEvent, -}; - -class TestIPAInterface : public IPAInterface -{ -public: - TestIPAInterface() - : sequence_(0) - { - } - - int init(const IPASettings &settings) override - { - if (settings.configurationFile != "/ipa/configuration/file") { - cerr << "init(): Invalid configuration file" << endl; - report(Op_init, TestFail); - return 0; - } - - report(Op_init, TestPass); - return 0; - } - - int start() override - { - report(Op_start, TestPass); - return 0; - } - - void stop() override - { - report(Op_stop, TestPass); - } - - void configure(const CameraSensorInfo &sensorInfo, - const std::map<unsigned int, IPAStream> &streamConfig, - const std::map<unsigned int, const ControlInfoMap &> &entityControls, - [[maybe_unused]] const IPAOperationData &ipaConfig, - [[maybe_unused]] IPAOperationData *result) override - { - /* Verify sensorInfo. */ - if (sensorInfo.outputSize.width != 2560 || - sensorInfo.outputSize.height != 1940) { - cerr << "configure(): Invalid sensor info size " - << sensorInfo.outputSize.toString(); - } - - /* Verify streamConfig. */ - if (streamConfig.size() != 2) { - cerr << "configure(): Invalid number of streams " - << streamConfig.size() << endl; - return report(Op_configure, TestFail); - } - - auto iter = streamConfig.find(1); - if (iter == streamConfig.end()) { - cerr << "configure(): No configuration for stream 1" << endl; - return report(Op_configure, TestFail); - } - const IPAStream *stream = &iter->second; - if (stream->pixelFormat != V4L2_PIX_FMT_YUYV || - stream->size != Size{ 1024, 768 }) { - cerr << "configure(): Invalid configuration for stream 1" << endl; - return report(Op_configure, TestFail); - } - - iter = streamConfig.find(2); - if (iter == streamConfig.end()) { - cerr << "configure(): No configuration for stream 2" << endl; - return report(Op_configure, TestFail); - } - stream = &iter->second; - if (stream->pixelFormat != V4L2_PIX_FMT_NV12 || - stream->size != Size{ 800, 600 }) { - cerr << "configure(): Invalid configuration for stream 2" << endl; - return report(Op_configure, TestFail); - } - - /* Verify entityControls. */ - auto ctrlIter = entityControls.find(42); - if (ctrlIter == entityControls.end()) { - cerr << "configure(): Controls not found" << endl; - return report(Op_configure, TestFail); - } - - const ControlInfoMap &infoMap = ctrlIter->second; - - if (infoMap.count(V4L2_CID_BRIGHTNESS) != 1 || - infoMap.count(V4L2_CID_CONTRAST) != 1 || - infoMap.count(V4L2_CID_SATURATION) != 1) { - cerr << "configure(): Invalid control IDs" << endl; - return report(Op_configure, TestFail); - } - - report(Op_configure, TestPass); - } - - void mapBuffers(const std::vector<IPABuffer> &buffers) override - { - if (buffers.size() != 2) { - cerr << "mapBuffers(): Invalid number of buffers " - << buffers.size() << endl; - return report(Op_mapBuffers, TestFail); - } - - if (buffers[0].id != 10 || - buffers[1].id != 11) { - cerr << "mapBuffers(): Invalid buffer IDs" << endl; - return report(Op_mapBuffers, TestFail); - } - - if (buffers[0].planes.size() != 3 || - buffers[1].planes.size() != 3) { - cerr << "mapBuffers(): Invalid number of planes" << endl; - return report(Op_mapBuffers, TestFail); - } - - if (buffers[0].planes[0].length != 4096 || - buffers[0].planes[1].length != 0 || - buffers[0].planes[2].length != 0 || - buffers[0].planes[0].length != 4096 || - buffers[1].planes[1].length != 4096 || - buffers[1].planes[2].length != 0) { - cerr << "mapBuffers(): Invalid length" << endl; - return report(Op_mapBuffers, TestFail); - } - - if (buffers[0].planes[0].fd.fd() == -1 || - buffers[0].planes[1].fd.fd() != -1 || - buffers[0].planes[2].fd.fd() != -1 || - buffers[0].planes[0].fd.fd() == -1 || - buffers[1].planes[1].fd.fd() == -1 || - buffers[1].planes[2].fd.fd() != -1) { - cerr << "mapBuffers(): Invalid dmabuf" << endl; - return report(Op_mapBuffers, TestFail); - } - - report(Op_mapBuffers, TestPass); - } - - void unmapBuffers(const std::vector<unsigned int> &ids) override - { - if (ids.size() != 2) { - cerr << "unmapBuffers(): Invalid number of ids " - << ids.size() << endl; - return report(Op_unmapBuffers, TestFail); - } - - if (ids[0] != 10 || ids[1] != 11) { - cerr << "unmapBuffers(): Invalid buffer IDs" << endl; - return report(Op_unmapBuffers, TestFail); - } - - report(Op_unmapBuffers, TestPass); - } - - void processEvent(const IPAOperationData &data) override - { - /* Verify operation and data. */ - if (data.operation != Op_processEvent) { - cerr << "processEvent(): Invalid operation " - << data.operation << endl; - return report(Op_processEvent, TestFail); - } - - if (data.data != std::vector<unsigned int>{ 1, 2, 3, 4 }) { - cerr << "processEvent(): Invalid data" << endl; - return report(Op_processEvent, TestFail); - } - - /* Verify controls. */ - if (data.controls.size() != 1) { - cerr << "processEvent(): Controls not found" << endl; - return report(Op_processEvent, TestFail); - } - - const ControlList &controls = data.controls[0]; - if (controls.get(V4L2_CID_BRIGHTNESS).get<int32_t>() != 10 || - controls.get(V4L2_CID_CONTRAST).get<int32_t>() != 20 || - controls.get(V4L2_CID_SATURATION).get<int32_t>() != 30) { - cerr << "processEvent(): Invalid controls" << endl; - return report(Op_processEvent, TestFail); - } - - report(Op_processEvent, TestPass); - } - -private: - void report(Operation op, int status) - { - IPAOperationData data; - data.operation = op; - data.data.resize(1); - data.data[0] = status; - queueFrameAction.emit(sequence_++, data); - } - - unsigned int sequence_; -}; - -#define INVOKE(method, ...) \ - invoke(&IPAInterface::method, Op_##method, #method, ##__VA_ARGS__) - -class IPAWrappersTest : public Test -{ -public: - IPAWrappersTest() - : subdev_(nullptr), wrapper_(nullptr), sequence_(0), fd_(-1) - { - } - -protected: - int init() override - { - /* Locate the VIMC Sensor B subdevice. */ - enumerator_ = unique_ptr<DeviceEnumerator>(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 << "No VIMC media device found: skip test" << endl; - return TestSkip; - } - - MediaEntity *entity = media_->getEntityByName("Sensor A"); - if (!entity) { - cerr << "Unable to find media entity 'Sensor A'" << endl; - return TestFail; - } - - subdev_ = new V4L2Subdevice(entity); - if (subdev_->open() < 0) { - cerr << "Unable to open 'Sensor A' subdevice" << endl; - return TestFail; - } - - /* Force usage of the C API as that's what we want to test. */ - int ret = setenv("LIBCAMERA_IPA_FORCE_C_API", "", 1); - if (ret) - return TestFail; - - std::unique_ptr<IPAInterface> intf = std::make_unique<TestIPAInterface>(); - wrapper_ = new IPAContextWrapper(new IPAInterfaceWrapper(std::move(intf))); - wrapper_->queueFrameAction.connect(this, &IPAWrappersTest::queueFrameAction); - - /* Create a file descriptor for the buffer-related operations. */ - fd_ = open("/tmp", O_TMPFILE | O_RDWR, 0600); - if (fd_ == -1) - return TestFail; - - ret = ftruncate(fd_, 4096); - if (ret < 0) - return TestFail; - - return TestPass; - } - - int run() override - { - int ret; - - /* Test configure(). */ - CameraSensorInfo sensorInfo{ - .model = "sensor", - .bitsPerPixel = 8, - .activeAreaSize = { 2576, 1956 }, - .analogCrop = { 8, 8, 2560, 1940 }, - .outputSize = { 2560, 1940 }, - .pixelRate = 96000000, - .lineLength = 2918, - }; - std::map<unsigned int, IPAStream> config{ - { 1, { V4L2_PIX_FMT_YUYV, { 1024, 768 } } }, - { 2, { V4L2_PIX_FMT_NV12, { 800, 600 } } }, - }; - std::map<unsigned int, const ControlInfoMap &> controlInfo; - controlInfo.emplace(42, subdev_->controls()); - IPAOperationData ipaConfig; - ret = INVOKE(configure, sensorInfo, config, controlInfo, - ipaConfig, nullptr); - if (ret == TestFail) - return TestFail; - - /* Test mapBuffers(). */ - std::vector<IPABuffer> buffers(2); - buffers[0].planes.resize(3); - buffers[0].id = 10; - buffers[0].planes[0].fd = FileDescriptor(fd_); - buffers[0].planes[0].length = 4096; - buffers[1].id = 11; - buffers[1].planes.resize(3); - buffers[1].planes[0].fd = FileDescriptor(fd_); - buffers[1].planes[0].length = 4096; - buffers[1].planes[1].fd = FileDescriptor(fd_); - buffers[1].planes[1].length = 4096; - - ret = INVOKE(mapBuffers, buffers); - if (ret == TestFail) - return TestFail; - - /* Test unmapBuffers(). */ - std::vector<unsigned int> bufferIds = { 10, 11 }; - ret = INVOKE(unmapBuffers, bufferIds); - if (ret == TestFail) - return TestFail; - - /* Test processEvent(). */ - IPAOperationData data; - data.operation = Op_processEvent; - data.data = { 1, 2, 3, 4 }; - data.controls.emplace_back(subdev_->controls()); - - ControlList &controls = data.controls.back(); - controls.set(V4L2_CID_BRIGHTNESS, static_cast<int32_t>(10)); - controls.set(V4L2_CID_CONTRAST, static_cast<int32_t>(20)); - controls.set(V4L2_CID_SATURATION, static_cast<int32_t>(30)); - - ret = INVOKE(processEvent, data); - if (ret == TestFail) - return TestFail; - - /* - * Test init(), start() and stop() last to ensure nothing in the - * wrappers or serializer depends on them being called first. - */ - IPASettings settings{ - .configurationFile = "/ipa/configuration/file" - }; - ret = INVOKE(init, settings); - if (ret == TestFail) { - cerr << "Failed to run init()"; - return TestFail; - } - - ret = INVOKE(start); - if (ret == TestFail) { - cerr << "Failed to run start()"; - return TestFail; - } - - ret = INVOKE(stop); - if (ret == TestFail) { - cerr << "Failed to run stop()"; - return TestFail; - } - - return TestPass; - } - - void cleanup() override - { - delete wrapper_; - delete subdev_; - - if (fd_ != -1) - close(fd_); - } - -private: - template<typename T, typename... Args1, typename... Args2> - int invoke(T (IPAInterface::*func)(Args1...), Operation op, - const char *name, Args2... args) - { - data_ = IPAOperationData(); - (wrapper_->*func)(args...); - - if (frame_ != sequence_) { - cerr << "IPAInterface::" << name - << "(): invalid frame number " << frame_ - << ", expected " << sequence_; - return TestFail; - } - - sequence_++; - - if (data_.operation != op) { - cerr << "IPAInterface::" << name - << "(): failed to propagate" << endl; - return TestFail; - } - - if (data_.data[0] != TestPass) { - cerr << "IPAInterface::" << name - << "(): reported an error" << endl; - return TestFail; - } - - return TestPass; - } - - void queueFrameAction(unsigned int frame, const IPAOperationData &data) - { - frame_ = frame; - data_ = data; - } - - std::shared_ptr<MediaDevice> media_; - std::unique_ptr<DeviceEnumerator> enumerator_; - V4L2Subdevice *subdev_; - - IPAContextWrapper *wrapper_; - IPAOperationData data_; - unsigned int sequence_; - unsigned int frame_; - int fd_; -}; - -TEST_REGISTER(IPAWrappersTest) diff --git a/test/ipa/meson.build b/test/ipa/meson.build index ba672f3f..e4f0818a 100644 --- a/test/ipa/meson.build +++ b/test/ipa/meson.build @@ -3,7 +3,6 @@ ipa_test = [ ['ipa_module_test', 'ipa_module_test.cpp'], ['ipa_interface_test', 'ipa_interface_test.cpp'], - ['ipa_wrappers_test', 'ipa_wrappers_test.cpp'], ] foreach t : ipa_test