|
|
@ -180,7 +180,7 @@ namespace Exiv2 {
|
|
|
|
case we have any exif or xmp data, also check
|
|
|
|
case we have any exif or xmp data, also check
|
|
|
|
for any chunks with alpha frame/layer set */
|
|
|
|
for any chunks with alpha frame/layer set */
|
|
|
|
while (!io_->eof() && static_cast<uint64_t>(io_->tell()) < filesize) {
|
|
|
|
while (!io_->eof() && static_cast<uint64_t>(io_->tell()) < filesize) {
|
|
|
|
readOrThrow(*io_, chunkId.data(0), WEBP_TAG_SIZE, Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, chunkId.data(), WEBP_TAG_SIZE, Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, size_buff, WEBP_TAG_SIZE, Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, size_buff, WEBP_TAG_SIZE, Exiv2::kerCorruptedMetadata);
|
|
|
|
const uint32_t size_u32 = Exiv2::getULong(size_buff, littleEndian);
|
|
|
|
const uint32_t size_u32 = Exiv2::getULong(size_buff, littleEndian);
|
|
|
|
|
|
|
|
|
|
|
@ -189,7 +189,7 @@ namespace Exiv2 {
|
|
|
|
Exiv2::kerCorruptedMetadata);
|
|
|
|
Exiv2::kerCorruptedMetadata);
|
|
|
|
const long size = static_cast<long>(size_u32);
|
|
|
|
const long size = static_cast<long>(size_u32);
|
|
|
|
DataBuf payload(size);
|
|
|
|
DataBuf payload(size);
|
|
|
|
readOrThrow(*io_, payload.data(0), payload.size(), Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, payload.data(), payload.size(), Exiv2::kerCorruptedMetadata);
|
|
|
|
if ( payload.size() % 2 ) {
|
|
|
|
if ( payload.size() % 2 ) {
|
|
|
|
byte c = 0;
|
|
|
|
byte c = 0;
|
|
|
|
readOrThrow(*io_, &c, 1, Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, &c, 1, Exiv2::kerCorruptedMetadata);
|
|
|
@ -317,7 +317,7 @@ namespace Exiv2 {
|
|
|
|
|
|
|
|
|
|
|
|
io_->seek(12, BasicIo::beg);
|
|
|
|
io_->seek(12, BasicIo::beg);
|
|
|
|
while (!io_->eof() && static_cast<uint64_t>(io_->tell()) < filesize) {
|
|
|
|
while (!io_->eof() && static_cast<uint64_t>(io_->tell()) < filesize) {
|
|
|
|
readOrThrow(*io_, chunkId.data(0), 4, Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, chunkId.data(), 4, Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, size_buff, 4, Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, size_buff, 4, Exiv2::kerCorruptedMetadata);
|
|
|
|
|
|
|
|
|
|
|
|
const uint32_t size_u32 = Exiv2::getULong(size_buff, littleEndian);
|
|
|
|
const uint32_t size_u32 = Exiv2::getULong(size_buff, littleEndian);
|
|
|
@ -328,7 +328,7 @@ namespace Exiv2 {
|
|
|
|
const long size = static_cast<long>(size_u32);
|
|
|
|
const long size = static_cast<long>(size_u32);
|
|
|
|
|
|
|
|
|
|
|
|
DataBuf payload(size);
|
|
|
|
DataBuf payload(size);
|
|
|
|
readOrThrow(*io_, payload.data(0), size, Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, payload.data(), size, Exiv2::kerCorruptedMetadata);
|
|
|
|
if ( io_->tell() % 2 ) io_->seek(+1,BasicIo::cur); // skip pad
|
|
|
|
if ( io_->tell() % 2 ) io_->seek(+1,BasicIo::cur); // skip pad
|
|
|
|
|
|
|
|
|
|
|
|
if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_VP8X)) {
|
|
|
|
if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_VP8X)) {
|
|
|
@ -357,11 +357,11 @@ namespace Exiv2 {
|
|
|
|
payload.write_uint8(0, x & ~WEBP_VP8X_EXIF_BIT);
|
|
|
|
payload.write_uint8(0, x & ~WEBP_VP8X_EXIF_BIT);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (outIo.write(chunkId.c_data(0), WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
|
|
|
|
if (outIo.write(chunkId.c_data(), WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
if (outIo.write(size_buff, WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
|
|
|
|
if (outIo.write(size_buff, WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
if (outIo.write(payload.c_data(0), payload.size()) != payload.size())
|
|
|
|
if (outIo.write(payload.c_data(), payload.size()) != payload.size())
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
if (outIo.tell() % 2) {
|
|
|
|
if (outIo.tell() % 2) {
|
|
|
|
if (outIo.write(&WEBP_PAD_ODD, 1) != 1) throw Error(kerImageWriteFailed);
|
|
|
|
if (outIo.write(&WEBP_PAD_ODD, 1) != 1) throw Error(kerImageWriteFailed);
|
|
|
@ -373,7 +373,7 @@ namespace Exiv2 {
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
ul2Data(data, static_cast<uint32_t>(iccProfile_.size()), littleEndian);
|
|
|
|
ul2Data(data, static_cast<uint32_t>(iccProfile_.size()), littleEndian);
|
|
|
|
if (outIo.write(data, WEBP_TAG_SIZE) != WEBP_TAG_SIZE) throw Error(kerImageWriteFailed);
|
|
|
|
if (outIo.write(data, WEBP_TAG_SIZE) != WEBP_TAG_SIZE) throw Error(kerImageWriteFailed);
|
|
|
|
if (outIo.write(iccProfile_.c_data(0), iccProfile_.size()) != iccProfile_.size()) {
|
|
|
|
if (outIo.write(iccProfile_.c_data(), iccProfile_.size()) != iccProfile_.size()) {
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
has_icc = false;
|
|
|
|
has_icc = false;
|
|
|
@ -385,11 +385,11 @@ namespace Exiv2 {
|
|
|
|
} else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_XMP)) {
|
|
|
|
} else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_XMP)) {
|
|
|
|
// Skip and add new data afterwards
|
|
|
|
// Skip and add new data afterwards
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
if (outIo.write(chunkId.c_data(0), WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
|
|
|
|
if (outIo.write(chunkId.c_data(), WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
if (outIo.write(size_buff, WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
|
|
|
|
if (outIo.write(size_buff, WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
if (outIo.write(payload.c_data(0), payload.size()) != payload.size())
|
|
|
|
if (outIo.write(payload.c_data(), payload.size()) != payload.size())
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -471,15 +471,15 @@ namespace Exiv2 {
|
|
|
|
while (!io_->eof() && static_cast<uint64_t>(io_->tell()) < filesize) {
|
|
|
|
while (!io_->eof() && static_cast<uint64_t>(io_->tell()) < filesize) {
|
|
|
|
auto offset = static_cast<uint64_t>(io_->tell());
|
|
|
|
auto offset = static_cast<uint64_t>(io_->tell());
|
|
|
|
byte size_buff[WEBP_TAG_SIZE];
|
|
|
|
byte size_buff[WEBP_TAG_SIZE];
|
|
|
|
io_->read(chunkId.data(0), WEBP_TAG_SIZE);
|
|
|
|
io_->read(chunkId.data(), WEBP_TAG_SIZE);
|
|
|
|
io_->read(size_buff, WEBP_TAG_SIZE);
|
|
|
|
io_->read(size_buff, WEBP_TAG_SIZE);
|
|
|
|
long size = Exiv2::getULong(size_buff, littleEndian);
|
|
|
|
long size = Exiv2::getULong(size_buff, littleEndian);
|
|
|
|
DataBuf payload(offset?size:WEBP_TAG_SIZE); // header is different from chunks
|
|
|
|
DataBuf payload(offset?size:WEBP_TAG_SIZE); // header is different from chunks
|
|
|
|
io_->read(payload.data(0), payload.size());
|
|
|
|
io_->read(payload.data(), payload.size());
|
|
|
|
|
|
|
|
|
|
|
|
if ( bPrint ) {
|
|
|
|
if ( bPrint ) {
|
|
|
|
out << Internal::indent(depth)
|
|
|
|
out << Internal::indent(depth)
|
|
|
|
<< Internal::stringFormat(" %s | %8u | %8u | ", chunkId.c_str(0),
|
|
|
|
<< Internal::stringFormat(" %s | %8u | %8u | ", chunkId.c_str(),
|
|
|
|
static_cast<uint32_t>(size), static_cast<uint32_t>(offset))
|
|
|
|
static_cast<uint32_t>(size), static_cast<uint32_t>(offset))
|
|
|
|
<< Internal::binaryToString(makeSlice(payload, 0, payload.size() > 32 ? 32 : payload.size()))
|
|
|
|
<< Internal::binaryToString(makeSlice(payload, 0, payload.size() > 32 ? 32 : payload.size()))
|
|
|
|
<< std::endl;
|
|
|
|
<< std::endl;
|
|
|
@ -487,7 +487,7 @@ namespace Exiv2 {
|
|
|
|
|
|
|
|
|
|
|
|
if ( equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_EXIF) && option==kpsRecursive ) {
|
|
|
|
if ( equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_EXIF) && option==kpsRecursive ) {
|
|
|
|
// create memio object with the payload, then print the structure
|
|
|
|
// create memio object with the payload, then print the structure
|
|
|
|
BasicIo::UniquePtr p = BasicIo::UniquePtr(new MemIo(payload.c_data(0),payload.size()));
|
|
|
|
BasicIo::UniquePtr p = BasicIo::UniquePtr(new MemIo(payload.c_data(),payload.size()));
|
|
|
|
printTiffStructure(*p,out,option,depth);
|
|
|
|
printTiffStructure(*p,out,option,depth);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -495,7 +495,7 @@ namespace Exiv2 {
|
|
|
|
|| (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_ICCP) && option==kpsIccProfile)
|
|
|
|
|| (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_ICCP) && option==kpsIccProfile)
|
|
|
|
;
|
|
|
|
;
|
|
|
|
if ( bPrintPayload ) {
|
|
|
|
if ( bPrintPayload ) {
|
|
|
|
out.write(payload.c_str(0), payload.size());
|
|
|
|
out.write(payload.c_str(), payload.size());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if ( offset && io_->tell() % 2 ) io_->seek(+1, BasicIo::cur); // skip padding byte on sub-chunks
|
|
|
|
if ( offset && io_->tell() % 2 ) io_->seek(+1, BasicIo::cur); // skip padding byte on sub-chunks
|
|
|
@ -546,7 +546,7 @@ namespace Exiv2 {
|
|
|
|
|
|
|
|
|
|
|
|
chunkId.write_uint8(4, '\0');
|
|
|
|
chunkId.write_uint8(4, '\0');
|
|
|
|
while (!io_->eof() && io_->tell() < filesize) {
|
|
|
|
while (!io_->eof() && io_->tell() < filesize) {
|
|
|
|
readOrThrow(*io_, chunkId.data(0), WEBP_TAG_SIZE, Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, chunkId.data(), WEBP_TAG_SIZE, Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, size_buff, WEBP_TAG_SIZE, Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, size_buff, WEBP_TAG_SIZE, Exiv2::kerCorruptedMetadata);
|
|
|
|
|
|
|
|
|
|
|
|
const uint32_t size_u32 = Exiv2::getULong(size_buff, littleEndian);
|
|
|
|
const uint32_t size_u32 = Exiv2::getULong(size_buff, littleEndian);
|
|
|
@ -568,7 +568,7 @@ namespace Exiv2 {
|
|
|
|
has_canvas_data = true;
|
|
|
|
has_canvas_data = true;
|
|
|
|
byte size_buf[WEBP_TAG_SIZE];
|
|
|
|
byte size_buf[WEBP_TAG_SIZE];
|
|
|
|
|
|
|
|
|
|
|
|
readOrThrow(*io_, payload.data(0), payload.size(), Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, payload.data(), payload.size(), Exiv2::kerCorruptedMetadata);
|
|
|
|
|
|
|
|
|
|
|
|
// Fetch width
|
|
|
|
// Fetch width
|
|
|
|
memcpy(&size_buf, payload.c_data(4), 3);
|
|
|
|
memcpy(&size_buf, payload.c_data(4), 3);
|
|
|
@ -583,7 +583,7 @@ namespace Exiv2 {
|
|
|
|
enforce(size >= 10, Exiv2::kerCorruptedMetadata);
|
|
|
|
enforce(size >= 10, Exiv2::kerCorruptedMetadata);
|
|
|
|
|
|
|
|
|
|
|
|
has_canvas_data = true;
|
|
|
|
has_canvas_data = true;
|
|
|
|
readOrThrow(*io_, payload.data(0), payload.size(), Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, payload.data(), payload.size(), Exiv2::kerCorruptedMetadata);
|
|
|
|
byte size_buf[WEBP_TAG_SIZE];
|
|
|
|
byte size_buf[WEBP_TAG_SIZE];
|
|
|
|
|
|
|
|
|
|
|
|
// Fetch width""
|
|
|
|
// Fetch width""
|
|
|
@ -604,7 +604,7 @@ namespace Exiv2 {
|
|
|
|
byte size_buf_w[2];
|
|
|
|
byte size_buf_w[2];
|
|
|
|
byte size_buf_h[3];
|
|
|
|
byte size_buf_h[3];
|
|
|
|
|
|
|
|
|
|
|
|
readOrThrow(*io_, payload.data(0), payload.size(), Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, payload.data(), payload.size(), Exiv2::kerCorruptedMetadata);
|
|
|
|
|
|
|
|
|
|
|
|
// Fetch width
|
|
|
|
// Fetch width
|
|
|
|
memcpy(&size_buf_w, payload.c_data(1), 2);
|
|
|
|
memcpy(&size_buf_w, payload.c_data(1), 2);
|
|
|
@ -622,7 +622,7 @@ namespace Exiv2 {
|
|
|
|
has_canvas_data = true;
|
|
|
|
has_canvas_data = true;
|
|
|
|
byte size_buf[WEBP_TAG_SIZE];
|
|
|
|
byte size_buf[WEBP_TAG_SIZE];
|
|
|
|
|
|
|
|
|
|
|
|
readOrThrow(*io_, payload.data(0), payload.size(), Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, payload.data(), payload.size(), Exiv2::kerCorruptedMetadata);
|
|
|
|
|
|
|
|
|
|
|
|
// Fetch width
|
|
|
|
// Fetch width
|
|
|
|
memcpy(&size_buf, payload.c_data(6), 3);
|
|
|
|
memcpy(&size_buf, payload.c_data(6), 3);
|
|
|
@ -634,10 +634,10 @@ namespace Exiv2 {
|
|
|
|
size_buf[3] = 0;
|
|
|
|
size_buf[3] = 0;
|
|
|
|
pixelHeight_ = Exiv2::getULong(size_buf, littleEndian) + 1;
|
|
|
|
pixelHeight_ = Exiv2::getULong(size_buf, littleEndian) + 1;
|
|
|
|
} else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_ICCP)) {
|
|
|
|
} else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_ICCP)) {
|
|
|
|
readOrThrow(*io_, payload.data(0), payload.size(), Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, payload.data(), payload.size(), Exiv2::kerCorruptedMetadata);
|
|
|
|
this->setIccProfile(payload);
|
|
|
|
this->setIccProfile(payload);
|
|
|
|
} else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_EXIF)) {
|
|
|
|
} else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_EXIF)) {
|
|
|
|
readOrThrow(*io_, payload.data(0), payload.size(), Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, payload.data(), payload.size(), Exiv2::kerCorruptedMetadata);
|
|
|
|
|
|
|
|
|
|
|
|
byte size_buff2[2];
|
|
|
|
byte size_buff2[2];
|
|
|
|
// 4 meaningful bytes + 2 padding bytes
|
|
|
|
// 4 meaningful bytes + 2 padding bytes
|
|
|
@ -649,22 +649,22 @@ namespace Exiv2 {
|
|
|
|
bool s_header = false;
|
|
|
|
bool s_header = false;
|
|
|
|
bool le_header = false;
|
|
|
|
bool le_header = false;
|
|
|
|
bool be_header = false;
|
|
|
|
bool be_header = false;
|
|
|
|
long pos = getHeaderOffset(payload.c_data(0), payload.size(), reinterpret_cast<byte*>(&exifLongHeader), 4);
|
|
|
|
long pos = getHeaderOffset(payload.c_data(), payload.size(), reinterpret_cast<byte*>(&exifLongHeader), 4);
|
|
|
|
|
|
|
|
|
|
|
|
if (pos == -1) {
|
|
|
|
if (pos == -1) {
|
|
|
|
pos = getHeaderOffset(payload.c_data(0), payload.size(), reinterpret_cast<byte*>(&exifLongHeader), 6);
|
|
|
|
pos = getHeaderOffset(payload.c_data(), payload.size(), reinterpret_cast<byte*>(&exifLongHeader), 6);
|
|
|
|
if (pos != -1) {
|
|
|
|
if (pos != -1) {
|
|
|
|
s_header = true;
|
|
|
|
s_header = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (pos == -1) {
|
|
|
|
if (pos == -1) {
|
|
|
|
pos = getHeaderOffset(payload.c_data(0), payload.size(), reinterpret_cast<byte*>(&exifTiffLEHeader), 3);
|
|
|
|
pos = getHeaderOffset(payload.c_data(), payload.size(), reinterpret_cast<byte*>(&exifTiffLEHeader), 3);
|
|
|
|
if (pos != -1) {
|
|
|
|
if (pos != -1) {
|
|
|
|
le_header = true;
|
|
|
|
le_header = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (pos == -1) {
|
|
|
|
if (pos == -1) {
|
|
|
|
pos = getHeaderOffset(payload.c_data(0), payload.size(), reinterpret_cast<byte*>(&exifTiffBEHeader), 4);
|
|
|
|
pos = getHeaderOffset(payload.c_data(), payload.size(), reinterpret_cast<byte*>(&exifTiffBEHeader), 4);
|
|
|
|
if (pos != -1) {
|
|
|
|
if (pos != -1) {
|
|
|
|
be_header = true;
|
|
|
|
be_header = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -693,11 +693,11 @@ namespace Exiv2 {
|
|
|
|
rawExifData.copyBytes(6, reinterpret_cast<char*>(&exifShortHeader), 6);
|
|
|
|
rawExifData.copyBytes(6, reinterpret_cast<char*>(&exifShortHeader), 6);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
rawExifData.copyBytes(offset, payload.c_data(0), payload.size());
|
|
|
|
rawExifData.copyBytes(offset, payload.c_data(), payload.size());
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef EXIV2_DEBUG_MESSAGES
|
|
|
|
#ifdef EXIV2_DEBUG_MESSAGES
|
|
|
|
std::cout << "Display Hex Dump [size:" << static_cast<unsigned long>(sizePayload) << "]" << std::endl;
|
|
|
|
std::cout << "Display Hex Dump [size:" << static_cast<unsigned long>(sizePayload) << "]" << std::endl;
|
|
|
|
std::cout << Internal::binaryToHex(rawExifData.c_data(0), sizePayload);
|
|
|
|
std::cout << Internal::binaryToHex(rawExifData.c_data(), sizePayload);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
if (pos != -1) {
|
|
|
|
if (pos != -1) {
|
|
|
@ -715,8 +715,8 @@ namespace Exiv2 {
|
|
|
|
exifData_.clear();
|
|
|
|
exifData_.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_XMP)) {
|
|
|
|
} else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_XMP)) {
|
|
|
|
readOrThrow(*io_, payload.data(0), payload.size(), Exiv2::kerCorruptedMetadata);
|
|
|
|
readOrThrow(*io_, payload.data(), payload.size(), Exiv2::kerCorruptedMetadata);
|
|
|
|
xmpPacket_.assign(payload.c_str(0), payload.size());
|
|
|
|
xmpPacket_.assign(payload.c_str(), payload.size());
|
|
|
|
if (!xmpPacket_.empty() && XmpParser::decode(xmpData_, xmpPacket_)) {
|
|
|
|
if (!xmpPacket_.empty() && XmpParser::decode(xmpData_, xmpPacket_)) {
|
|
|
|
#ifndef SUPPRESS_WARNINGS
|
|
|
|
#ifndef SUPPRESS_WARNINGS
|
|
|
|
EXV_WARNING << "Failed to decode XMP metadata." << std::endl;
|
|
|
|
EXV_WARNING << "Failed to decode XMP metadata." << std::endl;
|
|
|
@ -725,7 +725,7 @@ namespace Exiv2 {
|
|
|
|
#ifdef EXIV2_DEBUG_MESSAGES
|
|
|
|
#ifdef EXIV2_DEBUG_MESSAGES
|
|
|
|
std::cout << "Display Hex Dump [size:" << static_cast<unsigned long>(payload.size()) << "]"
|
|
|
|
std::cout << "Display Hex Dump [size:" << static_cast<unsigned long>(payload.size()) << "]"
|
|
|
|
<< std::endl;
|
|
|
|
<< std::endl;
|
|
|
|
std::cout << Internal::binaryToHex(payload.c_data(0), payload.size());
|
|
|
|
std::cout << Internal::binaryToHex(payload.c_data(), payload.size());
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
@ -837,7 +837,7 @@ namespace Exiv2 {
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
if (iIo.write(size_buff, WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
|
|
|
|
if (iIo.write(size_buff, WEBP_TAG_SIZE) != WEBP_TAG_SIZE)
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
if (iIo.write(iccProfile_.c_data(0), iccProfile_.size()) != iccProfile_.size())
|
|
|
|
if (iIo.write(iccProfile_.c_data(), iccProfile_.size()) != iccProfile_.size())
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
throw Error(kerImageWriteFailed);
|
|
|
|
if (iIo.tell() % 2) {
|
|
|
|
if (iIo.tell() % 2) {
|
|
|
|
if (iIo.write(&WEBP_PAD_ODD, 1) != 1) throw Error(kerImageWriteFailed);
|
|
|
|
if (iIo.write(&WEBP_PAD_ODD, 1) != 1) throw Error(kerImageWriteFailed);
|
|
|
|