annotate src/exiv2.cc @ 185:354da67a7ca2

read also iptc and xmp
author nadvornik
date Fri, 15 Feb 2008 10:48:09 +0000
parents 2507418ab7a2
children bd3fc1aa7fe9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
1
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
2 #ifdef HAVE_CONFIG_H
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
3 # include "config.h"
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
4 #endif
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
5
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
6 #ifdef HAVE_EXIV2
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
7
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
8 #include <exiv2/image.hpp>
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
9 #include <exiv2/exif.hpp>
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
10 #include <iostream>
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
11
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
12 extern "C" {
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
13
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
14 #include <glib.h>
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
15 #include "exif.h"
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
16
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
17 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
18
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
19 struct _ExifData
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
20 {
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
21 Exiv2::ExifData exifData;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
22 Exiv2::ExifData::const_iterator exifIter; /* for exif_get_next_item */
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
23 Exiv2::IptcData iptcData;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
24 Exiv2::IptcData::const_iterator iptcIter; /* for exif_get_next_item */
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
25 Exiv2::XmpData xmpData;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
26 Exiv2::XmpData::const_iterator xmpIter; /* for exif_get_next_item */
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
27
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
28 _ExifData(gchar *path, gint parse_color_profile)
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
29 {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
30 Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(path);
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
31 g_assert (image.get() != 0);
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
32 image->readMetadata();
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
33 exifData = image->exifData();
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
34 iptcData = image->iptcData();
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
35 xmpData = image->xmpData();
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
36 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
37
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
38 };
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
39
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
40 extern "C" {
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
41
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
42 ExifData *exif_read(gchar *path, gint parse_color_profile)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
43 {
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents: 180
diff changeset
44 printf("exif %s\n", path);
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
45 try {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
46 return new ExifData(path, parse_color_profile);
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
47 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
48 catch (Exiv2::AnyError& e) {
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
49 std::cout << "Caught Exiv2 exception '" << e << "'\n";
179
37004d5a584a and first version that actually shows some exif data (see advanced view)
nadvornik
parents: 178
diff changeset
50 return 0;
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
51 }
179
37004d5a584a and first version that actually shows some exif data (see advanced view)
nadvornik
parents: 178
diff changeset
52
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
53 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
54
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
55 void exif_free(ExifData *exif)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
56 {
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents: 180
diff changeset
57
8a417f10ba09 more exiv2 fixes
nadvornik
parents: 180
diff changeset
58 delete exif;
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
59 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
60
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
61 ExifItem *exif_get_item(ExifData *exif, const gchar *key)
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
62 {
183
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
63 try {
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
64 Exiv2::Metadatum *item;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
65 try {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
66 Exiv2::ExifKey ekey(key);
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
67 Exiv2::ExifData::iterator pos = exif->exifData.findKey(ekey);
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
68 if (pos == exif->exifData.end()) return NULL;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
69 item = &*pos;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
70 }
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
71 catch (Exiv2::AnyError& e) {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
72 try {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
73 Exiv2::IptcKey ekey(key);
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
74 Exiv2::IptcData::iterator pos = exif->iptcData.findKey(ekey);
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
75 if (pos == exif->iptcData.end()) return NULL;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
76 item = &*pos;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
77 }
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
78 catch (Exiv2::AnyError& e) {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
79 Exiv2::XmpKey ekey(key);
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
80 Exiv2::XmpData::iterator pos = exif->xmpData.findKey(ekey);
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
81 if (pos == exif->xmpData.end()) return NULL;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
82 item = &*pos;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
83 }
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
84 }
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
85 return (ExifItem *)item;
183
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
86 }
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
87 catch (Exiv2::AnyError& e) {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
88 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
89 return NULL;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
90 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
91 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
92
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
93
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
94 ExifItem *exif_get_first_item(ExifData *exif)
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
95 {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
96 try {
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
97 exif->exifIter = exif->exifData.begin();
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
98 exif->iptcIter = exif->iptcData.begin();
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
99 exif->xmpIter = exif->xmpData.begin();
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
100 if (exif->exifIter != exif->exifData.end())
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
101 {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
102 const Exiv2::Metadatum *item = &*exif->exifIter;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
103 exif->exifIter++;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
104 return (ExifItem *)item;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
105 }
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
106 if (exif->iptcIter != exif->iptcData.end())
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
107 {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
108 const Exiv2::Metadatum *item = &*exif->iptcIter;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
109 exif->iptcIter++;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
110 return (ExifItem *)item;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
111 }
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
112 if (exif->xmpIter != exif->xmpData.end())
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
113 {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
114 const Exiv2::Metadatum *item = &*exif->xmpIter;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
115 exif->xmpIter++;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
116 return (ExifItem *)item;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
117 }
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
118 return NULL;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
119
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
120 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
121 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
122 std::cout << "Caught Exiv2 exception '" << e << "'\n";
183
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
123 return NULL;
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
124 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
125 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
126
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
127 ExifItem *exif_get_next_item(ExifData *exif)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
128 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
129 try {
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
130 if (exif->exifIter != exif->exifData.end())
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
131 {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
132 const Exiv2::Metadatum *item = &*exif->exifIter;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
133 exif->exifIter++;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
134 return (ExifItem *)item;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
135 }
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
136 if (exif->iptcIter != exif->iptcData.end())
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
137 {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
138 const Exiv2::Metadatum *item = &*exif->iptcIter;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
139 exif->iptcIter++;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
140 return (ExifItem *)item;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
141 }
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
142 if (exif->xmpIter != exif->xmpData.end())
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
143 {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
144 const Exiv2::Metadatum *item = &*exif->xmpIter;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
145 exif->xmpIter++;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
146 return (ExifItem *)item;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
147 }
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
148 return NULL;
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
149 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
150 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
151 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
152 return NULL;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
153 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
154 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
155
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
156 char *exif_item_get_tag_name(ExifItem *item)
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
157 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
158 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
159 if (!item) return NULL;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
160 return g_strdup(((Exiv2::Metadatum *)item)->key().c_str());
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
161 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
162 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
163 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
164 return NULL;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
165 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
166 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
167
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
168 guint exif_item_get_tag_id(ExifItem *item)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
169 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
170 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
171 if (!item) return 0;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
172 return ((Exiv2::Metadatum *)item)->tag();
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
173 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
174 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
175 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
176 return 0;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
177 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
178 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
179
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
180 guint exif_item_get_elements(ExifItem *item)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
181 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
182 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
183 if (!item) return 0;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
184 return ((Exiv2::Metadatum *)item)->count();
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
185 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
186 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
187 std::cout << "Caught Exiv2 exception '" << e << "'\n";
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
188 return 0;
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
189 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
190 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
191
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
192 char *exif_item_get_data(ExifItem *item, guint *data_len)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
193 {
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
194 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
195
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents: 180
diff changeset
196 char *exif_item_get_description(ExifItem *item)
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
197 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
198 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
199 if (!item) return NULL;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
200 return g_strdup(((Exiv2::Metadatum *)item)->tagLabel().c_str());
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
201 }
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
202 catch (std::exception& e) {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
203 // std::cout << "Caught Exiv2 exception '" << e << "'\n";
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
204 return NULL;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
205 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
206 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
207
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
208 /*
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
209 invalidTypeId, unsignedByte, asciiString, unsignedShort,
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
210 unsignedLong, unsignedRational, signedByte, undefined,
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
211 signedShort, signedLong, signedRational, string,
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
212 date, time, comment, directory,
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
213 xmpText, xmpAlt, xmpBag, xmpSeq,
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
214 langAlt, lastTypeId
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
215 */
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
216
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
217 static guint format_id_trans_tbl [] = {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
218 EXIF_FORMAT_UNKNOWN,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
219 EXIF_FORMAT_BYTE_UNSIGNED,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
220 EXIF_FORMAT_STRING,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
221 EXIF_FORMAT_SHORT_UNSIGNED,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
222 EXIF_FORMAT_LONG_UNSIGNED,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
223 EXIF_FORMAT_RATIONAL_UNSIGNED,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
224 EXIF_FORMAT_BYTE,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
225 EXIF_FORMAT_UNDEFINED,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
226 EXIF_FORMAT_SHORT,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
227 EXIF_FORMAT_LONG,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
228 EXIF_FORMAT_RATIONAL,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
229 EXIF_FORMAT_STRING,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
230 EXIF_FORMAT_STRING,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
231 EXIF_FORMAT_STRING,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
232 EXIF_FORMAT_UNDEFINED,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
233 EXIF_FORMAT_STRING,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
234 EXIF_FORMAT_STRING,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
235 EXIF_FORMAT_STRING,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
236 EXIF_FORMAT_STRING
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
237 };
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
238
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
239
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
240
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
241 guint exif_item_get_format_id(ExifItem *item)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
242 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
243 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
244 if (!item) return EXIF_FORMAT_UNKNOWN;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
245 guint id = ((Exiv2::Metadatum *)item)->typeId();
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
246 if (id >= (sizeof(format_id_trans_tbl) / sizeof(format_id_trans_tbl[0])) ) return EXIF_FORMAT_UNKNOWN;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
247 return format_id_trans_tbl[id];
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
248 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
249 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
250 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
251 return EXIF_FORMAT_UNKNOWN;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
252 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
253 }
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
254
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
255 const char *exif_item_get_format_name(ExifItem *item, gint brief)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
256 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
257 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
258 if (!item) return NULL;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
259 return ((Exiv2::Metadatum *)item)->typeName();
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
260 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
261 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
262 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
263 return NULL;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
264 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
265 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
266
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
267
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
268 gchar *exif_item_get_data_as_text(ExifItem *item)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
269 {
183
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
270 try {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
271 if (!item) return NULL;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
272 // std::stringstream str; // does not work with Exiv2::Metadatum because operator<< is not virtual
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
273 // str << *((Exiv2::Metadatum *)item);
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
274 // return g_strdup(str.str().c_str());
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
275 return g_strdup(((Exiv2::Metadatum *)item)->toString().c_str());
183
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
276 }
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
277 catch (Exiv2::AnyError& e) {
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
278 return NULL;
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
279 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
280 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
281
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
282
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
283 gint exif_item_get_integer(ExifItem *item, gint *value)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
284 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
285 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
286 if (!item) return 0;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
287 return ((Exiv2::Metadatum *)item)->toLong();
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
288 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
289 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
290 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
291 return 0;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
292 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
293 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
294
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
295 ExifRational *exif_item_get_rational(ExifItem *item, gint *sign)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
296 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
297 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
298 if (!item) return NULL;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
299 Exiv2::Rational v = ((Exiv2::Metadatum *)item)->toRational();
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
300 static ExifRational ret;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
301 ret.num = v.first;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
302 ret.den = v.second;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
303 return &ret;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
304 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
305 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
306 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
307 return NULL;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
308 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
309 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
310
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents: 180
diff changeset
311 const gchar *exif_get_tag_description_by_key(const gchar *key)
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
312 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
313 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
314 Exiv2::ExifKey ekey(key);
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
315 return Exiv2::ExifTags::tagLabel(ekey.tag(), ekey.ifdId ());
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
316 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
317 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
318 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
319 return NULL;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
320 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
321 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
322
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
323 gint format_raw_img_exif_offsets_fd(int fd, const gchar *path,
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
324 unsigned char *header_data, const guint header_len,
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
325 guint *image_offset, guint *exif_offset)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
326 {
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
327 return 0;
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
328 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
329
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
330 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
331
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
332 #endif
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
333 /* HAVE_EXIV2 */