[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:04 UTC 2017
Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/exiv2.git;a=commitdiff;h=5f1d52e
The following commit has been merged in the master branch:
commit 5f1d52e4971fc3087df54248b6b172e1f86c9b0a
Author: Robin Mills <robin at clanmills.com>
Date: Sun Sep 25 22:43:40 2016 +0000
#1230 Added stdin-test and fixing issue identified by the test.
---
Makefile | 3 ++
config/Makefile.in | 3 ++
include/exiv2/xmp.hpp | 13 ++++++
src/actions.cpp | 6 ++-
src/actions.hpp | 2 +-
src/error.cpp | 1 +
src/exiv2.cpp | 102 +++++++++++++++++++++++++++++++++++++-------
src/exiv2app.hpp | 48 +--------------------
src/image.cpp | 5 ++-
src/jpgimage.cpp | 1 +
src/tiffimage.cpp | 11 +++--
src/tiffvisitor.cpp | 8 +++-
src/xmp.cpp | 1 +
test/Makefile | 1 +
test/data/stdin-test.out | 107 +++++++++++++++++++++++++++++++++++++++++++++++
test/data/webp-test.out | 8 ++--
test/stdin-test.sh | 42 +++++++++++++++++++
17 files changed, 286 insertions(+), 76 deletions(-)
diff --git a/Makefile b/Makefile
index 662b41b..9a0507d 100644
--- a/Makefile
+++ b/Makefile
@@ -106,6 +106,9 @@ preview-test preview:
icc-test icc:
cd test && ./icc-test.sh
+stdin-test:
+ cd test && ./stdin-test.sh
+
# convenience target for building individual sample programs
addmoddel exifcomment exifvalue httptest iptctest mmap-test stringto-test \
exifdata iotest key-test path-test taglist write2-test write-test \
diff --git a/config/Makefile.in b/config/Makefile.in
index 662b41b..9a0507d 100644
--- a/config/Makefile.in
+++ b/config/Makefile.in
@@ -106,6 +106,9 @@ preview-test preview:
icc-test icc:
cd test && ./icc-test.sh
+stdin-test:
+ cd test && ./stdin-test.sh
+
# convenience target for building individual sample programs
addmoddel exifcomment exifvalue httptest iptctest mmap-test stringto-test \
exifdata iotest key-test path-test taglist write2-test write-test \
diff --git a/include/exiv2/xmp.hpp b/include/exiv2/xmp.hpp
index b6e5f7a..8a768d4 100644
--- a/include/exiv2/xmp.hpp
+++ b/include/exiv2/xmp.hpp
@@ -245,11 +245,24 @@ namespace Exiv2 {
bool empty() const;
//! Get the number of metadata entries
long count() const;
+
+ //! are we to use the packet?
+ bool usePacket() const { return usePacket_; } ;
+
+ //! set usePacket_
+ bool usePacket(bool b) { bool r = usePacket_; usePacket_=b ; return r; };
+ //! setPacket
+ void setPacket(const std::string& xmpPacket) { xmpPacket_ = xmpPacket ; usePacket(false); };
+ // ! getPacket
+ const std::string& xmpPacket() const { return xmpPacket_ ; };
+
//@}
private:
// DATA
XmpMetadata xmpMetadata_;
+ std::string xmpPacket_ ;
+ bool usePacket_ ;
}; // class XmpData
/*!
diff --git a/src/actions.cpp b/src/actions.cpp
index bcb086b..591d3e6 100644
--- a/src/actions.cpp
+++ b/src/actions.cpp
@@ -1300,7 +1300,7 @@ namespace Action {
if (0 == rc && (Params::instance().target_ & (Params::ctXmpSidecar|Params::ctXmpRaw)) ) {
std::string xmpPath = newFilePath(path,".xmp");
- rc = bStdin ? insertXmpPacket(path,stdIn) : insertXmpPacket(path,xmpPath);
+ rc = bStdin ? insertXmpPacket(path,stdIn,bStdin) : insertXmpPacket(path,xmpPath);
}
if (0 == rc && Params::instance().target_ & Params::ctIccProfile) {
@@ -1335,7 +1335,7 @@ namespace Action {
return insertXmpPacket(path,xmpBlob);
}
- int Insert::insertXmpPacket(const std::string& path,const Exiv2::DataBuf& xmpBlob) const
+ int Insert::insertXmpPacket(const std::string& path,const Exiv2::DataBuf& xmpBlob,bool usePacket) const
{
std::string xmpPacket;
for ( long i = 0 ; i < xmpBlob.size_ ; i++ ) {
@@ -1344,7 +1344,9 @@ namespace Action {
Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(path);
assert(image.get() != 0);
image->readMetadata();
+ image->clearXmpData();
image->setXmpPacket(xmpPacket);
+ image->writeXmpFromPacket(usePacket);
image->writeMetadata();
return 0;
diff --git a/src/actions.hpp b/src/actions.hpp
index 42adfb4..24a279f 100644
--- a/src/actions.hpp
+++ b/src/actions.hpp
@@ -353,7 +353,7 @@ namespace Action {
/*!
@brief Insert xmp from a DataBuf into file \em path.
*/
- int insertXmpPacket(const std::string& path,const Exiv2::DataBuf& xmpBlob) const;
+ int insertXmpPacket(const std::string& path,const Exiv2::DataBuf& xmpBlob,bool usePacket=false) const;
/*!
@brief Insert an ICC profile from a file into file \em path.
diff --git a/src/error.cpp b/src/error.cpp
index d92ea7f..663be0d 100644
--- a/src/error.cpp
+++ b/src/error.cpp
@@ -105,6 +105,7 @@ namespace {
{ 51, N_("TIFF array element tag %1 has wrong type") }, // %1=tag number
{ 52, N_("%1 has invalid XMP value type `%2'") }, // %1=key, %2=value type
{ 53, N_("Not a valid ICC Profile") },
+ { 54, N_("Not valid XMP") },
};
}
diff --git a/src/exiv2.cpp b/src/exiv2.cpp
index f92b9ae..428706a 100644
--- a/src/exiv2.cpp
+++ b/src/exiv2.cpp
@@ -877,6 +877,85 @@ int Params::nonoption(const std::string& argv)
return rc;
} // Params::nonoption
+static int readFileToBuf(FILE* f,Exiv2::DataBuf& buf)
+{
+ const int buff_size = 4*1028;
+ Exiv2::byte* bytes = (Exiv2::byte*)::malloc(buff_size);
+ int nBytes = 0 ;
+ bool more = bytes != NULL;
+ while ( more ) {
+ char buff[buff_size];
+ int n = (int) fread(buff,1,buff_size,f);
+ more = n > 0 ;
+ if ( more ) {
+ bytes = (Exiv2::byte*) realloc(bytes,nBytes+n);
+ memcpy(bytes+nBytes,buff,n);
+ nBytes += n ;
+ }
+ }
+
+ if ( nBytes ) {
+ buf.alloc(nBytes);
+ memcpy(buf.pData_,(const void*)bytes,nBytes);
+ }
+ if ( bytes != NULL ) ::free(bytes) ;
+ return nBytes;
+}
+
+void Params::getStdin(Exiv2::DataBuf& buf)
+{
+ // copy stdin to stdinBuf
+ if ( stdinBuf.size_ == 0 ) {
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW__) || defined(_MSC_VER)
+ DWORD fdwMode;
+ _setmode(fileno(stdin), O_BINARY);
+ Sleep(300);
+ if ( !GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &fdwMode) ) { // failed: stdin has bytes!
+#else
+ // http://stackoverflow.com/questions/34479795/make-c-not-wait-for-user-input/34479916#34479916
+ fd_set readfds;
+ FD_ZERO (&readfds);
+ FD_SET(STDIN_FILENO, &readfds);
+ struct timeval timeout = {1,0}; // yes: set timeout seconds,microseconds
+
+ // if we have something in the pipe, read it
+ if (select(1, &readfds, NULL, NULL, &timeout)) {
+#endif
+#ifdef DEBUG
+ std::cerr << "stdin has data" << std::endl;
+#endif
+ readFileToBuf(stdin,stdinBuf);
+ }
+#ifdef DEBUG
+ // this is only used to simulate reading from stdin when debugging
+ // to simulate exiv2 -pX foo.jpg | exiv2 -iXX- bar.jpg
+ // exiv2 -pX foo.jpg > ~/temp/stdin ; exiv2 -iXX- bar.jpg
+ if ( stdinBuf.size_ == 0 ) {
+ const char* path = "/Users/rmills/temp/stdin";
+ FILE* f = fopen(path,"rb");
+ if ( f ) {
+ readFileToBuf(f,stdinBuf);
+ fclose(f);
+ std::cerr << "read stdin from " << path << std::endl;
+ }
+ }
+#endif
+#ifdef DEBUG
+ std::cerr << "getStdin stdinBuf.size_ = " << stdinBuf.size_ << std::endl;
+#endif
+ }
+
+ // copy stdinBuf to buf
+ if ( stdinBuf.size_ ) {
+ buf.alloc(stdinBuf.size_);
+ memcpy(buf.pData_,stdinBuf.pData_,buf.size_);
+ }
+#ifdef DEBUG
+ std::cerr << "getStdin stdinBuf.size_ = " << stdinBuf.size_ << std::endl;
+#endif
+
+} // Params::getStdin()
+
typedef std::map<std::string,std::string> long_t;
int Params::getopt(int argc, char* const Argv[])
@@ -1049,6 +1128,8 @@ namespace {
{
int rc = 0;
int target = 0;
+ int all = Params::ctExif | Params::ctIptc | Params::ctComment | Params::ctXmp;
+ int extra = Params::ctXmpSidecar|Params::ctExif|Params::ctIptc|Params::ctXmp;
for (size_t i = 0; rc == 0 && i < optarg.size(); ++i) {
switch (optarg[i]) {
case 'e': target |= Params::ctExif; break;
@@ -1059,21 +1140,12 @@ namespace {
case 'C': target |= Params::ctIccProfile; break;
case 'I': target |= Params::ctIptcRaw;break;
case '-': target |= Params::ctStdInOut;break;
- case 'a': target |= Params::ctExif
- | Params::ctIptc
- | Params::ctComment
- | Params::ctXmp; break;
- case 'X':
- Params::printTarget("X before",target);
- target |= Params::ctXmpSidecar|Params::ctExif | Params::ctIptc | Params::ctXmp ; // -eX
- Params::printTarget("X after1",target);
-
- if ( i ) { // -eXX
- target |= Params::ctXmpRaw ;
- Params::printTarget("X after2",target);
- target ^= Params::ctExif|Params::ctIptc|Params::ctXmp ; // turn off those bits
- }
- Params::printTarget("X ending",target,false);
+ case 'a': target |= all ; break;
+ case 'X': target |= extra ; // -eX
+ if ( i > 0 ) { // -eXX or -iXX
+ target |= Params::ctXmpRaw ;
+ target &= ~extra; // turn off those bits
+ }
break;
case 'p':
diff --git a/src/exiv2app.hpp b/src/exiv2app.hpp
index 657cce7..02a008b 100644
--- a/src/exiv2app.hpp
+++ b/src/exiv2app.hpp
@@ -353,53 +353,7 @@ public:
stdin can be used by multiple images in the exiv2 command line:
For example: $ cat foo.icc | exiv2 -iC- a.jpg b.jpg c.jpg will modify the ICC profile in several images.
*/
- void getStdin(Exiv2::DataBuf& buf)
- {
- // copy stdin to stdinBuf
- if ( stdinBuf.size_ == 0 ) {
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW__) || defined(_MSC_VER)
- DWORD fdwMode;
- _setmode(fileno(stdin), O_BINARY);
- if ( !GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &fdwMode) ) { // failed: stdin has bytes!
-#else
- // http://stackoverflow.com/questions/34479795/make-c-not-wait-for-user-input/34479916#34479916
- fd_set readfds;
- FD_ZERO (&readfds);
- FD_SET(STDIN_FILENO, &readfds);
- struct timeval timeout = { 0,0 };
-
- // if we have something in the pipe, read it
- if (select(1, &readfds, NULL, NULL, &timeout)) {
-#endif
- const int buff_size = 4*1028;
- Exiv2::byte* bytes = (Exiv2::byte*)::malloc(buff_size);
- int nBytes = 0 ;
- bool more = bytes != NULL;
- while ( more ) {
- char buff[buff_size];
- int n = (int) fread(buff,1,buff_size,stdin);
- more = n > 0 ;
- if ( more ) {
- bytes = (Exiv2::byte*) realloc(bytes,nBytes+n);
- memcpy(bytes+nBytes,buff,n);
- nBytes += n ;
- }
- }
-
- if ( nBytes ) {
- stdinBuf.alloc(nBytes);
- memcpy(stdinBuf.pData_,(const void*)bytes,nBytes);
- }
- if ( bytes != NULL ) ::free(bytes) ;
- }
- }
-
- // copy stdinBuf to buf
- if ( stdinBuf.size_ ) {
- buf.alloc(stdinBuf.size_);
- memcpy(buf.pData_,stdinBuf.pData_,buf.size_);
- }
- };
+ void getStdin(Exiv2::DataBuf& buf);
}; // class Params
diff --git a/src/image.cpp b/src/image.cpp
index 6a8bc52..68e3278 100644
--- a/src/image.cpp
+++ b/src/image.cpp
@@ -249,7 +249,10 @@ namespace Exiv2 {
void Image::setXmpPacket(const std::string& xmpPacket)
{
xmpPacket_ = xmpPacket;
- writeXmpFromPacket(true);
+ if ( XmpParser::decode(xmpData_, xmpPacket) ) {
+ throw Error(54);
+ }
+ xmpPacket_ = xmpPacket;
}
void Image::clearXmpData()
diff --git a/src/jpgimage.cpp b/src/jpgimage.cpp
index 4c1d0ad..7059aae 100644
--- a/src/jpgimage.cpp
+++ b/src/jpgimage.cpp
@@ -901,6 +901,7 @@ namespace Exiv2 {
int skipCom = -1;
Blob psBlob;
DataBuf rawExif;
+ xmpData().usePacket(writeXmpFromPacket());
// Write image header
if (writeHeader(outIo)) throw Error(21);
diff --git a/src/tiffimage.cpp b/src/tiffimage.cpp
index d442444..f0eb1f1 100644
--- a/src/tiffimage.cpp
+++ b/src/tiffimage.cpp
@@ -229,14 +229,17 @@ namespace Exiv2 {
Exiv2::ExifKey key("Exif.Image.InterColorProfile");
Exiv2::ExifData::iterator pos = exifData_.findKey(key);
bool found = pos != exifData_.end();
- if ( iccProfile_.size_ > 0 ) {
- Exiv2::DataValue value(iccProfile_.pData_,iccProfile_.size_);
- if ( found ) pos->setValue(&value);
- else exifData_.add(key,&value);
+ if ( iccProfileDefined() ) {
+ Exiv2::DataValue value(iccProfile_.pData_,iccProfile_.size_);
+ if ( found ) pos->setValue(&value);
+ else exifData_.add(key,&value);
} else {
if ( found ) exifData_.erase(pos);
}
+ // set usePacket to influence TiffEncoder::encodeXmp() called by TiffVisitor.encode()
+ xmpData().usePacket(writeXmpFromPacket());
+
TiffParser::encode(*io_, pData, size, bo, exifData_, iptcData_, xmpData_); // may throw
} // TiffImage::writeMetadata
diff --git a/src/tiffvisitor.cpp b/src/tiffvisitor.cpp
index 14c61d2..a771489 100644
--- a/src/tiffvisitor.cpp
+++ b/src/tiffvisitor.cpp
@@ -618,10 +618,14 @@ namespace Exiv2 {
exifData_.erase(pos);
}
std::string xmpPacket;
- if (XmpParser::encode(xmpPacket, xmpData_) > 1) {
+ if ( xmpData_.usePacket() ) {
+ xmpPacket = xmpData_.xmpPacket();
+ } else {
+ if (XmpParser::encode(xmpPacket, xmpData_) > 1) {
#ifndef SUPPRESS_WARNINGS
- EXV_ERROR << "Failed to encode XMP metadata.
";
+ EXV_ERROR << "Failed to encode XMP metadata.
";
#endif
+ }
}
if (!xmpPacket.empty()) {
// Set the XMP Exif tag to the new value
diff --git a/src/xmp.cpp b/src/xmp.cpp
index 1a3e637..d967d96 100644
--- a/src/xmp.cpp
+++ b/src/xmp.cpp
@@ -540,6 +540,7 @@ namespace Exiv2 {
const std::string& xmpPacket)
{ try {
xmpData.clear();
+ xmpData.setPacket(xmpPacket);
if (xmpPacket.empty()) return 0;
if (!initialize()) {
diff --git a/test/Makefile b/test/Makefile
index 1434a77..2dff2e4 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -75,6 +75,7 @@ TESTS = addmoddel.sh \
modify-test.sh \
path-test.sh \
preview-test.sh \
+ stdin-test.sh \
stringto-test.sh \
tiff-test.sh \
webp-test.sh \
diff --git a/test/data/stdin-test.out b/test/data/stdin-test.out
new file mode 100644
index 0000000..af0085e
--- /dev/null
+++ b/test/data/stdin-test.out
@@ -0,0 +1,107 @@
+STRUCTURE OF JPEG FILE: girl.jpg
+ address | marker | length | data
+ 0 | 0xffd8 SOI
+ 2 | 0xffe0 APP0 | 16 | JFIF............
+ 20 | 0xffdb DQT | 67
+ 89 | 0xffdb DQT | 67
+ 158 | 0xffc0 SOF0 | 17
+ 177 | 0xffc4 DHT | 28
+ 207 | 0xffc4 DHT | 74
+ 283 | 0xffc4 DHT | 28
+ 313 | 0xffc4 DHT | 57
+ 372 | 0xffe1 APP1 | 4613 | http://ns.adobe.com/xap/1.0/.<?x
+ 4987 | 0xffe1 APP1 | 4602 | http://ns.adobe.com/xap/1.0/.<?x
+ 9591 | 0xffda SOS
+STRUCTURE OF JPEG FILE: girl.jpg
+ address | marker | length | data
+ 0 | 0xffd8 SOI
+ 2 | 0xffe0 APP0 | 16 | JFIF............
+ 20 | 0xffdb DQT | 67
+ 89 | 0xffdb DQT | 67
+ 158 | 0xffc0 SOF0 | 17
+ 177 | 0xffc4 DHT | 28
+ 207 | 0xffc4 DHT | 74
+ 283 | 0xffc4 DHT | 28
+ 313 | 0xffc4 DHT | 57
+ 372 | 0xffe1 APP1 | 4602 | http://ns.adobe.com/xap/1.0/.<?x
+ 4976 | 0xffda SOS
+STRUCTURE OF JPEG FILE: girl.jpg
+ address | marker | length | data
+ 0 | 0xffd8 SOI
+ 2 | 0xffe0 APP0 | 16 | JFIF............
+ 20 | 0xffe1 APP1 | 4613 | http://ns.adobe.com/xap/1.0/.<?x
+ 4635 | 0xffdb DQT | 67
+ 4704 | 0xffdb DQT | 67
+ 4773 | 0xffc0 SOF0 | 17
+ 4792 | 0xffc4 DHT | 28
+ 4822 | 0xffc4 DHT | 74
+ 4898 | 0xffc4 DHT | 28
+ 4928 | 0xffc4 DHT | 57
+ 4987 | 0xffda SOS
+STRUCTURE OF JPEG FILE: girl.jpg
+ address | marker | length | data
+ 0 | 0xffd8 SOI
+ 2 | 0xffe0 APP0 | 16 | JFIF............
+ 20 | 0xffdb DQT | 67
+ 89 | 0xffdb DQT | 67
+ 158 | 0xffc0 SOF0 | 17
+ 177 | 0xffc4 DHT | 28
+ 207 | 0xffc4 DHT | 74
+ 283 | 0xffc4 DHT | 28
+ 313 | 0xffc4 DHT | 57
+ 372 | 0xffda SOS
+STRUCTURE OF JPEG FILE: girl.jpg
+ address | marker | length | data
+ 0 | 0xffd8 SOI
+ 2 | 0xffe0 APP0 | 16 | JFIF............
+ 20 | 0xffe1 APP1 | 4613 | http://ns.adobe.com/xap/1.0/.<?x
+ 4635 | 0xffdb DQT | 67
+ 4704 | 0xffdb DQT | 67
+ 4773 | 0xffc0 SOF0 | 17
+ 4792 | 0xffc4 DHT | 28
+ 4822 | 0xffc4 DHT | 74
+ 4898 | 0xffc4 DHT | 28
+ 4928 | 0xffc4 DHT | 57
+ 4987 | 0xffda SOS
+<?xml version="1.0"?>
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/" rdf:about="uuid:e61b1e9d-b8e4-6a17-a443-74b51849baaf">
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>Celebs: JEnna Marbles</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+<?xpacket end='w'?>
+<?xml version="1.0"?>
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/" rdf:about="uuid:e61b1e9d-b8e4-6a17-a443-74b51849baaf">
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>Celebs: JEnna Marbles</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+<?xpacket end='w'?>
+<?xml version="1.0"?>
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/" rdf:about="uuid:e61b1e9d-b8e4-6a17-a443-74b51849baaf">
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>Celebs: JEnna Marbles</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+<?xpacket end='w'?>
diff --git a/test/data/webp-test.out b/test/data/webp-test.out
index 28e3f6f..1ae9fc4 100644
--- a/test/data/webp-test.out
+++ b/test/data/webp-test.out
@@ -296,12 +296,12 @@ STRUCTURE OF WEBP FILE: exiv2-bug1199.webp
XMP | 2864 | 184662 | <?xpacket begin="..." id="W5M0Mp
STRUCTURE OF WEBP FILE: exiv2-bug1199.webp
Chunk | Length | Offset | Payload
- RIFF | 189580 | 0 | WEBP
+ RIFF | 189324 | 0 | WEBP
VP8X | 10 | 12 | ,........
ICCP | 560 | 30 | ...0ADBE....mntrRGB XYZ ........
VP8 | 172008 | 598 | .G...*.. .>1..B.!..o.. ......]..
EXIF | 12040 | 172614 | II*........................... .
- XMP | 4917 | 184662 | <?xpacket begin="..." id="W5M0Mp
+ XMP | 4661 | 184662 | <?xpacket begin="..." id="W5M0Mp
STRUCTURE OF WEBP FILE: exiv2-bug1199.webp
Chunk | Length | Offset | Payload
RIFF | 187526 | 0 | WEBP
@@ -320,12 +320,12 @@ STRUCTURE OF WEBP FILE: exiv2-bug1199.webp
XMP | 3407 | 184662 | <?xpacket begin="..." id="W5M0Mp
STRUCTURE OF WEBP FILE: exiv2-bug1199.webp
Chunk | Length | Offset | Payload
- RIFF | 1862068 | 0 | WEBP
+ RIFF | 1864146 | 0 | WEBP
VP8X | 10 | 12 | ,........
ICCP | 560 | 30 | ...0ADBE....mntrRGB XYZ ........
VP8 | 172008 | 598 | .G...*.. .>1..B.!..o.. ......]..
EXIF | 12040 | 172614 | II*........................... .
- XMP | 1677405 | 184662 | <x:xmpmeta xmlns:x="adobe:ns:met
+ XMP | 1679484 | 184662 | <?xpacket begin="..." id="W5M0Mp
STRUCTURE OF WEBP FILE: exiv2-bug1199.webp
Chunk | Length | Offset | Payload
RIFF | 187526 | 0 | WEBP
diff --git a/test/stdin-test.sh b/test/stdin-test.sh
new file mode 100755
index 0000000..05d77e2
--- /dev/null
+++ b/test/stdin-test.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+# Test driver for stdin
+
+source ./functions.source
+
+( cd "$testdir"
+
+ printf "stdin XMP " >&3
+ copyTestFile exiv2-bug1229.jpg # jpg with 2 APP1/xap segments
+
+ copyTestFile exiv2-bug1229.jpg girl.jpg
+ runTest exiv2 -pS girl.jpg
+ runTest exiv2 -dX girl.jpg # remove first
+ runTest exiv2 -pS girl.jpg
+ runTest exiv2 -pX exiv2-bug1229.jpg | runTest exiv2 -iXX- girl.jpg
+ runTest exiv2 -pS girl.jpg
+
+ copyTestFile exiv2-bug1229.jpg girl.jpg
+ runTest exiv2 -dX girl.jpg
+ runTest exiv2 -dX girl.jpg
+ runTest exiv2 -pS girl.jpg
+ runTest exiv2 -pX exiv2-bug1229.jpg | runTest exiv2 -iXX- girl.jpg
+ runTest exiv2 -pS girl.jpg
+
+ for f in Reagan.tiff Reagan.tiff ReaganSmallPng.png; do
+ copyTestFile $f
+ runTest exiv2 -pX exiv2-bug1229.jpg | runTest exiv2 -iXX- $f
+ exiv2 -pX $f | xmllint --format -
+ done
+
+) 3>&1 > $results 2>&1
+
+printf "
"
+
+# ----------------------------------------------------------------------
+# Evaluate results
+cat $results | tr -d $'
' > $results-stripped
+mv $results-stripped $results
+reportTest $results $good
+
+# That's all Folks!
+##
--
exiv2 packaging
More information about the pkg-kde-commits
mailing list