/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2020, Sebastian Fricke * * bayer_format.cpp - BayerFormat class tests */ #include #include #include #include "test.h" using namespace std; using namespace libcamera; class BayerFormatTest : public Test { protected: int run() { /* An empty Bayer format has to be invalid. */ BayerFormat bayerFmt; if (bayerFmt.isValid()) { cerr << "An empty BayerFormat has to be invalid." << endl; return TestFail; } /* A correct Bayer format has to be valid. */ bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None); if (!bayerFmt.isValid()) { cerr << "A correct BayerFormat has to be valid." << endl; return TestFail; } /* * Two bayer formats created with the same order and bit depth * have to be equal. */ bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None); BayerFormat bayerFmtExpect = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None); if (bayerFmt != bayerFmtExpect) { cerr << "Comparison of identical formats failed." << endl; return TestFail; } /* * Two Bayer formats created with the same order but with a * different bitDepth are not equal. */ bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None); bayerFmtExpect = BayerFormat(BayerFormat::BGGR, 12, BayerFormat::None); if (bayerFmt == bayerFmtExpect) { cerr << "Comparison of different formats failed." << endl; return TestFail; } /* * Create a Bayer format with a V4L2PixelFormat and check if we * get the same format after converting back to the V4L2 Format. */ V4L2PixelFormat v4l2FmtExpect = V4L2PixelFormat( V4L2_PIX_FMT_SBGGR8); bayerFmt = BayerFormat::fromV4L2PixelFormat(v4l2FmtExpect); V4L2PixelFormat v4l2Fmt = bayerFmt.toV4L2PixelFormat(); if (v4l2Fmt != v4l2FmtExpect) { cerr << "Expected: '" << v4l2FmtExpect.toString() << "' got: '" << v4l2Fmt.toString() << "'" << endl; return TestFail; } /* * Use an empty Bayer format and verify that no matching * V4L2PixelFormat is found. */ v4l2FmtExpect = V4L2PixelFormat(); bayerFmt = BayerFormat(); v4l2Fmt = bayerFmt.toV4L2PixelFormat(); if (v4l2Fmt != v4l2FmtExpect) { cerr << "Expected: empty V4L2PixelFormat got: '" << v4l2Fmt.toString() << "'" << endl; return TestFail; } /* * Check if we get the expected Bayer format BGGR8 * when we convert the V4L2PixelFormat (V4L2_PIX_FMT_SBGGR8) * to a Bayer format. */ bayerFmtExpect = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None); v4l2Fmt = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR8); bayerFmt = BayerFormat::fromV4L2PixelFormat(v4l2Fmt); if (bayerFmt != bayerFmtExpect) { cerr << "Expected BayerFormat '" << bayerFmtExpect.toString() << "', got: '" << bayerFmt.toString() << "'" << endl; return TestFail; } /* * Confirm that a V4L2PixelFormat that is not found in * the conversion table, doesn't yield a Bayer format. */ V4L2PixelFormat v4l2FmtUnknown = V4L2PixelFormat( V4L2_PIX_FMT_BGRA444); bayerFmt = BayerFormat::fromV4L2PixelFormat(v4l2FmtUnknown); if (bayerFmt.isValid()) { cerr << "Expected empty BayerFormat got: '" << bayerFmt.toString() << "'" << endl; return TestFail; } /* * Test if a valid Bayer format can be converted to a * string representation. */ bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None); if (bayerFmt.toString() != "BGGR-8") { cerr << "String representation != 'BGGR-8' (got: '" << bayerFmt.toString() << "' ) " << endl; return TestFail; } /* * Determine if an empty Bayer format results in no * string representation. */ bayerFmt = BayerFormat(); if (bayerFmt.toString() != "INVALID") { cerr << "String representation != 'INVALID' (got: '" << bayerFmt.toString() << "' ) " << endl; return TestFail; } /* * Perform a horizontal Flip and make sure that the * order is adjusted accordingly. */ bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None); bayerFmtExpect = BayerFormat(BayerFormat::GBRG, 8, BayerFormat::None); BayerFormat hFlipFmt = bayerFmt.transform(Transform::HFlip); if (hFlipFmt != bayerFmtExpect) { cerr << "Horizontal flip of 'BGGR-8' should result in '" << bayerFmtExpect.toString() << "', got: '" << hFlipFmt.toString() << "'" << endl; return TestFail; } /* * Perform a vertical Flip and make sure that * the order is adjusted accordingly. */ bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None); bayerFmtExpect = BayerFormat(BayerFormat::GRBG, 8, BayerFormat::None); BayerFormat vFlipFmt = bayerFmt.transform(Transform::VFlip); if (vFlipFmt != bayerFmtExpect) { cerr << "Vertical flip of 'BGGR-8' should result in '" << bayerFmtExpect.toString() << "', got: '" << vFlipFmt.toString() << "'" << endl; return TestFail; } /* * Perform a transposition on a pixel order with both green * pixels on the bottom left to top right diagonal and make * sure, that it doesn't change. */ bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None); BayerFormat transposeFmt = bayerFmt.transform( Transform::Transpose); if (transposeFmt != bayerFmt) { cerr << "Transpose with both green pixels on the " << "antidiagonal should not change the order " << "(got '" << transposeFmt.toString() << "')" << endl; return TestFail; } /* * Perform a transposition on an pixel order with red and blue * on the bottom left to top right diagonal and make sure * that their positions are switched. */ bayerFmt = BayerFormat(BayerFormat::GBRG, 8, BayerFormat::None); bayerFmtExpect = BayerFormat(BayerFormat::GRBG, 8, BayerFormat::None); transposeFmt = bayerFmt.transform(Transform::Transpose); if (transposeFmt != bayerFmtExpect) { cerr << "Transpose with the red & blue pixels on the " << "antidiagonal should switch their position " << "(got '" << transposeFmt.toString() << "')" << endl; return TestFail; } return TestPass; } }; TEST_REGISTER(BayerFormatTest) libcamera: buffer: Rename buffer.h to framebuffer.hLaurent Pinchart 2021-06-25libcamera/base: Move extended base functionalityKieran Bingham 2021-06-14libcamera: request: Add Request::cancel()Jacopo Mondi 2021-03-29libcamera: request: Add a toString()Kieran Bingham 2021-03-29libcamera: request: Provide a sequence numberKieran Bingham 2021-03-29libcamera: buffer: Break friendship with RequestKieran Bingham 2021-03-19libcamera: request: Fix documentation of controls() methodMarian Cichy 2021-03-08libcamera: Request: validate state on completeKieran Bingham 2021-02-02libcamera: Improve Request life cycle trackingJacopo Mondi 2020-11-03libcamera: request: Add tracepointsPaul Elder 2020-10-12libcamera, android, cam, gstreamer, qcam, v4l2: Reuse RequestPaul Elder 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-07-27libcamera: request: Add log point on a completed requestNaushir Patuck 2020-05-16libcamera: Move internal headers to include/libcamera/internal/Laurent Pinchart 2020-01-12libcamera: Switch to FrameBuffer interfaceNiklas Söderlund 2020-01-12libcamera: buffer: Move captured metadata to FrameMetadataNiklas Söderlund 2020-01-12libcamera: request: In addBuffer() do not fetch stream from BufferNiklas Söderlund 2020-01-12libcamera: buffer: Drop private function setRequest()Niklas Söderlund 2020-01-12libcamera: request: remove prepare()Niklas Söderlund 2019-10-13libcamera: controls: Support accessing controls by numerical IDLaurent Pinchart 2019-10-13libcamera: controls: Default ControlList validator argument to nullptrLaurent Pinchart 2019-10-10libcamera: request: Add metadata informationNiklas Söderlund 2019-10-05libcamera: controls: Use ControlValidator to validate ControlListLaurent Pinchart 2019-07-14libcamera: buffer: Add dmabuf file descriptorsJacopo Mondi 2019-07-14libcamera: v4l2_videodevice: Signal buffer completion at streamoff timeLaurent Pinchart 2019-07-14libcamera: buffer: Split memory information to BufferMemoryLaurent Pinchart 2019-07-14libcamera: request: Add cookie to make request tracking easierLaurent Pinchart 2019-07-02libcamera: request: Add a ControlListKieran Bingham 2019-04-19libcamera: Include header related to source file firstLaurent Pinchart 2019-04-19libcamera: Document documentation style and update the code accordinglyLaurent Pinchart 2019-04-18libcamera: buffer: Store Request reference in BufferJacopo Mondi 2019-04-18libcamera: request: Expose the Stream to Buffers mapJacopo Mondi 2019-04-18libcamera: camera: Validate Request before queueing itJacopo Mondi 2019-04-18libcamera: request: Add hasPendingBuffers() methodJacopo Mondi 2019-03-01libcamera: Handle request completion explicitly in pipeline handlersLaurent Pinchart 2019-03-01libcamera: request: Add request completion statusLaurent Pinchart 2019-02-06libcamera: camera: Extend the interface to support captureNiklas Söderlund 2019-02-06libcamera: Provide a Request objectJacopo Mondi