Limit CR3 previews to JPEG only

This commit is contained in:
Miloš Komarčević
2021-10-20 15:19:47 +02:00
committed by Miloš Komarčević
parent 3db71f6998
commit 40e5021577
2 changed files with 20 additions and 14 deletions
+17 -11
View File
@@ -73,9 +73,9 @@
#define TAG_cmt2 0x434D5432 /**< "CMD2" exifID */
#define TAG_cmt3 0x434D5433 /**< "CMT3" canonID */
#define TAG_cmt4 0x434D5434 /**< "CMT4" gpsID */
#define TAG_colr 0x636f6c72 /**< "colr" */
#define TAG_colr 0x636f6c72 /**< "colr" Colour information */
#define TAG_exif 0x45786966 /**< "Exif" Used by JXL*/
#define TAG_xml 0x786d6c20 /**< "xml " Used by JXL*/
#define TAG_xml 0x786d6c20 /**< "xml " Used by JXL*/
#define TAG_thmb 0x54484d42 /**< "THMB" Canon thumbnail */
#define TAG_prvw 0x50525657 /**< "PRVW" Canon preview image */
@@ -122,7 +122,7 @@ namespace Exiv2
bool BmffImage::fullBox(uint32_t box)
{
return box == TAG_meta || box == TAG_iinf || box == TAG_iloc;
return box == TAG_meta || box == TAG_iinf || box == TAG_iloc || box == TAG_thmb || box == TAG_prvw;
}
static bool skipBox(uint32_t box)
@@ -262,7 +262,7 @@ namespace Exiv2
enforce(data.size() - skip >= 4, Exiv2::kerCorruptedMetadata);
flags = data.read_uint32(skip, endian_); // version/flags
version = static_cast<uint8_t>(flags >> 24);
version &= 0x00ffffff;
flags &= 0x00ffffff;
skip += 4;
}
@@ -484,10 +484,14 @@ namespace Exiv2
parseXmp(box_length,io_->tell());
break;
case TAG_thmb:
parseCr3Preview(data, out, bTrace, 4, 6, 8, 16);
if (version == 0) {
parseCr3Preview(data, out, bTrace, skip, skip+2, skip+4, skip+12);
}
break;
case TAG_prvw:
parseCr3Preview(data, out, bTrace, 6, 8, 12, 16);
if (version == 0) {
parseCr3Preview(data, out, bTrace, skip+2, skip+4, skip+8, skip+12);
}
break;
default: break ; /* do nothing */
@@ -576,17 +580,19 @@ namespace Exiv2
void BmffImage::parseCr3Preview(DataBuf &data,
std::ostream& out,
bool bTrace,
uint16_t width_offset,
uint16_t height_offset,
uint32_t width_offset,
uint32_t height_offset,
uint32_t size_offset,
uint16_t relative_position)
uint32_t relative_position)
{
// Derived from https://github.com/lclevy/canon_cr3
NativePreview nativePreview;
// Only JPEG (version 0) is currently supported
// (relative_position is identical between versions)
long here = io_->tell();
enforce(here >= 0 &&
here <= std::numeric_limits<long>::max() - relative_position,
here <= std::numeric_limits<long>::max() - static_cast<long>(relative_position),
kerCorruptedMetadata);
NativePreview nativePreview;
nativePreview.position_ = here + relative_position;
nativePreview.width_ = data.read_uint16(width_offset, endian_);
nativePreview.height_ = data.read_uint16(height_offset, endian_);