RAF: Simplify metadata extraction

Remove manual TiffParser usage for reading APP1 segement,
instead use JpegImage for proper parsing.
This commit is contained in:
Daniel Vogelbacher 2023-05-15 19:25:35 +02:00
parent 6c4b6d9d7f
commit d27c5ac838

View File

@ -259,27 +259,18 @@ void RafImage::readMetadata() {
throw Error(ErrorCode::kerFailedToReadImageData); throw Error(ErrorCode::kerFailedToReadImageData);
} }
// Extracting metadata from first APP1 container // Retreive metadata from embedded JPEG preview image.
constexpr byte tiff_offset = 12; auto jpg_io = std::make_unique<Exiv2::MemIo>(jpg_buf.data(), jpg_buf.size());
ByteOrder bo = TiffParser::decode(exifData_, iptcData_, xmpData_, jpg_buf.c_data() + tiff_offset, jpg_buf.size() - tiff_offset); auto jpg_img = JpegImage(std::move(jpg_io), false);
jpg_img.readMetadata();
// If there is no XMP data in first APP1 EXIF structure, there is maybe setByteOrder(jpg_img.byteOrder());
// another APP1 container for XMP. Just use the JpegImage metadata parser for that. xmpData_ = jpg_img.xmpData();
if(xmpData_.empty()) { exifData_ = jpg_img.exifData();
auto jpg_io = std::make_unique<Exiv2::MemIo>(jpg_buf.data(), jpg_buf.size()); iptcData_ = jpg_img.iptcData();
auto jpg_img = JpegImage(std::move(jpg_io), false);
jpg_img.readMetadata();
const auto jpg_xmp_data = jpg_img.xmpData();
for(auto& datum : jpg_xmp_data) {
xmpData_.add(datum);
}
}
exifData_["Exif.Image2.JPEGInterchangeFormat"] = getULong(jpg_img_offset, bigEndian); exifData_["Exif.Image2.JPEGInterchangeFormat"] = getULong(jpg_img_offset, bigEndian);
exifData_["Exif.Image2.JPEGInterchangeFormatLength"] = getULong(jpg_img_length, bigEndian); exifData_["Exif.Image2.JPEGInterchangeFormatLength"] = getULong(jpg_img_length, bigEndian);
setByteOrder(bo);
// parse the tiff // parse the tiff
byte readBuff[4]; byte readBuff[4];
if (io_->seek(100, BasicIo::beg) != 0) if (io_->seek(100, BasicIo::beg) != 0)