From b053384ffab467ed016019bbcf8121a6f9e48fed Mon Sep 17 00:00:00 2001 From: Umang Jain Date: Wed, 28 Oct 2020 02:54:47 +0530 Subject: android: jpeg: post_processor_jpeg: Embed thumbnail into Exif metadata Embed a Jpeg-encoded thumbnail into Exif metadata using the Thumbnailer class that got introduced. Introduce a helper function in Exif class for setting the thumbnail data. Signed-off-by: Umang Jain Reviewed-by: Laurent Pinchart Reviewed-by: Kieran Bingham [Kieran: Add todo comment, and Compression enum] Signed-off-by: Kieran Bingham --- src/android/jpeg/exif.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'src/android/jpeg/exif.cpp') diff --git a/src/android/jpeg/exif.cpp b/src/android/jpeg/exif.cpp index d21534a4..33b3fa7f 100644 --- a/src/android/jpeg/exif.cpp +++ b/src/android/jpeg/exif.cpp @@ -75,8 +75,16 @@ Exif::~Exif() if (exifData_) free(exifData_); - if (data_) + if (data_) { + /* + * Reset thumbnail data to avoid getting double-freed by + * libexif. It is owned by the caller (i.e. PostProcessorJpeg). + */ + data_->data = nullptr; + data_->size = 0; + exif_data_unref(data_); + } if (mem_) exif_mem_unref(mem_); @@ -268,6 +276,20 @@ void Exif::setOrientation(int orientation) setShort(EXIF_IFD_0, EXIF_TAG_ORIENTATION, value); } +/* + * The thumbnail data should remain valid until the Exif object is destroyed. + * Failing to do so, might result in no thumbnail data being set even after a + * call to Exif::setThumbnail(). + */ +void Exif::setThumbnail(Span thumbnail, + Compression compression) +{ + data_->data = const_cast(thumbnail.data()); + data_->size = thumbnail.size(); + + setShort(EXIF_IFD_0, EXIF_TAG_COMPRESSION, compression); +} + [[nodiscard]] int Exif::generate() { if (exifData_) { -- cgit v1.2.1