From 47c5912c58cf650417ebe9bf9a2d88b3d10d7c91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Komar=C4=8Devi=C4=87?= <4973094+kmilos@users.noreply.github.com> Date: Wed, 20 Oct 2021 15:19:47 +0200 Subject: [PATCH 1/2] Limit CR3 previews to JPEG only (cherry picked from commit 40e5021577025562ca7eb083486af3bc612d04d9) From 5b2fcf73e1d5754ae76c57b6a6961155d4b1a0c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Komar=C4=8Devi=C4=87?= Date: Wed, 20 Oct 2021 22:15:44 +0200 Subject: [PATCH 2/2] Expose unsupported CR3 previews as binary (cherry picked from commit 8b7d8729b7592c6e4135f3e9b88513ae45e262b5) --- include/exiv2/bmffimage.hpp | 1 + src/bmffimage.cpp | 32 +++++++++++++++++++++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/include/exiv2/bmffimage.hpp b/include/exiv2/bmffimage.hpp index a502f1f368..9db10652ea 100644 --- a/include/exiv2/bmffimage.hpp +++ b/include/exiv2/bmffimage.hpp @@ -121,6 +121,7 @@ namespace Exiv2 void parseCr3Preview(DataBuf &data, std::ostream &out, bool bTrace, + uint8_t version, uint32_t width_offset, uint32_t height_offset, uint32_t size_offset, diff --git a/src/bmffimage.cpp b/src/bmffimage.cpp index 87fec4dbec..44874036e6 100644 --- a/src/bmffimage.cpp +++ b/src/bmffimage.cpp @@ -488,13 +488,25 @@ namespace Exiv2 parseXmp(box_length,io_->tell()); break; case TAG_thmb: - if (version == 0) { - parseCr3Preview(data, out, bTrace, skip, skip+2, skip+4, skip+12); + switch (version) { + case 0: // JPEG + parseCr3Preview(data, out, bTrace, version, skip, skip+2, skip+4, skip+12); + break; + case 1: // HDR + parseCr3Preview(data, out, bTrace, version, skip+2, skip+4, skip+8, skip+12); + break; + default: + break; } break; case TAG_prvw: - if (version == 0) { - parseCr3Preview(data, out, bTrace, skip+2, skip+4, skip+8, skip+12); + switch (version) { + case 0: // JPEG + case 1: // HDR + parseCr3Preview(data, out, bTrace, version, skip+2, skip+4, skip+8, skip+12); + break; + default: + break; } break; @@ -584,14 +596,13 @@ namespace Exiv2 void BmffImage::parseCr3Preview(DataBuf &data, std::ostream& out, bool bTrace, + uint8_t version, uint32_t width_offset, uint32_t height_offset, uint32_t size_offset, uint32_t relative_position) { // Derived from https://github.com/lclevy/canon_cr3 - // Only JPEG (version 0) is currently supported - // (relative_position is identical between versions) long here = io_->tell(); enforce(here >= 0 && here <= std::numeric_limits::max() - static_cast(relative_position), @@ -606,7 +617,14 @@ namespace Exiv2 enforce(size_offset <= static_cast(data.size_ - 4), kerCorruptedMetadata); nativePreview.size_ = getLong(data.pData_ + size_offset, endian_); nativePreview.filter_ = ""; - nativePreview.mimeType_ = "image/jpeg"; + switch (version) { + case 0: + nativePreview.mimeType_ = "image/jpeg"; + break; + default: + nativePreview.mimeType_ = "application/octet-stream"; + break; + } nativePreviews_.push_back(nativePreview); if (bTrace) {