40#define M_PI 3.14159265358979323846
53#ifndef NO_VERBOSE_TAG_STRINGS
67#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
68#define exif_entry_log(...) do { } while (0)
69#elif defined(__GNUC__)
70#define exif_entry_log(x...) do { } while (0)
72#define exif_entry_log (void)
82 if (!e || !e->
priv || !i)
return NULL;
99 if (!e || !e->
priv)
return NULL;
209 unsigned int i, newsize;
210 unsigned char *newdata;
215 if (!e || !e->
priv)
return;
245 _(
"Tag '%s' was of format '%s' (which is "
246 "against specification) and has been "
247 "changed to format '%s'."),
258 "Could not allocate %lu byte(s).", (
unsigned long)newsize);
282 _(
"Tag '%s' is of format '%s' (which is "
283 "against specification) but cannot be changed "
314 _(
"Tag '%s' was of format '%s' (which is "
315 "against specification) and has been "
316 "changed to format '%s'."),
347 _(
"Tag '%s' was of format '%s' (which is "
348 "against specification) and has been "
349 "changed to format '%s'."),
365 _(
"Tag 'UserComment' had invalid format '%s'. "
366 "Format has been set to 'undefined'."),
373 if ((e->
size >= 8) && (e->
data[0] == 0)) {
374 memcpy(e->
data,
"\0\0\0\0\0\0\0\0", 8);
387 memcpy (e->
data,
"ASCII\0\0\0", 8);
391 _(
"Tag 'UserComment' has been expanded to at "
392 "least 8 bytes in order to follow the "
402 for (i = 0; (i < e->
size) && !e->
data[i]; i++);
403 if (!i)
for ( ; (i < e->
size) && (e->
data[i] ==
' '); i++);
404 if ((i >= 8) && (i < e->
size)) {
406 _(
"Tag 'UserComment' is not empty but does not "
407 "start with a format identifier. "
408 "This has been fixed."));
409 memcpy (e->
data,
"ASCII\0\0\0", 8);
417 if (memcmp (e->
data,
"ASCII\0\0\0" , 8) &&
418 memcmp (e->
data,
"UNICODE\0" , 8) &&
419 memcmp (e->
data,
"JIS\0\0\0\0\0" , 8) &&
420 memcmp (e->
data,
"\0\0\0\0\0\0\0\0", 8)) {
429 memcpy (e->
data,
"ASCII\0\0\0", 8);
433 _(
"Tag 'UserComment' did not start with a "
434 "format identifier. This has been fixed."));
466 if (!e->
size || !maxlen)
470 snprintf (val, maxlen,
_(
"%i bytes undefined data"), e->
size);
475 snprintf (val, maxlen,
"0x%02x", v_byte);
479 snprintf (val+len, maxlen-len,
", 0x%02x", v_byte);
480 len += strlen (val+len);
481 if (len >= maxlen-1)
break;
486 snprintf (val, maxlen,
"%u", v_short);
491 snprintf (val+len, maxlen-len,
", %u", v_short);
492 len += strlen (val+len);
493 if (len >= maxlen-1)
break;
498 snprintf (val, maxlen,
"%i", v_sshort);
504 snprintf (val+len, maxlen-len,
", %i", v_sshort);
505 len += strlen (val+len);
506 if (len >= maxlen-1)
break;
511 snprintf (val, maxlen,
"%lu", (
unsigned long) v_long);
517 snprintf (val+len, maxlen-len,
", %lu", (
unsigned long) v_long);
518 len += strlen (val+len);
519 if (len >= maxlen-1)
break;
524 snprintf (val, maxlen,
"%li", (
long) v_slong);
529 snprintf (val+len, maxlen-len,
", %li", (
long) v_slong);
530 len += strlen (val+len);
531 if (len >= maxlen-1)
break;
535 strncpy (val, (
char *) e->
data,
MIN (maxlen-1, e->
size));
536 val[
MIN (maxlen-1, e->
size)] = 0;
542 snprintf (val+len, maxlen-len,
", ");
543 len += strlen (val+len);
554 int decimals = (int)(log10(v_rat.
denominator)-0.08+1.0);
555 snprintf (val+len, maxlen-len,
"%2.*f",
560 snprintf (val+len, maxlen-len,
"%lu/%lu",
563 len += strlen (val+len);
564 if (len >= maxlen-1)
break;
571 snprintf (val+len, maxlen-len,
", ");
572 len += strlen (val+len);
577 int decimals = (int)(log10(abs(v_srat.
denominator))-0.08+1.0);
578 snprintf (val+len, maxlen-len,
"%2.*f",
583 snprintf (val+len, maxlen-len,
"%li/%li",
586 len += strlen (val+len);
587 if (len >= maxlen-1)
break;
593 snprintf (val, maxlen,
_(
"%i bytes unsupported data type"),
609 l =
MIN(
sizeof(buf)-1, 2*indent);
613 printf (
"%sTag: 0x%x ('%s')\n", buf, e->
tag,
615 printf (
"%s Format: %i ('%s')\n", buf, e->
format,
617 printf (
"%s Components: %i\n", buf, (
int) e->
components);
618 printf (
"%s Size: %i\n", buf, e->
size);
635 for (i=n; i; --i, ++data) {
646#define CF(entry,target,v,maxlen) \
648 if (entry->format != target) { \
649 exif_entry_log (entry, EXIF_LOG_CODE_CORRUPT_DATA, \
650 _("The tag '%s' contains data of an invalid " \
651 "format ('%s', expected '%s')."), \
652 exif_tag_get_name (entry->tag), \
653 exif_format_get_name (entry->format), \
654 exif_format_get_name (target)); \
659#define CC(entry,target,v,maxlen) \
661 if (entry->components != target) { \
662 exif_entry_log (entry, EXIF_LOG_CODE_CORRUPT_DATA, \
663 _("The tag '%s' contains an invalid number of " \
664 "components (%i, expected %i)."), \
665 exif_tag_get_name (entry->tag), \
666 (int) entry->components, (int) target); \
675#ifndef NO_VERBOSE_TAG_DATA
677 {
N_(
"Chunky format"),
N_(
"Planar format"), NULL}},
679 {
"",
N_(
"Not defined"),
N_(
"One-chip color area sensor"),
680 N_(
"Two-chip color area sensor"),
N_(
"Three-chip color area sensor"),
681 N_(
"Color sequential area sensor"),
"",
N_(
"Trilinear sensor"),
682 N_(
"Color sequential linear sensor"), NULL}},
684 {
"",
N_(
"Top-left"),
N_(
"Top-right"),
N_(
"Bottom-right"),
685 N_(
"Bottom-left"),
N_(
"Left-top"),
N_(
"Right-top"),
686 N_(
"Right-bottom"),
N_(
"Left-bottom"), NULL}},
688 {
"",
N_(
"Centered"),
N_(
"Co-sited"), NULL}},
690 {
N_(
"Reversed mono"),
N_(
"Normal mono"),
N_(
"RGB"),
N_(
"Palette"),
"",
691 N_(
"CMYK"),
N_(
"YCbCr"),
"",
N_(
"CieLAB"), NULL}},
693 {
N_(
"Normal process"),
N_(
"Custom process"), NULL}},
695 {
N_(
"Auto exposure"),
N_(
"Manual exposure"),
N_(
"Auto bracket"), NULL}},
697 {
N_(
"Auto white balance"),
N_(
"Manual white balance"), NULL}},
699 {
N_(
"Standard"),
N_(
"Landscape"),
N_(
"Portrait"),
700 N_(
"Night scene"), NULL}},
702 {
N_(
"Normal"),
N_(
"Low gain up"),
N_(
"High gain up"),
703 N_(
"Low gain down"),
N_(
"High gain down"), NULL}},
705 {
N_(
"Normal"),
N_(
"Low saturation"),
N_(
"High saturation"), NULL}},
721#ifndef NO_VERBOSE_TAG_DATA
723 { { 0, {
N_(
"Unknown"), NULL}},
724 { 1, {
N_(
"Average"),
N_(
"Avg"), NULL}},
725 { 2, {
N_(
"Center-weighted average"),
N_(
"Center-weight"), NULL}},
726 { 3, {
N_(
"Spot"), NULL}},
727 { 4, {
N_(
"Multi spot"), NULL}},
728 { 5, {
N_(
"Pattern"), NULL}},
729 { 6, {
N_(
"Partial"), NULL}},
730 {255, {
N_(
"Other"), NULL}},
733 { {1, {
N_(
"Uncompressed"), NULL}},
734 {5, {
N_(
"LZW compression"), NULL}},
735 {6, {
N_(
"JPEG compression"), NULL}},
736 {7, {
N_(
"JPEG compression"), NULL}},
737 {8, {
N_(
"Deflate/ZIP compression"), NULL}},
738 {32773, {
N_(
"PackBits compression"), NULL}},
741 { { 0, {
N_(
"Unknown"), NULL}},
742 { 1, {
N_(
"Daylight"), NULL}},
743 { 2, {
N_(
"Fluorescent"), NULL}},
744 { 3, {
N_(
"Tungsten incandescent light"),
N_(
"Tungsten"), NULL}},
745 { 4, {
N_(
"Flash"), NULL}},
746 { 9, {
N_(
"Fine weather"), NULL}},
747 { 10, {
N_(
"Cloudy weather"),
N_(
"Cloudy"), NULL}},
748 { 11, {
N_(
"Shade"), NULL}},
749 { 12, {
N_(
"Daylight fluorescent"), NULL}},
750 { 13, {
N_(
"Day white fluorescent"), NULL}},
751 { 14, {
N_(
"Cool white fluorescent"), NULL}},
752 { 15, {
N_(
"White fluorescent"), NULL}},
753 { 17, {
N_(
"Standard light A"), NULL}},
754 { 18, {
N_(
"Standard light B"), NULL}},
755 { 19, {
N_(
"Standard light C"), NULL}},
756 { 20, {
N_(
"D55"), NULL}},
757 { 21, {
N_(
"D65"), NULL}},
758 { 22, {
N_(
"D75"), NULL}},
759 { 24, {
N_(
"ISO studio tungsten"),NULL}},
760 {255, {
N_(
"Other"), NULL}},
763 { {2, {
N_(
"Inch"),
N_(
"in"), NULL}},
764 {3, {
N_(
"Centimeter"),
N_(
"cm"), NULL}},
767 { {2, {
N_(
"Inch"),
N_(
"in"), NULL}},
768 {3, {
N_(
"Centimeter"),
N_(
"cm"), NULL}},
771 { {0, {
N_(
"Not defined"), NULL}},
772 {1, {
N_(
"Manual"), NULL}},
773 {2, {
N_(
"Normal program"),
N_(
"Normal"), NULL}},
774 {3, {
N_(
"Aperture priority"),
N_(
"Aperture"), NULL}},
775 {4, {
N_(
"Shutter priority"),
N_(
"Shutter"), NULL}},
776 {5, {
N_(
"Creative program (biased toward depth of field)"),
777 N_(
"Creative"), NULL}},
778 {6, {
N_(
"Creative program (biased toward fast shutter speed)"),
779 N_(
"Action"), NULL}},
780 {7, {
N_(
"Portrait mode (for closeup photos with the background out "
781 "of focus)"),
N_(
"Portrait"), NULL}},
782 {8, {
N_(
"Landscape mode (for landscape photos with the background "
783 "in focus)"),
N_(
"Landscape"), NULL}},
786 { {0, {
N_(
"Unknown"), NULL}},
787 {1, {
N_(
"Standard output sensitivity (SOS)"), NULL}},
788 {2, {
N_(
"Recommended exposure index (REI)"), NULL}},
789 {3, {
N_(
"ISO speed"), NULL}},
790 {4, {
N_(
"Standard output sensitivity (SOS) and recommended exposure index (REI)"), NULL}},
791 {5, {
N_(
"Standard output sensitivity (SOS) and ISO speed"), NULL}},
792 {6, {
N_(
"Recommended exposure index (REI) and ISO speed"), NULL}},
793 {7, {
N_(
"Standard output sensitivity (SOS) and recommended exposure index (REI) and ISO speed"), NULL}},
796 { {0x0000, {
N_(
"Flash did not fire"),
N_(
"No flash"), NULL}},
797 {0x0001, {
N_(
"Flash fired"),
N_(
"Flash"),
N_(
"Yes"), NULL}},
798 {0x0005, {
N_(
"Strobe return light not detected"),
N_(
"Without strobe"),
800 {0x0007, {
N_(
"Strobe return light detected"),
N_(
"With strobe"), NULL}},
801 {0x0008, {
N_(
"Flash did not fire"), NULL}},
802 {0x0009, {
N_(
"Flash fired, compulsory flash mode"), NULL}},
803 {0x000d, {
N_(
"Flash fired, compulsory flash mode, return light "
804 "not detected"), NULL}},
805 {0x000f, {
N_(
"Flash fired, compulsory flash mode, return light "
807 {0x0010, {
N_(
"Flash did not fire, compulsory flash mode"), NULL}},
808 {0x0018, {
N_(
"Flash did not fire, auto mode"), NULL}},
809 {0x0019, {
N_(
"Flash fired, auto mode"), NULL}},
810 {0x001d, {
N_(
"Flash fired, auto mode, return light not detected"),
812 {0x001f, {
N_(
"Flash fired, auto mode, return light detected"), NULL}},
813 {0x0020, {
N_(
"No flash function"),NULL}},
814 {0x0041, {
N_(
"Flash fired, red-eye reduction mode"), NULL}},
815 {0x0045, {
N_(
"Flash fired, red-eye reduction mode, return light "
816 "not detected"), NULL}},
817 {0x0047, {
N_(
"Flash fired, red-eye reduction mode, return light "
819 {0x0049, {
N_(
"Flash fired, compulsory flash mode, red-eye reduction "
821 {0x004d, {
N_(
"Flash fired, compulsory flash mode, red-eye reduction "
822 "mode, return light not detected"), NULL}},
823 {0x004f, {
N_(
"Flash fired, compulsory flash mode, red-eye reduction mode, "
824 "return light detected"), NULL}},
825 {0x0058, {
N_(
"Flash did not fire, auto mode, red-eye reduction mode"), NULL}},
826 {0x0059, {
N_(
"Flash fired, auto mode, red-eye reduction mode"), NULL}},
827 {0x005d, {
N_(
"Flash fired, auto mode, return light not detected, "
828 "red-eye reduction mode"), NULL}},
829 {0x005f, {
N_(
"Flash fired, auto mode, return light detected, "
830 "red-eye reduction mode"), NULL}},
833 { {0, {
N_(
"Unknown"),
N_(
"?"), NULL}},
834 {1, {
N_(
"Macro"), NULL}},
835 {2, {
N_(
"Close view"),
N_(
"Close"), NULL}},
836 {3, {
N_(
"Distant view"),
N_(
"Distant"), NULL}},
839 { {1, {
N_(
"sRGB"), NULL}},
840 {2, {
N_(
"Adobe RGB"), NULL}},
841 {0xffff, {
N_(
"Uncalibrated"), NULL}},
844 { {0, {
N_(
"Unknown"), NULL}},
845 {1, {
N_(
"Not a composite image"), NULL}},
846 {2, {
N_(
"General composite image"), NULL}},
847 {3, {
N_(
"Composite image captured while shooting"), NULL}},
850 {0, { { 0, {NULL}}} }
856 unsigned int i, j, k;
857 ExifShort v_short, v_short2, v_short3, v_short4;
866 static const struct {
890 memset (val, 0, maxlen);
897 snprintf (val, maxlen,
_(
"Invalid size of entry (%i, "
914 ( memcmp (e->
data,
"ASCII\0\0\0" , 8) &&
915 memcmp (e->
data,
"UNICODE\0" , 8) &&
916 memcmp (e->
data,
"JIS\0\0\0\0\0", 8) &&
917 memcmp (e->
data,
"\0\0\0\0\0\0\0\0", 8)))
925 if ((e->
size >= 8) && !memcmp (e->
data,
"ASCII\0\0\0", 8)) {
926 strncpy (val, (
char *) e->
data + 8,
MIN (e->
size - 8, maxlen-1));
929 if ((e->
size >= 8) && !memcmp (e->
data,
"UNICODE\0", 8)) {
930 strncpy (val,
_(
"Unsupported UNICODE string"), maxlen-1);
937 if ((e->
size >= 8) && !memcmp (e->
data,
"JIS\0\0\0\0\0", 8)) {
938 strncpy (val,
_(
"Unsupported JIS string"), maxlen-1);
944 for (i = 0; (i < e->
size) &&
945 (!e->
data[i] || (e->
data[i] ==
' ')); i++);
946 if (i == e->
size)
break;
955 _(
"Tag UserComment contains data but is "
956 "against specification."));
957 for (j = 0; (i < e->
size) && (j < maxlen-1); i++, j++) {
959 _(
"Byte at position %i: 0x%02x"), i, e->
data[i]);
960 val[j] = isprint (e->
data[i]) ? e->
data[i] :
'.';
966 CC (e, 4, val, maxlen)
967 strncpy (val,
_(
"Unknown Exif Version"), maxlen-1);
968 for (i = 0; *versions[i].label; i++) {
969 if (!memcmp (e->
data, versions[i].label, 4)) {
970 snprintf (val, maxlen,
971 _(
"Exif Version %d.%d"),
980 CC (e, 4, val, maxlen)
981 if (!memcmp (e->
data,
"0100", 4))
982 strncpy (val,
_(
"FlashPix Version 1.0"), maxlen-1);
983 else if (!memcmp (e->
data,
"0101", 4))
984 strncpy (val,
_(
"FlashPix Version 1.01"), maxlen-1);
986 strncpy (val,
_(
"Unknown FlashPix Version"), maxlen-1);
997 strncpy (val, (
char *) e->
data,
MIN (maxlen-1, e->
size));
999 strncpy (val,
_(
"[None]"), maxlen-1);
1000 strncat (val,
" ", maxlen-1 - strlen (val));
1001 strncat (val,
_(
"(Photographer)"), maxlen-1 - strlen (val));
1004 strncat (val,
" - ", maxlen-1 - strlen (val));
1007 const unsigned char *tagdata = memchr(e->
data, 0, e->
size);
1009 unsigned int editor_ofs = tagdata - e->
data;
1010 unsigned int remaining = e->
size - editor_ofs;
1012 strncat (val, (
const char*)tagdata,
MIN (maxlen-1 - strlen (val), remaining));
1018 strncat (val,
_(
"[None]"), maxlen-1 - strlen (val));
1019 strncat (val,
" ", maxlen-1 - strlen (val));
1020 strncat (val,
_(
"(Editor)"), maxlen-1 - strlen (val));
1025 CC (e, 1, val, maxlen)
1032 snprintf (val, maxlen,
"f/%.01f", d);
1037 CC (e, 1, val, maxlen)
1044 snprintf (val, maxlen,
_(
"%.02f EV"), d);
1045 snprintf (b,
sizeof (b),
_(
" (f/%.01f)"), pow (2, d / 2.));
1046 strncat (val, b, maxlen-1 - strlen (val));
1050 CC (e, 1, val, maxlen)
1065 if (entry && entry->
data && entry->
size >= 7 &&
1066 !strncmp ((
char *)entry->
data,
"Minolta", 7)) {
1070 if (entry && entry->
data && entry->
size >= 8) {
1071 if (!strncmp ((
char *)entry->
data,
"DiMAGE 7", 8))
1073 else if (!strncmp ((
char *)entry->
data,
"DiMAGE 5", 8))
1078 snprintf (b,
sizeof (b),
_(
" (35 equivalent: %.0f mm)"),
1085 snprintf (val, maxlen,
"%.1f mm", d);
1086 strncat (val, b, maxlen-1 - strlen (val));
1090 CC (e, 1, val, maxlen)
1097 snprintf (val, maxlen,
"%.1f m", d);
1101 CC (e, 1, val, maxlen)
1109 snprintf (val, maxlen,
_(
"1/%.0f"), 1. / d);
1111 snprintf (val, maxlen,
"%.0f", d);
1112 strncat (val,
_(
" sec."), maxlen-1 - strlen (val));
1116 CC (e, 1, val, maxlen)
1123 snprintf (val, maxlen,
_(
"%.02f EV"), d);
1125 d = 1. / pow (2, d);
1127 snprintf (b,
sizeof (b),
_(
" (1/%.0f sec.)"), 1. / d);
1129 snprintf (b,
sizeof (b),
_(
" (%.0f sec.)"), d);
1130 strncat (val, b, maxlen-1 - strlen (val));
1134 CC (e, 1, val, maxlen)
1141 snprintf (val, maxlen,
_(
"%.02f EV"), d);
1142 snprintf (b,
sizeof (b),
_(
" (%.02f cd/m^2)"),
1143 1. / (
M_PI * 0.3048 * 0.3048) * pow (2, d));
1144 strncat (val, b, maxlen-1 - strlen (val));
1148 CC (e, 1, val, maxlen)
1149 v_byte = e->
data[0];
1151 strncpy (val,
_(
"DSC"), maxlen-1);
1153 snprintf (val, maxlen,
_(
"Internal error (unknown "
1154 "value %i)"), v_byte);
1158 CC (e, 4, val, maxlen)
1159 for (i = 0; i < 4; i++) {
1160 switch (e->
data[i]) {
1161 case 0: c =
_(
"-");
break;
1162 case 1: c =
_(
"Y");
break;
1163 case 2: c =
_(
"Cb");
break;
1164 case 3: c =
_(
"Cr");
break;
1165 case 4: c =
_(
"R");
break;
1166 case 5: c =
_(
"G");
break;
1167 case 6: c =
_(
"B");
break;
1168 default: c =
_(
"Reserved");
break;
1170 strncat (val, c, maxlen-1 - strlen (val));
1172 strncat (val,
" ", maxlen-1 - strlen (val));
1177 CC (e, 1, val, maxlen)
1184 snprintf (val, maxlen,
_(
"%.02f EV"), d);
1188 CC (e, 1, val, maxlen)
1189 v_byte = e->
data[0];
1191 strncpy (val,
_(
"Directly photographed"), maxlen-1);
1193 snprintf (val, maxlen,
_(
"Internal error (unknown "
1194 "value %i)"), v_byte);
1198 CC (e, 2, val, maxlen)
1203 if ((v_short == 2) && (v_short2 == 1))
1204 strncpy (val,
_(
"YCbCr4:2:2"), maxlen-1);
1205 else if ((v_short == 2) && (v_short2 == 2))
1206 strncpy (val,
_(
"YCbCr4:2:0"), maxlen-1);
1208 snprintf (val, maxlen,
"%u, %u", v_short, v_short2);
1216 snprintf (val, maxlen,
"(x,y) = (%i,%i)",
1223 snprintf (val, maxlen,
_(
"Within distance %i of "
1224 "(x,y) = (%i,%i)"), v_short3, v_short,
1232 snprintf (val, maxlen,
_(
"Within rectangle "
1233 "(width %i, height %i) around "
1234 "(x,y) = (%i,%i)"), v_short3, v_short4,
1238 snprintf (val, maxlen,
_(
"Unexpected number "
1239 "of components (%li, expected 2, 3, or 4)."),
1246 CC (e, 4, val, maxlen)
1247 v_byte = e->
data[0];
1248 snprintf (val, maxlen,
"%u", v_byte);
1250 v_byte = e->
data[i];
1251 snprintf (b,
sizeof (b),
".%u", v_byte);
1252 strncat (val, b, maxlen-1 - strlen (val));
1259 strncpy (val, (
char *) e->
data,
MIN (maxlen-1, e->
size));
1270 CC (e, 1, val, maxlen)
1271 v_byte = e->
data[0];
1273 strncpy (val,
_(
"Sea level"), maxlen-1);
1274 else if (v_byte == 1)
1275 strncpy (val,
_(
"Sea level reference"), maxlen-1);
1277 snprintf (val, maxlen,
_(
"Internal error (unknown "
1278 "value %i)"), v_byte);
1283 CC (e, 3, val, maxlen)
1309 snprintf (val, maxlen,
"%02u:%02u:%05.2f", i, j, d);
1324 CC (e, 1, val, maxlen)
1330 snprintf (val, maxlen,
_(
"Internal error (unknown "
1331 "value %i)"), v_short);
1336 for (j = 0;
list2[i].elem[j].values[0] &&
1337 (
list2[i].elem[j].index < v_short); j++);
1339 snprintf (val, maxlen,
_(
"Internal error (unknown "
1340 "value %i)"), v_short);
1345 memset (val, 0, maxlen);
1346 for (k = 0;
list2[i].elem[j].values[k]; k++) {
1348 if ((maxlen > l) && (strlen (val) < l))
1351 if (!val[0]) snprintf (val, maxlen,
"%i", v_short);
1369 CC (e, 1, val, maxlen)
1373 for (i = 0;
list[i].tag && (
list[i].tag != e->
tag); i++);
1375 snprintf (val, maxlen,
_(
"Internal error (unknown "
1376 "value %i)"), v_short);
1381 for (j = 0;
list[i].strings[j] && (j < v_short); j++);
1383 snprintf (val, maxlen,
"%i", v_short);
1385 snprintf (val, maxlen,
_(
"Unknown value %i"), v_short);
1396 unsigned char *utf16;
1399 if (e->
size >= 65536 -
sizeof(uint16_t)*2)
break;
1412 utf16[e->
size+1] = 0;
1413 utf16[e->
size+2] = 0;
1452 e->
size = allocSize;
1723#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S)
1729#if defined(HAVE_LOCALTIME_S)
1730 localtime_s (&tms, &t);
1732#elif defined(HAVE_LOCALTIME_R)
1733 tm = localtime_r (&t, &tms);
1735 tm = localtime (&t);
1742 snprintf ((
char *) e->
data, e->
size,
1743 "%04i:%02i:%02i %02i:%02i:%02i",
1744 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
1745 tm->tm_hour, tm->tm_min, tm->tm_sec);
1778 strncpy ((
char *)e->
data,
_(
"[None]"), e->
size);
1787 strcpy (((
char *)e->
data) + 0,
_(
"[None]"));
1788 strcpy (((
char *)e->
data) + strlen (
_(
"[None]")) + 1,
_(
"[None]"));
1818 memcpy (e->
data,
"0100", 4);
1828 memcpy (e->
data,
"0210", 4);
ExifByteOrder
Which byte order to use.
ExifEntry * exif_content_get_entry(ExifContent *content, ExifTag tag)
Return the ExifEntry in this IFD corresponding to the given tag.
ExifByteOrder exif_data_get_byte_order(ExifData *data)
Return the byte order in use by this EXIF structure.
static void clear_entry(ExifEntry *e)
static const struct @4 list[]
ExifEntry * exif_entry_new_mem(ExifMem *mem)
Reserve memory for and initialize new ExifEntry using the specified memory allocator.
void exif_entry_free(ExifEntry *e)
Actually free the ExifEntry.
static void * exif_entry_realloc(ExifEntry *e, void *d_orig, unsigned int i)
const char * values[4]
list of progressively shorter string descriptions; the longest one that fits will be selected
#define CC(entry, target, v, maxlen)
const char * exif_entry_get_value(ExifEntry *e, char *val, unsigned int maxlen)
Return a localized textual representation of the value of the EXIF entry.
ExifEntry * exif_entry_new(void)
Reserve memory for and initialize a new ExifEntry.
void exif_entry_unref(ExifEntry *e)
Decrease reference counter for ExifEntry.
#define CF(entry, target, v, maxlen)
static const struct @5 list2[]
ExifLog * exif_data_get_log(ExifData *)
void exif_entry_fix(ExifEntry *e)
Fix the type or format of the given EXIF entry to bring it into spec.
static void exif_entry_log(ExifEntry *e, ExifLogCode code, const char *format,...)
static void * exif_entry_alloc(ExifEntry *e, unsigned int i)
static int match_repeated_char(const unsigned char *data, unsigned char ch, size_t n)
Check if a string consists entirely of a single, repeated character.
void exif_entry_initialize(ExifEntry *e, ExifTag tag)
Initialize an empty ExifEntry with default data in the correct format for the given tag.
void exif_entry_dump(ExifEntry *e, unsigned int indent)
Dump text representation of ExifEntry to stdout.
static void exif_entry_format_value(ExifEntry *e, char *val, size_t maxlen)
Format the value of an ExifEntry for human display in a generic way.
static void exif_entry_initialize_gps(ExifEntry *e, ExifTag tag)
void exif_entry_ref(ExifEntry *e)
Increase reference counter for ExifEntry.
static ExifShort exif_get_short_convert(const unsigned char *buf, ExifFormat format, ExifByteOrder order)
Get a value and convert it to an ExifShort.
#define exif_entry_get_ifd(e)
Return the IFD number of the given ExifEntry.
const ExifGPSIfdTagInfo * exif_get_gps_tag_info(ExifTag tag)
void exif_logv(ExifLog *log, ExifLogCode code, const char *domain, const char *format, va_list args)
@ EXIF_LOG_CODE_NO_MEMORY
@ EXIF_LOG_CODE_CORRUPT_DATA
#define EXIF_LOG_NO_MEMORY(l, d, s)
void exif_mem_free(ExifMem *mem, void *d)
void exif_mem_unref(ExifMem *mem)
Unrefcount an ExifMem.
void * exif_mem_alloc(ExifMem *mem, ExifLong ds)
void * exif_mem_realloc(ExifMem *mem, void *d, ExifLong ds)
ExifMem * exif_mem_new_default(void)
Create a new ExifMem with default values for your convenience.
void exif_mem_ref(ExifMem *mem)
Refcount an ExifMem.
const char * exif_tag_get_name_in_ifd(ExifTag tag, ExifIfd ifd)
Return a textual name of the given tag when found in the given IFD.
@ EXIF_TAG_DATE_TIME_ORIGINAL
@ EXIF_TAG_BODY_SERIAL_NUMBER
@ EXIF_TAG_LENS_SERIAL_NUMBER
@ EXIF_TAG_LENS_SPECIFICATION
@ EXIF_TAG_SUBJECT_LOCATION
@ EXIF_TAG_ISO_SPEED_RATINGS
@ EXIF_TAG_ISO_SPEEDLatitudeYYY
@ EXIF_TAG_EXIF_IFD_POINTER
@ EXIF_TAG_INTEROPERABILITY_VERSION
@ EXIF_TAG_OFFSET_TIME_DIGITIZED
@ EXIF_TAG_MAX_APERTURE_VALUE
@ EXIF_TAG_PLANAR_CONFIGURATION
@ EXIF_TAG_RESOLUTION_UNIT
@ EXIF_TAG_BITS_PER_SAMPLE
@ EXIF_TAG_STANDARD_OUTPUT_SENSITIVITY
@ EXIF_TAG_SUBJECT_DISTANCE
@ EXIF_TAG_GPS_INFO_IFD_POINTER
@ EXIF_TAG_FOCAL_PLANE_RESOLUTION_UNIT
@ EXIF_TAG_APERTURE_VALUE
@ EXIF_TAG_IMAGE_DESCRIPTION
@ EXIF_TAG_INTEROPERABILITY_IFD_POINTER
@ EXIF_TAG_FLASH_PIX_VERSION
@ EXIF_TAG_DIGITAL_ZOOM_RATIO
@ EXIF_TAG_SOURCE_IMAGE_NUMBER_OF_COMPOSITE_IMAGE
@ EXIF_TAG_JPEG_INTERCHANGE_FORMAT
@ EXIF_TAG_COMPOSITE_IMAGE
@ EXIF_TAG_COMPONENTS_CONFIGURATION
@ EXIF_TAG_OFFSET_TIME_ORIGINAL
@ EXIF_TAG_ISO_SPEEDLatitudeZZZ
@ EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH
@ EXIF_TAG_SHUTTER_SPEED_VALUE
@ EXIF_TAG_PIXEL_Y_DIMENSION
@ EXIF_TAG_PIXEL_X_DIMENSION
@ EXIF_TAG_CAMERA_OWNER_NAME
@ EXIF_TAG_YCBCR_POSITIONING
@ EXIF_TAG_EXPOSURE_PROGRAM
@ EXIF_TAG_PHOTOMETRIC_INTERPRETATION
@ EXIF_TAG_EXPOSURE_INDEX
@ EXIF_TAG_YCBCR_SUB_SAMPLING
@ EXIF_TAG_SCENE_CAPTURE_TYPE
@ EXIF_TAG_SAMPLES_PER_PIXEL
@ EXIF_TAG_EXPOSURE_BIAS_VALUE
@ EXIF_TAG_SENSITIVITY_TYPE
@ EXIF_TAG_SUBJECT_DISTANCE_RANGE
@ EXIF_TAG_CUSTOM_RENDERED
@ EXIF_TAG_REFERENCE_BLACK_WHITE
@ EXIF_TAG_RECOMMENDED_EXPOSURE_INDEX
@ EXIF_TAG_DATE_TIME_DIGITIZED
@ EXIF_TAG_BRIGHTNESS_VALUE
@ EXIF_TAG_SENSING_METHOD
@ EXIF_TAG_SUB_SEC_TIME_DIGITIZED
@ EXIF_TAG_FOCAL_LENGTH_IN_35MM_FILM
@ EXIF_TAG_FOCAL_PLANE_X_RESOLUTION
@ EXIF_TAG_COMPRESSED_BITS_PER_PIXEL
@ EXIF_TAG_SUB_SEC_TIME_ORIGINAL
@ EXIF_TAG_PRIMARY_CHROMATICITIES
@ EXIF_TAG_FOCAL_PLANE_Y_RESOLUTION
#define EXIF_TAG_GPS_TIME_STAMP
#define EXIF_TAG_GPS_VERSION_ID
#define EXIF_TAG_GPS_ALTITUDE_REF
void exif_convert_utf16_to_utf8(char *out, unsigned int outlen, const unsigned char *in, unsigned int inlen)
This function converts rather UCS-2LE than UTF-16 to UTF-8.
ExifRational exif_get_rational(const unsigned char *buf, ExifByteOrder order)
Retrieve an ExifRational value from memory.
void exif_set_rational(unsigned char *buf, ExifByteOrder order, ExifRational value)
Store an ExifRational value into memory in EXIF format.
ExifLong exif_get_long(const unsigned char *buf, ExifByteOrder order)
Retrieve an ExifLong value from memory.
ExifShort exif_get_short(const unsigned char *buf, ExifByteOrder order)
Retrieve an ExifShort value from memory.
ExifSLong exif_get_slong(const unsigned char *b, ExifByteOrder order)
Retrieve an ExifSLong value from memory.
ExifSShort exif_get_sshort(const unsigned char *buf, ExifByteOrder order)
Retrieve an ExifSShort value from memory.
void exif_set_srational(unsigned char *buf, ExifByteOrder order, ExifSRational value)
Store an ExifSRational value into memory in EXIF format.
void exif_set_short(unsigned char *b, ExifByteOrder order, ExifShort value)
Store an ExifShort value into memory in EXIF format.
ExifSRational exif_get_srational(const unsigned char *buf, ExifByteOrder order)
Retrieve an ExifSRational value from memory.
EXIF data manipulation functions and types.
unsigned char ExifByte
EXIF Unsigned Byte data type.
uint32_t ExifLong
EXIF Unsigned Long data type.
int32_t ExifSLong
EXIF Signed Long data type.
uint16_t ExifShort
EXIF Unsigned Short data type.
int16_t ExifSShort
EXIF Signed Short data type.
#define bindtextdomain(Domain, Directory)
const char * default_value
EXIF Unsigned Rational data type.
EXIF Signed Rational data type.
ExifData * parent
Data containing this content.
Represents the entire EXIF data found in an image.
ExifContent * ifd[EXIF_IFD_COUNT]
Data for each IFD.
Data found in one EXIF tag.
unsigned long components
Number of elements in the array, if this is an array entry.
ExifFormat format
Type of data in this entry.
ExifContent * parent
ExifContent containing this entry.
unsigned char * data
Pointer to the raw EXIF data for this entry.
ExifTag tag
EXIF tag for this entry.
ExifEntryPrivate * priv
Internal data to be used by libexif itself.
unsigned int size
Number of bytes in the buffer at data.