From 74794de987c069250deba03c1a55ccd6f659e9e8 Mon Sep 17 00:00:00 2001 From: Cheng-Hao Yang Date: Fri, 22 Jul 2022 07:06:00 +0000 Subject: android: exif: Fix thumbnail buffer lifetime Previously the thumbnail buffer is destructed before even being used in Exif. This patch moves the buffer into class Exif, so that the developer won't need to worry about its lifetime. Signed-off-by: Harvey Yang Reviewed-by: Laurent Pinchart Reviewed-by: Umang Jain Signed-off-by: Umang Jain --- src/android/jpeg/exif.cpp | 13 +++++-------- src/android/jpeg/exif.h | 5 ++++- src/android/jpeg/post_processor_jpeg.cpp | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/android/jpeg/exif.cpp b/src/android/jpeg/exif.cpp index 3220b458..6b1d0f1f 100644 --- a/src/android/jpeg/exif.cpp +++ b/src/android/jpeg/exif.cpp @@ -430,16 +430,13 @@ 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, +void Exif::setThumbnail(std::vector &&thumbnail, Compression compression) { - data_->data = const_cast(thumbnail.data()); - data_->size = thumbnail.size(); + thumbnailData_ = std::move(thumbnail); + + data_->data = thumbnailData_.data(); + data_->size = thumbnailData_.size(); setShort(EXIF_IFD_0, EXIF_TAG_COMPRESSION, compression); } diff --git a/src/android/jpeg/exif.h b/src/android/jpeg/exif.h index 2ff8fb78..e68716f3 100644 --- a/src/android/jpeg/exif.h +++ b/src/android/jpeg/exif.h @@ -10,6 +10,7 @@ #include #include #include +#include #include @@ -60,7 +61,7 @@ public: void setOrientation(int orientation); void setSize(const libcamera::Size &size); - void setThumbnail(libcamera::Span thumbnail, + void setThumbnail(std::vector &&thumbnail, Compression compression); void setTimestamp(time_t timestamp, std::chrono::milliseconds msec); @@ -106,4 +107,6 @@ private: unsigned char *exifData_; unsigned int size_; + + std::vector thumbnailData_; }; diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp index d72ebc3c..0cf56716 100644 --- a/src/android/jpeg/post_processor_jpeg.cpp +++ b/src/android/jpeg/post_processor_jpeg.cpp @@ -166,7 +166,7 @@ void PostProcessorJpeg::process(Camera3RequestDescriptor::StreamBuffer *streamBu std::vector thumbnail; generateThumbnail(source, thumbnailSize, quality, &thumbnail); if (!thumbnail.empty()) - exif.setThumbnail(thumbnail, Exif::Compression::JPEG); + exif.setThumbnail(std::move(thumbnail), Exif::Compression::JPEG); } resultMetadata->addEntry(ANDROID_JPEG_THUMBNAIL_SIZE, data, 2); -- cgit v1.2.1