summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-06-11 02:33:54 +0200
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-06-16 16:47:43 +0200
commitbf650cf3fc43ea8d198d14612af6db4b45ef4b68 (patch)
treef83642c0d3005bf069030b77c1b9e17535c2ae18
parent9d4fb49dbc224989dc64af864b296f1cc73a4eff (diff)
qcam: dng_writer: Record creation time in the EXIF directory
If the EXIF directory is empty due to no metadata being available tools such as tiffinfo complains that the directory is malformed. TIFFFetchDirectory: Sanity check on directory count failed, this is probably not a valid IFD offset. TIFFReadCustomDirectory: Failed to read custom directory at offset 0. Always record the creation time in the EXIF directory instead of adding complexity to skip creating the EXIF directory if there is no metadata to record. This ensures there are at least some entries in the EXIF directory and that makes tiffinfo happy. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/qcam/dng_writer.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/qcam/dng_writer.cpp b/src/qcam/dng_writer.cpp
index 84709088..77e2333b 100644
--- a/src/qcam/dng_writer.cpp
+++ b/src/qcam/dng_writer.cpp
@@ -427,6 +427,23 @@ int DNGWriter::write(const char *filename, const Camera *camera,
/* Create a new IFD for the EXIF data and fill it. */
TIFFCreateEXIFDirectory(tif);
+ /* Store creation time. */
+ time_t rawtime;
+ struct tm *timeinfo;
+ char strTime[20];
+
+ time(&rawtime);
+ timeinfo = localtime(&rawtime);
+ strftime(strTime, 20, "%Y:%m:%d %H:%M:%S", timeinfo);
+
+ /*
+ * \todo Handle timezone information by setting OffsetTimeOriginal and
+ * OffsetTimeDigitized once libtiff catches up to the specification and
+ * has EXIFTAG_ defines to handle them.
+ */
+ TIFFSetField(tif, EXIFTAG_DATETIMEORIGINAL, strTime);
+ TIFFSetField(tif, EXIFTAG_DATETIMEDIGITIZED, strTime);
+
if (metadata.contains(controls::AnalogueGain)) {
float gain = metadata.get(controls::AnalogueGain);
uint16_t iso = std::min(std::max(gain * 100, 0.0f), 65535.0f);