From e2d7782847c07c05d50897c4b0527ff02b2ff41e Mon Sep 17 00:00:00 2001 From: Jesse Evans Date: Wed, 16 Feb 2022 17:12:35 -0800 Subject: Update Piex Add support for Sony ARW 4.0. Fix overflow issue in GetOlympusPreviewImage. Fix issue with Canon RP raw CR3 files. --- piex.gyp | 2 ++ src/image_type_recognition/image_type_recognition_lite.cc | 3 ++- src/piex.cc | 4 ++-- src/piex_cr3.cc | 10 +++++----- src/tiff_parser.cc | 11 +++++------ src/tiff_parser.h | 2 +- 6 files changed, 17 insertions(+), 15 deletions(-) diff --git a/piex.gyp b/piex.gyp index 737a0c2..15741dc 100755 --- a/piex.gyp +++ b/piex.gyp @@ -18,11 +18,13 @@ 'type': 'static_library', 'sources': [ 'src/piex.cc', + 'src/piex_cr3.cc', 'src/tiff_parser.cc', ], 'variables': { 'headers': [ 'src/piex.h', + 'src/piex_cr3.h', 'src/piex_types.h', 'src/tiff_parser.h', ], diff --git a/src/image_type_recognition/image_type_recognition_lite.cc b/src/image_type_recognition/image_type_recognition_lite.cc index cb32e1c..5976f42 100755 --- a/src/image_type_recognition/image_type_recognition_lite.cc +++ b/src/image_type_recognition/image_type_recognition_lite.cc @@ -183,13 +183,14 @@ class ArwTypeChecker : public TypeChecker { // Search for (kSignatureFileTypeSection + kSignatureVersions[i]) in first // requested bytes const string kSignatureSection("\x00\xb0\x01\x00\x04\x00\x00\x00", 8); - const int kSignatureVersionsSize = 5; + const int kSignatureVersionsSize = 6; const string kSignatureVersions[kSignatureVersionsSize] = { string("\x02\x00", 2), // ARW 1.0 string("\x03\x00", 2), // ARW 2.0 string("\x03\x01", 2), // ARW 2.1 string("\x03\x02", 2), // ARW 2.2 string("\x03\x03", 2), // ARW 2.3 + string("\x04\x00", 2), // ARW 4.0 }; bool matched = false; for (int i = 0; i < kSignatureVersionsSize; ++i) { diff --git a/src/piex.cc b/src/piex.cc index 4b868d9..ac2ef0b 100755 --- a/src/piex.cc +++ b/src/piex.cc @@ -283,9 +283,9 @@ bool GetOlympusPreviewImage(StreamInterface* stream, } if (raw_processing_ifd.Has(kOlymTagAspectFrame)) { - std::vector aspect_frame(4); + std::vector aspect_frame; if (raw_processing_ifd.Get(kOlymTagAspectFrame, &aspect_frame) && - aspect_frame[2] > aspect_frame[0] && + aspect_frame.size() == 4 && aspect_frame[2] > aspect_frame[0] && aspect_frame[3] > aspect_frame[1]) { preview_image_data->full_width = aspect_frame[2] - aspect_frame[0] + 1; preview_image_data->full_height = aspect_frame[3] - aspect_frame[1] + 1; diff --git a/src/piex_cr3.cc b/src/piex_cr3.cc index 1e9a50a..4fa82b7 100755 --- a/src/piex_cr3.cc +++ b/src/piex_cr3.cc @@ -41,7 +41,7 @@ constexpr Uuid kUuidPrvw = {0xea, 0xf4, 0x2b, 0x5e, 0x1c, 0x98, 0x4b, 0x88, 0xb9, 0xfb, 0xb7, 0xdc, 0x40, 0x6e, 0x4d, 0x16}; constexpr size_t kTagSize = 4; -using BoxTag = std::array; +using BoxTag = std::array; constexpr BoxTag NewTag(const char s[kTagSize + 1]) { return BoxTag{s[0], s[1], s[2], s[3]}; @@ -232,8 +232,8 @@ Box GetNextBox(StreamInterface* stream, size_t offset) { return Box(); } BoxTag tag; - Error status = - stream->GetData(offset + sizeof(length_32), kTagSize, tag.data()); + Error status = stream->GetData(offset + sizeof(length_32), kTagSize, + reinterpret_cast(tag.data())); if (status != kOk) { return Box(); } @@ -531,7 +531,7 @@ bool IsImage(StreamInterface* stream, const Image& image) { Error Cr3GetPreviewData(StreamInterface* stream, PreviewImageData* preview_image_data) { - ProcessData data{preview_image_data}; + ProcessData data{.preview_image_data = preview_image_data}; if (!ProcessStream(stream, kMdatTag, &data)) { return kFail; } @@ -548,7 +548,7 @@ Error Cr3GetPreviewData(StreamInterface* stream, bool Cr3GetOrientation(StreamInterface* stream, std::uint32_t* orientation) { PreviewImageData preview_image_data; - ProcessData data{&preview_image_data}; + ProcessData data{.preview_image_data = &preview_image_data}; if (ProcessStream(stream, kCmt1Tag, &data)) { *orientation = preview_image_data.exif_orientation; return true; diff --git a/src/tiff_parser.cc b/src/tiff_parser.cc index fc63461..3ceaa75 100755 --- a/src/tiff_parser.cc +++ b/src/tiff_parser.cc @@ -27,7 +27,6 @@ namespace { using tiff_directory::Endian; using tiff_directory::Rational; -using tiff_directory::SRational; using tiff_directory::SizeOfType; using tiff_directory::TIFF_TYPE_LONG; using tiff_directory::TIFF_TYPE_UNDEFINED; @@ -396,8 +395,8 @@ bool GetImageData(const TiffDirectory& tiff_directory, StreamInterface* stream, default: return false; } - length = static_cast( - std::accumulate(strip_byte_counts.begin(), strip_byte_counts.end(), 0)); + length = static_cast(std::accumulate( + strip_byte_counts.begin(), strip_byte_counts.end(), 0U)); offset = strip_offsets[0]; } else if (tiff_directory.Has(kPanaTagJpegImage)) { if (!tiff_directory.GetOffsetAndLength( @@ -715,14 +714,14 @@ bool TiffParser::Parse(const TagSet& desired_tags, return true; } -bool TiffParser::ParseIfd(const std::uint32_t offset_to_ifd, +bool TiffParser::ParseIfd(const std::uint32_t ifd_offset, const TagSet& desired_tags, const std::uint16_t max_number_ifds, IfdVector* tiff_directory) { std::uint32_t next_ifd_offset; TiffDirectory tiff_ifd(static_cast(endian_)); - if (!ParseDirectory(tiff_offset_, offset_to_ifd, endian_, desired_tags, - stream_, &tiff_ifd, &next_ifd_offset) || + if (!ParseDirectory(tiff_offset_, ifd_offset, endian_, desired_tags, stream_, + &tiff_ifd, &next_ifd_offset) || !ParseSubIfds(tiff_offset_, desired_tags, max_number_ifds, endian_, stream_, &tiff_ifd)) { return false; diff --git a/src/tiff_parser.h b/src/tiff_parser.h index f89c319..e19dea2 100755 --- a/src/tiff_parser.h +++ b/src/tiff_parser.h @@ -184,7 +184,7 @@ class TiffParser { // Runs over the Tiff IFD, Exif IFD and subIFDs to get the preview image data. // Returns false if something with the Tiff tags is wrong. bool GetPreviewImageData(const TiffContent& tiff_content, - PreviewImageData* image_metadata); + PreviewImageData* preview_image_data); // Returns false if called more that once or something with the Tiff data is // wrong. -- cgit v1.2.3