Parse Exif in .HEIC/.AVIF

This commit is contained in:
Robin Mills
2021-02-25 12:28:50 +00:00
parent 4ff8fcdb5d
commit 913ee33372
2 changed files with 32 additions and 7 deletions
+1
View File
@@ -73,6 +73,7 @@ namespace Exiv2
//@}
void parseTiff(uint32_t root_tag, uint32_t length);
void parseTiff(uint32_t root_tag, uint32_t length,uint32_t start);
//! @name Manipulators
//@{
void readMetadata() /* override */;
+31 -7
View File
@@ -98,9 +98,9 @@ namespace Exiv2
uint32_t start_;
uint32_t length_;
std::string toString(long address = 0) const
std::string toString() const
{
return Internal::stringFormat("ID = %d from,length = %ld,%d", ID_, start_ + address, length_);
return Internal::stringFormat("ID = %d from,length = %ld,%d", ID_, start_, length_);
}
}; // class Iloc
@@ -269,10 +269,10 @@ namespace Exiv2
if (box.type == TAG_meta && ilocs_.find(exifID_) != ilocs_.end()) {
const Iloc& iloc = ilocs_.find(exifID_)->second;
#ifdef EXIV2_DEBUG_MESSAGES
std::cerr << indent(depth) << "Exiv2::BMFF Exif: " << iloc.toString(address + 20) << std::endl;
std::cerr << indent(depth) << "Exiv2::BMFF Exif: " << iloc.toString() << std::endl;
#endif
// parseTiff(Internal::Tag::root,iloc.length_,iloc.start_+address);
exifID_ = unknownID_;
parseTiff(Internal::Tag::root,iloc.length_,iloc.start_);
exifID_ = unknownID_; // don't do this again!
}
} break;
@@ -376,11 +376,34 @@ namespace Exiv2
return result;
}
void BmffImage::parseTiff(uint32_t root_tag, uint32_t length,uint32_t start)
{
// read and parse exif data
long restore = io_->tell();
DataBuf exif(length);
io_->seek(start,BasicIo::beg);
if ( exif.size_ > 8 && io_->read(exif.pData_,exif.size_) == exif.size_ ) {
// hunt for "II" or "MM"
long eof = 0xffffffff; // impossible value for punt
long punt = eof;
for ( long i = 0 ; i < exif.size_ -8 && punt==eof ; i+=2) {
if ( exif.pData_[i] == exif.pData_[i+1] )
if ( exif.pData_[i] == 'I' || exif.pData_[i] == 'M' )
punt = i;
}
if ( punt != eof ) {
Internal::TiffParserWorker::decode(exifData(), iptcData(), xmpData(),
exif.pData_+punt, exif.size_-punt, root_tag,
Internal::TiffMapping::findDecoder);
}
}
io_->seek(restore,BasicIo::beg);
}
void BmffImage::parseTiff(uint32_t root_tag, uint32_t length)
{
if (length > 8) {
DataBuf data(length - 8);
// rawData.alloc(length - 8);
long bufRead = io_->read(data.pData_, data.size_);
if (io_->error())
@@ -388,7 +411,8 @@ namespace Exiv2
if (bufRead != data.size_)
throw Error(kerInputDataReadFailed);
Internal::TiffParserWorker::decode(exifData(), iptcData(), xmpData(), data.pData_, data.size_, root_tag,
Internal::TiffParserWorker::decode(exifData(), iptcData(), xmpData(),
data.pData_, data.size_, root_tag,
Internal::TiffMapping::findDecoder);
}
}