From 6554b6264257af1c3c289d502032b2818d276f65 Mon Sep 17 00:00:00 2001 From: Paul Elder Date: Mon, 25 Aug 2025 20:46:42 +0900 Subject: [PATCH] utils: Add unary negation operation to Duration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In the near future we will add a SyncAdjustment control for adjusting the frame duration via the sync algorithm. This control needs to be able to take on a negative value, since the frame duration can be shortened in addition to being extended. While the control is an int, it would be convenient to be able to clamp it to frame duration limits, which are usually handled as utils::Duration values internally. To allow this using utils::Duration, add a unary negation operation to utils::Duration. Also add a test for the operator. Signed-off-by: Paul Elder Reviewed-by: Barnabás Pőcze Reviewed-by: Kieran Bingham Signed-off-by: Kieran Bingham --- include/libcamera/base/utils.h | 5 +++++ src/libcamera/base/utils.cpp | 6 ++++++ test/utils.cpp | 6 ++++++ 3 files changed, 17 insertions(+) diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h index f21c6dc0..cb8caaa9 100644 --- a/include/libcamera/base/utils.h +++ b/include/libcamera/base/utils.h @@ -394,6 +394,11 @@ public: return c.count(); } + constexpr Duration operator-() const + { + return BaseDuration::operator-(); + } + explicit constexpr operator bool() const { return *this != BaseDuration::zero(); diff --git a/src/libcamera/base/utils.cpp b/src/libcamera/base/utils.cpp index bcfc1941..cb9fe004 100644 --- a/src/libcamera/base/utils.cpp +++ b/src/libcamera/base/utils.cpp @@ -425,6 +425,12 @@ std::string toAscii(const std::string &str) * \return The tick count of the Duration expressed in \a Period */ +/** + * \fn Duration::operator-() + * \brief Negation operator to negate a \a Duration + * \return The duration, with the number of ticks negated + */ + /** * \fn Duration::operator bool() * \brief Boolean operator to test if a \a Duration holds a non-zero time value diff --git a/test/utils.cpp b/test/utils.cpp index d25475cb..195fddc9 100644 --- a/test/utils.cpp +++ b/test/utils.cpp @@ -167,6 +167,12 @@ protected: return TestFail; } + exposure = 100ms; + if ((-exposure).get() != -100) { + cerr << "utils::Duration failed negation" << endl; + return TestFail; + } + return TestPass; }