[libcamera-devel,3/5] libcamera: bayer_format: Add operator<<()
diff mbox series

Message ID 20220429212348.18063-4-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • libcamera: More operator<<() for stream output
Related show

Commit Message

Laurent Pinchart April 29, 2022, 9:23 p.m. UTC
Implement the stream output operator<<() for the BayerFormat class to
simplify printing them.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 include/libcamera/internal/bayer_format.h |  3 ++
 src/libcamera/bayer_format.cpp            | 57 ++++++++++++++---------
 2 files changed, 39 insertions(+), 21 deletions(-)

Comments

Kieran Bingham May 4, 2022, 8:59 a.m. UTC | #1
Quoting Laurent Pinchart via libcamera-devel (2022-04-29 22:23:46)
> Implement the stream output operator<<() for the BayerFormat class to
> simplify printing them.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

> ---
>  include/libcamera/internal/bayer_format.h |  3 ++
>  src/libcamera/bayer_format.cpp            | 57 ++++++++++++++---------
>  2 files changed, 39 insertions(+), 21 deletions(-)
> 
> diff --git a/include/libcamera/internal/bayer_format.h b/include/libcamera/internal/bayer_format.h
> index cb20bf9bea84..7d3e37c67e9c 100644
> --- a/include/libcamera/internal/bayer_format.h
> +++ b/include/libcamera/internal/bayer_format.h
> @@ -7,6 +7,7 @@
>  
>  #pragma once
>  
> +#include <ostream>
>  #include <stdint.h>
>  #include <string>
>  
> @@ -68,4 +69,6 @@ static inline bool operator!=(const BayerFormat &lhs, const BayerFormat &rhs)
>         return !(lhs == rhs);
>  }
>  
> +std::ostream &operator<<(std::ostream &out, const BayerFormat &f);
> +
>  } /* namespace libcamera */
> diff --git a/src/libcamera/bayer_format.cpp b/src/libcamera/bayer_format.cpp
> index 9aaec0bce264..4882707e7763 100644
> --- a/src/libcamera/bayer_format.cpp
> +++ b/src/libcamera/bayer_format.cpp
> @@ -9,6 +9,7 @@
>  
>  #include <algorithm>
>  #include <map>
> +#include <sstream>
>  #include <unordered_map>
>  
>  #include <linux/media-bus-format.h>
> @@ -236,28 +237,10 @@ const BayerFormat &BayerFormat::fromMbusCode(unsigned int mbusCode)
>   */
>  std::string BayerFormat::toString() const
>  {
> -       std::string result;
> +       std::stringstream ss;
> +       ss << *this;
>  
> -       static const char *orderStrings[] = {
> -               "BGGR",
> -               "GBRG",
> -               "GRBG",
> -               "RGGB",
> -               "MONO"
> -       };
> -       if (isValid() && order <= MONO)
> -               result = orderStrings[order];
> -       else
> -               return "INVALID";
> -
> -       result += "-" + std::to_string(bitDepth);
> -
> -       if (packing == Packing::CSI2)
> -               result += "-CSI2P";
> -       else if (packing == Packing::IPU3)
> -               result += "-IPU3P";
> -
> -       return result;
> +       return ss.str();
>  }
>  
>  /**
> @@ -270,6 +253,38 @@ bool operator==(const BayerFormat &lhs, const BayerFormat &rhs)
>                lhs.packing == rhs.packing;
>  }
>  
> +/**
> + * \brief Insert a text representation of a BayerFormats into an output stream
> + * \param[in] out The output stream
> + * \param[in] f The BayerFormat
> + * \return The output stream \a out
> + */
> +std::ostream &operator<<(std::ostream &out, const BayerFormat &f)
> +{
> +       static const char *orderStrings[] = {
> +               "BGGR-",
> +               "GBRG-",
> +               "GRBG-",
> +               "RGGB-",
> +               "MONO-"
> +       };
> +
> +       if (!f.isValid() || f.order > BayerFormat::MONO) {
> +               out << "INVALID";
> +               return out;
> +       }
> +
> +       /* The cast is required to avoid bitDepth being interpreted as a char. */
> +       out << orderStrings[f.order] << static_cast<unsigned int>(f.bitDepth);
> +
> +       if (f.packing == BayerFormat::Packing::CSI2)
> +               out << "-CSI2P";
> +       else if (f.packing == BayerFormat::Packing::IPU3)
> +               out << "-IPU3P";
> +
> +       return out;
> +}
> +
>  /**
>   * \fn bool operator!=(const BayerFormat &lhs, const BayerFormat &rhs)
>   * \brief Compare two BayerFormats for inequality
> -- 
> Regards,
> 
> Laurent Pinchart
>

Patch
diff mbox series

diff --git a/include/libcamera/internal/bayer_format.h b/include/libcamera/internal/bayer_format.h
index cb20bf9bea84..7d3e37c67e9c 100644
--- a/include/libcamera/internal/bayer_format.h
+++ b/include/libcamera/internal/bayer_format.h
@@ -7,6 +7,7 @@ 
 
 #pragma once
 
+#include <ostream>
 #include <stdint.h>
 #include <string>
 
@@ -68,4 +69,6 @@  static inline bool operator!=(const BayerFormat &lhs, const BayerFormat &rhs)
 	return !(lhs == rhs);
 }
 
+std::ostream &operator<<(std::ostream &out, const BayerFormat &f);
+
 } /* namespace libcamera */
diff --git a/src/libcamera/bayer_format.cpp b/src/libcamera/bayer_format.cpp
index 9aaec0bce264..4882707e7763 100644
--- a/src/libcamera/bayer_format.cpp
+++ b/src/libcamera/bayer_format.cpp
@@ -9,6 +9,7 @@ 
 
 #include <algorithm>
 #include <map>
+#include <sstream>
 #include <unordered_map>
 
 #include <linux/media-bus-format.h>
@@ -236,28 +237,10 @@  const BayerFormat &BayerFormat::fromMbusCode(unsigned int mbusCode)
  */
 std::string BayerFormat::toString() const
 {
-	std::string result;
+	std::stringstream ss;
+	ss << *this;
 
-	static const char *orderStrings[] = {
-		"BGGR",
-		"GBRG",
-		"GRBG",
-		"RGGB",
-		"MONO"
-	};
-	if (isValid() && order <= MONO)
-		result = orderStrings[order];
-	else
-		return "INVALID";
-
-	result += "-" + std::to_string(bitDepth);
-
-	if (packing == Packing::CSI2)
-		result += "-CSI2P";
-	else if (packing == Packing::IPU3)
-		result += "-IPU3P";
-
-	return result;
+	return ss.str();
 }
 
 /**
@@ -270,6 +253,38 @@  bool operator==(const BayerFormat &lhs, const BayerFormat &rhs)
 	       lhs.packing == rhs.packing;
 }
 
+/**
+ * \brief Insert a text representation of a BayerFormats into an output stream
+ * \param[in] out The output stream
+ * \param[in] f The BayerFormat
+ * \return The output stream \a out
+ */
+std::ostream &operator<<(std::ostream &out, const BayerFormat &f)
+{
+	static const char *orderStrings[] = {
+		"BGGR-",
+		"GBRG-",
+		"GRBG-",
+		"RGGB-",
+		"MONO-"
+	};
+
+	if (!f.isValid() || f.order > BayerFormat::MONO) {
+		out << "INVALID";
+		return out;
+	}
+
+	/* The cast is required to avoid bitDepth being interpreted as a char. */
+	out << orderStrings[f.order] << static_cast<unsigned int>(f.bitDepth);
+
+	if (f.packing == BayerFormat::Packing::CSI2)
+		out << "-CSI2P";
+	else if (f.packing == BayerFormat::Packing::IPU3)
+		out << "-IPU3P";
+
+	return out;
+}
+
 /**
  * \fn bool operator!=(const BayerFormat &lhs, const BayerFormat &rhs)
  * \brief Compare two BayerFormats for inequality