EXIF library (libexif) Internals 0.6.26
mnote-olympus-entry.c
Go to the documentation of this file.
1/* mnote-olympus-entry.c
2 *
3 * Copyright (c) 2002-2009 Lutz Mueller <lutz@users.sourceforge.net> et. al.
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301 USA.
19 *
20 * SPDX-License-Identifier: LGPL-2.0-or-later
21 */
22
23#include <config.h>
24#include "mnote-olympus-entry.h"
25
26#include <stdio.h>
27#include <stdlib.h>
28#include <string.h>
29
30#include <libexif/exif-format.h>
31#include <libexif/exif-utils.h>
32#include <libexif/exif-entry.h>
33#include <libexif/i18n.h>
34
35#define CF(format,target,v,maxlen) \
36{ \
37 if (format != target) { \
38 snprintf (v, maxlen, \
39 _("Invalid format '%s', " \
40 "expected '%s'."), \
41 exif_format_get_name (format), \
42 exif_format_get_name (target)); \
43 break; \
44 } \
45}
46
47#define CF2(format,target1,target2,v,maxlen) \
48{ \
49 if ((format != target1) && (format != target2)) { \
50 snprintf (v, maxlen, \
51 _("Invalid format '%s', " \
52 "expected '%s' or '%s'."), \
53 exif_format_get_name (format), \
54 exif_format_get_name (target1), \
55 exif_format_get_name (target2)); \
56 break; \
57 } \
58}
59
60#define CC(number,target,v,maxlen) \
61{ \
62 if (number != target) { \
63 snprintf (v, maxlen, \
64 _("Invalid number of components (%i, " \
65 "expected %i)."), (int) number, (int) target); \
66 break; \
67 } \
68}
69
70#define CC2(number,t1,t2,v,maxlen) \
71{ \
72 if ((number < t1) || (number > t2)) { \
73 snprintf (v, maxlen, \
74 _("Invalid number of components (%i, " \
75 "expected %i or %i)."), (int) number, \
76 (int) t1, (int) t2); \
77 break; \
78 } \
79}
80
81#define R2L(n) ((n).denominator ? (unsigned long)(n).numerator/(n).denominator : 0L)
82#define R2D(n) ((n).denominator ? (double)(n).numerator/(n).denominator : 0.0)
83
84static const struct {
87 struct {
88 int index;
89 const char *string;
90 } elem[24];
91} items[] = {
92#ifndef NO_VERBOSE_TAG_DATA
94 { {0, N_("AF non D lens")},
95 {1, N_("Manual")},
96 {2, N_("AF-D or AF-S lens")},
97 {6, N_("AF-D G lens")},
98 {10, N_("AF-D VR lens")},
99 {14, N_("AF-D G VR lens")},
100 {0, NULL}}},
102 { {0, N_("Flash did not fire")},
103 {4, N_("Flash unit unknown")},
104 {7, N_("Flash is external")},
105 {9, N_("Flash is on camera")},
106 {0, NULL}}},
108 { {1, N_("VGA basic")},
109 {2, N_("VGA normal")},
110 {3, N_("VGA fine")},
111 {4, N_("SXGA basic")},
112 {5, N_("SXGA normal")},
113 {6, N_("SXGA fine")},
114 {10, N_("2 Mpixel basic")},
115 {11, N_("2 Mpixel normal")},
116 {12, N_("2 Mpixel fine")},
117 {0, NULL}}},
119 { {1, N_("Color")},
120 {2, N_("Monochrome")},
121 {0, NULL}}},
123 { {0, N_("Normal")},
124 {1, N_("Bright+")},
125 {2, N_("Bright-")},
126 {3, N_("Contrast+")},
127 {4, N_("Contrast-")},
128 {0, NULL}}},
130 { {0, N_("ISO 80")},
131 {2, N_("ISO 160")},
132 {4, N_("ISO 320")},
133 {5, N_("ISO 100")},
134 {0, NULL}}},
136 { {0, N_("Auto")},
137 {1, N_("Preset")},
138 {2, N_("Daylight")},
139 {3, N_("Incandescence")},
140 {4, N_("Fluorescence")},
141 {5, N_("Cloudy")},
142 {6, N_("SpeedLight")},
143 {0, NULL}}},
145 { {0, N_("No fisheye")},
146 {1, N_("Fisheye on")},
147 {0, NULL}}},
149 { {1, N_("Normal, SQ")},
150 {2, N_("Normal, HQ")},
151 {3, N_("Normal, SHQ")},
152 {4, N_("Normal, RAW")},
153 {5, N_("Normal, SQ1")},
154 {6, N_("Normal, SQ2")},
155 {7, N_("Normal, super high")},
156 {17, N_("Normal, standard")},
157 {0x101, N_("Fine, SQ")},
158 {0x102, N_("Fine, HQ")},
159 {0x103, N_("Fine, SHQ")},
160 {0x104, N_("Fine, RAW")},
161 {0x105, N_("Fine, SQ1")},
162 {0x106, N_("Fine, SQ2")},
163 {0x107, N_("Fine, super high")},
164 {0x201, N_("Super fine, SQ")},
165 {0x202, N_("Super fine, HQ")},
166 {0x203, N_("Super fine, SHQ")},
167 {0x204, N_("Super fine, RAW")},
168 {0x205, N_("Super fine, SQ1")},
169 {0x206, N_("Super fine, SQ2")},
170 {0x207, N_("Super fine, super high")},
171 {0x211, N_("Super fine, high")},
172 {0, NULL}}},
174 { {0, N_("No")},
175 {1, N_("Yes")},
176 {2, N_("Super macro")},
177 {0, NULL}}},
179 { {0, N_("No")},
180 {1, N_("Yes")},
181 {0, NULL}}},
183 { {0, N_("Off")},
184 {1, N_("On")},
185 {2, N_("On (Preset)")},
186 {0, NULL}}},
188 { {0, N_("Auto")},
189 {1, N_("Red-eye reduction")},
190 {2, N_("Fill")},
191 {3, N_("Off")},
192 {0, NULL}}},
194 { {0, N_("None")},
195 {1, N_("Internal")},
196 {4, N_("External")},
197 {5, N_("Internal + external")},
198 {0, NULL}}},
200 { {0, N_("Normal")},
201 {1, N_("Macro")},
202 {0, NULL}}},
204 { {0, N_("Auto")},
205 {1, N_("Manual")},
206 {0, NULL}}},
208 { {0, N_("Normal")},
209 {1, N_("Hard")},
210 {2, N_("Soft")},
211 {0, NULL}}},
213 { {0, N_("No")},
214 {1, N_("Yes")},
215 {0, NULL}}},
217 { {0, N_("Hard")},
218 {1, N_("Normal")},
219 {2, N_("Soft")},
220 {0, NULL}}},
222 { {0, N_("No")},
223 {1, N_("Yes")},
224 {0, NULL}}},
226 { {0, N_("Interlaced")},
227 {1, N_("Progressive")},
228 {0, NULL}}},
229
231 { {0, N_("None")},
232 {1, N_("Standard")},
233 {2, N_("Best")},
234 {3, N_("Adjust exposure")},
235 {0, NULL}}},
237 { {1, N_("Spot focus")},
238 {2, N_("Normal focus")},
239 {0, NULL}}},
241 { {0, N_("Record while down")},
242 {1, N_("Press start, press stop")},
243 {0, NULL}}},
245 { {0, N_("No")},
246 {1, N_("Yes")},
247 {0, NULL}}},
249 { {0, N_("Auto")},
250 {1, N_("ISO 50")},
251 {3, N_("ISO 100")},
252 {4, N_("ISO 200")},
253 {5, N_("ISO 400")},
254 {0, NULL}}},
256 { {0, N_("Off")},
257 {1, N_("Sport")},
258 {2, N_("TV")},
259 {3, N_("Night")},
260 {4, N_("User 1")},
261 {5, N_("User 2")},
262 {6, N_("Lamp")},
263 {0, NULL}}},
265 { {0, N_("5 frames/sec")},
266 {1, N_("10 frames/sec")},
267 {2, N_("15 frames/sec")},
268 {3, N_("20 frames/sec")},
269 {0, NULL}}},
270#endif
271 { 0, 0, { { 0, NULL } } }
273
274char *
275mnote_olympus_entry_get_value (MnoteOlympusEntry *entry, char *v, unsigned int maxlen)
276{
277 char buf[30];
278 ExifLong vl;
279 ExifSLong vsl;
280 ExifShort vs = 0;
281 ExifSShort vss = 0;
282 ExifRational vr, vr2;
283 ExifSRational vsr;
284 int i, j;
285 double r, b;
286
287 if (!entry)
288 return (NULL);
289 if (maxlen < 1)
290 return NULL;
291
292 memset (v, 0, maxlen);
293 maxlen--;
294
295 if ((!entry->data) && (entry->components > 0))
296 return (v);
297
298 if ((!entry->data) && (entry->size > 0))
299 return NULL; /* internal inconsistency error */
300
301 switch (entry->tag) {
302
303 /* Nikon */
305 CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen)
306 CC (entry->components, 4, v, maxlen)
308 if ((vl & 0xF0F0F0F0) == 0x30303030) {
309 memcpy (v, entry->data, MIN (maxlen, 4));
310 } else {
311 snprintf (v, maxlen, "%04lx", (long unsigned int) vl);
312 }
313 break;
315 CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
316 CC (entry->components, 2, v, maxlen)
317 /*vs = exif_get_short (entry->data, entry->order);*/
318 vs = exif_get_short (entry->data + 2, entry->order);
319 snprintf (v, maxlen, "ISO %hd", vs);
320 break;
322 CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
323 CC (entry->components, 2, v, maxlen)
324 /*vs = exif_get_short (entry->data, entry->order);*/
325 vs = exif_get_short (entry->data + 2, entry->order);
326 snprintf (v, maxlen, "ISO2 %hd", vs);
327 break;
341 CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen)
342 memcpy(v, entry->data, MIN (maxlen, entry->size));
343 break;
347 CF (entry->format, EXIF_FORMAT_LONG, v, maxlen)
348 CC (entry->components, 1, v, maxlen)
349 vl = exif_get_long (entry->data, entry->order);
350 snprintf (v, maxlen, "%lu", (long unsigned int) vl );
351 break;
354 unsigned char h,m,l;
355 CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen)
356 CC (entry->components, 4, v, maxlen)
357 vl = exif_get_long (entry->data, entry->order);
358 h = (vl>>24)&0xff; m = (vl>>16)&0xff; l = (vl>>8)&0xff;
359 snprintf (v, maxlen, "%.1f", l?(double)h*((double)m/(double)l):0 );
360 break;
361 }
364 CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen)
365 CC (entry->components, 4, v, maxlen)
366 vl = exif_get_long (entry->data, entry->order);
367 snprintf (v, maxlen, "%.1f", ((long unsigned int) vl>>24)/6.0 );
368 break;
374 CF (entry->format, EXIF_FORMAT_SSHORT, v, maxlen)
375 CC (entry->components, 1, v, maxlen)
376 vs = exif_get_short (entry->data, entry->order);
377 snprintf (v, maxlen, "%hd", vs);
378 break;
380 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen)
381 CC (entry->components, 4, v, maxlen)
382 vr = exif_get_rational (entry->data, entry->order);
383 r = R2D(vr);
384 vr = exif_get_rational (entry->data+8, entry->order);
385 b = R2D(vr);
386 snprintf (v, maxlen, _("Red Correction %f, blue Correction %f"), r,b);
387 break;
389 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen)
390 CC (entry->components, 1, v, maxlen)
391 vr = exif_get_rational (entry->data, entry->order);
392 if (!vr.numerator || !vr.denominator) {
393 strncpy (v, _("No manual focus selection"), maxlen);
394 } else {
395 r = R2D(vr);
396 snprintf (v, maxlen, _("%2.2f meters"), r);
397 }
398 break;
400 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen)
401 CC (entry->components, 2, v, maxlen)
402 vr = exif_get_rational (entry->data, entry->order);
403 vr2 = exif_get_rational (entry->data+8, entry->order);
404 r = R2D(vr);
405 b = R2D(vr2);
406 snprintf (v, maxlen, "%2.2f x %2.2f um", r, b);
407 break;
409 CF2 (entry->format, EXIF_FORMAT_BYTE, EXIF_FORMAT_SHORT, v, maxlen)
410 CC (entry->components, 1, v, maxlen)
411 if (EXIF_FORMAT_SHORT == entry->format) {
412 vs = exif_get_short (entry->data, entry->order);
413 } else {
414 vs = entry->data[0];
415 }
416 snprintf (v, maxlen, "%hd", vs);
417 break;
419 CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen)
420 CC (entry->components, 4, v, maxlen)
421 switch ( *( entry->data+1) ) {
422 case 0: strncpy (v, _("AF position: center"), maxlen); break;
423 case 1: strncpy (v, _("AF position: top"), maxlen); break;
424 case 2: strncpy (v, _("AF position: bottom"), maxlen); break;
425 case 3: strncpy (v, _("AF position: left"), maxlen); break;
426 case 4: strncpy (v, _("AF position: right"), maxlen); break;
427 case 5: strncpy (v, _("AF position: upper-left"), maxlen); break;
428 case 6: strncpy (v, _("AF position: upper-right"), maxlen); break;
429 case 7: strncpy (v, _("AF position: lower-left"), maxlen); break;
430 case 8: strncpy (v, _("AF position: lower-right"), maxlen); break;
431 case 9: strncpy (v, _("AF position: far left"), maxlen); break;
432 case 10: strncpy (v, _("AF position: far right"), maxlen); break;
433 default: strncpy (v, _("Unknown AF position"), maxlen);
434 }
435 break;
437 CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
438 CC (entry->components, 2, v, maxlen)
439 vs = exif_get_short(entry->data, entry->order);
440 /* search for the tag */
441 for (i = 0; (items[i].tag && items[i].tag != entry->tag); i++)
442 ;
443 if (!items[i].tag) {
444 snprintf (v, maxlen, _("Internal error (unknown value %hi)"), vs);
445 break;
446 }
447 CF (entry->format, items[i].fmt, v, maxlen)
448 /* find the value */
449 for (j = 0; items[i].elem[j].string &&
450 (items[i].elem[j].index < vs); j++);
451 if (items[i].elem[j].index != vs) {
452 snprintf (v, maxlen, _("Unknown value %hi"), vs);
453 break;
454 }
455 strncpy (v, _(items[i].elem[j].string), maxlen);
456 break;
458 if (entry->format == EXIF_FORMAT_RATIONAL) {
459 CC (entry->components, 1, v, maxlen)
460 vr = exif_get_rational (entry->data, entry->order);
461 if (!vr.numerator || !vr.denominator) {
462 strncpy (v, _("None"), maxlen);
463 } else {
464 r = R2D(vr);
465 snprintf (v, maxlen, "%2.2f", r);
466 }
467 break;
468 }
469 /* to handle SHORT version of this tag, */
470 /* fall through */
498 CC (entry->components, 1, v, maxlen)
499 switch (entry->format) {
500 case EXIF_FORMAT_BYTE:
502 vs = entry->data[0];
503 break;
505 vs = exif_get_short(entry->data, entry->order);
506 break;
507 default:
508 vs = 0;
509 break;
510 }
511 /* search for the tag */
512 for (i = 0; (items[i].tag && items[i].tag != entry->tag); i++)
513 ;
514 if (!items[i].tag) {
515 snprintf (v, maxlen, _("Internal error (unknown value %hi)"), vs);
516 break;
517 }
518 CF (entry->format, items[i].fmt, v, maxlen)
519 /* find the value */
520 for (j = 0; items[i].elem[j].string &&
521 (items[i].elem[j].index < vs); j++);
522 if (items[i].elem[j].index != vs) {
523 snprintf (v, maxlen, _("Unknown value %hi"), vs);
524 break;
525 }
526 strncpy (v, _(items[i].elem[j].string), maxlen);
527 break;
537 CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
538 CC (entry->components, 1, v, maxlen)
539 vs = exif_get_short (entry->data, entry->order);
540 switch (vs) {
541 case 0:
542 strncpy (v, _("Off"), maxlen);
543 break;
544 case 1:
545 strncpy (v, _("On"), maxlen);
546 break;
547 default:
548 sprintf (buf, _("Unknown %hu"), vs);
549 strncat (v, buf, maxlen - strlen (v));
550 break;
551 }
552 break;
554 CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
555 CC (entry->components, 1, v, maxlen)
556 vs = exif_get_short (entry->data, entry->order);
557 switch (vs) {
558 case 0:
559 strncpy (v, _("Off"), maxlen);
560 break;
561 case 1:
562 strncpy (v, _("On"), maxlen);
563 break;
564 case 2:
565 strncpy (v, _("2 sec."), maxlen);
566 break;
567 default:
568 sprintf (buf, _("Unknown %hu"), vs);
569 strncat (v, buf, maxlen - strlen (v));
570 break;
571 }
572 break;
574 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen)
575 CC (entry->components, 4, v, maxlen)
576 {
577 double ao,ac;
578 unsigned long fs,fl;
579 vr = exif_get_rational (entry->data, entry->order);
580 fs = R2L(vr);
581 vr = exif_get_rational (entry->data+8, entry->order);
582 fl = R2L(vr);
583 vr = exif_get_rational (entry->data+16, entry->order);
584 ao = R2D(vr);
585 vr = exif_get_rational (entry->data+24, entry->order);
586 ac = R2D(vr);
587 snprintf (v, maxlen, "%ld-%ldmm 1:%3.1f - %3.1f",fs,fl,ao,ac);
588 }
589 break;
590
591 /* Olympus */
593 CF (entry->format, EXIF_FORMAT_LONG, v, maxlen)
594 CC (entry->components, 3, v, maxlen)
595 vl = exif_get_long (entry->data, entry->order);
596 switch (vl) {
597 case 0:
598 strncpy (v, _("Normal"), maxlen);
599 break;
600 case 1:
601 strncpy (v, _("Unknown"), maxlen);
602 break;
603 case 2:
604 strncpy (v, _("Fast"), maxlen);
605 break;
606 case 3:
607 strncpy (v, _("Panorama"), maxlen);
608 break;
609 default:
610 snprintf (v, maxlen, "%li", (long int) vl);
611 }
612 vl = exif_get_long (entry->data + 4, entry->order);
613 snprintf (buf, sizeof (buf), "/%li/", (long int) vl);
614 strncat (v, buf, maxlen - strlen (v));
615 vl = exif_get_long (entry->data + 8, entry->order);
616 switch (vl) {
617 case 1:
618 strncat (v, _("Left to right"), maxlen - strlen (v));
619 break;
620 case 2:
621 strncat (v, _("Right to left"), maxlen - strlen (v));
622 break;
623 case 3:
624 strncat (v, _("Bottom to top"), maxlen - strlen (v));
625 break;
626 case 4:
627 strncat (v, _("Top to bottom"), maxlen - strlen (v));
628 break;
629 default:
630 snprintf (buf, sizeof (buf), "%li",
631 (long int) vl);
632 strncat (v, buf, maxlen - strlen (v));
633 }
634 break;
636 if (entry->format == EXIF_FORMAT_SHORT) {
637 /* Epson uses a single SHORT here */
638 CC (entry->components, 1, v, maxlen)
639 vs = exif_get_short (entry->data, entry->order);
640 sprintf (buf, "%hu", vs);
641 strncat (v, buf, maxlen - strlen (v));
642 } else {
643 /* Others use an array of SSHORT here */
644 CC (entry->components, 6, v, maxlen)
645 CF (entry->format, EXIF_FORMAT_SSHORT, v, maxlen)
646 for (i=0; i < (int)entry->components; ++i) {
647 vss = exif_get_sshort (entry->data+2*i, entry->order);
648 sprintf (buf, "%hd ", vss);
649 strncat (v, buf, maxlen - strlen (v));
650 }
651 }
652 break;
654 CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
655 CC (entry->components, 6, v, maxlen)
656 for (i=0; i < (int)entry->components; ++i) {
657 vs = exif_get_short (entry->data+2*i, entry->order);
658 sprintf (buf, "%hu ", vs);
659 strncat (v, buf, maxlen - strlen (v));
660 }
661 break;
663 CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen)
664 CC2 (entry->components, 5, 8, v, maxlen)
665 strncpy (v, (char *)entry->data, MIN (maxlen, entry->size));
666 break;
668 CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen)
669 strncpy (v, (char *)entry->data, MIN (maxlen, entry->size));
670 break;
672 CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen)
673 CC2 (entry->components, 52, 60, v, maxlen)
674 strncpy (v, (char *)entry->data, MIN (maxlen, entry->size));
675 break;
677 CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen)
678 CC (entry->components, 32, v, maxlen)
679 strncpy (v, (char *)entry->data, MIN (maxlen, entry->size));
680 break;
682 CF (entry->format, EXIF_FORMAT_LONG, v, maxlen)
683 CC (entry->components, 30, v, maxlen)
684 for (i=0; i < (int)entry->components; ++i) {
685 vl = exif_get_long (entry->data+4*i, entry->order);
686 sprintf (buf, "%lu ", (unsigned long)vl);
687 strncat (v, buf, maxlen - strlen (v));
688 }
689 break;
691 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen)
692 CC (entry->components, 1, v, maxlen)
693 vr = exif_get_rational (entry->data, entry->order);
694 if (!vr.numerator || !vr.denominator) {
695 strncpy (v, _("Unknown"), maxlen);
696 }
697 else {
698 unsigned long tmp = vr.numerator / vr.denominator;
699 snprintf (v, maxlen, "%li mm", tmp);
700 }
701 break;
703 CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
704 CC (entry->components, 2, v, maxlen)
705 vs = exif_get_short (entry->data, entry->order);
706 switch (vs) {
707 case 1:
708 strncpy (v, _("Automatic"), maxlen);
709 break;
710 case 2:
711 {
712 ExifShort v2 = exif_get_short (entry->data + 2, entry->order);
713 unsigned long colorTemp = 0;
714 switch (v2) {
715 case 2:
716 colorTemp = 3000;
717 break;
718 case 3:
719 colorTemp = 3700;
720 break;
721 case 4:
722 colorTemp = 4000;
723 break;
724 case 5:
725 colorTemp = 4500;
726 break;
727 case 6:
728 colorTemp = 5500;
729 break;
730 case 7:
731 colorTemp = 6500;
732 break;
733 case 9:
734 colorTemp = 7500;
735 break;
736 }
737 if (colorTemp) {
738 snprintf (v, maxlen, _("Manual: %liK"), colorTemp);
739 }
740 else {
741 strncpy (v, _("Manual: unknown"), maxlen);
742 }
743
744 }
745 break;
746 case 3:
747 strncpy (v, _("One-touch"), maxlen);
748 break;
749 default:
750 strncpy (v, _("Unknown"), maxlen);
751 break;
752 }
753 break;
756 CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
757 CC (entry->components, 2, v, maxlen)
758 vs = exif_get_short (entry->data, entry->order);
759 snprintf (v, maxlen, "%hu ", vs);
760 vs = exif_get_short (entry->data + 2, entry->order);
761 sprintf (buf, "%hu", vs);
762 strncat (v, buf, maxlen - strlen (v));
763 break;
766 CC (entry->components, 4, v, maxlen)
767 /* Fall through to COLORMATRIX */
768 /* fall through */
770 CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
772 CC (entry->components, 9, v, maxlen)
773 for (i=0; i < (int)entry->components; ++i) {
774 vs = exif_get_short (entry->data+2*i, entry->order);
775 sprintf (buf, "%hu ", vs);
776 strncat (v, buf, maxlen - strlen (v));
777 }
778 break;
783 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen)
784 /* Fall through to default handler for display */
785 /* fall through */
786 default:
787 switch (entry->format) {
789 strncpy (v, (char *)entry->data, MIN (maxlen, entry->size));
790 break;
792 CC (entry->components, 1, v, maxlen)
793 vs = exif_get_short (entry->data, entry->order);
794 snprintf (v, maxlen, "%hu", vs);
795 break;
797 CC (entry->components, 1, v, maxlen)
798 vss = exif_get_sshort (entry->data, entry->order);
799 snprintf (v, maxlen, "%hi", vss);
800 break;
801 case EXIF_FORMAT_LONG:
802 CC (entry->components, 1, v, maxlen)
803 vl = exif_get_long (entry->data, entry->order);
804 snprintf (v, maxlen, "%lu", (long unsigned) vl);
805 break;
807 CC (entry->components, 1, v, maxlen)
808 vsl = exif_get_slong (entry->data, entry->order);
809 snprintf (v, maxlen, "%li", (long int) vsl);
810 break;
812 CC (entry->components, 1, v, maxlen)
813 vr = exif_get_rational (entry->data, entry->order);
814 if (!vr.denominator) {
815 strncpy (v, _("Infinite"), maxlen);
816 } else {
817 r = R2D(vr);
818 snprintf (v, maxlen, "%2.3f", r);
819 }
820 break;
822 CC (entry->components, 1, v, maxlen)
823 vsr = exif_get_srational (entry->data, entry->order);
824 if (!vsr.denominator) {
825 strncpy (v, _("Infinite"), maxlen);
826 } else {
827 r = R2D(vsr);
828 snprintf (v, maxlen, "%2.3f", r);
829 }
830 break;
832 default:
833 snprintf (v, maxlen, _("%i bytes unknown data: "),
834 entry->size);
835 for (i = 0; i < (int)entry->size; i++) {
836 sprintf (buf, "%02x", entry->data[i]);
837 strncat (v, buf, maxlen - strlen (v));
838 }
839 break;
840 }
841 break;
842 }
843
844 return (v);
845}
@ EXIF_BYTE_ORDER_INTEL
Little-endian byte order.
Handling EXIF entries.
Handling native EXIF data types.
ExifFormat
EXIF tag data formats.
Definition exif-format.h:34
@ EXIF_FORMAT_SLONG
Definition exif-format.h:43
@ EXIF_FORMAT_RATIONAL
Definition exif-format.h:39
@ EXIF_FORMAT_SRATIONAL
Definition exif-format.h:44
@ EXIF_FORMAT_LONG
Definition exif-format.h:38
@ EXIF_FORMAT_UNDEFINED
Definition exif-format.h:41
@ EXIF_FORMAT_SHORT
Definition exif-format.h:37
@ EXIF_FORMAT_SSHORT
Definition exif-format.h:42
@ EXIF_FORMAT_ASCII
Definition exif-format.h:36
@ EXIF_FORMAT_BYTE
Definition exif-format.h:35
ExifRational exif_get_rational(const unsigned char *buf, ExifByteOrder order)
Retrieve an ExifRational value from memory.
Definition exif-utils.c:190
ExifLong exif_get_long(const unsigned char *buf, ExifByteOrder order)
Retrieve an ExifLong value from memory.
Definition exif-utils.c:167
ExifShort exif_get_short(const unsigned char *buf, ExifByteOrder order)
Retrieve an ExifShort value from memory.
Definition exif-utils.c:104
ExifSLong exif_get_slong(const unsigned char *b, ExifByteOrder order)
Retrieve an ExifSLong value from memory.
Definition exif-utils.c:132
ExifSShort exif_get_sshort(const unsigned char *buf, ExifByteOrder order)
Retrieve an ExifSShort value from memory.
Definition exif-utils.c:89
ExifSRational exif_get_srational(const unsigned char *buf, ExifByteOrder order)
Retrieve an ExifSRational value from memory.
Definition exif-utils.c:179
EXIF data manipulation functions and types.
uint32_t ExifLong
EXIF Unsigned Long data type.
Definition exif-utils.h:56
int32_t ExifSLong
EXIF Signed Long data type.
Definition exif-utils.h:59
uint16_t ExifShort
EXIF Unsigned Short data type.
Definition exif-utils.h:50
#define MIN(a, b)
Definition exif-utils.h:182
int16_t ExifSShort
EXIF Signed Short data type.
Definition exif-utils.h:53
#define _(String)
Definition i18n.h:50
#define N_(String)
Definition i18n.h:51
MnoteOlympusTag tag
#define CC(number, target, v, maxlen)
char * mnote_olympus_entry_get_value(MnoteOlympusEntry *entry, char *v, unsigned int maxlen)
ExifFormat fmt
int index
struct @13::@14 elem[24]
#define R2L(n)
static const struct @13 items[]
#define R2D(n)
#define CF(format, target, v, maxlen)
#define CC2(number, t1, t2, v, maxlen)
#define CF2(format, target1, target2, v, maxlen)
const char * string
@ MNOTE_NIKON1_TAG_WHITEBALANCE
@ MNOTE_OLYMPUS_TAG_ID
@ MNOTE_SANYO_TAG_FLICKERREDUCE
@ MNOTE_NIKON_TAG_IMAGEADJUSTMENT
@ MNOTE_OLYMPUS_TAG_REDBALANCE
@ MNOTE_OLYMPUS_TAG_FOCALPLANEDIAGONAL
@ MNOTE_EPSON_TAG_SOFTWARE
@ MNOTE_OLYMPUS_TAG_FOCUSRANGE
@ MNOTE_OLYMPUS_TAG_EXTERNALFLASHBOUNCE
@ MNOTE_SANYO_TAG_FOCUSMODE
@ MNOTE_SANYO_TAG_QUICKSHOT
@ MNOTE_NIKON_TAG_TOTALPICTURES
@ MNOTE_SANYO_TAG_CCDSENSITIVITY
@ MNOTE_NIKON_TAG_SATURATION2
@ MNOTE_OLYMPUS_TAG_MODE
@ MNOTE_OLYMPUS_TAG_ONETOUCHWB
@ MNOTE_OLYMPUS_TAG_FLASHDEVICE
@ MNOTE_OLYMPUS_TAG_CONTRAST
@ MNOTE_OLYMPUS_TAG_FLASHMODE
@ MNOTE_SANYO_TAG_COLORADJUSTMENTMODE
@ MNOTE_NIKON_TAG_ISO2
@ MNOTE_NIKON1_TAG_CCDSENSITIVITY
@ MNOTE_NIKON_TAG_WHITEBALANCERB
@ MNOTE_NIKON1_TAG_IMAGEADJUSTMENT
@ MNOTE_OLYMPUS_TAG_LENSTEMPERATURE
@ MNOTE_NIKON_TAG_ISOSELECTION
@ MNOTE_OLYMPUS_TAG_VERSION
@ MNOTE_NIKON_TAG_SATURATION
@ MNOTE_OLYMPUS_TAG_SHARPNESS
@ MNOTE_NIKON_TAG_COLORMODE
@ MNOTE_SANYO_TAG_SELFTIMER
@ MNOTE_OLYMPUS_TAG_SENSORTEMPERATURE
@ MNOTE_OLYMPUS_TAG_NOISEREDUCTION
@ MNOTE_NIKON_TAG_SENSORPIXELSIZE
@ MNOTE_OLYMPUS_TAG_BWMODE
@ MNOTE_NIKON_TAG_EXPOSUREDIFF
@ MNOTE_OLYMPUS_TAG_QUALITY
@ MNOTE_SANYO_TAG_WIDERANGE
@ MNOTE_OLYMPUS_TAG_MACRO
@ MNOTE_OLYMPUS_TAG_CCDSCANMODE
@ MNOTE_OLYMPUS_TAG_UNKNOWN_4
@ MNOTE_NIKON_TAG_MANUALFOCUSDISTANCE
@ MNOTE_OLYMPUS_TAG_PREVIEWIMAGEVALID
@ MNOTE_OLYMPUS_TAG_COLORMATRIX
@ MNOTE_OLYMPUS_TAG_SERIALNUMBER2
@ MNOTE_NIKON1_TAG_COLORMODE
@ MNOTE_EPSON_TAG_IMAGE_WIDTH
@ MNOTE_NIKON_TAG_FLASHMODE
@ MNOTE_NIKON1_TAG_DIGITALZOOM
@ MNOTE_OLYMPUS_TAG_BLACKLEVEL
@ MNOTE_OLYMPUS_TAG_FOCUSDIST
@ MNOTE_NIKON_TAG_FLASHEXPCOMPENSATION
@ MNOTE_NIKON_TAG_FIRMWARE
@ MNOTE_OLYMPUS_TAG_INFO
@ MNOTE_NIKON1_TAG_CONVERTER
@ MNOTE_SANYO_TAG_VOICEMEMO
@ MNOTE_SANYO_TAG_DIGITALZOOM
@ MNOTE_NIKON_TAG_ADAPTER
@ MNOTE_OLYMPUS_TAG_WBALANCE
@ MNOTE_NIKON_TAG_WHITEBALANCE
@ MNOTE_NIKON_TAG_FLASHEXPOSUREBRACKETVAL
@ MNOTE_OLYMPUS_TAG_MANFOCUS
@ MNOTE_NIKON_TAG_LENSTYPE
@ MNOTE_NIKON_TAG_FLASHUSED
@ MNOTE_NIKON1_TAG_FOCUS
@ MNOTE_OLYMPUS_TAG_BLUEBALANCE
@ MNOTE_NIKON_TAG_QUALITY
@ MNOTE_NIKON_TAG_AFFOCUSPOSITION
@ MNOTE_NIKON_TAG_LENS_FSTOPS
@ MNOTE_SANYO_TAG_RESAVED
@ MNOTE_SANYO_TAG_SEQUENTIALSHOT
@ MNOTE_NIKON_TAG_SHARPENING
@ MNOTE_NIKON_TAG_HUE
@ MNOTE_EPSON_TAG_IMAGE_HEIGHT
@ MNOTE_NIKON_TAG_LENS
@ MNOTE_OLYMPUS_TAG_DIGIZOOM
@ MNOTE_SANYO_TAG_RECORDSHUTTERRELEASE
@ MNOTE_SANYO_TAG_SCENESELECT
@ MNOTE_NIKON_TAG_ISO
@ MNOTE_NIKON_TAG_DIGITALZOOM
@ MNOTE_SANYO_TAG_SEQUENCESHOTINTERVAL
@ MNOTE_NIKON_TAG_BRACKETING
@ MNOTE_OLYMPUS_TAG_LENSDISTORTION
@ MNOTE_NIKON_TAG_FOCUSMODE
@ MNOTE_NIKON1_TAG_QUALITY
@ MNOTE_NIKON_TAG_FLASHSETTING
@ MNOTE_NIKON_TAG_IMAGEBOUNDARY
@ MNOTE_SANYO_TAG_OPTICALZOOM
@ MNOTE_NIKON_TAG_COLORMODE1
@ MNOTE_OLYMPUS_TAG_COLORCONTROL
@ MNOTE_SANYO_TAG_LIGHTSOURCESPECIAL
@ MNOTE_NIKON_TAG_WHITEBALANCEFINE
enum _MnoteOlympusTag MnoteOlympusTag
EXIF Unsigned Rational data type.
Definition exif-utils.h:62
ExifLong denominator
Definition exif-utils.h:62
ExifLong numerator
Definition exif-utils.h:62
EXIF Signed Rational data type.
Definition exif-utils.h:67
ExifSLong denominator
Definition exif-utils.h:67

libexif Generated by doxygen