[SCM] exiv2 packaging branch, master, updated. debian/0.25-3.1-3734-gdcbc29a
Maximiliano Curia
maxy at moszumanska.debian.org
Thu Jul 13 17:47:25 UTC 2017
Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/exiv2.git;a=commitdiff;h=11993b3
The following commit has been merged in the master branch:
commit 11993b3b5520cc3aa5c63e6c4bc2e13f3f3980f4
Author: Robin Mills <robin at clanmills.com>
Date: Wed Mar 15 21:30:55 2017 +0000
#1271 Thanks to Ben for reporting this and providing the patch.
---
include/exiv2/orfimage.hpp | 1 +
include/exiv2/rafimage.hpp | 1 +
include/exiv2/riffvideo.hpp | 6 ++
include/exiv2/rw2image.hpp | 1 +
src/cr2image.cpp | 2 +
src/orfimage.cpp | 17 ++++
src/rafimage.cpp | 214 ++++++++++++++++++++++++++++++++++++++++++--
src/riffvideo.cpp | 83 +++++++++++++++++
src/rw2image.cpp | 17 ++++
src/webpimage.cpp | 5 +-
10 files changed, 336 insertions(+), 11 deletions(-)
diff --git a/include/exiv2/orfimage.hpp b/include/exiv2/orfimage.hpp
index 1b2e114..7d46746 100644
--- a/include/exiv2/orfimage.hpp
+++ b/include/exiv2/orfimage.hpp
@@ -79,6 +79,7 @@ namespace Exiv2 {
//! @name Manipulators
//@{
+ void printStructure(std::ostream& out, PrintStructureOption option,int depth);
void readMetadata();
void writeMetadata();
/*!
diff --git a/include/exiv2/rafimage.hpp b/include/exiv2/rafimage.hpp
index 0552386..cf6542b 100644
--- a/include/exiv2/rafimage.hpp
+++ b/include/exiv2/rafimage.hpp
@@ -78,6 +78,7 @@ namespace Exiv2 {
//! @name Manipulators
//@{
+ void printStructure(std::ostream& out, PrintStructureOption option,int depth);
void readMetadata();
/*!
@brief Todo: Write metadata back to the image. This method is not
diff --git a/include/exiv2/riffvideo.hpp b/include/exiv2/riffvideo.hpp
index 5305011..1eac859 100644
--- a/include/exiv2/riffvideo.hpp
+++ b/include/exiv2/riffvideo.hpp
@@ -71,6 +71,7 @@ namespace Exiv2 {
//! @name Manipulators
//@{
+ void printStructure(std::ostream& out, PrintStructureOption option,int depth);
void readMetadata();
void writeMetadata();
//@}
@@ -185,9 +186,14 @@ namespace Exiv2 {
RiffVideo(const RiffVideo& rhs);
//! Assignment operator
RiffVideo& operator=(const RiffVideo& rhs);
+ bool equalsRiffTag(Exiv2::DataBuf& buf ,const char* str);
//@}
private:
+ const static int RIFF_TAG_SIZE;
+ const static char* RIFF_CHUNK_HEADER_ICCP;
+ const static char* RIFF_CHUNK_HEADER_EXIF;
+ const static char* RIFF_CHUNK_HEADER_XMP;
//! Variable to check the end of metadata traversing.
bool continueTraversing_;
//! Variable which stores current stream being processsed.
diff --git a/include/exiv2/rw2image.hpp b/include/exiv2/rw2image.hpp
index 63d50b3..fe5a5db 100644
--- a/include/exiv2/rw2image.hpp
+++ b/include/exiv2/rw2image.hpp
@@ -76,6 +76,7 @@ namespace Exiv2 {
//! @name Manipulators
//@{
+ void printStructure(std::ostream& out, PrintStructureOption option,int depth);
void readMetadata();
/*!
@brief Todo: Write metadata back to the image. This method is not
diff --git a/src/cr2image.cpp b/src/cr2image.cpp
index b6fa315..2907426 100644
--- a/src/cr2image.cpp
+++ b/src/cr2image.cpp
@@ -107,6 +107,8 @@ namespace Exiv2 {
throw Error(3, "CR2");
}
clearMetadata();
+ std::ofstream devnull;
+ printStructure(devnull, kpsRecursive, 0);
ByteOrder bo = Cr2Parser::decode(exifData_,
iptcData_,
xmpData_,
diff --git a/src/orfimage.cpp b/src/orfimage.cpp
index 3f5a424..c516591 100644
--- a/src/orfimage.cpp
+++ b/src/orfimage.cpp
@@ -89,6 +89,21 @@ namespace Exiv2 {
throw(Error(32, "Image comment", "ORF"));
}
+ void OrfImage::printStructure(std::ostream& out, PrintStructureOption option, int depth) {
+ std::cout << "ORF IMAGE" << std::endl;
+ if (io_->open() != 0) throw Error(9, io_->path(), strError());
+ // Ensure that this is the correct image type
+ if ( imageType() == ImageType::none )
+ if (!isOrfType(*io_, false)) {
+ if (io_->error() || io_->eof()) throw Error(14);
+ throw Error(15);
+ }
+
+ io_->seek(0,BasicIo::beg);
+
+ printTiffStructure(io(),out,option,depth-1);
+ } // OrfImage::printStructure
+
void OrfImage::readMetadata()
{
#ifdef DEBUG
@@ -104,6 +119,8 @@ namespace Exiv2 {
throw Error(3, "ORF");
}
clearMetadata();
+ std::ofstream devnull;
+ printStructure(devnull, kpsRecursive, 0);
ByteOrder bo = OrfParser::decode(exifData_,
iptcData_,
xmpData_,
diff --git a/src/rafimage.cpp b/src/rafimage.cpp
index b883e4e..65742a3 100644
--- a/src/rafimage.cpp
+++ b/src/rafimage.cpp
@@ -34,6 +34,7 @@ EXIV2_RCSID("@(#) $Id$")
#include "rafimage.hpp"
#include "tiffimage.hpp"
+#include "image_int.hpp"
#include "image.hpp"
#include "basicio.hpp"
#include "error.hpp"
@@ -95,6 +96,189 @@ namespace Exiv2 {
throw(Error(32, "Image comment", "RAF"));
}
+ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, int depth) {
+ if (io_->open() != 0) {
+ throw Error(9, io_->path(), strError());
+ }
+ // Ensure this is the correct image type
+ if (!isRafType(*io_, true)) {
+ if (io_->error() || io_->eof()) throw Error(14);
+ throw Error(3, "RAF");
+ }
+ bool bPrint = option==kpsBasic || option==kpsRecursive;
+ if ( bPrint ) {
+ io_->seek(0,BasicIo::beg); // rewind
+
+ if ( bPrint ) {
+ out << Internal::indent(depth)
+ << "STRUCTURE OF RAF FILE: "
+ << io().path()
+ << std::endl;
+ out << Internal::indent(depth)
+ << Internal::stringFormat(" Length | Offset | Payload")
+ << std::endl;
+ }
+
+ byte magicdata [17];
+ io_->read(magicdata, 16);
+ magicdata[16] = 0;
+ if ( bPrint ) {
+ out << Internal::indent(depth)
+ << Internal::stringFormat(" %8u | %8u | ", 16, 0)
+ << "Magic number : "
+ << std::string((char*)&magicdata)
+ << std::endl;
+ }
+
+ byte data1 [5];
+ io_->read(data1, 4);
+ data1[4] = 0;
+ if ( bPrint ) {
+ out << Internal::indent(depth)
+ << Internal::stringFormat(" %8u | %8u | ", 4, 16)
+ << "data 1 : "
+ << std::string((char*)&data1)
+ << std::endl;
+ }
+
+ byte data2 [9];
+ io_->read(data2, 8);
+ data2[8] = 0;
+ if ( bPrint ) {
+ out << Internal::indent(depth)
+ << Internal::stringFormat(" %8u | %8u | ", 8, 20)
+ << "data 2 : "
+ << std::string((char*)&data2)
+ << std::endl;
+ }
+
+ byte camdata [33];
+ io_->read(camdata, 32);
+ camdata[32] = 0;
+ if ( bPrint ) {
+ out << Internal::indent(depth)
+ << Internal::stringFormat(" %8u | %8u | ", 32, 28)
+ << "camera : "
+ << std::string((char*)&camdata)
+ << std::endl;
+ }
+
+ byte dir_version [5];
+ io_->read(dir_version, 4);
+ dir_version[4] = 0;
+ if ( bPrint ) {
+ out << Internal::indent(depth)
+ << Internal::stringFormat(" %8u | %8u | ", 4, 60)
+ << "dir version : "
+ << std::string((char*)&dir_version)
+ << std::endl;
+ }
+
+ byte unknown [20];
+ io_->read(unknown, 20);
+
+ byte jpg_img_offset [4];
+ io_->read(jpg_img_offset, 4);
+ byte jpg_img_length [4];
+ io_->read(jpg_img_length, 4);
+ long jpg_img_off = Exiv2::getULong((const byte *) jpg_img_offset, bigEndian);
+ long jpg_img_len = Exiv2::getULong((const byte *) jpg_img_length, bigEndian);
+ std::stringstream j_off;
+ std::stringstream j_len;
+ j_off << jpg_img_off;
+ j_len << jpg_img_len;
+ if ( bPrint ) {
+ out << Internal::indent(depth)
+ << Internal::stringFormat(" %8u | %8u | ", 4, 84)
+ << "JPEG Image Offset : "
+ << j_off.str()
+ << std::endl;
+ out << Internal::indent(depth)
+ << Internal::stringFormat(" %8u | %8u | ", 4, 88)
+ << "JPEG Image Length : "
+ << j_len.str()
+ << std::endl;
+ }
+
+ byte cfa_header_offset [4];
+ io_->read(cfa_header_offset, 4);
+ byte cfa_header_length [4];
+ io_->read(cfa_header_length, 4);
+ long cfa_hdr_off = Exiv2::getULong((const byte *) cfa_header_offset, bigEndian);
+ long cfa_hdr_len = Exiv2::getULong((const byte *) cfa_header_length, bigEndian);
+ std::stringstream ch_off;
+ std::stringstream ch_len;
+ ch_off << cfa_hdr_off;
+ ch_len << cfa_hdr_len;
+ if ( bPrint ) {
+ out << Internal::indent(depth)
+ << Internal::stringFormat(" %8u | %8u | ", 4, 92)
+ << "CFA Header Offset : "
+ << ch_off.str()
+ << std::endl;
+ out << Internal::indent(depth)
+ << Internal::stringFormat(" %8u | %8u | ", 4, 96)
+ << "CFA Header Length : "
+ << ch_len.str()
+ << std::endl;
+ }
+
+ byte cfa_offset [4];
+ io_->read(cfa_offset, 4);
+ byte cfa_length [4];
+ io_->read(cfa_length, 4);
+ long cfa_off = Exiv2::getULong((const byte *) cfa_offset, bigEndian);
+ long cfa_len = Exiv2::getULong((const byte *) cfa_length, bigEndian);
+ std::stringstream c_off;
+ std::stringstream c_len;
+ c_off << cfa_off;
+ c_len << cfa_len;
+ if ( bPrint ) {
+ out << Internal::indent(depth)
+ << Internal::stringFormat(" %8u | %8u | ", 4, 100)
+ << "CFA Offset : "
+ << c_off.str()
+ << std::endl;
+ out << Internal::indent(depth)
+ << Internal::stringFormat(" %8u | %8u | ", 4, 104)
+ << "CFA Length : "
+ << c_len.str()
+ << std::endl;
+ }
+
+ io_->seek(jpg_img_off, BasicIo::beg); // rewind
+ DataBuf payload(16); // header is different from chunks
+ io_->read(payload.pData_, payload.size_);
+ if ( bPrint ) {
+ out << Internal::indent(depth)
+ << Internal::stringFormat(" %8u | %8u | ", jpg_img_len, jpg_img_off)
+ << "jpg image / exif : "
+ << Internal::binaryToString(payload, payload.size_)
+ << std::endl;
+ }
+
+ io_->seek(cfa_hdr_off, BasicIo::beg); // rewind
+ io_->read(payload.pData_, payload.size_);
+ if ( bPrint ) {
+ out << Internal::indent(depth)
+ << Internal::stringFormat(" %8u | %8u | ", cfa_hdr_len, cfa_hdr_off)
+ << "CFA Header: "
+ << Internal::binaryToString(payload, payload.size_)
+ << std::endl;
+ }
+
+ io_->seek(cfa_off, BasicIo::beg); // rewind
+ io_->read(payload.pData_, payload.size_);
+ if ( bPrint ) {
+ out << Internal::indent(depth)
+ << Internal::stringFormat(" %8u | %8u | ", cfa_len, cfa_off)
+ << "CFA : "
+ << Internal::binaryToString(payload, payload.size_)
+ << std::endl;
+ }
+ }
+ } // RafImage::printStructure
+
void RafImage::readMetadata()
{
#ifdef DEBUG
@@ -107,20 +291,32 @@ namespace Exiv2 {
if (io_->error() || io_->eof()) throw Error(14);
throw Error(3, "RAF");
}
- byte const* pData = io_->mmap();
- long size = io_->size();
- if (size < 88 + 4) throw Error(14); // includes the test for -1
- uint32_t const start = getULong(pData + 84, bigEndian) + 12;
- if (static_cast<uint32_t>(size) < start) throw Error(14);
+
clearMetadata();
+
+ io_->seek(84,BasicIo::beg);
+ byte jpg_img_offset [4];
+ io_->read(jpg_img_offset, 4);
+ byte jpg_img_length [4];
+ io_->read(jpg_img_length, 4);
+ long jpg_img_off = Exiv2::getULong((const byte *) jpg_img_offset, bigEndian);
+ long jpg_img_len = Exiv2::getULong((const byte *) jpg_img_length, bigEndian);
+
+ DataBuf buf(jpg_img_len - 12);
+ io_->seek(jpg_img_off + 12,BasicIo::beg);
+ io_->read(buf.pData_, buf.size_ - 12);
+ if (io_->error() || io_->eof()) throw Error(14);
+
+ io_->seek(0,BasicIo::beg); // rewind
+
ByteOrder bo = TiffParser::decode(exifData_,
iptcData_,
xmpData_,
- pData + start,
- size - start);
+ buf.pData_,
+ buf.size_);
- exifData_["Exif.Image2.JPEGInterchangeFormat"] = getULong(pData + 84, bigEndian);
- exifData_["Exif.Image2.JPEGInterchangeFormatLength"] = getULong(pData + 88, bigEndian);
+ exifData_["Exif.Image2.JPEGInterchangeFormat"] = getULong(jpg_img_offset, bigEndian);
+ exifData_["Exif.Image2.JPEGInterchangeFormatLength"] = getULong(jpg_img_length, bigEndian);
setByteOrder(bo);
} // RafImage::readMetadata
diff --git a/src/riffvideo.cpp b/src/riffvideo.cpp
index 91ea2d1..1edbbe5 100644
--- a/src/riffvideo.cpp
+++ b/src/riffvideo.cpp
@@ -41,6 +41,7 @@ EXIV2_RCSID("@(#) $Id$")
#include "tags_int.hpp"
#include "types.hpp"
#include "tiffimage_int.hpp"
+#include "image_int.hpp"
// + standard includes
#include <cmath>
@@ -516,6 +517,88 @@ namespace Exiv2 {
return "video/riff";
}
+ const int RiffVideo::RIFF_TAG_SIZE = 0x4;
+ const char* RiffVideo::RIFF_CHUNK_HEADER_ICCP = "ICCP";
+ const char* RiffVideo::RIFF_CHUNK_HEADER_EXIF = "EXIF";
+ const char* RiffVideo::RIFF_CHUNK_HEADER_XMP = "XMP ";
+
+ /*!
+ @brief Function used to check equality of a Tags with a
+ particular string (ignores case while comparing).
+ @param buf Data buffer that will contain Tag to compare
+ @param str char* Pointer to string
+ @return Returns true if the buffer value is equal to string.
+ */
+ bool RiffVideo::equalsRiffTag(Exiv2::DataBuf& buf, const char* str) {
+ for(int i = 0; i < 4; i++ )
+ if(toupper(buf.pData_[i]) != str[i])
+ return false;
+ return true;
+ }
+
+ void RiffVideo::printStructure(std::ostream& out, PrintStructureOption option, int depth) {
+ if (io_->open() != 0) {
+ throw Error(9, io_->path(), strError());
+ }
+ // Ensure this is the correct image type
+ if (!isRiffType(*io_, true)) {
+ if (io_->error() || io_->eof()) throw Error(14);
+ throw Error(3, "RIFF");
+ }
+
+ bool bPrint = option==kpsBasic || option==kpsRecursive;
+ if ( bPrint || option == kpsXMP || option == kpsIccProfile || option == kpsIptcErase ) {
+ byte data [RIFF_TAG_SIZE * 2];
+ io_->read(data, RIFF_TAG_SIZE * 2);
+ uint64_t filesize = Exiv2::getULong(data + RIFF_TAG_SIZE, littleEndian);
+ DataBuf chunkId(5) ;
+ chunkId.pData_[4] = '
--
exiv2 packaging
More information about the pkg-kde-commits
mailing list