[libcamera-devel] [PATCH v3 5/5] test: Add unit tests for the BayerFormat class
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Wed Jan 27 00:21:36 CET 2021
Hi Sebastian,
A few other comments.
On Wed, Jan 27, 2021 at 01:12:56AM +0200, Laurent Pinchart wrote:
> On Tue, Jan 26, 2021 at 07:48:54PM +0100, Sebastian Fricke wrote:
> > Test all of the present methods including the newly implemented
> > `fromV4L2PixelFormat`, as well as the new operators `==/!=`.
> >
> > Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
> > Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > Reviewed-by: David Plowman <david.plowman at raspberrypi.com>
> > Signed-off-by: Sebastian Fricke <sebastian.fricke at posteo.net>
> > ---
> > test/bayer_format.cpp | 210 ++++++++++++++++++++++++++++++++++++++++++
> > test/meson.build | 1 +
> > 2 files changed, 211 insertions(+)
> > create mode 100644 test/bayer_format.cpp
> >
> > diff --git a/test/bayer_format.cpp b/test/bayer_format.cpp
> > new file mode 100644
> > index 00000000..f763500f
> > --- /dev/null
> > +++ b/test/bayer_format.cpp
> > @@ -0,0 +1,210 @@
> > +/* SPDX-License-Identifier: GPL-2.0-or-later */
> > +/*
> > + * Copyright (C) 2020, Sebastian Fricke
> > + *
> > + * bayer_format.cpp - BayerFormat class tests
> > + */
> > +
> > +#include <iostream>
> > +
> > +#include <libcamera/internal/bayer_format.h>
> > +#include <libcamera/transform.h>
> > +
> > +#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 divergent formats failed."
>
> s/divergent/different/
>
> > + << 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 "
>
> s/antidiagonal,/antidiagonal/
>
> > + << " result: '" << transposeFmt.toString() << "'"
There's no line break before this line, so the message on the console
would look weird. I'd write
<< "(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 "
>
> Same here.
>
> > + << " result: '" << transposeFmt.toString() << "'"
Same here.
> > + << endl;
> > + return TestFail;
> > + }
> > +
> > + return TestPass;
> > + }
> > +};
> > +
> > +TEST_REGISTER(BayerFormatTest);
>
> s/;//
>
> > diff --git a/test/meson.build b/test/meson.build
> > index 7f0682ad..709b47aa 100644
> > --- a/test/meson.build
> > +++ b/test/meson.build
> > @@ -27,6 +27,7 @@ public_tests = [
> > ]
> >
> > internal_tests = [
> > + ['bayer-format', 'bayer_format.cpp'],
I'd rename the file to bayer-format.cpp to match the other files in this
directory.
> > ['byte-stream-buffer', 'byte-stream-buffer.cpp'],
> > ['camera-sensor', 'camera-sensor.cpp'],
> > ['event', 'event.cpp'],
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list