summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Fyodor Kyslov <kyslov@google.com> 2023-01-16 22:12:02 +0000
committer Fyodor Kyslov <kyslov@google.com> 2023-01-17 00:30:55 +0000
commite00916d94849eb722bd2be3c86c74e3a0cb511c6 (patch)
treedbf5990dc05735c411392f4977103d91e8ffd9b3
parent311c59bcbc49c63d32a234584007145f12d36729 (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.cpp22
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;