exiv2 does not register certain namespaces present in an image
Wormnest opened this issue · 1 comments
Describe the bug
Certain xmp namespaces that we know are present in an image, do not get registered. When trying to retrieve the namespace it throws "No namespace info available for XMP prefix `Item'".
This is known to happen with:
- prefix
Item
- namespacehttp://ns.google.com/photos/1.0/container/item/
(see GIMP issue https://gitlab.gnome.org/GNOME/gimp/-/issues/10557. - prefix
apple-fi
To Reproduce
Steps to reproduce the behavior:
-
Use the image from the above linked GIMP issue: https://shallowsky.com/tmp/PXL_20231220_182442817.jpg Note only the direct link works since Gitlab removes most metadata.
-
Build and run the supplied sample program on the above image. (attaching a zip doesn't seem to work, so replaced cpp with txt)
test-namespace.txt -
Tested on Windows 10 Home, 64-bit using:
MINGW64:
$ ./namespace-test.sh
+++ Testing exiv2 namespace info (exiv2 version 0.27.7)
Container namespace: 'http://ns.google.com/photos/1.0/container/'.
Exiv2 exception: 'No namespace info available for XMP prefix `Item''
UCRT64:
$ ./namespace-test.sh
Testing exiv2 namespace info (exiv2 version 0.28.2)
Container namespace: 'http://ns.google.com/photos/1.0/container/'.
Exiv2 exception: 'No namespace info available for XMP prefix `Item''
Expected behavior
I expect it to return the namespace for the Item
prefix just like it does for Container
.
Desktop (please complete the following information):
- OS and version: Windows 10 Home, 64-bit
- Exiv2 version and source: MINGW64 0.27.7, UCRT64 0.28.2
- Compiler and version: default as chosen by the MSYS2 project
- Compilation mode and/or compiler flags: as above
Additional context
Same on Linux using 0.28.2:
$ ./a.out PXL_20231220_182442817.jpg
Testing exiv2 namespace info (exiv2 version 0.28.2)
Container namespace: 'http://ns.google.com/photos/1.0/container/'.
Exiv2 exception: 'No namespace info available for XMP prefix `Item'
Still trying to understand the issue though.
It do seam to dump the namespace/container info properly (?):
$ exiv2 -PX ./PXL_20231220_182442817.jpg
Xmp.hdrgm.Version XmpText 3 1.0
Xmp.xmpNote.HasExtendedXMP XmpText 32 9AABF2DA602006640FE14B0C857436F3
Xmp.Container.Directory XmpText 0 type="Seq"
Xmp.Container.Directory[1] XmpText 0 type="Struct"
Xmp.Container.Directory[1]/Container:Item XmpText 0 type="Struct"
Xmp.Container.Directory[1]/Container:Item/Item:Mime XmpText 10 image/jpeg
Xmp.Container.Directory[1]/Container:Item/Item:Semantic XmpText 7 Primary
Xmp.Container.Directory[2] XmpText 0 type="Struct"
Xmp.Container.Directory[2]/Container:Item XmpText 0 type="Struct"
Xmp.Container.Directory[2]/Container:Item/Item:Mime XmpText 10 image/jpeg
Xmp.Container.Directory[2]/Container:Item/Item:Semantic XmpText 7 GainMap
Xmp.Container.Directory[2]/Container:Item/Item:Length XmpText 6 207318
Result of image->xmpPacket()
do seam to contain stuff as well:
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 4.4.0-Exiv2">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="" xmlns:hdrgm="http://ns.adobe.com/hdr-gain-map/1.0/" xmlns:xmpNote="http://ns.adobe.com/xmp/note/" xmlns:Container="http://ns.google.com/photos/1.0/container/" xmlns:Item="http://ns.google.com/photos/1.0/container/item/" hdrgm:Version="1.0" xmpNote:HasExtendedXMP="9AABF2DA602006640FE14B0C857436F3">
<Container:Directory>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
<Container:Item Item:Mime="image/jpeg" Item:Semantic="Primary"/>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<Container:Item Item:Mime="image/jpeg" Item:Semantic="GainMap" Item:Length="207318"/>
</rdf:li>
</rdf:Seq>
</Container:Directory>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
Also, the list of registered namespaces
only contains "Container namespace" (and bunch of other, unrelated ones):
Exiv2::Dictionary ns_dict;
Exiv2::XmpProperties::registeredNamespaces(ns_dict);
for (auto const& entry : ns_dict)
{
std::cout << entry.first << ": " << entry.second << std::endl;
}
...
...
xmpRights: http://ns.adobe.com/xap/1.0/rights/
xmpT: http://ns.adobe.com/xap/1.0/t/
xmpTPg: http://ns.adobe.com/xap/1.0/t/pg/
xmpidq: http://ns.adobe.com/xmp/Identifier/qual/1.0/
Container namespace: 'http://ns.google.com/photos/1.0/container/'.
It would seem, that http://ns.adobe.com/hdr-gain-map/1.0/"
is also missing o_0
But despite everything, accessing by explicit key works:
$ exiv2 -K "Xmp.Container.Directory[1]/Container:Item" ./PXL_20231220_182442817.jpg
Xmp.Container.Directory[1]/Container:Item XmpText 0 type="Struct"
o_0