summaryrefslogtreecommitdiff
path: root/test/meson.build
AgeCommit message (Expand)Author
2022-08-26test: Add a ColorSpace testLaurent Pinchart
2022-05-10py: Add unittests.pyTomi Valkeinen
2022-05-10test: Add YamlParser testHan-Lin Chen
2022-01-19test: Ensure CameraTest tests are not run in parallelKieran Bingham
2021-12-11test: fence: Add test for the Fence classJacopo Mondi
2021-12-04libcamera: base: Rename FileDescriptor to SharedFDLaurent Pinchart
2021-12-03test: Add UniqueFD testLaurent Pinchart
2021-08-14test: gstreamer: Add test for gstreamer single streamVedant Paranjape
2021-08-03test: Add tests for the Flags classLaurent Pinchart
2021-06-25test: Ensure LIBCAMERA_BASE_PRIVATE isn't publicKieran Bingham
2021-06-25libcamera: rename public libcamera dependencyKieran Bingham
2021-06-25libcamera/base: Validate internal headers as privateKieran Bingham
2021-03-28meson: Summarize which applications and adaptation layers are builtLaurent Pinchart
2021-03-12test: delayed_controls: Rename delayed_contols.cpp to delayed_controls.cppNaushir Patuck
2021-02-04test: Add unit tests for the BayerFormat classSebastian Fricke
2021-01-29test: delayed_controls: Add test case for DelayedControlsNiklas Söderlund
2020-12-30meson: test: Simplify top level mesonKieran Bingham
2020-08-06test: mapped-buffers: Provide MappedBuffer testKieran Bingham
2020-07-31tests: Add a test case for the Object::deleteLater() API, to verifyUmang Jain
2020-07-28test: Remove list-cameras testLaurent Pinchart
2020-07-10tests: v4l2_compat: Add test for v4l2_compatPaul Elder
2020-06-25libcamera: pixel_format: Replace hex with format namesKaaira Gupta
2020-06-17tests: Introduce hotplug hot-unplug unit testUmang Jain
2020-05-13licenses: License all meson files under CC0-1.0Laurent Pinchart
2020-04-14test: Add File class testsLaurent Pinchart
2020-03-06test: Add Span testLaurent Pinchart
2020-01-12test: file_descriptor: Add testNiklas Söderlund
2019-11-20test: Add control serialization testJacopo Mondi
2019-11-20test: Add ByteStreamBuffer testLaurent Pinchart
2019-10-15libcamera: utils: Add hex stream output helperLaurent Pinchart
2019-08-19test: Get event dispatcher from current threadLaurent Pinchart
2019-08-17test: Add Timer thread move testLaurent Pinchart
2019-08-17test: Add EventNotifier thread move testLaurent Pinchart
2019-08-17test: Add Object class thread affinity testLaurent Pinchart
2019-08-17test: Add Object::invokeMethod() testLaurent Pinchart
2019-07-17test: logging: move logging tests to a subdirectoryPaul Elder
2019-07-17test: logging: add logging process testPaul Elder
2019-07-12libcamera: Add Process and ProcessManager classesPaul Elder
2019-07-12test: add logging API testPaul Elder
2019-07-11test: Add test case for signal delivery across threadsLaurent Pinchart
2019-07-11test: Add Message test caseLaurent Pinchart
2019-07-11test: Add Thread test casesLaurent Pinchart
2019-07-02libcamera: test: Add ControlValue testKieran Bingham
2019-07-02test: ipc: unix: Add test for IPCUnixSocketNiklas Söderlund
2019-06-19libcamera: Rename V4L2Device to V4L2VideoDeviceJacopo Mondi
2019-06-19test: stream: Add test for StreamFormatNiklas Söderlund
2019-06-12tests: Add CameraSensor class testLaurent Pinchart
2019-05-23meson: Create and use a dependency for libcamera and its headersLaurent Pinchart
2019-05-21test: ipa: add IPAModule testsPaul Elder
2019-04-18test: geometry: Add tests for Size class comparison operatorsLaurent Pinchart
t;MyIPA>()); * } * \endcode * * The wrapper takes ownership of the IPAInterface and will automatically * delete it when the wrapper is destroyed. */ /** * \brief Construct an IPAInterfaceWrapper wrapping \a interface * \param[in] interface The interface to wrap */ IPAInterfaceWrapper::IPAInterfaceWrapper(std::unique_ptr<IPAInterface> interface) : ipa_(std::move(interface)), callbacks_(nullptr), cb_ctx_(nullptr) { ops = &operations_; ipa_->queueFrameAction.connect(this, &IPAInterfaceWrapper::queueFrameAction); } void IPAInterfaceWrapper::destroy(struct ipa_context *_ctx) { IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx); delete ctx; } void *IPAInterfaceWrapper::get_interface(struct ipa_context *_ctx) { IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx); return ctx->ipa_.get(); } void IPAInterfaceWrapper::init(struct ipa_context *_ctx, const struct ipa_settings *settings) { IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx); IPASettings ipaSettings{ .configurationFile = settings->configuration_file }; ctx->ipa_->init(ipaSettings); } int IPAInterfaceWrapper::start(struct ipa_context *_ctx) { IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx); return ctx->ipa_->start(); } void IPAInterfaceWrapper::stop(struct ipa_context *_ctx) { IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx); ctx->ipa_->stop(); } void IPAInterfaceWrapper::register_callbacks(struct ipa_context *_ctx, const struct ipa_callback_ops *callbacks, void *cb_ctx) { IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx); ctx->callbacks_ = callbacks; ctx->cb_ctx_ = cb_ctx; } void IPAInterfaceWrapper::configure(struct ipa_context *_ctx, const struct ipa_stream *streams, unsigned int num_streams, const struct ipa_control_info_map *maps, unsigned int num_maps) { IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx); ctx->serializer_.reset(); /* Translate the IPA stream configurations map. */ std::map<unsigned int, IPAStream> ipaStreams; for (unsigned int i = 0; i < num_streams; ++i) { const struct ipa_stream &stream = streams[i]; ipaStreams[stream.id] = { stream.pixel_format, Size(stream.width, stream.height), }; } /* Translate the IPA entity controls map. */ std::map<unsigned int, const ControlInfoMap &> entityControls; std::map<unsigned int, ControlInfoMap> infoMaps; for (unsigned int i = 0; i < num_maps; ++i) { const struct ipa_control_info_map &ipa_map = maps[i]; ByteStreamBuffer byteStream(ipa_map.data, ipa_map.size); unsigned int id = ipa_map.id; infoMaps[id] = ctx->serializer_.deserialize<ControlInfoMap>(byteStream); entityControls.emplace(id, infoMaps[id]); } ctx->ipa_->configure(ipaStreams, entityControls); } void IPAInterfaceWrapper::map_buffers(struct ipa_context *_ctx, const struct ipa_buffer *_buffers, size_t num_buffers) { IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx); std::vector<IPABuffer> buffers(num_buffers); for (unsigned int i = 0; i < num_buffers; ++i) { const struct ipa_buffer &_buffer = _buffers[i]; IPABuffer &buffer = buffers[i]; std::vector<FrameBuffer::Plane> &planes = buffer.planes; buffer.id = _buffer.id; planes.resize(_buffer.num_planes); for (unsigned int j = 0; j < _buffer.num_planes; ++j) { planes[j].fd = FileDescriptor(_buffer.planes[j].dmabuf); planes[j].length = _buffer.planes[j].length; } } ctx->ipa_->mapBuffers(buffers); } void IPAInterfaceWrapper::unmap_buffers(struct ipa_context *_ctx, const unsigned int *_ids, size_t num_buffers) { IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx); std::vector<unsigned int> ids(_ids, _ids + num_buffers); ctx->ipa_->unmapBuffers(ids); } void IPAInterfaceWrapper::process_event(struct ipa_context *_ctx, const struct ipa_operation_data *data) { IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx); IPAOperationData opData; opData.operation = data->operation; opData.data.resize(data->num_data); memcpy(opData.data.data(), data->data, data->num_data * sizeof(*data->data)); opData.controls.resize(data->num_lists); for (unsigned int i = 0; i < data->num_lists; ++i) { const struct ipa_control_list *c_list = &data->lists[i]; ByteStreamBuffer byteStream(c_list->data, c_list->size); opData.controls[i] = ctx->serializer_.deserialize<ControlList>(byteStream); } ctx->ipa_->processEvent(opData); } void IPAInterfaceWrapper::queueFrameAction(unsigned int frame, const IPAOperationData &data) { if (!callbacks_) return; struct ipa_operation_data c_data; c_data.operation = data.operation; c_data.data = data.data.data(); c_data.num_data = data.data.size(); struct ipa_control_list control_lists[data.controls.size()]; c_data.lists = control_lists; c_data.num_lists = data.controls.size(); std::size_t listsSize = 0; for (const auto &list : data.controls) listsSize += serializer_.binarySize(list); std::vector<uint8_t> binaryData(listsSize); ByteStreamBuffer byteStreamBuffer(binaryData.data(), listsSize); unsigned int i = 0; for (const auto &list : data.controls) { struct ipa_control_list &c_list = control_lists[i]; c_list.size = serializer_.binarySize(list); ByteStreamBuffer b = byteStreamBuffer.carveOut(c_list.size); serializer_.serialize(list, b); c_list.data = b.base(); } callbacks_->queue_frame_action(cb_ctx_, frame, c_data); } #ifndef __DOXYGEN__ /* * This construct confuses Doygen and makes it believe that all members of the * operations is a member of IPAInterfaceWrapper. It must thus be hidden. */ const struct ipa_context_ops IPAInterfaceWrapper::operations_ = { .destroy = &IPAInterfaceWrapper::destroy, .get_interface = &IPAInterfaceWrapper::get_interface, .init = &IPAInterfaceWrapper::init, .start = &IPAInterfaceWrapper::start, .stop = &IPAInterfaceWrapper::stop, .register_callbacks = &IPAInterfaceWrapper::register_callbacks, .configure = &IPAInterfaceWrapper::configure, .map_buffers = &IPAInterfaceWrapper::map_buffers, .unmap_buffers = &IPAInterfaceWrapper::unmap_buffers, .process_event = &IPAInterfaceWrapper::process_event, }; #endif } /* namespace libcamera */