diff options
author | 2023-01-16 22:12:02 +0000 | |
---|---|---|
committer | 2023-01-17 00:30:55 +0000 | |
commit | e00916d94849eb722bd2be3c86c74e3a0cb511c6 (patch) | |
tree | dbf5990dc05735c411392f4977103d91e8ffd9b3 | |
parent | 311c59bcbc49c63d32a234584007145f12d36729 (diff) |
jpegrecoverymap: Return ICCProfile data from JPEG/R file
This change read ICCProfile data from JPEG/R file and returns it to a
caller
Bug: b/252835416
Test: atest ImageReaderTest#testJpegRDisplayP3
Change-Id: Iea8144066514f73c4ad797239789686e3e051477
-rw-r--r-- | libs/jpegrecoverymap/jpegdecoder.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/libs/jpegrecoverymap/jpegdecoder.cpp b/libs/jpegrecoverymap/jpegdecoder.cpp index 0ae6a63970..7dc3df9d71 100644 --- a/libs/jpegrecoverymap/jpegdecoder.cpp +++ b/libs/jpegrecoverymap/jpegdecoder.cpp @@ -32,6 +32,10 @@ const uint32_t kAPP2Marker = JPEG_APP0 + 2; // ICC const std::string kXmpNameSpace = "http://ns.adobe.com/xap/1.0/"; const std::string kExifIdCode = "Exif"; +constexpr uint32_t kICCMarkerHeaderSize = 14; +constexpr uint8_t kICCSig[] = { + 'I', 'C', 'C', '_', 'P', 'R', 'O', 'F', 'I', 'L', 'E', '\0', +}; struct jpegr_source_mgr : jpeg_source_mgr { jpegr_source_mgr(const uint8_t* ptr, int len); @@ -336,8 +340,22 @@ bool JpegDecoder::getCompressedImageParameters(const void* image, int length, *pWidth = cinfo.image_width; *pHeight = cinfo.image_height; - //TODO: Parse iccProfile - (void)iccData; + if (iccData != nullptr) { + for (jpeg_marker_struct* marker = cinfo.marker_list; marker; + marker = marker->next) { + if (marker->marker != kAPP2Marker) { + continue; + } + if (marker->data_length <= kICCMarkerHeaderSize || + memcmp(marker->data, kICCSig, sizeof(kICCSig)) != 0) { + continue; + } + + const unsigned int len = marker->data_length - kICCMarkerHeaderSize; + const uint8_t *src = marker->data + kICCMarkerHeaderSize; + iccData->insert(iccData->end(), src, src+len); + } + } if (exifData != nullptr) { bool exifAppears = false; |