[libcamera-devel] [PATCH v2 2/2] android: jpeg: exif: Set timezone information

Umang Jain email at uajain.com
Thu Sep 24 20:36:42 CEST 2020


The EXIF specification defines three timezone related tags namely,
OffsetTime, OffsetTimeOriginal and OffsetTimeDigitized. However,
these are not supported by libexif (as of v0.6.21) hence, carry
the tags' positional values in our implementation until we get
this support from libexif itself.

Since these tags were introduced in EXIF specification v2.31, set
the exif version number explicitly too.

Signed-off-by: Umang Jain <email at uajain.com>
---
 src/android/jpeg/exif.cpp | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/src/android/jpeg/exif.cpp b/src/android/jpeg/exif.cpp
index a5674b3..32cf897 100644
--- a/src/android/jpeg/exif.cpp
+++ b/src/android/jpeg/exif.cpp
@@ -13,6 +13,16 @@ using namespace libcamera;
 
 LOG_DEFINE_CATEGORY(EXIF)
 
+/*
+ * List of EXIF tags that we set directly because they are not supported
+ * by libexif version 0.6.21.
+ */
+enum class _ExifTag {
+	OFFSET_TIME              = 0x9010,
+	OFFSET_TIME_ORIGINAL     = 0x9011,
+	OFFSET_TIME_DIGITIZED    = 0x9012,
+};
+
 /*
  * The Exif class should be instantiated and specific properties set
  * through the exposed public API.
@@ -51,6 +61,9 @@ Exif::Exif()
 	 */
 	exif_data_set_byte_order(data_, EXIF_BYTE_ORDER_INTEL);
 
+	setString(EXIF_IFD_EXIF, EXIF_TAG_EXIF_VERSION,
+		  EXIF_FORMAT_UNDEFINED, "0231");
+
 	/* Create the mandatory EXIF fields with default data. */
 	exif_data_fix(data_);
 }
@@ -197,6 +210,22 @@ void Exif::setTimestamp(time_t timestamp)
 	setString(EXIF_IFD_0, EXIF_TAG_DATE_TIME, EXIF_FORMAT_ASCII, ts);
 	setString(EXIF_IFD_EXIF, EXIF_TAG_DATE_TIME_ORIGINAL, EXIF_FORMAT_ASCII, ts);
 	setString(EXIF_IFD_EXIF, EXIF_TAG_DATE_TIME_DIGITIZED, EXIF_FORMAT_ASCII, ts);
+
+	/* Query and set timezone information if available. */
+	int r = strftime(str, sizeof(str), "%z", &tm);
+	if (r > 0) {
+		std::string tz(str);
+		tz.insert(3, 1, ':');
+		setString(EXIF_IFD_EXIF,
+			  static_cast<ExifTag>(_ExifTag::OFFSET_TIME),
+			  EXIF_FORMAT_ASCII, tz);
+		setString(EXIF_IFD_EXIF,
+			  static_cast<ExifTag>(_ExifTag::OFFSET_TIME_ORIGINAL),
+			  EXIF_FORMAT_ASCII, tz);
+		setString(EXIF_IFD_EXIF,
+			  static_cast<ExifTag>(_ExifTag::OFFSET_TIME_DIGITIZED),
+			  EXIF_FORMAT_ASCII, tz);
+	}
 }
 
 void Exif::setOrientation(int orientation)
-- 
2.25.1



More information about the libcamera-devel mailing list