summaryrefslogtreecommitdiff
path: root/test
AgeCommit message (Expand)Author
2021-03-02tests: Test IPA serializer generationPaul Elder
2021-03-02tests: Add test for IPCPipeUnixSocketPaul Elder
2021-03-02tests: Add IPADataSerializer testPaul Elder
2021-02-16libcamera: IPAInterface: Replace C API with the new C++-only APIPaul Elder
2021-02-16tests: Remove IPA wrappers testPaul Elder
2021-02-11meson: Fix coding style when declaring arraysLaurent Pinchart
2021-02-05libcamera: camera_sensor: Add frame length limits to CameraSensorInfoNaushir Patuck
2021-02-04test: Add unit tests for the BayerFormat classSebastian Fricke
2021-02-04test: buffer-import: Fix false-positive failureKieran Bingham
2021-01-29test: delayed_controls: Add test case for DelayedControlsNiklas Söderlund
2020-12-30meson: test: Simplify top level mesonKieran Bingham
2020-12-30test: file: Check that directories are not treated as filesKieran Bingham
2020-12-14libcamera: Replace ARRAY_SIZE() with std::size()Laurent Pinchart
2020-12-09libcamera: v4l2_device: Return a unique pointer from fromEntityName()Laurent Pinchart
2020-12-08libcamera: ipa: Pass a set of controls and return results from ipa::start()Naushir Patuck
2020-11-15libcamera: Move EventDispatcher to internal APILaurent Pinchart
2020-11-15test: Get event dispatcher from current threadLaurent Pinchart
2020-10-27test: geometry: Add unit tests for new geometry helper functionsDavid Plowman
2020-10-23libcamera: Drop unneeded empty default constructors and destructorsLaurent Pinchart
2020-10-21test: v4l2_videodevice: Prevent variable shadowing of formatKieran Bingham
2020-10-20ipa: Rename ipa_vimc.h to vimc.hLaurent Pinchart
2020-10-20test: Omit extra semicolonsHirokazu Honda
2020-10-12libcamera, android, cam, gstreamer, qcam, v4l2: Reuse RequestPaul Elder
2020-10-09test: span: Fix typo describing the dynamic span testPaul Elder
2020-10-07libcamera: ProcessManager: make ProcessManager lifetime explicitly managedPaul Elder
2020-09-21test: Include specific headers instead of libcamera.hLaurent Pinchart
2020-08-25meson: Remove -Wno-unused-parameterLaurent Pinchart
2020-08-14libcamera: request: Make Stream pointer constNiklas Söderlund
2020-08-14libcamera: request: Declare a using directive for map of buffersNiklas Söderlund
2020-08-13test: ipc: unixsocket: Close open fds on error pathsUmang Jain
2020-08-06test: mapped-buffers: Provide MappedBuffer testKieran Bingham
2020-08-05libcamera: camera: Rename name() to id()Niklas Söderlund
2020-08-05libcamera: pipelines: Use sensor ID as camera nameNiklas Söderlund
2020-08-03libcamera: geometry: Add isNull() function to Rectangle classJacopo Mondi
2020-08-03libcamera: utils: Add alignUp and alignDown functionsJacopo Mondi
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-27test: process: Test Process::kill()Laurent Pinchart
2020-07-23libcamera: v4l2_subdevice: Replace ImageFormats with a mapNiklas Söderlund
2020-07-17tests: v4l2_compat: Fix v4l2-compliance and v4l2-ctl version parsingPaul Elder
2020-07-17libcamera: ipa_interface: Add support for custom IPA data to configure()Laurent Pinchart
2020-07-15test: file: Add file creation testLaurent Pinchart
2020-07-15test: file: Add read/write testsLaurent Pinchart
2020-07-15libcamera: geometry: Provide in-place versions of the Size helpersLaurent Pinchart
2020-07-15libcamera: geometry: Add helper functions to the Size classLaurent Pinchart
2020-07-13tests: v4l2_compat: Check v4l2-compliance and v4l2-ctl versionsPaul Elder
2020-07-13tests: v4l2_compat: Prettify failure outputPaul Elder
2020-07-10tests: v4l2_compat: Add test for v4l2_compatPaul Elder
2020-07-09libcamera: utils: Add map_keys() functionLaurent Pinchart
2020-07-08libcamera: Use Size::isNull()Laurent Pinchart
ose * transforms. Transforms are composed according to the usual mathematical * convention such that the right transform is applied first, and the left * transform is applied second. * * Finally, we have a total of 8 distinct transformations, as follows (a * couple of them have additional synonyms for convenience). We illustrate each * with its nominal effect on a rectangle with vertices labelled A, B, C and D. * * \sa https://en.wikipedia.org/wiki/Examples_of_groups#dihedral_group_of_order_8 * * The set of 2D plane transforms is also known as the symmetry group of a * square, described in the link. Note that the group can be generated by * only 2 elements (the horizontal flip and a 90 degree rotation, for * example), however, the encoding used here makes the presence of the vertical * flip explicit. * * \var Transform::Identity * * Identity transform. ~~~ A-B A-B Input image | | goes to output image | | C-D C-D ~~~ * Numeric value: 0 (no bits set). * * \var Transform::Rot0 * * Synonym for Transform::Identity (zero degree rotation). * * \var Transform::HFlip * * Horizontal flip. ~~~ A-B B-A Input image | | goes to output image | | C-D D-C ~~~ * Numeric value: 1 (horizontal flip bit set only). * * \var Transform::VFlip * * Vertical flip. ~~~ A-B C-D Input image | | goes to output image | | C-D A-B ~~~ * Numeric value: 2 (vertical flip bit set only). * * \var Transform::HVFlip * * Horizontal and vertical flip (identical to a 180 degree rotation). ~~~ A-B D-C Input image | | goes to output image | | C-D B-A ~~~ * Numeric value: 3 (horizontal and vertical flip bits set). * * \var Transform::Rot180 * * Synonym for `HVFlip` (180 degree rotation). * * \var Transform::Transpose * * Transpose (about the main diagonal). ~~~ A-B A-C Input image | | goes to output image | | C-D B-D ~~~ * Numeric value: 4 (transpose bit set only). * * \var Transform::Rot270 * * Rotation by 270 degrees clockwise (90 degrees anticlockwise). ~~~ A-B B-D Input image | | goes to output image | | C-D A-C ~~~ * Numeric value: 5 (transpose and horizontal flip bits set). * * \var Transform::Rot90 * * Rotation by 90 degrees clockwise (270 degrees anticlockwise). ~~~ A-B C-A Input image | | goes to output image | | C-D D-B ~~~ * Numeric value: 6 (transpose and vertical flip bits set). * * \var Transform::Rot180Transpose * * Rotation by 180 degrees followed by transpose (alternatively, transposition * about the "opposite diagonal"). ~~~ A-B D-B Input image | | goes to output image | | C-D C-A ~~~ * Numeric value: 7 (all bits set). */ /** * \fn operator &(Transform t0, Transform t1) * \brief Apply bitwise AND operator between the bits in the two transforms * \param[in] t0 The first transform * \param[in] t1 The second transform */ /** * \fn operator |(Transform t0, Transform t1) * \brief Apply bitwise OR operator between the bits in the two transforms * \param[in] t0 The first transform * \param[in] t1 The second transform */ /** * \fn operator ^(Transform t0, Transform t1) * \brief Apply bitwise XOR operator between the bits in the two transforms * \param[in] t0 The first transform * \param[in] t1 The second transform */ /** * \fn operator &=(Transform &t0, Transform t1) * \brief Apply bitwise AND-assignment operator between the bits in the two * transforms * \param[in] t0 The first transform * \param[in] t1 The second transform */ /** * \fn operator |=(Transform &t0, Transform t1) * \brief Apply bitwise OR-assignment operator between the bits in the two * transforms * \param[in] t0 The first transform * \param[in] t1 The second transform */ /** * \fn operator ^=(Transform &t0, Transform t1) * \brief Apply bitwise XOR-assignment operator between the bits in the two * transforms * \param[in] t0 The first transform * \param[in] t1 The second transform */ /** * \brief Compose two transforms together * \param[in] t1 The second transform * \param[in] t0 The first transform * * Composing transforms follows the usual mathematical convention for * composing functions. That is, when performing `t1 * t0`, \a t0 is applied * first, and then \a t1. * For example, `Transpose * HFlip` performs `HFlip` first and then the * `Transpose` yielding `Rot270`, as shown below. ~~~ A-B B-A B-D Input image | | -> HFLip -> | | -> Transpose -> | | = Rot270 C-D D-C A-C ~~~ * Note that composition is generally non-commutative for Transforms, * and not the same as XOR-ing the underlying bit representations. */ Transform operator*(Transform t1, Transform t0) { /* * Reorder the operations so that we imagine doing t0's transpose * (if any) after t1's flips. The effect is to swap t1's hflips for * vflips and vice versa, after which we can just xor all the bits. */ Transform reordered = t1; if (!!(t0 & Transform::Transpose)) { reordered = t1 & Transform::Transpose; if (!!(t1 & Transform::HFlip)) reordered |= Transform::VFlip; if (!!(t1 & Transform::VFlip)) reordered |= Transform::HFlip; } return reordered ^ t0; } /** * \brief Invert a transform * \param[in] t The transform to be inverted * * That is, we return the transform such that `t * (-t)` and `(-t) * t` both * yield the identity transform. */ Transform operator-(Transform t) { /* All are self-inverses, except for Rot270 and Rot90. */ static const Transform inverses[] = { Transform::Identity, Transform::HFlip, Transform::VFlip, Transform::HVFlip, Transform::Transpose, Transform::Rot90, Transform::Rot270, Transform::Rot180Transpose }; return inverses[static_cast<int>(t)]; } /** * \fn operator!(Transform t) * \brief Return `true` if the transform is the `Identity`, otherwise `false` * \param[in] t The transform to be tested */ /** * \fn operator~(Transform t) * \brief Return the transform with all the bits inverted individually * \param[in] t The transform of which the bits will be inverted * * This inverts the bits that encode the transform in a bitwise manner. Note * that this is not the proper inverse of transform \a t (for which use \a * operator-). */ /** * \brief Return the transform representing a rotation of the given angle * clockwise * \param[in] angle The angle of rotation in a clockwise sense. Negative values * can be used to represent anticlockwise rotations * \param[out] success Set to `true` if the angle is a multiple of 90 degrees, * otherwise `false` * \return The transform corresponding to the rotation if \a success was set to * `true`, otherwise the `Identity` transform */ Transform transformFromRotation(int angle, bool *success) { angle = angle % 360; if (angle < 0) angle += 360; if (success != nullptr) *success = true; switch (angle) { case 0: return Transform::Identity; case 90: return Transform::Rot90; case 180: return Transform::Rot180; case 270: return Transform::Rot270; } if (success != nullptr) *success = false; return Transform::Identity; } /** * \brief Return a character string describing the transform * \param[in] t The transform to be described. */ const char *transformToString(Transform t) { static const char *strings[] = { "identity", "hflip", "vflip", "hvflip", "transpose", "rot270", "rot90", "rot180transpose" }; return strings[static_cast<int>(t)]; } } /* namespace libcamera */