From a90ee0001e086f276fb340f351bc8444bef0810b Mon Sep 17 00:00:00 2001 From: Fyodor Kyslov Date: Tue, 10 Jan 2023 23:41:41 +0000 Subject: jpegrecoverymap: propagate EXIF to upper level Test: manual Bug: b/252835416 Change-Id: I83afd787d2d689a03d1adc4205b29f8e53c6e0dc --- .../include/jpegrecoverymap/jpegdecoder.h | 6 +++--- .../include/jpegrecoverymap/recoverymap.h | 3 ++- libs/jpegrecoverymap/jpegdecoder.cpp | 23 +++++++++++++++++++--- 3 files changed, 25 insertions(+), 7 deletions(-) (limited to 'libs') diff --git a/libs/jpegrecoverymap/include/jpegrecoverymap/jpegdecoder.h b/libs/jpegrecoverymap/include/jpegrecoverymap/jpegdecoder.h index 5993546059..d0de48ff87 100644 --- a/libs/jpegrecoverymap/include/jpegrecoverymap/jpegdecoder.h +++ b/libs/jpegrecoverymap/include/jpegrecoverymap/jpegdecoder.h @@ -86,12 +86,12 @@ public: */ int getEXIFPos() { return mExifPos; } /* - * Decompresses metadata of the image. + * Decompresses metadata of the image. All vectors are owned by the caller. */ bool getCompressedImageParameters(const void* image, int length, size_t* pWidth, size_t* pHeight, - std::vector* &iccData, - std::vector* &exifData); + std::vector* iccData, + std::vector* exifData); /* * Extracts EXIF package and updates the EXIF position / length without decoding the image. */ diff --git a/libs/jpegrecoverymap/include/jpegrecoverymap/recoverymap.h b/libs/jpegrecoverymap/include/jpegrecoverymap/recoverymap.h index 905bf16c1a..c44a92a9bd 100644 --- a/libs/jpegrecoverymap/include/jpegrecoverymap/recoverymap.h +++ b/libs/jpegrecoverymap/include/jpegrecoverymap/recoverymap.h @@ -244,7 +244,8 @@ public: * * The output is filled jpegr_info structure * @param compressed_jpegr_image compressed JPEGR image - * @param jpegr_info pointer to output JPEGR info + * @param jpegr_info pointer to output JPEGR info. Members of jpegr_info + * are owned by the caller * @return NO_ERROR if JPEGR parsing succeeds, error code otherwise */ status_t getJPEGRInfo(jr_compressed_ptr compressed_jpegr_image, diff --git a/libs/jpegrecoverymap/jpegdecoder.cpp b/libs/jpegrecoverymap/jpegdecoder.cpp index 07b527cfcb..0ae6a63970 100644 --- a/libs/jpegrecoverymap/jpegdecoder.cpp +++ b/libs/jpegrecoverymap/jpegdecoder.cpp @@ -311,7 +311,7 @@ bool JpegDecoder::decompress(jpeg_decompress_struct* cinfo, const uint8_t* dest, bool JpegDecoder::getCompressedImageParameters(const void* image, int length, size_t *pWidth, size_t *pHeight, - std::vector *&iccData , std::vector *&exifData) { + std::vector *iccData , std::vector *exifData) { jpeg_decompress_struct cinfo; jpegr_source_mgr mgr(static_cast(image), length); jpegrerror_mgr myerr; @@ -336,10 +336,27 @@ bool JpegDecoder::getCompressedImageParameters(const void* image, int length, *pWidth = cinfo.image_width; *pHeight = cinfo.image_height; - //TODO: Parse iccProfile and exifData + //TODO: Parse iccProfile (void)iccData; - (void)exifData; + if (exifData != nullptr) { + bool exifAppears = false; + for (jpeg_marker_struct* marker = cinfo.marker_list; marker && !exifAppears; + marker = marker->next) { + if (marker->marker != kAPP1Marker) { + continue; + } + + const unsigned int len = marker->data_length; + if (len >= kExifIdCode.size() && + !strncmp(reinterpret_cast(marker->data), kExifIdCode.c_str(), + kExifIdCode.size())) { + exifData->resize(len, 0); + memcpy(static_cast(exifData->data()), marker->data, len); + exifAppears = true; + } + } + } jpeg_destroy_decompress(&cinfo); return true; -- cgit v1.2.3-59-g8ed1b