From: Jan P. <pa...@us...> - 2004-05-10 12:28:58
|
Update of /cvsroot/libexif/libexif/libexif/olympus In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7840 Modified Files: exif-mnote-data-olympus.c mnote-olympus-entry.c mnote-olympus-tag.c mnote-olympus-tag.h Log Message: I've extended support of Nikon maker note in the "Olympus" part, where Lutz originally put the first code. It appears there are at least 3 versions of Nikon mnote: 1) IFD with 0x1B items - was confused w/ Pentax-made mnote 2) 'Nikon',0,1,0,IFD 3) 'Nikon',0,2,0,0,0, 8-byte TIFF header, IFD In addition to that, there are 2 sets of tags: a) 'Version 1' is used by cases 1)+2) b) 'Version 2' is used by case 3) A bad thing is that both sets use the same ids. Furthermore, while v1 uses SHORT values, v2 uses ASCII values containing the actual string representations of the numeric values. To distinguish v1 & v2 tags, MNOTE_NIKON1_TAG_BASE (0x8000) is added to every tag if reading a v1 file - this is done in exif_mnote_data_olympus_load(). Some of the tags are explained here: http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html most of other tags are work (?) of Serge Droz <ser...@ps...> who submitted the original code enhancing now obsolete libmnote. Meaning of many tags remains unknown. Index: mnote-olympus-entry.c =================================================================== RCS file: /cvsroot/libexif/libexif/libexif/olympus/mnote-olympus-entry.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- mnote-olympus-entry.c 4 May 2004 21:27:01 -0000 1.7 +++ mnote-olympus-entry.c 10 May 2004 12:28:48 -0000 1.8 @@ -27,6 +27,7 @@ #include <libexif/exif-format.h> #include <libexif/exif-utils.h> +#include <libexif/exif-entry.h> #include <libexif/i18n.h> #define CF(format,target,v,maxlen) \ @@ -54,13 +55,105 @@ #undef MIN #define MIN(a, b) (((a) < (b)) ? (a) : (b)) +static struct { + ExifTag tag; + ExifFormat fmt; + struct { + int index; + const char *string; + } elem[8]; +} items[] = { + { MNOTE_NIKON_TAG_LENSTYPE, EXIF_FORMAT_BYTE, + { {0, N_("AF non D Lens")}, + {1, N_("Manual")}, + {2, N_("AF-D or AF-S Lens")}, + {6, N_("AF-D G Lens")}, + {10, N_("AF-D VR Lens")}, + {0, NULL}}}, + { MNOTE_NIKON_TAG_FLASHUSED, EXIF_FORMAT_BYTE, + { {0, N_("Flash did not fire")}, + {4, N_("Flash unit unknown")}, + {7, N_("Flash is external")}, + {9, N_("Flash is on Camera")}, + {0, NULL}}}, + { MNOTE_NIKON1_TAG_QUALITY, EXIF_FORMAT_SHORT, + { {1, N_("VGA Basic")}, + {2, N_("VGA Normal")}, + {3, N_("VGA Fine")}, + {4, N_("SXGA Basic")}, + {5, N_("SXGA Normal")}, + {6, N_("SXGA Fine")}, + {0, NULL}}}, + { MNOTE_NIKON1_TAG_COLORMODE, EXIF_FORMAT_SHORT, + { {1, N_("Color")}, + {2, N_("Monochrome")}, + {0, NULL}}}, + { MNOTE_NIKON1_TAG_IMAGEADJUSTMENT, EXIF_FORMAT_SHORT, + { {0, N_("Normal")}, + {1, N_("Bright+")}, + {2, N_("Bright-")}, + {3, N_("Contrast+")}, + {4, N_("Contrast-")}, + {0, NULL}}}, + { MNOTE_NIKON1_TAG_CCDSENSITIVITY, EXIF_FORMAT_SHORT, + { {0, N_("ISO80")}, + {2, N_("ISO160")}, + {4, N_("ISO320")}, + {5, N_("ISO100")}, + {0, NULL}}}, + { MNOTE_NIKON1_TAG_WHITEBALANCE, EXIF_FORMAT_SHORT, + { {0, N_("Auto")}, + {1, N_("Preset")}, + {2, N_("Daylight")}, + {3, N_("Incandescense")}, + {4, N_("Fluorescence")}, + {5, N_("Cloudy")}, + {6, N_("SpeedLight")}, + {0, NULL}}}, + { MNOTE_OLYMPUS_TAG_QUALITY, EXIF_FORMAT_SHORT, + { {1, N_("SQ")}, + {2, N_("HQ")}, + {3, N_("SHQ")}, + {0, NULL}}}, + { MNOTE_OLYMPUS_TAG_MACRO, EXIF_FORMAT_SHORT, + { {0, N_("No")}, + {1, N_("Yes")}, + {0, NULL}}}, + { MNOTE_OLYMPUS_TAG_DIGIZOOM, EXIF_FORMAT_SHORT, + { {0, N_("1x")}, + {2, N_("2x")}, + {0, NULL}}}, + { MNOTE_OLYMPUS_TAG_FLASHMODE, EXIF_FORMAT_SHORT, + { {0, N_("Auto")}, + {1, N_("Red-eye reduction")}, + {2, N_("Fill")}, + {3, N_("Off")}, + {0, NULL}}}, + { MNOTE_OLYMPUS_TAG_SHARPNESS, EXIF_FORMAT_SHORT, + { {0, N_("Normal")}, + {1, N_("Hard")}, + {2, N_("Soft")}, + {0, NULL}}}, + { MNOTE_OLYMPUS_TAG_CONTRAST, EXIF_FORMAT_SHORT, + { {0, N_("Hard")}, + {1, N_("Normal")}, + {2, N_("Soft")}, + {0, NULL}}}, + { MNOTE_OLYMPUS_TAG_MANFOCUS, EXIF_FORMAT_SHORT, + { {0, N_("No")}, + {1, N_("Yes")}, + {0, NULL}}}, + { 0, } +}; + char * mnote_olympus_entry_get_value (MnoteOlympusEntry *entry, char *v, unsigned int maxlen) { - char buf[32]; - ExifLong vl; - ExifShort vs; + char buf[32]; + ExifLong vl; + ExifShort vs; ExifRational vr; + int i, j; if (!entry) return (NULL); @@ -77,21 +170,21 @@ CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen); CC (entry->components, 4, v, maxlen); vl = exif_get_long (entry->data, entry->order); - snprintf (v, sizeof (v), "0x%04lx", vl); + snprintf (v, maxlen, "0x%04lx", vl); break; case MNOTE_NIKON_TAG_ISO: CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen); CC (entry->components, 2, v, maxlen); //vs = exif_get_short (entry->data, entry->order); vs = exif_get_short (entry->data + 2, entry->order); - snprintf (v, sizeof (v), "ISO %hd", vs); + snprintf (v, maxlen, "ISO %hd", vs); break; case MNOTE_NIKON_TAG_ISO2: CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen); CC (entry->components, 2, v, maxlen); //vs = exif_get_short (entry->data, entry->order); vs = exif_get_short (entry->data + 2, entry->order); - snprintf (v, sizeof (v), "ISO2 %hd", vs); + snprintf (v, maxlen, "ISO2 %hd", vs); break; case MNOTE_NIKON_TAG_QUALITY: CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen); @@ -100,58 +193,39 @@ //printf("-> 0x%04x\n",entry->data); //printf("-> 0x%s<\n",entry->data - 0); memcpy(v, entry->data ,entry->components); - //snprintf (v, sizeof (v), "%s<", ( entry->data - 9 ); + //snprintf (v, maxlen, "%s<", ( entry->data - 9 ); break; case MNOTE_NIKON_TAG_COLORMODE: - CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen); - memcpy(v, entry->data ,entry->components); - break; case MNOTE_NIKON_TAG_COLORMODE1: - CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen); - memcpy(v, entry->data ,entry->components); - break; - case MNOTE_NIKON_TAG_TOTALPICTURES: - CF (entry->format, EXIF_FORMAT_LONG, v, maxlen); - CC (entry->components, 1, v, maxlen); - vl = exif_get_long (entry->data , entry->order); - snprintf (v, sizeof (v), "%lu", vl ); - break; case MNOTE_NIKON_TAG_WHITEBALANCE: - CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen); - memcpy(v, entry->data ,entry->components); - break; case MNOTE_NIKON_TAG_SHARPENING: - CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen); - memcpy(v, entry->data ,entry->components); - break; case MNOTE_NIKON_TAG_FOCUSMODE: - CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen); - memcpy(v, entry->data ,entry->components); - break; case MNOTE_NIKON_TAG_FLASHSETTING: - CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen); - memcpy(v, entry->data ,entry->components); - break; case MNOTE_NIKON_TAG_ISOSELECTION: - CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen); - memcpy(v, entry->data ,entry->components); - break; case MNOTE_NIKON_TAG_FLASHMODE: + case MNOTE_NIKON_TAG_IMAGEADJUSTMENT: + case MNOTE_NIKON_TAG_ADAPTER: CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen); - memcpy(v, entry->data ,entry->components); + memcpy(v, entry->data, MIN (maxlen, entry->components)); + break; + case MNOTE_NIKON_TAG_TOTALPICTURES: + CF (entry->format, EXIF_FORMAT_LONG, v, maxlen); + CC (entry->components, 1, v, maxlen); + vl = exif_get_long (entry->data, entry->order); + snprintf (v, maxlen, "%lu", vl ); break; case MNOTE_NIKON_TAG_WHITEBALANCEFINE: CF (entry->format, EXIF_FORMAT_SSHORT, v, maxlen); CC (entry->components, 1, v, maxlen); - vs = exif_get_short (entry->data, entry->order); - snprintf (v, sizeof (v), "%hd", vs); + vs = exif_get_short (entry->data, entry->order); + snprintf (v, maxlen, "%hd", vs); break; case MNOTE_NIKON_TAG_WHITEBALANCERB: CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); CC (entry->components, 4, v, maxlen); //vr = exif_get_rational (entry->data, entry->order); //if (vr.numerator == 0) { - // strncpy (v, _("Unknown"), sizeof (v)); + // strncpy (v, _("Unknown"), maxlen); //} //else { { @@ -161,25 +235,66 @@ vr = exif_get_rational (entry->data+8, entry->order); b = (1.0*vr.numerator) / vr.denominator; //printf("numerator %li, denominator %li\n", vr.numerator, vr.denominator); - snprintf (v, sizeof (v), "Red Correction %f, Blue Correction %f", r,b); + snprintf (v, maxlen, "Red Correction %f, Blue Correction %f", r,b); } break; - case MNOTE_NIKON_TAG_LENSTYPE: - CF (entry->format, EXIF_FORMAT_BYTE, v, maxlen); - CC (entry->components, 1, v, maxlen); - switch ( *( entry->data) ) { - case 0: snprintf (v, sizeof (v), "AF non D Lens"); break; - case 1: snprintf (v, sizeof (v), "manual"); break; - case 2: snprintf (v, sizeof (v), "AF-D or AF-S Lens"); break; - case 6: snprintf (v, sizeof (v), "AF-D G Lens"); break; - case 10: snprintf (v, sizeof (v), "AF-D VR Lens"); break; - default: snprintf (v, sizeof (v), "unknown Lens"); - } + case MNOTE_NIKON_TAG_AFFOCUSPOSITION: + CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen); + CC (entry->components, 4, v, maxlen); + switch ( *( entry->data+1) ) { + case 0: strncpy (v, "AF Position: Center", maxlen); break; + case 1: strncpy (v, "AF Position: Top", maxlen); break; + case 2: strncpy (v, "AF Position: Bottom", maxlen); break; + case 3: strncpy (v, "AF Position: Left", maxlen); break; + case 4: strncpy (v, "AF Position: Right", maxlen); break; + default: strncpy (v, "Unknown AF Position", maxlen); + } break; - case MNOTE_NIKON_TAG_LENS: - CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); - CC (entry->components, 4, v, maxlen); - { + case MNOTE_NIKON_TAG_LENSTYPE: + case MNOTE_NIKON_TAG_FLASHUSED: + case MNOTE_NIKON1_TAG_QUALITY: + case MNOTE_NIKON1_TAG_COLORMODE: + case MNOTE_NIKON1_TAG_IMAGEADJUSTMENT: + case MNOTE_NIKON1_TAG_CCDSENSITIVITY: + case MNOTE_NIKON1_TAG_WHITEBALANCE: + case MNOTE_OLYMPUS_TAG_QUALITY: + case MNOTE_OLYMPUS_TAG_MACRO: + case MNOTE_OLYMPUS_TAG_DIGIZOOM: + case MNOTE_OLYMPUS_TAG_FLASHMODE: + case MNOTE_OLYMPUS_TAG_SHARPNESS: + case MNOTE_OLYMPUS_TAG_CONTRAST: + case MNOTE_OLYMPUS_TAG_MANFOCUS: + /* search the tag */ + for (i = 0; (items[i].tag && items[i].tag != entry->tag); i++); + if (!items[i].tag) { + strncpy (v, "Internal error", maxlen); + break; + } + CF (entry->format, items[i].fmt, v, maxlen); + CC (entry->components, 1, v, maxlen); + switch (entry->format) { + case EXIF_FORMAT_BYTE: + case EXIF_FORMAT_UNDEFINED: + vs = entry->data[0]; + break; + case EXIF_FORMAT_SHORT: + vs = exif_get_short(entry->data, entry->order); + break; + } + /* find the value */ + for (j = 0; items[i].elem[j].string && + (items[i].elem[j].index < vs); j++); + if (items[i].elem[j].index != vs) { + snprintf (v, maxlen, "Unknown value %hi", vs); + break; + } + strncpy (v, items[i].elem[j].string, maxlen); + break; + + case MNOTE_NIKON_TAG_LENS: + CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); + CC (entry->components, 4, v, maxlen); + { float c,d; unsigned long a,b; vr = exif_get_rational (entry->data, entry->order); @@ -190,31 +305,9 @@ c = (1.0*vr.numerator) / vr.denominator; vr = exif_get_rational (entry->data+24, entry->order); d = (1.0*vr.numerator) / vr.denominator; - //printf("numerator %li, denominator %li\n", vr.numerator, vr.denominator); snprintf (v, sizeof (v), "%ld-%ldmm 1:%3.1f - %3.1f",a,b,c,d); - } - break; - case MNOTE_NIKON_TAG_FLASHUSED: - CF (entry->format, EXIF_FORMAT_BYTE, v, maxlen); - CC (entry->components, 1, v, maxlen); - switch ( *( entry->data) ) { - case 0: snprintf (v, sizeof (v), "Flash did not fire"); break; - case 4: snprintf (v, sizeof (v), "Flash unit unknown"); break; - case 7: snprintf (v, sizeof (v), "Flash is external"); break; - case 9: snprintf (v, sizeof (v), "Flash is on Camera"); break; - default: snprintf (v, sizeof (v), "unknown Flash status"); - } - break; - case MNOTE_NIKON_TAG_AFFOCUSPOSITION: - CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen); - CC (entry->components, 4, v, maxlen); - switch ( *( entry->data+1) ) { - case 0: snprintf (v, sizeof (v), "AF Position: Center"); break; - case 1: snprintf (v, sizeof (v), "AF Position: Top"); break; case 2: snprintf (v, sizeof (v), "AF Position: Bottom"); break; - case 3: snprintf (v, sizeof (v), "AF Position: Left"); break; - case 4: snprintf (v, sizeof (v), "AF Position: Right"); break; - default: snprintf (v, sizeof (v), "unknown AF Position"); - } - break; + //printf("numerator %li, denominator %li\n", vr.numerator, vr.denominator); snprintf (v, sizeof (v), "%ld-%ldmm 1:%3.1f - %3.1f",a,b,c,d); + } + break; /* Olympus */ case MNOTE_OLYMPUS_TAG_MODE: @@ -259,59 +352,11 @@ strncat (v, buf, maxlen - strlen (v)); } break; - case MNOTE_OLYMPUS_TAG_QUALITY: - CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen); - CC (entry->components, 1, v, maxlen); - vs = exif_get_short (entry->data, entry->order); - switch (vs) { - case 1: - strncpy (v, _("SQ"), maxlen); - break; - case 2: - strncpy (v, _("HQ"), maxlen); - break; - case 3: - strncpy (v, _("SHQ"), maxlen); - break; - default: - snprintf (v, maxlen, _("%i"), vs); - } - break; - case MNOTE_OLYMPUS_TAG_MACRO: - CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen); - CC (entry->components, 1, v, maxlen); - vs = exif_get_short (entry->data, entry->order); - switch (vs) { - case 0: - strncpy (v, _("no"), maxlen); - break; - case 1: - strncpy (v, _("yes"), maxlen); - break; - default: - snprintf (v, maxlen, _("%i"), vs); - } - break; case MNOTE_OLYMPUS_TAG_UNKNOWN_1: CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen); CC (entry->components, 1, v, maxlen); strncpy (v, _("Unknown tag."), maxlen); break; - case MNOTE_OLYMPUS_TAG_DIGIZOOM: - CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen); - CC (entry->components, 1, v, maxlen); - vs = exif_get_short (entry->data, entry->order); - switch (vs) { - case 0: - strncpy (v, _("1x"), maxlen); - break; - case 2: - strncpy (v, _("2x"), maxlen); - break; - default: - snprintf (v, maxlen, _("%i"), vs); - } - break; case MNOTE_OLYMPUS_TAG_UNKNOWN_2: CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); CC (entry->components, 1, v, maxlen); @@ -338,27 +383,6 @@ CF (entry->format, EXIF_FORMAT_LONG, v, maxlen); CC (entry->components, 30, v, maxlen); break; - case MNOTE_OLYMPUS_TAG_FLASHMODE: - CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen); - CC (entry->components, 1, v, maxlen); - vs = exif_get_short (entry->data, entry->order); - switch (vs) { - case 0: - strncpy (v, _("Auto"), maxlen); - break; - case 1: - strncpy (v, _("Red-eye reduction"), maxlen); - break; - case 2: - strncpy (v, _("Fill"), maxlen); - break; - case 3: - strncpy (v, _("Off"), maxlen); - break; - default: - snprintf (v, maxlen, _("%i"), vs); - } - break; case MNOTE_OLYMPUS_TAG_FOCUSDIST: CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); CC (entry->components, 1, v, maxlen); @@ -372,24 +396,6 @@ snprintf (v, maxlen, "%li mm", tmp); } break; - case MNOTE_OLYMPUS_TAG_SHARPNESS: - CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen); - CC (entry->components, 1, v, maxlen); - vs = exif_get_short (entry->data, entry->order); - switch (vs) { - case 0: - strncpy (v, _("Normal"), maxlen); - break; - case 1: - strncpy (v, _("Hard"), maxlen); - break; - case 2: - strncpy (v, _("Soft"), maxlen); - break; - default: - snprintf (v, maxlen, _("%i"), vs); - } - break; case MNOTE_OLYMPUS_TAG_WBALANCE: CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen); CC (entry->components, 2, v, maxlen); @@ -442,41 +448,26 @@ break; } break; - case MNOTE_OLYMPUS_TAG_CONTRAST: - CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen); - CC (entry->components, 1, v, maxlen); - vs = exif_get_short (entry->data, entry->order); - switch (vs) { - case 0: - strncpy (v, _("Hard"), maxlen); - break; - case 1: - strncpy (v, _("Normal"), maxlen); - break; - case 2: - strncpy (v, _("Soft"), maxlen); - break; - default: - snprintf (v, maxlen, "%i", vs); - } - break; - case MNOTE_OLYMPUS_TAG_MANFOCUS: - CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen); - CC (entry->components, 1, v, maxlen); - vs = exif_get_short (entry->data, entry->order); - switch (vs) { - case 0: - strncpy (v, _("No"), maxlen); - break; - case 1: - strncpy (v, _("Yes"), maxlen); - break; + default: + switch (entry->format) { + case EXIF_FORMAT_ASCII: + strncpy (v, entry->data, MIN (maxlen, entry->components)); + break; + case EXIF_FORMAT_SHORT: + vs = exif_get_short (entry->data, entry->order); + snprintf (v, maxlen, "%hi", vs); + break; + case EXIF_FORMAT_LONG: + vl = exif_get_long (entry->data, entry->order); + snprintf (v, maxlen, "%li", vl); + break; + case EXIF_FORMAT_UNDEFINED: default: - snprintf (v, maxlen, _("%i"), vs); + snprintf (v, maxlen, "%li bytes unknown data", + entry->size); + break; } break; - default: - break; } return (v); Index: mnote-olympus-tag.h =================================================================== RCS file: /cvsroot/libexif/libexif/libexif/olympus/mnote-olympus-tag.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- mnote-olympus-tag.h 4 May 2004 21:27:01 -0000 1.2 +++ mnote-olympus-tag.h 10 May 2004 12:28:48 -0000 1.3 @@ -27,55 +27,73 @@ enum _MnoteOlympusTag { - /* Nikon */ + /* Nikon v.2 */ MNOTE_NIKON_TAG_FIRMWARE = 0x0001, - MNOTE_NIKON_TAG_ISO = 0x0002, - MNOTE_NIKON_TAG_COLORMODE1 = 0x0003, - MNOTE_NIKON_TAG_QUALITY = 0x0004, - MNOTE_NIKON_TAG_WHITEBALANCE = 0x0005, - MNOTE_NIKON_TAG_SHARPENING = 0x0006, - MNOTE_NIKON_TAG_FOCUSMODE = 0x0007, - MNOTE_NIKON_TAG_FLASHSETTING = 0x0008, - MNOTE_NIKON_TAG_FLASHMODE = 0x0009, - MNOTE_NIKON_TAG_WHITEBALANCEFINE = 0x000b, - MNOTE_NIKON_TAG_WHITEBALANCERB = 0x000c, - MNOTE_NIKON_TAG_UNKNOWN_0X000D = 0x000d, - MNOTE_NIKON_TAG_EXPOSUREDIFF = 0x000e, - MNOTE_NIKON_TAG_ISOSELECTION = 0x000f, - MNOTE_NIKON_TAG_UNKNOWN_0X0011 = 0x0011, - MNOTE_NIKON_TAG_FLASHCOMPENSATION = 0x0012, - MNOTE_NIKON_TAG_ISO2 = 0x0013, - MNOTE_NIKON_TAG_UNKNOWN_0X0016 = 0x0016, - MNOTE_NIKON_TAG_UNKNOWN_0X0017 = 0x0017, - MNOTE_NIKON_TAG_UNKNOWN_0X0018 = 0x0018, - MNOTE_NIKON_TAG_UNKNOWN_0X0019 = 0x0019, - MNOTE_NIKON_TAG_TONECOMPENSATION = 0x0081, - MNOTE_NIKON_TAG_LENSTYPE = 0x0083, - MNOTE_NIKON_TAG_LENS = 0x0084, - MNOTE_NIKON_TAG_MANUALFOCUSDISTANCE = 0x0085, - MNOTE_NIKON_TAG_FLASHUSED = 0x0087, - MNOTE_NIKON_TAG_AFFOCUSPOSITION = 0x0088, - MNOTE_NIKON_TAG_BRACKETING = 0x0089, - MNOTE_NIKON_TAG_UNKNOWN_0X008A = 0x008a, - MNOTE_NIKON_TAG_UNKNOWN_0X008B = 0x008b, - MNOTE_NIKON_TAG_CURVE = 0x008c, - MNOTE_NIKON_TAG_COLORMODE = 0x008d, - MNOTE_NIKON_TAG_LIGHTYPE = 0x0090, - MNOTE_NIKON_TAG_UNKNOWN_0X0091 = 0x0091, - MNOTE_NIKON_TAG_HUE = 0x0092, - MNOTE_NIKON_TAG_NOISEREDUCTION = 0x0095, - MNOTE_NIKON_TAG_UNKNOWN_0X0097 = 0x0097, - MNOTE_NIKON_TAG_UNKNOWN_0X0098 = 0x0098, - MNOTE_NIKON_TAG_UNKNOWN_0X009A = 0x009a, - MNOTE_NIKON_TAG_UNKNOWN_0X00A0 = 0x00a0, - MNOTE_NIKON_TAG_UNKNOWN_0X00A2 = 0x00a2, - MNOTE_NIKON_TAG_UNKNOWN_0X00A3 = 0x00a3, - MNOTE_NIKON_TAG_TOTALPICTURES = 0x00a7, - MNOTE_NIKON_TAG_UNKNOWN_0X00A8 = 0x00a8, - MNOTE_NIKON_TAG_OPTIMIZATION = 0x00a9, - MNOTE_NIKON_TAG_UNKNOWN_0X00AA = 0x00aa, - MNOTE_NIKON_TAG_UNKNOWN_0X00AB = 0x00ab, - MNOTE_NIKON_TAG_CAPTUREEDITORDATA = 0x0e01, + MNOTE_NIKON_TAG_ISO = 0x0002, + MNOTE_NIKON_TAG_COLORMODE1 = 0x0003, + MNOTE_NIKON_TAG_QUALITY = 0x0004, + MNOTE_NIKON_TAG_WHITEBALANCE = 0x0005, + MNOTE_NIKON_TAG_SHARPENING = 0x0006, + MNOTE_NIKON_TAG_FOCUSMODE = 0x0007, + MNOTE_NIKON_TAG_FLASHSETTING = 0x0008, + MNOTE_NIKON_TAG_FLASHMODE = 0x0009, + MNOTE_NIKON_TAG_WHITEBALANCEFINE = 0x000b, + MNOTE_NIKON_TAG_WHITEBALANCERB = 0x000c, + MNOTE_NIKON_TAG_UNKNOWN_0X000D = 0x000d, + MNOTE_NIKON_TAG_EXPOSUREDIFF = 0x000e, + MNOTE_NIKON_TAG_ISOSELECTION = 0x000f, + MNOTE_NIKON_TAG_UNKNOWN_0X0011 = 0x0011, + MNOTE_NIKON_TAG_FLASHCOMPENSATION = 0x0012, + MNOTE_NIKON_TAG_ISO2 = 0x0013, + MNOTE_NIKON_TAG_UNKNOWN_0X0016 = 0x0016, + MNOTE_NIKON_TAG_UNKNOWN_0X0017 = 0x0017, + MNOTE_NIKON_TAG_UNKNOWN_0X0018 = 0x0018, + MNOTE_NIKON_TAG_UNKNOWN_0X0019 = 0x0019, + MNOTE_NIKON_TAG_IMAGEADJUSTMENT = 0x0080, + MNOTE_NIKON_TAG_TONECOMPENSATION = 0x0081, + MNOTE_NIKON_TAG_ADAPTER = 0x0082, + MNOTE_NIKON_TAG_LENSTYPE = 0x0083, + MNOTE_NIKON_TAG_LENS = 0x0084, + MNOTE_NIKON_TAG_MANUALFOCUSDISTANCE = 0x0085, + MNOTE_NIKON_TAG_DIGITALZOOM = 0x0086, + MNOTE_NIKON_TAG_FLASHUSED = 0x0087, + MNOTE_NIKON_TAG_AFFOCUSPOSITION = 0x0088, + MNOTE_NIKON_TAG_BRACKETING = 0x0089, + MNOTE_NIKON_TAG_UNKNOWN_0X008A = 0x008a, + MNOTE_NIKON_TAG_UNKNOWN_0X008B = 0x008b, + MNOTE_NIKON_TAG_CURVE = 0x008c, + MNOTE_NIKON_TAG_COLORMODE = 0x008d, + MNOTE_NIKON_TAG_LIGHTYPE = 0x0090, + MNOTE_NIKON_TAG_UNKNOWN_0X0091 = 0x0091, + MNOTE_NIKON_TAG_HUE = 0x0092, + MNOTE_NIKON_TAG_UNKNOWN_0X0094 = 0x0094, + MNOTE_NIKON_TAG_NOISEREDUCTION = 0x0095, + MNOTE_NIKON_TAG_UNKNOWN_0X0097 = 0x0097, + MNOTE_NIKON_TAG_UNKNOWN_0X0098 = 0x0098, + MNOTE_NIKON_TAG_UNKNOWN_0X009A = 0x009a, + MNOTE_NIKON_TAG_UNKNOWN_0X009B = 0x009b, + MNOTE_NIKON_TAG_UNKNOWN_0X00A0 = 0x00a0, + MNOTE_NIKON_TAG_UNKNOWN_0X00A2 = 0x00a2, + MNOTE_NIKON_TAG_UNKNOWN_0X00A3 = 0x00a3, + MNOTE_NIKON_TAG_TOTALPICTURES = 0x00a7, + MNOTE_NIKON_TAG_UNKNOWN_0X00A8 = 0x00a8, + MNOTE_NIKON_TAG_OPTIMIZATION = 0x00a9, + MNOTE_NIKON_TAG_UNKNOWN_0X00AA = 0x00aa, + MNOTE_NIKON_TAG_UNKNOWN_0X00AB = 0x00ab, + MNOTE_NIKON_TAG_CAPTUREEDITORDATA = 0x0e01, + + /* Nikon v1: real values + our proprietary base to distinguish from v2 */ + MNOTE_NIKON1_TAG_BASE = 0x8000, + MNOTE_NIKON1_TAG_UNKNOWN_0X0002 = 0x0002 + MNOTE_NIKON1_TAG_BASE, + MNOTE_NIKON1_TAG_QUALITY = 0x0003 + MNOTE_NIKON1_TAG_BASE, + MNOTE_NIKON1_TAG_COLORMODE = 0x0004 + MNOTE_NIKON1_TAG_BASE, + MNOTE_NIKON1_TAG_IMAGEADJUSTMENT = 0x0005 + MNOTE_NIKON1_TAG_BASE, + MNOTE_NIKON1_TAG_CCDSENSITIVITY = 0x0006 + MNOTE_NIKON1_TAG_BASE, + MNOTE_NIKON1_TAG_WHITEBALANCE = 0x0007 + MNOTE_NIKON1_TAG_BASE, + MNOTE_NIKON1_TAG_FOCUS = 0x0008 + MNOTE_NIKON1_TAG_BASE, + MNOTE_NIKON1_TAG_UNKNOWN_0X0009 = 0x0009 + MNOTE_NIKON1_TAG_BASE, + MNOTE_NIKON1_TAG_DIGITALZOOM = 0x000a + MNOTE_NIKON1_TAG_BASE, + MNOTE_NIKON1_TAG_CONVERTER = 0x000b + MNOTE_NIKON1_TAG_BASE, /* Olympus */ MNOTE_OLYMPUS_TAG_MODE = 0x0200, Index: mnote-olympus-tag.c =================================================================== RCS file: /cvsroot/libexif/libexif/libexif/olympus/mnote-olympus-tag.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- mnote-olympus-tag.c 4 May 2004 21:27:01 -0000 1.2 +++ mnote-olympus-tag.c 10 May 2004 12:28:48 -0000 1.3 @@ -32,54 +32,71 @@ const char *description; } table[] = { - /* Nikon */ - {MNOTE_NIKON_TAG_FIRMWARE, "Firmware", N_("Firmware Version"), ""}, - {MNOTE_NIKON_TAG_ISO, "ISO", N_("ISO Setting"), ""}, - {MNOTE_NIKON_TAG_COLORMODE1, "COLORMODE1", N_("Colormode (?)"), ""}, - {MNOTE_NIKON_TAG_QUALITY, "QUALITY", N_("Quality"), ""}, - {MNOTE_NIKON_TAG_WHITEBALANCE, "WHITEBALANCE", N_("Whitebalance"), ""}, - {MNOTE_NIKON_TAG_SHARPENING, "SHARPENING", N_("Image Sharpening"), ""}, - {MNOTE_NIKON_TAG_FOCUSMODE, "FOCUSMODE", N_("Focus Mode"), ""}, - {MNOTE_NIKON_TAG_FLASHSETTING, "FLASHSETTING", N_("Flash Setting"), ""}, - {MNOTE_NIKON_TAG_FLASHMODE, "FLASHMODE", N_("Flash Mode"), ""}, - {MNOTE_NIKON_TAG_WHITEBALANCEFINE,"WHITEBALANCEFINE",N_("Whitebalance fine ajustment"), ""}, - {MNOTE_NIKON_TAG_WHITEBALANCERB, "WHITEBALANCERB", N_("Whitebalance RB"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X000D, "UNKNOWN_0X000D", N_("Unknown tag 0x000d"), ""}, - {MNOTE_NIKON_TAG_ISOSELECTION, "ISOSELECTION", N_("Isoselection"), ""}, {MNOTE_NIKON_TAG_UNKNOWN_0X0011, "UNKNOWN_0X0011", N_("Unknown tag 0x0011"), ""}, - {MNOTE_NIKON_TAG_EXPOSUREDIFF, "EXPOSUREDIFF", N_("Exposurediff ?"), ""}, - {MNOTE_NIKON_TAG_FLASHCOMPENSATION, "FLASHCOMPENSATION", N_("Flashcompensation ?"), ""}, - {MNOTE_NIKON_TAG_ISO2, "ISO", N_("ISO Setting"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X0016, "UNKNOWN_0X0016", N_("Unknown tag 0x0016"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X0017, "UNKNOWN_0X0017", N_("Unknown tag 0x0017"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X0018, "UNKNOWN_0X0018", N_("Unknown tag 0x0018"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X0019, "UNKNOWN_0X0019", N_("Unknown tag 0x0019"), ""}, - {MNOTE_NIKON_TAG_TONECOMPENSATION, "TONECOMPENSATION", N_("Tonecompensation"), ""}, - {MNOTE_NIKON_TAG_LENSTYPE, "LENSTYPE", N_("Lenstype"), ""}, - {MNOTE_NIKON_TAG_LENS, "LENS", N_("Lens"), ""}, - {MNOTE_NIKON_TAG_MANUALFOCUSDISTANCE, "MANUALFOCUSDISTANCE", N_("Manual Focus Distance"), ""}, - {MNOTE_NIKON_TAG_FLASHUSED, "FLASHUSED", N_("Flash used"), ""}, - {MNOTE_NIKON_TAG_AFFOCUSPOSITION, "AFFOCUSPOSITION", N_("AF Focus position"), ""}, - {MNOTE_NIKON_TAG_BRACKETING, "BRACKETING", N_("Bracketing"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X008A, "UNKNOWN_0X008A", N_("Unknown tag 0x008a"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X008B, "UNKNOWN_0X008B", N_("Unknown tag 0x008b"), ""}, - {MNOTE_NIKON_TAG_CURVE, "CURVE,", N_("Contrast curve"), ""}, - {MNOTE_NIKON_TAG_COLORMODE, "COLORMODE,", N_("Colormode"), ""}, - {MNOTE_NIKON_TAG_LIGHTYPE, "LIGHTYPE,", N_("Lightype"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X0091, "UNKNOWN_0X0091", N_("Unknown tag 0x0091"), ""}, - {MNOTE_NIKON_TAG_HUE, "Hue,", N_("Hue Adjustment"), ""}, - {MNOTE_NIKON_TAG_NOISEREDUCTION , "NOISEREDUCTION,", N_("Noisereduction"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X0097, "UNKNOWN_0X0097", N_("Unknown tag 0x0097"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X0098, "UNKNOWN_0X0098", N_("Unknown tag 0x0098"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X009A, "UNKNOWN_0X009A", N_("Unknown tag 0x009a"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X00A0, "UNKNOWN_0X00A0", N_("Unknown tag 0x00a0"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X00A2, "UNKNOWN_0X00A2", N_("Unknown tag 0x00a2"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X00A3, "UNKNOWN_0X00A3", N_("Unknown tag 0x00a3"), ""}, - {MNOTE_NIKON_TAG_TOTALPICTURES , "TOTALPICTURES,", N_("Total number of pictures taken"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X00A8, "UNKNOWN_0X00A8", N_("Unknown tag 0x00a8"), ""}, - {MNOTE_NIKON_TAG_OPTIMIZATION , "OPTIMIZATION,", N_("Optimize Image"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X00AA, "UNKNOWN_0X00AA", N_("Unknown tag 0x00aa"), ""}, - {MNOTE_NIKON_TAG_UNKNOWN_0X00AB, "UNKNOWN_0X00AB", N_("Unknown tag 0x00ab"), ""}, - {MNOTE_NIKON_TAG_CAPTUREEDITORDATA, "CAPTUREEDITORDATA,", N_("Capture Editor Data"), ""}, + /* Nikon v2 */ + {MNOTE_NIKON_TAG_FIRMWARE, "Firmware", N_("Firmware Version"), ""}, + {MNOTE_NIKON_TAG_ISO, "ISO", N_("ISO Setting"), ""}, + {MNOTE_NIKON_TAG_COLORMODE1, "COLORMODE1", N_("Colormode (?)"), ""}, + {MNOTE_NIKON_TAG_QUALITY, "QUALITY", N_("Quality"), ""}, + {MNOTE_NIKON_TAG_WHITEBALANCE, "WHITEBALANCE", N_("Whitebalance"), ""}, + {MNOTE_NIKON_TAG_SHARPENING, "SHARPENING", N_("Image Sharpening"), ""}, + {MNOTE_NIKON_TAG_FOCUSMODE, "FOCUSMODE", N_("Focus Mode"), ""}, + {MNOTE_NIKON_TAG_FLASHSETTING, "FLASHSETTING", N_("Flash Setting"), ""}, + {MNOTE_NIKON_TAG_FLASHMODE, "FLASHMODE", N_("Flash Mode"), ""}, + {MNOTE_NIKON_TAG_WHITEBALANCEFINE,"WHITEBALANCEFINE",N_("Whitebalance fine ajustment"), ""}, + {MNOTE_NIKON_TAG_WHITEBALANCERB, "WHITEBALANCERB", N_("Whitebalance RB"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X000D, "UNKNOWN_0X000D", N_("Unknown tag 0x000d"), ""}, + {MNOTE_NIKON_TAG_ISOSELECTION, "ISOSELECTION", N_("Isoselection"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X0011, "UNKNOWN_0X0011", N_("Unknown tag 0x0011"), ""}, + {MNOTE_NIKON_TAG_EXPOSUREDIFF, "EXPOSUREDIFF", N_("Exposurediff ?"), ""}, + {MNOTE_NIKON_TAG_FLASHCOMPENSATION, "FLASHCOMPENSATION", N_("Flashcompensation ?"), ""}, + {MNOTE_NIKON_TAG_ISO2, "ISO", N_("ISO Setting"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X0016, "UNKNOWN_0X0016", N_("Unknown tag 0x0016"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X0017, "UNKNOWN_0X0017", N_("Unknown tag 0x0017"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X0018, "UNKNOWN_0X0018", N_("Unknown tag 0x0018"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X0019, "UNKNOWN_0X0019", N_("Unknown tag 0x0019"), ""}, + {MNOTE_NIKON_TAG_IMAGEADJUSTMENT, "ImageAdjustment", N_("Image Adjustment"), ""}, + {MNOTE_NIKON_TAG_TONECOMPENSATION, "TONECOMPENSATION", N_("Tonecompensation"), ""}, + {MNOTE_NIKON_TAG_ADAPTER, "Adapter", N_("Adapter"), ""}, + {MNOTE_NIKON_TAG_LENSTYPE, "LENSTYPE", N_("Lenstype"), ""}, + {MNOTE_NIKON_TAG_LENS, "LENS", N_("Lens"), ""}, + {MNOTE_NIKON_TAG_MANUALFOCUSDISTANCE, "MANUALFOCUSDISTANCE", N_("Manual Focus Distance"), ""}, + {MNOTE_NIKON_TAG_DIGITALZOOM, "DigitalZoom", N_("Digital Zoom"), ""}, + {MNOTE_NIKON_TAG_FLASHUSED, "FLASHUSED", N_("Flash used"), ""}, + {MNOTE_NIKON_TAG_AFFOCUSPOSITION, "AFFOCUSPOSITION", N_("AF Focus position"), ""}, + {MNOTE_NIKON_TAG_BRACKETING, "BRACKETING", N_("Bracketing"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X008A, "UNKNOWN_0X008A", N_("Unknown tag 0x008a"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X008B, "UNKNOWN_0X008B", N_("Unknown tag 0x008b"), ""}, + {MNOTE_NIKON_TAG_CURVE, "CURVE,", N_("Contrast curve"), ""}, + {MNOTE_NIKON_TAG_COLORMODE, "COLORMODE,", N_("Colormode"), ""}, + {MNOTE_NIKON_TAG_LIGHTYPE, "LIGHTYPE,", N_("Lightype"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X0091, "UNKNOWN_0X0091", N_("Unknown tag 0x0091"), ""}, + {MNOTE_NIKON_TAG_HUE, "Hue,", N_("Hue Adjustment"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X0094, "UNKNOWN_0X0094", N_("Unknown tag 0x0094"), ""}, + {MNOTE_NIKON_TAG_NOISEREDUCTION, "NOISEREDUCTION,", N_("Noisereduction"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X0097, "UNKNOWN_0X0097", N_("Unknown tag 0x0097"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X0098, "UNKNOWN_0X0098", N_("Unknown tag 0x0098"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X009A, "UNKNOWN_0X009A", N_("Unknown tag 0x009a"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X009B, "UNKNOWN_0X009B", N_("Unknown tag 0x009b"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X00A0, "UNKNOWN_0X00A0", N_("Unknown tag 0x00a0"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X00A2, "UNKNOWN_0X00A2", N_("Unknown tag 0x00a2"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X00A3, "UNKNOWN_0X00A3", N_("Unknown tag 0x00a3"), ""}, + {MNOTE_NIKON_TAG_TOTALPICTURES, "TOTALPICTURES,", N_("Total number of pictures taken"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X00A8, "UNKNOWN_0X00A8", N_("Unknown tag 0x00a8"), ""}, + {MNOTE_NIKON_TAG_OPTIMIZATION, "OPTIMIZATION,", N_("Optimize Image"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X00AA, "UNKNOWN_0X00AA", N_("Unknown tag 0x00aa"), ""}, + {MNOTE_NIKON_TAG_UNKNOWN_0X00AB, "UNKNOWN_0X00AB", N_("Unknown tag 0x00ab"), ""}, + {MNOTE_NIKON_TAG_CAPTUREEDITORDATA, "CAPTUREEDITORDATA,", N_("Capture Editor Data"), ""}, + + {MNOTE_NIKON1_TAG_UNKNOWN_0X0002, "UNKNOWN_0X0002", N_("Unknown tag 0x0002"), ""}, + {MNOTE_NIKON1_TAG_QUALITY, "QUALITY", N_("Quality"), ""}, + {MNOTE_NIKON1_TAG_COLORMODE, "COLORMODE,", N_("Colormode"), ""}, + {MNOTE_NIKON1_TAG_IMAGEADJUSTMENT, "ImageAdjustment", N_("Image Adjustment"), ""}, + {MNOTE_NIKON1_TAG_CCDSENSITIVITY, "CCDSensitivity", N_("CCD Sensitivity"), ""}, + {MNOTE_NIKON1_TAG_WHITEBALANCE, "WhiteBalance", N_("Whitebalance"), ""}, + {MNOTE_NIKON1_TAG_FOCUS, "Focus", N_("Focus"), ""}, + {MNOTE_NIKON1_TAG_UNKNOWN_0X0009, "UNKNOWN_0X0009", N_("Unknown tag 0x0009"), ""}, + {MNOTE_NIKON1_TAG_DIGITALZOOM, "DigitalZoom", N_("Digital Zoom"), ""}, + {MNOTE_NIKON1_TAG_CONVERTER, "Converter", N_("Converter"), ""}, /* Olympus */ {MNOTE_OLYMPUS_TAG_MODE, "Mode", N_("Speed/Sequence/Panorama direction"), ""}, Index: exif-mnote-data-olympus.c =================================================================== RCS file: /cvsroot/libexif/libexif/libexif/olympus/exif-mnote-data-olympus.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- exif-mnote-data-olympus.c 5 May 2004 18:02:23 -0000 1.10 +++ exif-mnote-data-olympus.c 10 May 2004 12:28:48 -0000 1.11 @@ -120,7 +120,7 @@ { ExifMnoteDataOlympus *n = (ExifMnoteDataOlympus *) en; ExifShort c; - unsigned int i, s, o; + unsigned int i, s, o, o2, datao = 6, base = 0; if (!n || !buf) return; @@ -129,15 +129,42 @@ * a size of 22 bytes (6 for 'OLYMP', 2 other bytes, 2 for the * number of entries, and 12 for one entry. * - * Nikon headers start with "Nikon". + * Nikon v1 headers start with "Nikon", 0, 1, 0, number_of_tags, + * or just with number_of_tags (models D1H, D1X...). + * Nikon v2 headers start with "Nikon", 0, 2, 0, 0, 0, "MM", 0, 0x2A + * or "Nikon", 0, 2, 0, 0, 0, "II", 0x2A, 0. */ - if (buf_size - n->offset - 6 < 5) return; - if (memcmp (buf + 6 + n->offset, "Nikon", 5) && - memcmp (buf + 6 + n->offset, "OLYMP", 5)) return; if (buf_size - n->offset < 22) return; + if (!memcmp (buf + 6 + n->offset, "OLYMP", 5)) { + o2 = 6 + n->offset + 8 + 2; + c = exif_get_short (buf + 6 + n->offset + 8, n->order); + } else if (!memcmp (buf + 6 + n->offset, "Nikon", 5)) { + o2 = 6 + n->offset + 8 + 2; + datao = o2; + if (!memcmp(buf + o2 - 4, "\2\0\0\0II\x2A\0", 8)) { + n->order = EXIF_BYTE_ORDER_INTEL; + o2 += exif_get_long(buf + o2 + 4, n->order); + } else if (!memcmp(buf + o2 - 4, "\2\0\0\0MM\0\x2A", 8)) { + n->order = EXIF_BYTE_ORDER_MOTOROLA; + o2 += exif_get_long(buf + o2 + 4, n->order); + } else if (!memcmp(buf + o2 - 4, "\1\0", 2)) { + o2 -= 2; + base = MNOTE_NIKON1_TAG_BASE; + } else { + return; + } + if (o2 + 2 > buf_size) return; + c = exif_get_short (buf + o2, n->order); + o2 += 2; + } else if (!memcmp (buf + 6 + n->offset, "\0\x1b", 2)) { + o2 = 6 + n->offset; + c = exif_get_short (buf + o2, n->order); + o2 += 2; + } else { + return; + } /* Read the number of entries and remove old ones. */ - c = exif_get_short (buf + 6 + n->offset + 8, n->order); exif_mnote_data_olympus_clear (n); n->entries = malloc (sizeof (MnoteOlympusEntry) * c); @@ -145,11 +172,11 @@ /* Parse the entries */ for (i = 0; i < c; i++) { - o = 6 + n->offset + 8 + 2 + 12 * i; + o = o2 + 12 * i; if (o + 12 > buf_size) return; n->count = i + 1; - n->entries[i].tag = exif_get_short (buf + o, n->order); + n->entries[i].tag = exif_get_short (buf + o, n->order) + base; n->entries[i].format = exif_get_short (buf + o + 2, n->order); n->entries[i].components = exif_get_long (buf + o + 4, n->order); n->entries[i].order = n->order; @@ -162,7 +189,7 @@ n->entries[i].components; if (!s) return; o += 8; - if (s > 4) o = exif_get_long (buf + o, n->order) + 6; + if (s > 4) o = exif_get_long (buf + o, n->order) + datao; if (o + s > buf_size) return; /* Sanity check */ |