summaryrefslogtreecommitdiff
path: root/src
AgeCommit message (Expand)Author
2020-03-07gst: utils: Add simple scoped lockers for GMutex and GRectMutexNicolas Dufresne
2020-03-07gst: Add initial device providerNicolas Dufresne
2020-03-07gst: Add utility to convert StreamFormats to GstCapsNicolas Dufresne
2020-03-07Add GStreamer plugin and element skeletonNicolas Dufresne
2020-03-07libcamera: v4l2_videodevice: Don't use std::atomic specializationLaurent Pinchart
2020-03-06libcamera: V4L2BufferCache: Improve cache eviction strategyNiklas Söderlund
2020-03-06libcamera: V4L2BufferCache: Check for hot hit firstNiklas Söderlund
2020-03-06libcamera: V4L2BufferCache: Use the entry referenceNiklas Söderlund
2020-03-06libcamera: V4L2BufferCache: Mark Entry::operator==() as constNiklas Söderlund
2020-03-06cam: Add option to list camera propertiesJacopo Mondi
2020-03-06libcamera: control_serializer: Add support for array controlsJacopo Mondi
2020-03-06libcamera: control_serializer: Use zero-copy ByteStreamBuffer::read()Laurent Pinchart
2020-03-06libcamera: control_serializer: Simplify serialization of ControlValueLaurent Pinchart
2020-03-06libcamera: control_serializer: Use explicit ControlTypeNone caseLaurent Pinchart
2020-03-06libcamera: byte_stream_buffer: Add zero-copy read() variantLaurent Pinchart
2020-03-06libcamera: byte_stream_buffer: Add Span<> supportJacopo Mondi
2020-03-06libcamera: byte_stream_buffer: Fix documentation of read() and write()Jacopo Mondi
2020-03-06libcamera: ipa: Support array controls in ipa_control_value_entryLaurent Pinchart
2020-03-06libcamera: controls: Convert bool ControlValue to lowercase stringsLaurent Pinchart
2020-03-06libcamera: controls: Add support for byte controlsJacopo Mondi
2020-03-06libcamera: controls: Add support for float controlsJacopo Mondi
2020-03-06libcamera: controls: Add a 'size' yaml propertyJacopo Mondi
2020-03-06libcamera: controls: Allow passing an std::initializer list to set()Laurent Pinchart
2020-03-06libcamera: controls: Support array controls in ControlValueJacopo Mondi
2020-03-06libcamera: controls: Expose raw data in ControlValueLaurent Pinchart
2020-03-06libcamera: controls: Move Control constructor to controls.hLaurent Pinchart
2020-03-06libcamera: controls: Move ControlValue constructor to controls.hLaurent Pinchart
2020-03-06libcamera: controls: Move ControlValue get() and set() to controls.hLaurent Pinchart
2020-03-06libcamera: controls: Return control by valueLaurent Pinchart
2020-03-06libcamera: controls: Decouple control and value type in ControlList::set()Laurent Pinchart
2020-03-06libcamera: controls: Don't convert 32-bit and 64-bit implicitlyLaurent Pinchart
2020-03-06libcamera: controls: Reorder ControlValue methodsJacopo Mondi
2020-03-06libcamera: ipa: Test control structure size with static_assertLaurent Pinchart
2020-03-06libcamera: ipa: Make <ipa/ipa_controls.h> self-containedLaurent Pinchart
2020-03-06libcamera: ipa: Remove unused IPA control typesJacopo Mondi
2020-03-06libcamera: gen-controls: Fix documentation issue with <<Jacopo Mondi
2020-02-24libcamera: ipa_manager: Search for IPA libraries in build treeKieran Bingham
2020-02-24libcamera: ipa_manager: Allow recursive parsingKieran Bingham
2020-02-24libcamera: ipa_manager: Simplify addDir() usageKieran Bingham
2020-02-24libcamera: ipa_manager: Re-arrange IPA precedenceKieran Bingham
2020-02-24libcamera: utils: Add a C++ dirname implementationKieran Bingham
2020-02-19qcam: Fix compilation errors with clang-10Laurent Pinchart
2020-02-19qcam: Use standard PicturesLocation path for captureKieran Bingham
2020-02-19libcamera: media_device: Use Loggable interfaceKieran Bingham
2020-02-19libcamera: media_device: prevent sign extension on castsKieran Bingham
2020-02-18libcamera: Use C++14 std::*_t type traitsLaurent Pinchart
2020-02-18libcamera: device_enumerator: Don't stop if one device failsLaurent Pinchart
2020-02-14android: camera_device: Use Camera properties for static MetadataJacopo Mondi
2020-02-14libcamera: camera: Add Camera propertiesJacopo Mondi
2020-02-14libcamera: pipeline_handler: Add Camera propertiesJacopo Mondi
lass="hl opt"><< "\t" << path << endl; return TestFail; } return TestPass; } int testEnumerate() { std::vector<unsigned int> integers{ 1, 2, 3, 4, 5 }; unsigned int i = 0; for (auto [index, value] : utils::enumerate(integers)) { if (index != i || value != i + 1) { cerr << "utils::enumerate(<vector>) test failed: i=" << i << ", index=" << index << ", value=" << value << std::endl; return TestFail; } /* Verify that we can modify the value. */ --value; ++i; } if (integers != std::vector<unsigned int>{ 0, 1, 2, 3, 4 }) { cerr << "Failed to modify container in enumerated range loop" << endl; return TestFail; } Span<const unsigned int> span{ integers }; i = 0; for (auto [index, value] : utils::enumerate(span)) { if (index != i || value != i) { cerr << "utils::enumerate(<span>) test failed: i=" << i << ", index=" << index << ", value=" << value << std::endl; return TestFail; } ++i; } const unsigned int array[] = { 0, 2, 4, 6, 8 }; i = 0; for (auto [index, value] : utils::enumerate(array)) { if (index != i || value != i * 2) { cerr << "utils::enumerate(<array>) test failed: i=" << i << ", index=" << index << ", value=" << value << std::endl; return TestFail; } ++i; } return TestPass; } int testDuration() { std::ostringstream os; utils::Duration exposure; double ratio; exposure = 25ms + 25ms; if (exposure.get<std::micro>() != 50000.0) { cerr << "utils::Duration failed to return microsecond count"; return TestFail; } exposure = 1.0s / 4; if (exposure != 250ms) { cerr << "utils::Duration failed scalar divide test"; return TestFail; } exposure = 5000.5us; if (!exposure) { cerr << "utils::Duration failed boolean test"; return TestFail; } os << exposure; if (os.str() != "5000.50us") { cerr << "utils::Duration operator << failed"; return TestFail; } exposure = 100ms; ratio = exposure / 25ms; if (ratio != 4.0) { cerr << "utils::Duration failed ratio test"; return TestFail; } return TestPass; } int run() { /* utils::hex() test. */ std::ostringstream os; std::string ref; os << utils::hex(static_cast<int8_t>(0x42)) << " "; ref += "0x42 "; os << utils::hex(static_cast<uint8_t>(0x42)) << " "; ref += "0x42 "; os << utils::hex(static_cast<int16_t>(0x42)) << " "; ref += "0x0042 "; os << utils::hex(static_cast<uint16_t>(0x42)) << " "; ref += "0x0042 "; os << utils::hex(static_cast<int32_t>(0x42)) << " "; ref += "0x00000042 "; os << utils::hex(static_cast<uint32_t>(0x42)) << " "; ref += "0x00000042 "; os << utils::hex(static_cast<int64_t>(0x42)) << " "; ref += "0x0000000000000042 "; os << utils::hex(static_cast<uint64_t>(0x42)) << " "; ref += "0x0000000000000042 "; os << utils::hex(static_cast<int8_t>(0x42), 6) << " "; ref += "0x000042 "; os << utils::hex(static_cast<uint8_t>(0x42), 1) << " "; ref += "0x42 "; os << utils::hex(static_cast<int16_t>(0x42), 6) << " "; ref += "0x000042 "; os << utils::hex(static_cast<uint16_t>(0x42), 1) << " "; ref += "0x42 "; os << utils::hex(static_cast<int32_t>(0x42), 4) << " "; ref += "0x0042 "; os << utils::hex(static_cast<uint32_t>(0x42), 1) << " "; ref += "0x42 "; os << utils::hex(static_cast<int64_t>(0x42), 4) << " "; ref += "0x0042 "; os << utils::hex(static_cast<uint64_t>(0x42), 1) << " "; ref += "0x42 "; std::string s = os.str(); if (s != ref) { cerr << "utils::hex() test failed, expected '" << ref << "', got '" << s << "'"; return TestFail; } /* utils::join() and utils::split() test. */ std::vector<std::string> elements = { "/bin", "/usr/bin", "", "", }; std::string path; for (const auto &element : elements) path += (path.empty() ? "" : ":") + element; if (path != utils::join(elements, ":")) { cerr << "utils::join() test failed" << endl; return TestFail; } std::vector<std::string> dirs; for (const auto &dir : utils::split(path, ":")) dirs.push_back(dir); if (dirs != elements) { cerr << "utils::split() test failed" << endl; return TestFail; } const auto &split = utils::split(path, ":"); dirs = std::vector<std::string>{ split.begin(), split.end() }; if (dirs != elements) { cerr << "utils::split() LegacyInputIterator test failed" << endl; return TestFail; } /* utils::join() with conversion function test. */ std::vector<Size> sizes = { { 0, 0 }, { 100, 100 } }; s = utils::join(sizes, "/", [](const Size &size) { return size.toString(); }); if (s != "0x0/100x100") { cerr << "utils::join() with conversion test failed" << endl; return TestFail; } /* utils::dirname() tests. */ if (TestPass != testDirname()) return TestFail; /* utils::map_keys() test. */ const std::map<std::string, unsigned int> map{ { "zero", 0 }, { "one", 1 }, { "two", 2 }, }; std::vector<std::string> expectedKeys{ "zero", "one", "two", }; std::sort(expectedKeys.begin(), expectedKeys.end()); const std::vector<std::string> keys = utils::map_keys(map); if (keys != expectedKeys) { cerr << "utils::map_keys() test failed" << endl; return TestFail; } /* utils::alignUp() and utils::alignDown() tests. */ if (utils::alignDown(6, 3) != 6 || utils::alignDown(7, 3) != 6) { cerr << "utils::alignDown test failed" << endl; return TestFail; } if (utils::alignUp(6, 3) != 6 || utils::alignUp(7, 3) != 9) { cerr << "utils::alignUp test failed" << endl; return TestFail; } /* utils::enumerate() test. */ if (testEnumerate() != TestPass) return TestFail; /* utils::Duration test. */ if (testDuration() != TestPass) return TestFail; return TestPass; } }; TEST_REGISTER(UtilsTest)