From patchwork Thu Dec 31 15:53:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Fricke X-Patchwork-Id: 10798 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 28247C0F1A for ; Thu, 31 Dec 2020 15:54:38 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E855361D25; Thu, 31 Dec 2020 16:54:37 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="mQcbRPzY"; dkim-atps=neutral Received: from mail-wm1-x329.google.com (mail-wm1-x329.google.com [IPv6:2a00:1450:4864:20::329]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 11B0B6031D for ; Thu, 31 Dec 2020 16:54:37 +0100 (CET) Received: by mail-wm1-x329.google.com with SMTP id r4so7512403wmh.5 for ; Thu, 31 Dec 2020 07:54:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=zuTY42ZMfo1siGVlU7k9dyTzIsNOKpMhoGanuRaVzjs=; b=mQcbRPzYPctM3GI3KCBLVxM6Q9Wk3es2noFD7li0ZJUSD2eXdMrJ7UOe8ddBD8TJv2 DFtilakc/WvBgQ846uzlniFD74qNm3dnVUylRVh8BPzTK1gghEF2+r+nhztRdLbsf4VW PdiOocqysVPUyyqutFMbvUpbJKH6YPDziBjoa/O+aDXum5FeG/aatFlF5HHlswV7CD9/ ut5DrfRhg86W09g0yiXhCbzPchd+b3A8ml9oujeqE50A6DZHiFnhFA8KKv+ReI6mB7/G meIw1aB9/B3j21uxS7qOdQa3rSDo1SVLkQXWzTi0NtLjGzt8FjCLNj6jhfpAsF/GK/2w ZG0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=zuTY42ZMfo1siGVlU7k9dyTzIsNOKpMhoGanuRaVzjs=; b=LqkOuzfup3Eszt8dLwgJfMrVvJpBdmGCP20TnP7uCTuwdtrL1gT1fkuBiLK6mdM8Ja jliZqDDHw6VBFmbYNEm5tYAEl5rojuzFqUJVY8U/Y7LDJJUFaY1DoE0ULBoS2BO+jxDw J9367/01MI4zOmQLNwqyYxJbj2XDWsQfKKNtUWjVXe5IG/E72mDFc/v2at2i7mwr0KdC 8WNjVyy8vtXwmoxAmnMuHv6cyPg6I1n1RPJId6ByLJyFtdnyxMw2X+scVML58UahProx hFdU08uQ1svglNnFInh6plA4kAd76wELzad9pxFU8R3v9EdkGaBGDltyZdMv83E0x0EB svGw== X-Gm-Message-State: AOAM531yNqNGyFnaw3shmeuJick9TLQOYQsxJtTSfaEiZCTT6QngsbT7 xza9CUWRiWVEpLJj4h/NDew6DxnMBoo= X-Google-Smtp-Source: ABdhPJwkbJITxDzvhq/jnZwMV8rXApBDRlyFI8icMCuu5vjmujnu4wRStiTae7TxM5Au/nWU838dlw== X-Received: by 2002:a7b:c45a:: with SMTP id l26mr12451474wmi.91.1609430076766; Thu, 31 Dec 2020 07:54:36 -0800 (PST) Received: from basti-TUXEDO-Book-XA1510.fritz.box (p200300d1ff267500b10aabf0e84cdf75.dip0.t-ipconnect.de. [2003:d1:ff26:7500:b10a:abf0:e84c:df75]) by smtp.gmail.com with ESMTPSA id s63sm14595787wms.18.2020.12.31.07.54.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Dec 2020 07:54:36 -0800 (PST) From: Sebastian Fricke To: libcamera-devel@lists.libcamera.org Date: Thu, 31 Dec 2020 16:53:36 +0100 Message-Id: <20201231155336.7058-5-sebastian.fricke.linux@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201231155336.7058-1-sebastian.fricke.linux@gmail.com> References: <20201231155336.7058-1-sebastian.fricke.linux@gmail.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 4/4] test: Add unit tests for the BayerFormat class X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Test all of the present methods including the newly implemented `fromV4L2PixelFormat`, as well as the new operators `==/!=`. Signed-off-by: Sebastian Fricke Reviewed-by: Jacopo Mondi Reviewed-by: Laurent Pinchart Reviewed-by: David Plowman --- test/bayer_format.cpp | 202 ++++++++++++++++++++++++++++++++++++++++++ test/meson.build | 1 + 2 files changed, 203 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..dd7aa8cb --- /dev/null +++ b/test/bayer_format.cpp @@ -0,0 +1,202 @@ +/* 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 = BayerFormat(); + if (bayerFmt.isValid()) { + cout << "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()) { + cout << "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) { + cout << "Two BayerFormat object created with the same " + << "order and bitDepth must be equal." << 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) { + cout << "Two BayerFormat object created with the same " + << "order, but different bit depths are not equal." + << 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) { + cout << "Expected: '" << v4l2FmtExpect.toString() + << "' got: '" << v4l2Fmt.toString() << "'" << endl; + return TestFail; + } + + /* + * Use a Bayer format that is not found in the mapping table + * and verify that no matching V4L2PixelFormat is found. + */ + v4l2FmtExpect = V4L2PixelFormat(); + bayerFmt = BayerFormat(BayerFormat::BGGR, 24, + BayerFormat::None); + v4l2Fmt = bayerFmt.toV4L2PixelFormat(); + if (v4l2Fmt != v4l2FmtExpect) { + cout << "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) { + cout << "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. + */ + bayerFmtExpect = BayerFormat(); + V4L2PixelFormat v4l2FmtUnknown = V4L2PixelFormat( + V4L2_PIX_FMT_BGRA444); + bayerFmt = BayerFormat::fromV4L2PixelFormat(v4l2FmtUnknown); + if (bayerFmt != bayerFmtExpect) { + cout << "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") { + cout << "String representation != 'BGGR8' (got: '" + << bayerFmt.toString() << "' ) " << endl; + return TestFail; + } + + /* + * Determine if an empty Bayer format results in no + * string representation. + */ + bayerFmt = BayerFormat(); + if (bayerFmt.toString() != "INVALID") { + cout << "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) { + cout << "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) { + cout << "vertical flip of 'BGGR-8' " + << "should result in '" + << bayerFmtExpect.toString() << "', got: '" + << vFlipFmt.toString() << "'" << endl; + return TestFail; + } + + /* + * Perform a transposition and make sure that nothing changes. + * Transpositions are not implemented as sensors are not + * expected to support this functionality. + */ + bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None); + BayerFormat transposeFmt = bayerFmt.transform( + Transform::Transpose); + if (transposeFmt.toString() != "BGGR-8") { + cout << "Transposition is not supported " + << "format should be 'BGGR-8', got: '" + << transposeFmt.toString() << "'" << endl; + return TestFail; + } + + return TestPass; + } +}; + +TEST_REGISTER(BayerFormatTest); + diff --git a/test/meson.build b/test/meson.build index 0a1d434e..e985b0a0 100644 --- a/test/meson.build +++ b/test/meson.build @@ -23,6 +23,7 @@ public_tests = [ ] internal_tests = [ + ['bayer-format', 'bayer_format.cpp'], ['byte-stream-buffer', 'byte-stream-buffer.cpp'], ['camera-sensor', 'camera-sensor.cpp'], ['event', 'event.cpp'],