mirror of
https://github.com/Evolution-X/external_piex
synced 2026-02-01 03:31:47 +00:00
Add support for CR3s with embedded heif thumbnails
Change-Id: I2cb6b1e46ed91961744cc5b795cc7144c6cacb54
This commit is contained in:
28
src/piex.cc
28
src/piex.cc
@@ -23,6 +23,7 @@
|
||||
|
||||
#include "src/binary_parse/range_checked_byte_ptr.h"
|
||||
#include "src/image_type_recognition/image_type_recognition_lite.h"
|
||||
#include "src/piex_cr3.h"
|
||||
#include "src/tiff_parser.h"
|
||||
|
||||
namespace piex {
|
||||
@@ -649,7 +650,8 @@ bool IsRaw(StreamInterface* data) {
|
||||
}
|
||||
|
||||
Error GetPreviewImageData(StreamInterface* data,
|
||||
PreviewImageData* preview_image_data) {
|
||||
PreviewImageData* preview_image_data,
|
||||
RawImageTypes* output_type) {
|
||||
const size_t bytes = BytesRequiredForIsRaw();
|
||||
if (data == nullptr || bytes == 0) {
|
||||
return kFail;
|
||||
@@ -662,11 +664,15 @@ Error GetPreviewImageData(StreamInterface* data,
|
||||
}
|
||||
RangeCheckedBytePtr header_buffer(file_header.data(), file_header.size());
|
||||
|
||||
switch (RecognizeRawImageTypeLite(header_buffer)) {
|
||||
RawImageTypes type = RecognizeRawImageTypeLite(header_buffer);
|
||||
if (output_type != nullptr) *output_type = type;
|
||||
switch (type) {
|
||||
case image_type_recognition::kArwImage:
|
||||
return ArwGetPreviewData(data, preview_image_data);
|
||||
case image_type_recognition::kCr2Image:
|
||||
return Cr2GetPreviewData(data, preview_image_data);
|
||||
case image_type_recognition::kCr3Image:
|
||||
return Cr3GetPreviewData(data, preview_image_data);
|
||||
case image_type_recognition::kDngImage:
|
||||
return DngGetPreviewData(data, preview_image_data);
|
||||
case image_type_recognition::kNefImage:
|
||||
@@ -703,24 +709,32 @@ bool GetOrientation(StreamInterface* data, std::uint32_t* orientation) {
|
||||
using image_type_recognition::GetNumberOfBytesForIsOfType;
|
||||
using image_type_recognition::IsOfType;
|
||||
|
||||
std::vector<std::uint8_t> file_header(
|
||||
GetNumberOfBytesForIsOfType(image_type_recognition::kRafImage));
|
||||
size_t min_header_bytes =
|
||||
std::max(GetNumberOfBytesForIsOfType(image_type_recognition::kRafImage),
|
||||
GetNumberOfBytesForIsOfType(image_type_recognition::kCr3Image));
|
||||
|
||||
std::vector<std::uint8_t> file_header(min_header_bytes);
|
||||
if (data->GetData(0, file_header.size(), file_header.data()) != kOk) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// For RAF files a special routine is necessary to get orientation. For others
|
||||
// the general approach is sufficient.
|
||||
// For RAF and CR# files a special routine is necessary to get orientation.
|
||||
// For others the general approach is sufficient.
|
||||
if (IsOfType(RangeCheckedBytePtr(file_header.data(), file_header.size()),
|
||||
image_type_recognition::kRafImage)) {
|
||||
return RafGetOrientation(data, orientation);
|
||||
} else if (IsOfType(
|
||||
RangeCheckedBytePtr(file_header.data(), file_header.size()),
|
||||
image_type_recognition::kCr3Image)) {
|
||||
return Cr3GetOrientation(data, orientation);
|
||||
} else {
|
||||
return GetExifOrientation(data, 0 /* offset */, orientation);
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<std::string> SupportedExtensions() {
|
||||
return {"ARW", "CR2", "DNG", "NEF", "NRW", "ORF", "PEF", "RAF", "RW2", "SRW"};
|
||||
return {"ARW", "CR2", "CR3", "DNG", "NEF", "NRW",
|
||||
"ORF", "PEF", "RAF", "RW2", "SRW"};
|
||||
}
|
||||
|
||||
} // namespace piex
|
||||
|
||||
Reference in New Issue
Block a user