Add a new parsing regression test.
authorDan Fandrich <dan@coneharvesters.com>
Fri, 1 Jun 2018 18:17:43 +0000 (20:17 +0200)
committerDan Fandrich <dan@coneharvesters.com>
Tue, 3 Jul 2018 13:28:39 +0000 (15:28 +0200)
This is intended as a fast check that all tags, including MakerNotes, can be
parsed.  It is not intended to replace the much more complete tests in
libexif-testsuite, but rather add some basic parsing test coverage without
having to download and configure a separate repository. As more tags are
identified and supported in the library in the future, the golden test files
will need to be updated to match.

The input files cover all four major MakerNote types supported by libexif and a
large proportion of the variants within those types.  The test files have had
their JPEG image data stripped out to make them smaller (which also makes them
noncompliant) but it's good enough for libexif to read the tags as well as some
other EXIF tools that don't care about the image.

Patch from Google.

21 files changed:
test/Makefile.am
test/parse-regression.sh [new file with mode: 0755]
test/test-parse.c
test/testdata/canon_makernote_variant_1.jpg [new file with mode: 0644]
test/testdata/canon_makernote_variant_1.jpg.parsed [new file with mode: 0644]
test/testdata/fuji_makernote_variant_1.jpg [new file with mode: 0644]
test/testdata/fuji_makernote_variant_1.jpg.parsed [new file with mode: 0644]
test/testdata/olympus_makernote_variant_2.jpg [new file with mode: 0644]
test/testdata/olympus_makernote_variant_2.jpg.parsed [new file with mode: 0644]
test/testdata/olympus_makernote_variant_3.jpg [new file with mode: 0644]
test/testdata/olympus_makernote_variant_3.jpg.parsed [new file with mode: 0644]
test/testdata/olympus_makernote_variant_4.jpg [new file with mode: 0644]
test/testdata/olympus_makernote_variant_4.jpg.parsed [new file with mode: 0644]
test/testdata/olympus_makernote_variant_5.jpg [new file with mode: 0644]
test/testdata/olympus_makernote_variant_5.jpg.parsed [new file with mode: 0644]
test/testdata/pentax_makernote_variant_2.jpg [new file with mode: 0644]
test/testdata/pentax_makernote_variant_2.jpg.parsed [new file with mode: 0644]
test/testdata/pentax_makernote_variant_3.jpg [new file with mode: 0644]
test/testdata/pentax_makernote_variant_3.jpg.parsed [new file with mode: 0644]
test/testdata/pentax_makernote_variant_4.jpg [new file with mode: 0644]
test/testdata/pentax_makernote_variant_4.jpg.parsed [new file with mode: 0644]

index a0e0566..57ec617 100644 (file)
@@ -4,18 +4,19 @@ SUBDIRS = nls
 #  - Add "small" tests and stuff here.
 #  - Add "big"   tests and stuff to explicitly test for (fixed) bugs
 #    to libexif-testsuite:
-#    * We don't want to force people to download dozens of test images
-#      just for one small library.
+#    * We don't want to force people to download dozens of big test images
+#      just for one small library. The ones included here are carefully chosen
+#      as a basic self-contained regression test set.
 #    * Proper testing is done with the "exif" program in libexif-testsuite.
 #      And this is just the lib - we don't have the program available
 #      here yet.
 
-TESTS = test-mem test-value test-integers test-parse test-tagtable test-sorted test-fuzzer
-
-TEST_IMAGES = $(top_srcdir)/daniel-andrews-sample.jpg
-export TEST_IMAGES
+TESTS = test-mem test-value test-integers test-parse test-tagtable test-sorted \
+       test-fuzzer parse-regression.sh
 
 check_PROGRAMS = test-mem test-mnote test-value test-integers test-parse \
        test-tagtable test-sorted test-fuzzer
 
 LDADD = $(top_builddir)/libexif/libexif.la $(LTLIBINTL)
+
+EXTRA_DIST = parse-regression.sh
diff --git a/test/parse-regression.sh b/test/parse-regression.sh
new file mode 100755 (executable)
index 0000000..b18db59
--- /dev/null
@@ -0,0 +1,17 @@
+#!/bin/sh
+# Parses test EXIF files and compares the results to that expected
+srcdir="${srcdir:-.}"
+TMPLOG="$(mktemp)"
+trap 'rm -f "${TMPLOG}"' 0
+# Ensure that names are untranslated
+LANG=
+LANGUAGE=
+LC_ALL=C
+export LANG LANGUAGE LC_ALL
+for fn in "${srcdir}"/testdata/*.jpg ; do
+    ./test-parse "${fn}" > "${TMPLOG}"
+    if ! diff "${fn}".parsed "${TMPLOG}"; then
+        echo Error parsing "$fn"
+        exit 1
+    fi
+done
index 83889e6..388f739 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 
+static unsigned entry_count;
 
 /** Callback function handling an ExifEntry. */
-void content_foreach_func(ExifEntry *entry, void *callback_data);
-void content_foreach_func(ExifEntry *entry, void *UNUSED(callback_data))
+static void content_foreach_func(ExifEntry *entry, void *UNUSED(callback_data))
 {
   char buf[2000];
   exif_entry_get_value(entry, buf, sizeof(buf));
-  printf("    Entry %p: %s (%s)\n"
+  printf("    Entry %u: %s (%s)\n"
         "      Size, Comps: %d, %d\n"
         "      Value: %s\n", 
-        entry,
+        entry_count,
         exif_tag_get_name(entry->tag),
         exif_format_get_name(entry->format),
         entry->size,
         (int)(entry->components),
         exif_entry_get_value(entry, buf, sizeof(buf)));
+  ++entry_count;
 }
 
 
 /** Callback function handling an ExifContent (corresponds 1:1 to an IFD). */
-void data_foreach_func(ExifContent *content, void *callback_data);
-void data_foreach_func(ExifContent *content, void *callback_data)
+static void data_foreach_func(ExifContent *content, void *callback_data)
 {
-  printf("  Content %p: ifd=%d\n", content, exif_content_get_ifd(content));
+  static unsigned content_count;
+  entry_count = 0;
+  printf("  Content %u: ifd=%d\n", content_count, exif_content_get_ifd(content));
   exif_content_foreach_entry(content, content_foreach_func, callback_data);
+  ++content_count;
 }
 
+static void dump_makernote(ExifData *d) {
+  ExifMnoteData *mn = exif_data_get_mnote_data(d);
+  if (mn) {
+    char buf[2000];
+    int i;
+    int num = exif_mnote_data_count(mn);
+    printf("  MakerNote\n");
+    for (i=0; i < num; ++i) {
+      if (exif_mnote_data_get_value(mn, i, buf, sizeof(buf))) {
+       const char *title = exif_mnote_data_get_title(mn, i);
+       unsigned int id = exif_mnote_data_get_id(mn, i);
+       if (!title)
+           title = "(unknown)";
+       printf("    Entry %u: %u, %s\n"
+              "      Size: %u\n", i, id, title, strlen(buf));
+      }
+    }
+  }
+}
 
 /** Run EXIF parsing test on the given file. */
-void test_parse(const char *filename, void *callback_data);
-void test_parse(const char *filename, void *callback_data)
+static void test_parse(const char *filename, void *callback_data)
 {
   ExifData *d;
-  printf("File %s\n", filename);
+
+  /* Skip over path to display only the file name */
+  const char *fn = strrchr(filename, '/');
+  if (fn)
+    ++fn;
+  else
+    fn = filename;
+  printf("File %s\n", fn);
 
   d = exif_data_new_from_file(filename);
   exif_data_foreach_content(d, data_foreach_func, callback_data);
+
+  dump_makernote(d);
+
   exif_data_unref(d);
 }
 
@@ -73,8 +104,7 @@ typedef void (*test_parse_func) (const char *filename, void *callback_data);
 
 
 /** Split string at whitespace and call callback with each substring. */
-void split_ws_string(const char *string, test_parse_func func, void *callback_data);
-void split_ws_string(const char *string, test_parse_func func, void *callback_data)
+static void split_ws_string(const char *string, test_parse_func func, void *callback_data)
 {
   const char *start = string;
   const char *p = start;
@@ -109,13 +139,17 @@ int main(const int argc, const char *argv[])
   int i;
   void *callback_data = NULL;
 
-  const char *envar = getenv("TEST_IMAGES");
-  if (envar) {
-    split_ws_string(envar, test_parse, callback_data);
-  }
-
-  for (i=1; i<argc; i++) {
-    test_parse(argv[i], callback_data);
+  if (argc > 1) {
+    for (i=1; i<argc; i++) {
+      test_parse(argv[i], callback_data);
+    }
+  } else {
+    /* If no command-line argument is found, get the file names from
+       the environment. */
+    const char *envar = getenv("TEST_IMAGES");
+    if (envar) {
+      split_ws_string(envar, test_parse, callback_data);
+    }
   }
 
   return 0;
diff --git a/test/testdata/canon_makernote_variant_1.jpg b/test/testdata/canon_makernote_variant_1.jpg
new file mode 100644 (file)
index 0000000..1eb37d0
Binary files /dev/null and b/test/testdata/canon_makernote_variant_1.jpg differ
diff --git a/test/testdata/canon_makernote_variant_1.jpg.parsed b/test/testdata/canon_makernote_variant_1.jpg.parsed
new file mode 100644 (file)
index 0000000..41911bc
--- /dev/null
@@ -0,0 +1,337 @@
+File canon_makernote_variant_1.jpg
+  Content 0: ifd=0
+    Entry 0: Make (ASCII)
+      Size, Comps: 6, 6
+      Value: Canon
+    Entry 1: Model (ASCII)
+      Size, Comps: 20, 20
+      Value: Canon PowerShot S70
+    Entry 2: Orientation (Short)
+      Size, Comps: 2, 1
+      Value: Right-top
+    Entry 3: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 180
+    Entry 4: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 180
+    Entry 5: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+    Entry 6: DateTime (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:10:10 16:42:32
+    Entry 7: YCbCrPositioning (Short)
+      Size, Comps: 2, 1
+      Value: Centered
+  Content 1: ifd=1
+    Entry 0: Compression (Short)
+      Size, Comps: 2, 1
+      Value: JPEG compression
+    Entry 1: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 180
+    Entry 2: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 180
+    Entry 3: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+  Content 2: ifd=2
+    Entry 0: ExposureTime (Rational)
+      Size, Comps: 8, 1
+      Value: 1 sec.
+    Entry 1: FNumber (Rational)
+      Size, Comps: 8, 1
+      Value: f/2.8
+    Entry 2: ExifVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: Exif Version 2.2
+    Entry 3: DateTimeOriginal (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:10:10 16:42:32
+    Entry 4: DateTimeDigitized (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:10:10 16:42:32
+    Entry 5: ComponentsConfiguration (Undefined)
+      Size, Comps: 4, 4
+      Value: Y Cb Cr -
+    Entry 6: CompressedBitsPerPixel (Rational)
+      Size, Comps: 8, 1
+      Value:  5
+    Entry 7: ShutterSpeedValue (SRational)
+      Size, Comps: 8, 1
+      Value: 0.00 EV (1 sec.)
+    Entry 8: ApertureValue (Rational)
+      Size, Comps: 8, 1
+      Value: 2.97 EV (f/2.8)
+    Entry 9: ExposureBiasValue (SRational)
+      Size, Comps: 8, 1
+      Value: 0.00 EV
+    Entry 10: MaxApertureValue (Rational)
+      Size, Comps: 8, 1
+      Value: 2.97 EV (f/2.8)
+    Entry 11: MeteringMode (Short)
+      Size, Comps: 2, 1
+      Value: Pattern
+    Entry 12: Flash (Short)
+      Size, Comps: 2, 1
+      Value: Flash did not fire, compulsory flash mode
+    Entry 13: FocalLength (Rational)
+      Size, Comps: 8, 1
+      Value: 5.8 mm
+    Entry 14: MakerNote (Undefined)
+      Size, Comps: 904, 904
+      Value: 904 bytes undefined data
+    Entry 15: UserComment (Undefined)
+      Size, Comps: 264, 264
+      Value: 
+    Entry 16: FlashPixVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: FlashPix Version 1.0
+    Entry 17: ColorSpace (Short)
+      Size, Comps: 2, 1
+      Value: sRGB
+    Entry 18: PixelXDimension (Short)
+      Size, Comps: 2, 1
+      Value: 640
+    Entry 19: PixelYDimension (Short)
+      Size, Comps: 2, 1
+      Value: 480
+    Entry 20: FocalPlaneXResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 2253.521
+    Entry 21: FocalPlaneYResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 2253.521
+    Entry 22: FocalPlaneResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+    Entry 23: SensingMethod (Short)
+      Size, Comps: 2, 1
+      Value: One-chip color area sensor
+    Entry 24: FileSource (Undefined)
+      Size, Comps: 1, 1
+      Value: DSC
+    Entry 25: CustomRendered (Short)
+      Size, Comps: 2, 1
+      Value: Normal process
+    Entry 26: ExposureMode (Short)
+      Size, Comps: 2, 1
+      Value: Auto exposure
+    Entry 27: WhiteBalance (Short)
+      Size, Comps: 2, 1
+      Value: Auto white balance
+    Entry 28: DigitalZoomRatio (Rational)
+      Size, Comps: 8, 1
+      Value: 1.0000
+    Entry 29: SceneCaptureType (Short)
+      Size, Comps: 2, 1
+      Value: Landscape
+  Content 3: ifd=3
+  Content 4: ifd=4
+    Entry 0: InteroperabilityIndex (ASCII)
+      Size, Comps: 4, 4
+      Value: R98
+    Entry 1: InteroperabilityVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: 0100
+    Entry 2: RelatedImageWidth (Short)
+      Size, Comps: 2, 1
+      Value: 640
+    Entry 3: RelatedImageLength (Short)
+      Size, Comps: 2, 1
+      Value: 480
+  MakerNote
+    Entry 0: 1, Macro Mode
+      Size: 6
+    Entry 1: 1, Self-timer
+      Size: 3
+    Entry 2: 1, Quality
+      Size: 9
+    Entry 3: 1, Flash Mode
+      Size: 3
+    Entry 4: 1, Drive Mode
+      Size: 6
+    Entry 5: 1, (unknown)
+      Size: 6
+    Entry 6: 1, Focus Mode
+      Size: 6
+    Entry 7: 1, (unknown)
+      Size: 6
+    Entry 8: 1, Record Mode
+      Size: 4
+    Entry 9: 1, Image Size
+      Size: 5
+    Entry 10: 1, Easy Shooting Mode
+      Size: 9
+    Entry 11: 1, Digital Zoom
+      Size: 4
+    Entry 12: 1, Contrast
+      Size: 6
+    Entry 13: 1, Saturation
+      Size: 6
+    Entry 14: 1, Sharpness
+      Size: 6
+    Entry 15: 1, ISO
+      Size: 4
+    Entry 16: 1, Metering Mode
+      Size: 10
+    Entry 17: 1, Focus Range
+      Size: 4
+    Entry 18: 1, AF Point
+      Size: 23
+    Entry 19: 1, Exposure Mode
+      Size: 13
+    Entry 20: 1, (unknown)
+      Size: 6
+    Entry 21: 1, Lens Type
+      Size: 6
+    Entry 22: 1, Long Focal Length of Lens
+      Size: 3
+    Entry 23: 1, Short Focal Length of Lens
+      Size: 3
+    Entry 24: 1, Focal Units per mm
+      Size: 2
+    Entry 25: 1, Maximal Aperture
+      Size: 4
+    Entry 26: 1, Minimal Aperture
+      Size: 4
+    Entry 27: 1, Flash Activity
+      Size: 6
+    Entry 28: 1, Flash Details
+      Size: 0
+    Entry 29: 1, (unknown)
+      Size: 6
+    Entry 30: 1, (unknown)
+      Size: 6
+    Entry 31: 1, Focus Mode
+      Size: 6
+    Entry 32: 1, AE Setting
+      Size: 9
+    Entry 33: 1, Image Stabilization
+      Size: 6
+    Entry 34: 1, Display Aperture
+      Size: 4
+    Entry 35: 1, Zoom Source Width
+      Size: 4
+    Entry 36: 1, Zoom Target Width
+      Size: 4
+    Entry 37: 1, (unknown)
+      Size: 6
+    Entry 38: 1, (unknown)
+      Size: 6
+    Entry 39: 1, Photo Effect
+      Size: 3
+    Entry 40: 1, Manual Flash Output
+      Size: 3
+    Entry 41: 1, Color Tone
+      Size: 6
+    Entry 42: 1, (unknown)
+      Size: 6
+    Entry 43: 1, (unknown)
+      Size: 6
+    Entry 44: 1, (unknown)
+      Size: 6
+    Entry 45: 2, Focal Type
+      Size: 4
+    Entry 46: 2, Focal Length
+      Size: 3
+    Entry 47: 2, Focal Plane X Size
+      Size: 7
+    Entry 48: 2, Focal Plane Y Size
+      Size: 7
+    Entry 49: 3, (unknown)
+      Size: 0
+    Entry 50: 4, Auto ISO
+      Size: 5
+    Entry 51: 4, Shot ISO
+      Size: 2
+    Entry 52: 4, Measured EV
+      Size: 8
+    Entry 53: 4, Target Aperture
+      Size: 4
+    Entry 54: 4, Target Exposure Time
+      Size: 1
+    Entry 55: 4, Exposure Compensation
+      Size: 7
+    Entry 56: 4, White Balance
+      Size: 4
+    Entry 57: 4, Slow Shutter
+      Size: 3
+    Entry 58: 4, Sequence Number
+      Size: 1
+    Entry 59: 4, (unknown)
+      Size: 6
+    Entry 60: 4, (unknown)
+      Size: 6
+    Entry 61: 4, (unknown)
+      Size: 6
+    Entry 62: 4, Flash Guide Number
+      Size: 4
+    Entry 63: 4, AF Point
+      Size: 6
+    Entry 64: 4, Flash Exposure Compensation
+      Size: 7
+    Entry 65: 4, AE Bracketing
+      Size: 3
+    Entry 66: 4, AE Bracket Value
+      Size: 7
+    Entry 67: 4, (unknown)
+      Size: 6
+    Entry 68: 4, Focus Distance Upper
+      Size: 7
+    Entry 69: 4, Focus Distance Lower
+      Size: 4
+    Entry 70: 4, F-Number
+      Size: 4
+    Entry 71: 4, Exposure Time
+      Size: 1
+    Entry 72: 4, (unknown)
+      Size: 6
+    Entry 73: 4, Bulb Duration
+      Size: 6
+    Entry 74: 4, (unknown)
+      Size: 6
+    Entry 75: 4, Camera Type
+      Size: 7
+    Entry 76: 4, Auto Rotate
+      Size: 12
+    Entry 77: 4, ND Filter
+      Size: 3
+    Entry 78: 4, Self-timer
+      Size: 3
+    Entry 79: 4, (unknown)
+      Size: 6
+    Entry 80: 4, (unknown)
+      Size: 6
+    Entry 81: 4, (unknown)
+      Size: 6
+    Entry 82: 4, Manual Flash Output
+      Size: 3
+    Entry 83: 0, (unknown)
+      Size: 0
+    Entry 84: 0, (unknown)
+      Size: 0
+    Entry 85: 18, (unknown)
+      Size: 0
+    Entry 86: 19, (unknown)
+      Size: 0
+    Entry 87: 6, Image Type
+      Size: 22
+    Entry 88: 7, Firmware Version
+      Size: 21
+    Entry 89: 8, Image Number
+      Size: 8
+    Entry 90: 9, Owner Name
+      Size: 0
+    Entry 91: 16, (unknown)
+      Size: 0
+    Entry 92: 0, (unknown)
+      Size: 0
+    Entry 93: 24, (unknown)
+      Size: 0
+    Entry 94: 25, (unknown)
+      Size: 0
+    Entry 95: 13, (unknown)
+      Size: 0
diff --git a/test/testdata/fuji_makernote_variant_1.jpg b/test/testdata/fuji_makernote_variant_1.jpg
new file mode 100644 (file)
index 0000000..75e0371
Binary files /dev/null and b/test/testdata/fuji_makernote_variant_1.jpg differ
diff --git a/test/testdata/fuji_makernote_variant_1.jpg.parsed b/test/testdata/fuji_makernote_variant_1.jpg.parsed
new file mode 100644 (file)
index 0000000..e12e7ef
--- /dev/null
@@ -0,0 +1,227 @@
+File fuji_makernote_variant_1.jpg
+  Content 0: ifd=0
+    Entry 0: Make (ASCII)
+      Size, Comps: 9, 9
+      Value: FUJIFILM
+    Entry 1: Model (ASCII)
+      Size, Comps: 14, 14
+      Value: FinePix Z33WP
+    Entry 2: Orientation (Short)
+      Size, Comps: 2, 1
+      Value: Top-left
+    Entry 3: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 4: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 5: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+    Entry 6: Software (ASCII)
+      Size, Comps: 37, 37
+      Value: Digital Camera FinePix Z33WP Ver1.01
+    Entry 7: DateTime (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:03:25 03:27:25
+    Entry 8: YCbCrPositioning (Short)
+      Size, Comps: 2, 1
+      Value: Co-sited
+    Entry 9: Copyright (ASCII)
+      Size, Comps: 5, 5
+      Value: [None] (Photographer) - [None] (Editor)
+    Entry 10: PrintImageMatching (Undefined)
+      Size, Comps: 28, 28
+      Value: 28 bytes undefined data
+  Content 1: ifd=1
+    Entry 0: Compression (Short)
+      Size, Comps: 2, 1
+      Value: JPEG compression
+    Entry 1: Orientation (Short)
+      Size, Comps: 2, 1
+      Value: Top-left
+    Entry 2: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 3: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 4: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+    Entry 5: YCbCrPositioning (Short)
+      Size, Comps: 2, 1
+      Value: Co-sited
+  Content 2: ifd=2
+    Entry 0: ExposureTime (Rational)
+      Size, Comps: 8, 1
+      Value: 1/60 sec.
+    Entry 1: FNumber (Rational)
+      Size, Comps: 8, 1
+      Value: f/3.7
+    Entry 2: ExposureProgram (Short)
+      Size, Comps: 2, 1
+      Value: Normal program
+    Entry 3: ISOSpeedRatings (Short)
+      Size, Comps: 2, 1
+      Value: 400
+    Entry 4: ExifVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: Exif Version 2.2
+    Entry 5: DateTimeOriginal (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:03:25 03:27:25
+    Entry 6: DateTimeDigitized (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:03:25 03:27:25
+    Entry 7: ComponentsConfiguration (Undefined)
+      Size, Comps: 4, 4
+      Value: Y Cb Cr -
+    Entry 8: CompressedBitsPerPixel (Rational)
+      Size, Comps: 8, 1
+      Value: 3.0
+    Entry 9: ShutterSpeedValue (SRational)
+      Size, Comps: 8, 1
+      Value: 6.00 EV (1/64 sec.)
+    Entry 10: ApertureValue (Rational)
+      Size, Comps: 8, 1
+      Value: 3.80 EV (f/3.7)
+    Entry 11: BrightnessValue (SRational)
+      Size, Comps: 8, 1
+      Value: 2.70 EV (22.26 cd/m^2)
+    Entry 12: ExposureBiasValue (SRational)
+      Size, Comps: 8, 1
+      Value: 0.00 EV
+    Entry 13: MaxApertureValue (Rational)
+      Size, Comps: 8, 1
+      Value: 3.80 EV (f/3.7)
+    Entry 14: MeteringMode (Short)
+      Size, Comps: 2, 1
+      Value: Pattern
+    Entry 15: LightSource (Short)
+      Size, Comps: 2, 1
+      Value: Unknown
+    Entry 16: Flash (Short)
+      Size, Comps: 2, 1
+      Value: Flash fired, compulsory flash mode, red-eye reduction mode
+    Entry 17: FocalLength (Rational)
+      Size, Comps: 8, 1
+      Value: 6.3 mm
+    Entry 18: MakerNote (Undefined)
+      Size, Comps: 2954, 2954
+      Value: 2954 bytes undefined data
+    Entry 19: FlashPixVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: FlashPix Version 1.0
+    Entry 20: ColorSpace (Short)
+      Size, Comps: 2, 1
+      Value: sRGB
+    Entry 21: PixelXDimension (Long)
+      Size, Comps: 4, 1
+      Value: 640
+    Entry 22: PixelYDimension (Long)
+      Size, Comps: 4, 1
+      Value: 480
+    Entry 23: FocalPlaneXResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 1075
+    Entry 24: FocalPlaneYResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 1075
+    Entry 25: FocalPlaneResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Centimeter
+    Entry 26: SensingMethod (Short)
+      Size, Comps: 2, 1
+      Value: One-chip color area sensor
+    Entry 27: FileSource (Undefined)
+      Size, Comps: 1, 1
+      Value: DSC
+    Entry 28: SceneType (Undefined)
+      Size, Comps: 1, 1
+      Value: Directly photographed
+    Entry 29: CustomRendered (Short)
+      Size, Comps: 2, 1
+      Value: Normal process
+    Entry 30: ExposureMode (Short)
+      Size, Comps: 2, 1
+      Value: Auto exposure
+    Entry 31: WhiteBalance (Short)
+      Size, Comps: 2, 1
+      Value: Auto white balance
+    Entry 32: SceneCaptureType (Short)
+      Size, Comps: 2, 1
+      Value: Standard
+    Entry 33: Sharpness (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 34: SubjectDistanceRange (Short)
+      Size, Comps: 2, 1
+      Value: Unknown
+  Content 3: ifd=3
+  Content 4: ifd=4
+    Entry 0: InteroperabilityIndex (ASCII)
+      Size, Comps: 4, 4
+      Value: R98
+    Entry 1: InteroperabilityVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: 0100
+  MakerNote
+    Entry 0: 0, Maker Note Version
+      Size: 4
+    Entry 1: 16, Serial Number
+      Size: 30
+    Entry 2: 4096, Quality
+      Size: 7
+    Entry 3: 4097, Sharpness
+      Size: 6
+    Entry 4: 4098, White Balance
+      Size: 4
+    Entry 5: 4099, Chromaticity Saturation
+      Size: 8
+    Entry 6: 4112, Flash Mode
+      Size: 17
+    Entry 7: 4113, Flash Firing Strength Compensation
+      Size: 6
+    Entry 8: 4128, Macro Mode
+      Size: 3
+    Entry 9: 4129, Focusing Mode
+      Size: 4
+    Entry 10: 4130, (unknown)
+      Size: 1
+    Entry 11: 4131, Focus Point
+      Size: 8
+    Entry 12: 4144, Slow Synchro Mode
+      Size: 3
+    Entry 13: 4145, Picture Mode
+      Size: 4
+    Entry 14: 4146, (unknown)
+      Size: 1
+    Entry 15: 4352, Continuous Taking
+      Size: 3
+    Entry 16: 4353, Continuous Sequence Number
+      Size: 1
+    Entry 17: 4608, (unknown)
+      Size: 1
+    Entry 18: 4624, FinePix Color
+      Size: 10
+    Entry 19: 4864, Blur Check
+      Size: 7
+    Entry 20: 4865, Auto Focus Check
+      Size: 12
+    Entry 21: 4866, Auto Exposure Check
+      Size: 7
+    Entry 22: 5128, (unknown)
+      Size: 20
+    Entry 23: 5129, (unknown)
+      Size: 20
+    Entry 24: 5130, (unknown)
+      Size: 1
+    Entry 25: 16392, (unknown)
+      Size: 1
+    Entry 26: 16640, (unknown)
+      Size: 1
+    Entry 27: 16896, (unknown)
+      Size: 1
+    Entry 28: 61456, (unknown)
+      Size: 23
diff --git a/test/testdata/olympus_makernote_variant_2.jpg b/test/testdata/olympus_makernote_variant_2.jpg
new file mode 100644 (file)
index 0000000..461d613
Binary files /dev/null and b/test/testdata/olympus_makernote_variant_2.jpg differ
diff --git a/test/testdata/olympus_makernote_variant_2.jpg.parsed b/test/testdata/olympus_makernote_variant_2.jpg.parsed
new file mode 100644 (file)
index 0000000..c9114cd
--- /dev/null
@@ -0,0 +1,233 @@
+File olympus_makernote_variant_2.jpg
+  Content 0: ifd=0
+    Entry 0: ImageDescription (ASCII)
+      Size, Comps: 11, 11
+      Value:           
+    Entry 1: Make (ASCII)
+      Size, Comps: 6, 6
+      Value: NIKON
+    Entry 2: Model (ASCII)
+      Size, Comps: 13, 13
+      Value: COOLPIX S570
+    Entry 3: Orientation (Short)
+      Size, Comps: 2, 1
+      Value: Top-left
+    Entry 4: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 300
+    Entry 5: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 300
+    Entry 6: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+    Entry 7: Software (ASCII)
+      Size, Comps: 17, 17
+      Value: COOLPIX S570V1.0
+    Entry 8: DateTime (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:12:28 04:28:56
+    Entry 9: YCbCrPositioning (Short)
+      Size, Comps: 2, 1
+      Value: Co-sited
+  Content 1: ifd=1
+    Entry 0: Compression (Short)
+      Size, Comps: 2, 1
+      Value: JPEG compression
+    Entry 1: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 300
+    Entry 2: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 300
+    Entry 3: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+  Content 2: ifd=2
+    Entry 0: ExposureTime (Rational)
+      Size, Comps: 8, 1
+      Value: 1/25 sec.
+    Entry 1: FNumber (Rational)
+      Size, Comps: 8, 1
+      Value: f/2.7
+    Entry 2: ExposureProgram (Short)
+      Size, Comps: 2, 1
+      Value: Normal program
+    Entry 3: ISOSpeedRatings (Short)
+      Size, Comps: 2, 1
+      Value: 80
+    Entry 4: ExifVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: Exif Version 2.2
+    Entry 5: DateTimeOriginal (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:12:28 04:28:56
+    Entry 6: DateTimeDigitized (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:12:28 04:28:56
+    Entry 7: ComponentsConfiguration (Undefined)
+      Size, Comps: 4, 4
+      Value: Y Cb Cr -
+    Entry 8: CompressedBitsPerPixel (Rational)
+      Size, Comps: 8, 1
+      Value:  2
+    Entry 9: ExposureBiasValue (SRational)
+      Size, Comps: 8, 1
+      Value: -2.00 EV
+    Entry 10: MaxApertureValue (Rational)
+      Size, Comps: 8, 1
+      Value: 2.90 EV (f/2.7)
+    Entry 11: MeteringMode (Short)
+      Size, Comps: 2, 1
+      Value: Pattern
+    Entry 12: LightSource (Short)
+      Size, Comps: 2, 1
+      Value: Cool white fluorescent
+    Entry 13: Flash (Short)
+      Size, Comps: 2, 1
+      Value: Flash fired, auto mode
+    Entry 14: FocalLength (Rational)
+      Size, Comps: 8, 1
+      Value: 5.0 mm
+    Entry 15: MakerNote (Undefined)
+      Size, Comps: 1932, 1932
+      Value: 1932 bytes undefined data
+    Entry 16: UserComment (Undefined)
+      Size, Comps: 16, 16
+      Value:        
+    Entry 17: FlashPixVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: FlashPix Version 1.0
+    Entry 18: ColorSpace (Short)
+      Size, Comps: 2, 1
+      Value: sRGB
+    Entry 19: PixelXDimension (Long)
+      Size, Comps: 4, 1
+      Value: 640
+    Entry 20: PixelYDimension (Long)
+      Size, Comps: 4, 1
+      Value: 480
+    Entry 21: FileSource (Undefined)
+      Size, Comps: 1, 1
+      Value: DSC
+    Entry 22: SceneType (Undefined)
+      Size, Comps: 1, 1
+      Value: Directly photographed
+    Entry 23: CustomRendered (Short)
+      Size, Comps: 2, 1
+      Value: Normal process
+    Entry 24: ExposureMode (Short)
+      Size, Comps: 2, 1
+      Value: Auto exposure
+    Entry 25: WhiteBalance (Short)
+      Size, Comps: 2, 1
+      Value: Manual white balance
+    Entry 26: DigitalZoomRatio (Rational)
+      Size, Comps: 8, 1
+      Value: 0.00
+    Entry 27: FocalLengthIn35mmFilm (Short)
+      Size, Comps: 2, 1
+      Value: 28
+    Entry 28: SceneCaptureType (Short)
+      Size, Comps: 2, 1
+      Value: Portrait
+    Entry 29: GainControl (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 30: Contrast (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 31: Saturation (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 32: Sharpness (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 33: SubjectDistanceRange (Short)
+      Size, Comps: 2, 1
+      Value: Unknown
+  Content 3: ifd=3
+  Content 4: ifd=4
+    Entry 0: InteroperabilityIndex (ASCII)
+      Size, Comps: 4, 4
+      Value: R98
+    Entry 1: InteroperabilityVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: 0100
+  MakerNote
+    Entry 0: 1, Firmware Version
+      Size: 4
+    Entry 1: 2, ISO Setting
+      Size: 6
+    Entry 2: 3, Color Mode (?)
+      Size: 6
+    Entry 3: 4, Quality
+      Size: 6
+    Entry 4: 5, White Balance
+      Size: 12
+    Entry 5: 6, Image Sharpening
+      Size: 6
+    Entry 6: 7, Focus Mode
+      Size: 6
+    Entry 7: 8, Flash Setting
+      Size: 7
+    Entry 8: 10, (unknown)
+      Size: 5
+    Entry 9: 11, White Balance Fine Adjustment
+      Size: 1
+    Entry 10: 15, ISO Selection
+      Size: 6
+    Entry 11: 16, (unknown)
+      Size: 24
+    Entry 12: 17, Preview Image IFD
+      Size: 4
+    Entry 13: 26, (unknown)
+      Size: 40
+    Entry 14: 33, (unknown)
+      Size: 236
+    Entry 15: 38, (unknown)
+      Size: 46
+    Entry 16: 45, (unknown)
+      Size: 45
+    Entry 17: 46, (unknown)
+      Size: 1
+    Entry 18: 47, (unknown)
+      Size: 1
+    Entry 19: 48, (unknown)
+      Size: 1
+    Entry 20: 128, Image Adjustment
+      Size: 13
+    Entry 21: 133, Manual Focus Distance
+      Size: 25
+    Entry 22: 134, Digital Zoom
+      Size: 5
+    Entry 23: 136, AF Focus Position
+      Size: 19
+    Entry 24: 143, (unknown)
+      Size: 15
+    Entry 25: 145, (unknown)
+      Size: 1984
+    Entry 26: 148, Saturation
+      Size: 1
+    Entry 27: 149, Noise Reduction
+      Size: 4
+    Entry 28: 155, (unknown)
+      Size: 26
+    Entry 29: 156, (unknown)
+      Size: 20
+    Entry 30: 157, (unknown)
+      Size: 1
+    Entry 31: 158, (unknown)
+      Size: 46
+    Entry 32: 159, (unknown)
+      Size: 26
+    Entry 33: 172, (unknown)
+      Size: 11
+    Entry 34: 178, (unknown)
+      Size: 8
+    Entry 35: 181, (unknown)
+      Size: 4
+    Entry 36: 61440, (unknown)
+      Size: 30
+    Entry 37: 61441, (unknown)
+      Size: 1
diff --git a/test/testdata/olympus_makernote_variant_3.jpg b/test/testdata/olympus_makernote_variant_3.jpg
new file mode 100644 (file)
index 0000000..42498e2
Binary files /dev/null and b/test/testdata/olympus_makernote_variant_3.jpg differ
diff --git a/test/testdata/olympus_makernote_variant_3.jpg.parsed b/test/testdata/olympus_makernote_variant_3.jpg.parsed
new file mode 100644 (file)
index 0000000..8af2843
--- /dev/null
@@ -0,0 +1,176 @@
+File olympus_makernote_variant_3.jpg
+  Content 0: ifd=0
+    Entry 0: ImageDescription (ASCII)
+      Size, Comps: 32, 32
+      Value: OLYMPUS DIGITAL CAMERA         
+    Entry 1: Make (ASCII)
+      Size, Comps: 24, 24
+      Value: OLYMPUS CORPORATION    
+    Entry 2: Model (ASCII)
+      Size, Comps: 17, 17
+      Value: u30D,S410D,u410D
+    Entry 3: Orientation (Short)
+      Size, Comps: 2, 1
+      Value: Top-left
+    Entry 4: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 5: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 6: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+    Entry 7: Software (ASCII)
+      Size, Comps: 32, 32
+      Value: Version 1.0                    
+    Entry 8: DateTime (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:10:11 15:54:48
+    Entry 9: YCbCrPositioning (Short)
+      Size, Comps: 2, 1
+      Value: Co-sited
+    Entry 10: PrintImageMatching (Undefined)
+      Size, Comps: 244, 244
+      Value: 244 bytes undefined data
+  Content 1: ifd=1
+    Entry 0: Compression (Short)
+      Size, Comps: 2, 1
+      Value: JPEG compression
+    Entry 1: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 2: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 3: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+  Content 2: ifd=2
+    Entry 0: ExposureTime (Rational)
+      Size, Comps: 8, 1
+      Value: 1/2 sec.
+    Entry 1: FNumber (Rational)
+      Size, Comps: 8, 1
+      Value: f/5.2
+    Entry 2: ExposureProgram (Short)
+      Size, Comps: 2, 1
+      Value: Creative program (biased toward depth of field)
+    Entry 3: ISOSpeedRatings (Short)
+      Size, Comps: 2, 1
+      Value: 64
+    Entry 4: ExifVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: Exif Version 2.21
+    Entry 5: DateTimeOriginal (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:10:11 15:54:48
+    Entry 6: DateTimeDigitized (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:10:11 15:54:48
+    Entry 7: ComponentsConfiguration (Undefined)
+      Size, Comps: 4, 4
+      Value: Y Cb Cr -
+    Entry 8: ExposureBiasValue (SRational)
+      Size, Comps: 8, 1
+      Value: 0.00 EV
+    Entry 9: MaxApertureValue (Rational)
+      Size, Comps: 8, 1
+      Value: 3.26 EV (f/3.1)
+    Entry 10: MeteringMode (Short)
+      Size, Comps: 2, 1
+      Value: Pattern
+    Entry 11: LightSource (Short)
+      Size, Comps: 2, 1
+      Value: Unknown
+    Entry 12: Flash (Short)
+      Size, Comps: 2, 1
+      Value: Flash did not fire, compulsory flash mode
+    Entry 13: FocalLength (Rational)
+      Size, Comps: 8, 1
+      Value: 17.4 mm
+    Entry 14: MakerNote (Undefined)
+      Size, Comps: 4860, 4860
+      Value: 4860 bytes undefined data
+    Entry 15: UserComment (Undefined)
+      Size, Comps: 125, 125
+      Value:                                                                                                                      
+    Entry 16: FlashPixVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: FlashPix Version 1.0
+    Entry 17: ColorSpace (Short)
+      Size, Comps: 2, 1
+      Value: sRGB
+    Entry 18: PixelXDimension (Long)
+      Size, Comps: 4, 1
+      Value: 640
+    Entry 19: PixelYDimension (Long)
+      Size, Comps: 4, 1
+      Value: 480
+    Entry 20: FileSource (Undefined)
+      Size, Comps: 1, 1
+      Value: DSC
+    Entry 21: CustomRendered (Short)
+      Size, Comps: 2, 1
+      Value: Normal process
+    Entry 22: ExposureMode (Short)
+      Size, Comps: 2, 1
+      Value: Auto exposure
+    Entry 23: WhiteBalance (Short)
+      Size, Comps: 2, 1
+      Value: Auto white balance
+    Entry 24: DigitalZoomRatio (Rational)
+      Size, Comps: 8, 1
+      Value: 1.00
+    Entry 25: SceneCaptureType (Short)
+      Size, Comps: 2, 1
+      Value: Standard
+    Entry 26: GainControl (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 27: Contrast (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 28: Saturation (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 29: Sharpness (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+  Content 3: ifd=3
+  Content 4: ifd=4
+    Entry 0: InteroperabilityIndex (ASCII)
+      Size, Comps: 4, 4
+      Value: R98
+    Entry 1: InteroperabilityVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: 0100
+  MakerNote
+    Entry 0: 512, Speed/Sequence/Panorama Direction
+      Size: 10
+    Entry 1: 513, Quality
+      Size: 11
+    Entry 2: 514, Macro
+      Size: 11
+    Entry 3: 515, Black & White Mode
+      Size: 2
+    Entry 4: 516, Digital Zoom
+      Size: 4
+    Entry 5: 517, Focal Plane Diagonal
+      Size: 5
+    Entry 6: 518, Lens Distortion Parameters
+      Size: 12
+    Entry 7: 519, Firmware Version
+      Size: 5
+    Entry 8: 521, Camera ID
+      Size: 31
+    Entry 9: 8208, (unknown)
+      Size: 336
+    Entry 10: 8224, (unknown)
+      Size: 1288
+    Entry 11: 8240, (unknown)
+      Size: 83
+    Entry 12: 8256, (unknown)
+      Size: 520
+    Entry 13: 8272, (unknown)
+      Size: 1999
diff --git a/test/testdata/olympus_makernote_variant_4.jpg b/test/testdata/olympus_makernote_variant_4.jpg
new file mode 100644 (file)
index 0000000..233ff78
Binary files /dev/null and b/test/testdata/olympus_makernote_variant_4.jpg differ
diff --git a/test/testdata/olympus_makernote_variant_4.jpg.parsed b/test/testdata/olympus_makernote_variant_4.jpg.parsed
new file mode 100644 (file)
index 0000000..bcc683e
--- /dev/null
@@ -0,0 +1,168 @@
+File olympus_makernote_variant_4.jpg
+  Content 0: ifd=0
+    Entry 0: ImageDescription (ASCII)
+      Size, Comps: 32, 32
+      Value: OLYMPUS DIGITAL CAMERA         
+    Entry 1: Make (ASCII)
+      Size, Comps: 24, 24
+      Value: OLYMPUS IMAGING CORP.  
+    Entry 2: Model (ASCII)
+      Size, Comps: 17, 17
+      Value: E-PL2           
+    Entry 3: Orientation (Short)
+      Size, Comps: 2, 1
+      Value: Top-left
+    Entry 4: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 160
+    Entry 5: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 160
+    Entry 6: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+    Entry 7: Software (ASCII)
+      Size, Comps: 32, 32
+      Value: Version 1.0                    
+    Entry 8: DateTime (ASCII)
+      Size, Comps: 20, 20
+      Value: 0000:00:00 00:00:00
+    Entry 9: Artist (ASCII)
+      Size, Comps: 64, 64
+      Value: 
+    Entry 10: YCbCrPositioning (Short)
+      Size, Comps: 2, 1
+      Value: Co-sited
+    Entry 11: Copyright (ASCII)
+      Size, Comps: 64, 64
+      Value: [None] (Photographer) - [None] (Editor)
+    Entry 12: PrintImageMatching (Undefined)
+      Size, Comps: 528, 528
+      Value: 528 bytes undefined data
+  Content 1: ifd=1
+    Entry 0: Compression (Short)
+      Size, Comps: 2, 1
+      Value: JPEG compression
+    Entry 1: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 2: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 3: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+  Content 2: ifd=2
+    Entry 0: ExposureTime (Rational)
+      Size, Comps: 8, 1
+      Value: 1/13 sec.
+    Entry 1: FNumber (Rational)
+      Size, Comps: 8, 1
+      Value: f/5.6
+    Entry 2: ExposureProgram (Short)
+      Size, Comps: 2, 1
+      Value: Manual
+    Entry 3: ISOSpeedRatings (Short)
+      Size, Comps: 2, 1
+      Value: 320
+    Entry 4: ExifVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: Exif Version 2.21
+    Entry 5: DateTimeOriginal (ASCII)
+      Size, Comps: 20, 20
+      Value: 0000:00:00 00:00:00
+    Entry 6: DateTimeDigitized (ASCII)
+      Size, Comps: 20, 20
+      Value: 0000:00:00 00:00:00
+    Entry 7: ComponentsConfiguration (Undefined)
+      Size, Comps: 4, 4
+      Value: Y Cb Cr -
+    Entry 8: ExposureBiasValue (SRational)
+      Size, Comps: 8, 1
+      Value: 0.00 EV
+    Entry 9: MaxApertureValue (Rational)
+      Size, Comps: 8, 1
+      Value: 3.61 EV (f/3.5)
+    Entry 10: MeteringMode (Short)
+      Size, Comps: 2, 1
+      Value: Pattern
+    Entry 11: LightSource (Short)
+      Size, Comps: 2, 1
+      Value: Unknown
+    Entry 12: Flash (Short)
+      Size, Comps: 2, 1
+      Value: Internal error (unknown value 72)
+    Entry 13: FocalLength (Rational)
+      Size, Comps: 8, 1
+      Value: 14.0 mm
+    Entry 14: MakerNote (Undefined)
+      Size, Comps: 9858, 9858
+      Value: 9858 bytes undefined data
+    Entry 15: UserComment (Undefined)
+      Size, Comps: 9, 9
+      Value:  
+    Entry 16: FlashPixVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: FlashPix Version 1.0
+    Entry 17: ColorSpace (Short)
+      Size, Comps: 2, 1
+      Value: sRGB
+    Entry 18: PixelXDimension (Long)
+      Size, Comps: 4, 1
+      Value: 1280
+    Entry 19: PixelYDimension (Long)
+      Size, Comps: 4, 1
+      Value: 960
+    Entry 20: FileSource (Undefined)
+      Size, Comps: 1, 1
+      Value: DSC
+    Entry 21: CustomRendered (Short)
+      Size, Comps: 2, 1
+      Value: Normal process
+    Entry 22: ExposureMode (Short)
+      Size, Comps: 2, 1
+      Value: Manual exposure
+    Entry 23: WhiteBalance (Short)
+      Size, Comps: 2, 1
+      Value: Auto white balance
+    Entry 24: DigitalZoomRatio (Rational)
+      Size, Comps: 8, 1
+      Value: 1.00
+    Entry 25: SceneCaptureType (Short)
+      Size, Comps: 2, 1
+      Value: Standard
+    Entry 26: GainControl (Short)
+      Size, Comps: 2, 1
+      Value: Low gain up
+    Entry 27: Contrast (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 28: Saturation (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 29: Sharpness (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+  Content 3: ifd=3
+  Content 4: ifd=4
+    Entry 0: InteroperabilityIndex (ASCII)
+      Size, Comps: 4, 4
+      Value: R98
+    Entry 1: InteroperabilityVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: 0100
+  MakerNote
+    Entry 0: 512, Speed/Sequence/Panorama Direction
+      Size: 8
+    Entry 1: 521, Camera ID
+      Size: 31
+    Entry 2: 8208, (unknown)
+      Size: 0
+    Entry 3: 8224, (unknown)
+      Size: 0
+    Entry 4: 8240, (unknown)
+      Size: 0
+    Entry 5: 8256, (unknown)
+      Size: 0
+    Entry 6: 8272, (unknown)
+      Size: 0
diff --git a/test/testdata/olympus_makernote_variant_5.jpg b/test/testdata/olympus_makernote_variant_5.jpg
new file mode 100644 (file)
index 0000000..f083f75
Binary files /dev/null and b/test/testdata/olympus_makernote_variant_5.jpg differ
diff --git a/test/testdata/olympus_makernote_variant_5.jpg.parsed b/test/testdata/olympus_makernote_variant_5.jpg.parsed
new file mode 100644 (file)
index 0000000..5665487
--- /dev/null
@@ -0,0 +1,243 @@
+File olympus_makernote_variant_5.jpg
+  Content 0: ifd=0
+    Entry 0: ImageDescription (ASCII)
+      Size, Comps: 32, 32
+      Value: SANYO DIGITAL CAMERA           
+    Entry 1: Make (ASCII)
+      Size, Comps: 24, 24
+      Value: SANYO Electric Co.,Ltd.
+    Entry 2: Model (ASCII)
+      Size, Comps: 14, 14
+      Value: TH1          
+    Entry 3: Orientation (Short)
+      Size, Comps: 2, 1
+      Value: Top-left
+    Entry 4: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 5: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 6: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+    Entry 7: Software (ASCII)
+      Size, Comps: 32, 32
+      Value: ver1.1.0                       
+    Entry 8: DateTime (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:12:28 17:03:51
+    Entry 9: YCbCrPositioning (Short)
+      Size, Comps: 2, 1
+      Value: Co-sited
+    Entry 10: PrintImageMatching (Undefined)
+      Size, Comps: 296, 296
+      Value: 296 bytes undefined data
+  Content 1: ifd=1
+    Entry 0: Compression (Short)
+      Size, Comps: 2, 1
+      Value: JPEG compression
+    Entry 1: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 2: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 3: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+  Content 2: ifd=2
+    Entry 0: ExposureTime (Rational)
+      Size, Comps: 8, 1
+      Value: 1/250 sec.
+    Entry 1: FNumber (Rational)
+      Size, Comps: 8, 1
+      Value: f/4.1
+    Entry 2: ExposureProgram (Short)
+      Size, Comps: 2, 1
+      Value: Manual
+    Entry 3: ISOSpeedRatings (Short)
+      Size, Comps: 2, 1
+      Value: 200
+    Entry 4: ExifVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: Exif Version 2.21
+    Entry 5: DateTimeOriginal (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:12:28 17:03:51
+    Entry 6: DateTimeDigitized (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:12:28 17:03:51
+    Entry 7: ComponentsConfiguration (Undefined)
+      Size, Comps: 4, 4
+      Value: Y Cb Cr -
+    Entry 8: CompressedBitsPerPixel (Rational)
+      Size, Comps: 8, 1
+      Value:  2
+    Entry 9: BrightnessValue (SRational)
+      Size, Comps: 8, 1
+      Value: -0.10 EV (3.20 cd/m^2)
+    Entry 10: ExposureBiasValue (SRational)
+      Size, Comps: 8, 1
+      Value: -1.80 EV
+    Entry 11: MaxApertureValue (Rational)
+      Size, Comps: 8, 1
+      Value: 2.10 EV (f/2.1)
+    Entry 12: MeteringMode (Short)
+      Size, Comps: 2, 1
+      Value: Pattern
+    Entry 13: LightSource (Short)
+      Size, Comps: 2, 1
+      Value: Unknown
+    Entry 14: Flash (Short)
+      Size, Comps: 2, 1
+      Value: Flash did not fire, compulsory flash mode
+    Entry 15: FocalLength (Rational)
+      Size, Comps: 8, 1
+      Value: 22.6 mm
+    Entry 16: MakerNote (Undefined)
+      Size, Comps: 8200, 8200
+      Value: 8200 bytes undefined data
+    Entry 17: UserComment (Undefined)
+      Size, Comps: 126, 126
+      Value:                                                                                                                      
+    Entry 18: FlashPixVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: FlashPix Version 1.0
+    Entry 19: ColorSpace (Short)
+      Size, Comps: 2, 1
+      Value: sRGB
+    Entry 20: PixelXDimension (Long)
+      Size, Comps: 4, 1
+      Value: 640
+    Entry 21: PixelYDimension (Long)
+      Size, Comps: 4, 1
+      Value: 480
+    Entry 22: FileSource (Undefined)
+      Size, Comps: 1, 1
+      Value: DSC
+    Entry 23: SceneType (Undefined)
+      Size, Comps: 1, 1
+      Value: Directly photographed
+    Entry 24: CustomRendered (Short)
+      Size, Comps: 2, 1
+      Value: Normal process
+    Entry 25: ExposureMode (Short)
+      Size, Comps: 2, 1
+      Value: Manual exposure
+    Entry 26: WhiteBalance (Short)
+      Size, Comps: 2, 1
+      Value: Auto white balance
+    Entry 27: DigitalZoomRatio (Rational)
+      Size, Comps: 8, 1
+      Value: 0.00
+    Entry 28: FocalLengthIn35mmFilm (Short)
+      Size, Comps: 2, 1
+      Value: 393
+    Entry 29: SceneCaptureType (Short)
+      Size, Comps: 2, 1
+      Value: Standard
+    Entry 30: GainControl (Short)
+      Size, Comps: 2, 1
+      Value: Low gain up
+    Entry 31: Contrast (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 32: Saturation (Short)
+      Size, Comps: 2, 1
+      Value: High saturation
+    Entry 33: Sharpness (Short)
+      Size, Comps: 2, 1
+      Value: Soft
+    Entry 34: SubjectDistanceRange (Short)
+      Size, Comps: 2, 1
+      Value: Close view
+  Content 3: ifd=3
+  Content 4: ifd=4
+    Entry 0: InteroperabilityIndex (ASCII)
+      Size, Comps: 4, 4
+      Value: R98
+    Entry 1: InteroperabilityVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: 0100
+  MakerNote
+    Entry 0: 256, Thumbnail Image
+      Size: 1999
+    Entry 1: 512, Speed/Sequence/Panorama Direction
+      Size: 10
+    Entry 2: 513, Quality
+      Size: 16
+    Entry 3: 514, Macro
+      Size: 2
+    Entry 4: 515, Black & White Mode
+      Size: 2
+    Entry 5: 516, Digital Zoom
+      Size: 4
+    Entry 6: 526, Sequential Shot
+      Size: 4
+    Entry 7: 527, Wide Range
+      Size: 3
+    Entry 8: 528, Color Adjustment Mode
+      Size: 3
+    Entry 9: 529, (unknown)
+      Size: 1
+    Entry 10: 530, Focus Mode
+      Size: 10
+    Entry 11: 531, Quick Shot
+      Size: 3
+    Entry 12: 532, Self-timer
+      Size: 3
+    Entry 13: 533, (unknown)
+      Size: 1
+    Entry 14: 534, Voice Memo
+      Size: 3
+    Entry 15: 535, Record Shutter Release
+      Size: 17
+    Entry 16: 536, Flicker Reduce
+      Size: 3
+    Entry 17: 537, Optical Zoom
+      Size: 2
+    Entry 18: 538, CCD Sensitivity
+      Size: 4
+    Entry 19: 539, Digital Zoom
+      Size: 2
+    Entry 20: 540, (unknown)
+      Size: 2
+    Entry 21: 541, Light Source Special
+      Size: 3
+    Entry 22: 542, Resaved
+      Size: 2
+    Entry 23: 543, Scene Select
+      Size: 3
+    Entry 24: 544, (unknown)
+      Size: 1
+    Entry 25: 545, (unknown)
+      Size: 3
+    Entry 26: 546, (unknown)
+      Size: 1
+    Entry 27: 547, Manual Focus Distance
+      Size: 45
+    Entry 28: 548, Sequence Shot Interval
+      Size: 12
+    Entry 29: 549, (unknown)
+      Size: 0
+    Entry 30: 550, (unknown)
+      Size: 1
+    Entry 31: 551, (unknown)
+      Size: 1
+    Entry 32: 553, (unknown)
+      Size: 1
+    Entry 33: 3840, Data Dump
+      Size: 1999
+    Entry 34: 3841, (unknown)
+      Size: 1999
+    Entry 35: 3842, (unknown)
+      Size: 1
+    Entry 36: 3843, (unknown)
+      Size: 5
+    Entry 37: 3844, (unknown)
+      Size: 46
+    Entry 38: 3845, (unknown)
+      Size: 45
+    Entry 39: 3846, (unknown)
+      Size: 45
diff --git a/test/testdata/pentax_makernote_variant_2.jpg b/test/testdata/pentax_makernote_variant_2.jpg
new file mode 100644 (file)
index 0000000..0ef0ef2
Binary files /dev/null and b/test/testdata/pentax_makernote_variant_2.jpg differ
diff --git a/test/testdata/pentax_makernote_variant_2.jpg.parsed b/test/testdata/pentax_makernote_variant_2.jpg.parsed
new file mode 100644 (file)
index 0000000..168ac61
--- /dev/null
@@ -0,0 +1,200 @@
+File pentax_makernote_variant_2.jpg
+  Content 0: ifd=0
+    Entry 0: Make (ASCII)
+      Size, Comps: 24, 24
+      Value: Asahi Optical Co.,Ltd. 
+    Entry 1: Model (ASCII)
+      Size, Comps: 18, 18
+      Value: PENTAX Optio430RS
+    Entry 2: Orientation (Short)
+      Size, Comps: 2, 1
+      Value: Top-left
+    Entry 3: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 4: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 5: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+    Entry 6: Software (ASCII)
+      Size, Comps: 22, 22
+      Value: 1.00                 
+    Entry 7: DateTime (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:10:10 18:46:42
+    Entry 8: YCbCrPositioning (Short)
+      Size, Comps: 2, 1
+      Value: Centered
+    Entry 9: PrintImageMatching (Undefined)
+      Size, Comps: 40, 40
+      Value: 40 bytes undefined data
+  Content 1: ifd=1
+    Entry 0: Compression (Short)
+      Size, Comps: 2, 1
+      Value: JPEG compression
+    Entry 1: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 2: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 3: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+  Content 2: ifd=2
+    Entry 0: ExposureTime (Rational)
+      Size, Comps: 8, 1
+      Value: 1 sec.
+    Entry 1: FNumber (Rational)
+      Size, Comps: 8, 1
+      Value: f/2.6
+    Entry 2: ExifVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: Exif Version 2.2
+    Entry 3: DateTimeOriginal (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:10:10 18:46:42
+    Entry 4: DateTimeDigitized (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:10:10 18:46:42
+    Entry 5: ComponentsConfiguration (Undefined)
+      Size, Comps: 4, 4
+      Value: Y Cb Cr -
+    Entry 6: CompressedBitsPerPixel (Rational)
+      Size, Comps: 8, 1
+      Value: 0.433333
+    Entry 7: ExposureBiasValue (SRational)
+      Size, Comps: 8, 1
+      Value: 0.00 EV
+    Entry 8: MaxApertureValue (Rational)
+      Size, Comps: 8, 1
+      Value: 2.60 EV (f/2.5)
+    Entry 9: MeteringMode (Short)
+      Size, Comps: 2, 1
+      Value: Pattern
+    Entry 10: LightSource (Short)
+      Size, Comps: 2, 1
+      Value: Unknown
+    Entry 11: Flash (Short)
+      Size, Comps: 2, 1
+      Value: Flash fired, auto mode
+    Entry 12: FocalLength (Rational)
+      Size, Comps: 8, 1
+      Value: 7.6 mm
+    Entry 13: MakerNote (Undefined)
+      Size, Comps: 474, 474
+      Value: 474 bytes undefined data
+    Entry 14: FlashPixVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: FlashPix Version 1.0
+    Entry 15: ColorSpace (Short)
+      Size, Comps: 2, 1
+      Value: sRGB
+    Entry 16: PixelXDimension (Long)
+      Size, Comps: 4, 1
+      Value: 640
+    Entry 17: PixelYDimension (Long)
+      Size, Comps: 4, 1
+      Value: 480
+    Entry 18: CustomRendered (Short)
+      Size, Comps: 2, 1
+      Value: Normal process
+    Entry 19: ExposureMode (Short)
+      Size, Comps: 2, 1
+      Value: Auto exposure
+    Entry 20: WhiteBalance (Short)
+      Size, Comps: 2, 1
+      Value: Auto white balance
+    Entry 21: DigitalZoomRatio (Rational)
+      Size, Comps: 8, 1
+      Value: 0.00
+    Entry 22: FocalLengthIn35mmFilm (Short)
+      Size, Comps: 2, 1
+      Value: 37
+    Entry 23: SceneCaptureType (Short)
+      Size, Comps: 2, 1
+      Value: Night scene
+    Entry 24: Contrast (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 25: Saturation (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 26: Sharpness (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+  Content 3: ifd=3
+  Content 4: ifd=4
+    Entry 0: InteroperabilityIndex (ASCII)
+      Size, Comps: 4, 4
+      Value: R98
+    Entry 1: InteroperabilityVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: 0100
+  MakerNote
+    Entry 0: 16386, Preview Size
+      Size: 8
+    Entry 1: 16387, Preview Length
+      Size: 1
+    Entry 2: 16388, Preview Start
+      Size: 4
+    Entry 3: 24576, Preview Start
+      Size: 20
+    Entry 4: 24577, (unknown)
+      Size: 4
+    Entry 5: 24578, (unknown)
+      Size: 0
+    Entry 6: 24579, (unknown)
+      Size: 20
+    Entry 7: 24593, White Balance Bias
+      Size: 7
+    Entry 8: 24594, White Balance
+      Size: 3
+    Entry 9: 24595, (unknown)
+      Size: 2
+    Entry 10: 24609, (unknown)
+      Size: 24
+    Entry 11: 24610, Object Distance
+      Size: 4
+    Entry 12: 24611, (unknown)
+      Size: 2
+    Entry 13: 24625, (unknown)
+      Size: 20
+    Entry 14: 24626, (unknown)
+      Size: 20
+    Entry 15: 24627, (unknown)
+      Size: 2
+    Entry 16: 24628, Flash Distance
+      Size: 5
+    Entry 17: 28672, Record Mode
+      Size: 3
+    Entry 18: 28673, Self-timer
+      Size: 2
+    Entry 19: 28674, Quality Level
+      Size: 2
+    Entry 20: 28675, Focus Mode
+      Size: 2
+    Entry 21: 28677, (unknown)
+      Size: 4
+    Entry 22: 28678, Time Zone
+      Size: 3
+    Entry 23: 28679, Bestshot Mode
+      Size: 3
+    Entry 24: 28689, (unknown)
+      Size: 20
+    Entry 25: 28690, (unknown)
+      Size: 20
+    Entry 26: 28691, (unknown)
+      Size: 20
+    Entry 27: 28692, CCS ISO Sensitivity
+      Size: 4
+    Entry 28: 28693, Color Mode
+      Size: 2
+    Entry 29: 28694, Enhancement
+      Size: 2
+    Entry 30: 28695, Finer
+      Size: 2
+    Entry 31: 28696, (unknown)
+      Size: 2
diff --git a/test/testdata/pentax_makernote_variant_3.jpg b/test/testdata/pentax_makernote_variant_3.jpg
new file mode 100644 (file)
index 0000000..d93b86f
Binary files /dev/null and b/test/testdata/pentax_makernote_variant_3.jpg differ
diff --git a/test/testdata/pentax_makernote_variant_3.jpg.parsed b/test/testdata/pentax_makernote_variant_3.jpg.parsed
new file mode 100644 (file)
index 0000000..533d6d2
--- /dev/null
@@ -0,0 +1,219 @@
+File pentax_makernote_variant_3.jpg
+  Content 0: ifd=0
+    Entry 0: Make (ASCII)
+      Size, Comps: 19, 19
+      Value: PENTAX Corporation
+    Entry 1: Model (ASCII)
+      Size, Comps: 18, 18
+      Value: PENTAX Optio 750Z
+    Entry 2: Orientation (Short)
+      Size, Comps: 2, 1
+      Value: Top-left
+    Entry 3: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 4: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 5: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+    Entry 6: Software (ASCII)
+      Size, Comps: 20, 20
+      Value: Optio 750Z Ver 1.01
+    Entry 7: DateTime (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:10:11 19:06:04
+    Entry 8: YCbCrPositioning (Short)
+      Size, Comps: 2, 1
+      Value: Co-sited
+    Entry 9: PrintImageMatching (Undefined)
+      Size, Comps: 94, 94
+      Value: 94 bytes undefined data
+  Content 1: ifd=1
+    Entry 0: Compression (Short)
+      Size, Comps: 2, 1
+      Value: JPEG compression
+    Entry 1: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 2: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 3: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+  Content 2: ifd=2
+    Entry 0: ExposureTime (Rational)
+      Size, Comps: 8, 1
+      Value: 1 sec.
+    Entry 1: FNumber (Rational)
+      Size, Comps: 8, 1
+      Value: f/2.8
+    Entry 2: ISOSpeedRatings (Short)
+      Size, Comps: 2, 1
+      Value: 200
+    Entry 3: ExifVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: Exif Version 2.2
+    Entry 4: DateTimeOriginal (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:10:11 19:06:04
+    Entry 5: DateTimeDigitized (ASCII)
+      Size, Comps: 20, 20
+      Value: 2009:10:11 19:06:04
+    Entry 6: ComponentsConfiguration (Undefined)
+      Size, Comps: 4, 4
+      Value: Y Cb Cr -
+    Entry 7: CompressedBitsPerPixel (Rational)
+      Size, Comps: 8, 1
+      Value:  3
+    Entry 8: ExposureBiasValue (SRational)
+      Size, Comps: 8, 1
+      Value: 0.00 EV
+    Entry 9: MaxApertureValue (Rational)
+      Size, Comps: 8, 1
+      Value: 3.00 EV (f/2.8)
+    Entry 10: MeteringMode (Short)
+      Size, Comps: 2, 1
+      Value: Pattern
+    Entry 11: Flash (Short)
+      Size, Comps: 2, 1
+      Value: Flash did not fire, compulsory flash mode
+    Entry 12: FocalLength (Rational)
+      Size, Comps: 8, 1
+      Value: 7.8 mm
+    Entry 13: MakerNote (Undefined)
+      Size, Comps: 986, 986
+      Value: 986 bytes undefined data
+    Entry 14: FlashPixVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: FlashPix Version 1.0
+    Entry 15: ColorSpace (Short)
+      Size, Comps: 2, 1
+      Value: sRGB
+    Entry 16: PixelXDimension (Long)
+      Size, Comps: 4, 1
+      Value: 640
+    Entry 17: PixelYDimension (Long)
+      Size, Comps: 4, 1
+      Value: 480
+    Entry 18: CustomRendered (Short)
+      Size, Comps: 2, 1
+      Value: Custom process
+    Entry 19: ExposureMode (Short)
+      Size, Comps: 2, 1
+      Value: Auto exposure
+    Entry 20: WhiteBalance (Short)
+      Size, Comps: 2, 1
+      Value: Auto white balance
+    Entry 21: DigitalZoomRatio (Rational)
+      Size, Comps: 8, 1
+      Value: 1.00
+    Entry 22: FocalLengthIn35mmFilm (Short)
+      Size, Comps: 2, 1
+      Value: 37
+    Entry 23: SceneCaptureType (Short)
+      Size, Comps: 2, 1
+      Value: Standard
+    Entry 24: Contrast (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 25: Saturation (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 26: Sharpness (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 27: SubjectDistanceRange (Short)
+      Size, Comps: 2, 1
+      Value: Unknown
+  Content 3: ifd=3
+  Content 4: ifd=4
+    Entry 0: InteroperabilityIndex (ASCII)
+      Size, Comps: 4, 4
+      Value: R98
+    Entry 1: InteroperabilityVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: 0100
+  MakerNote
+    Entry 0: 16385, Capture Mode
+      Size: 6
+    Entry 1: 16386, Preview Size
+      Size: 8
+    Entry 2: 16387, Preview Length
+      Size: 1
+    Entry 3: 16388, Preview Start
+      Size: 4
+    Entry 4: 16389, Model Identification
+      Size: 5
+    Entry 5: 16390, Date
+      Size: 10
+    Entry 6: 16391, Time
+      Size: 8
+    Entry 7: 16392, Quality Level
+      Size: 4
+    Entry 8: 16393, Image Size
+      Size: 7
+    Entry 9: 16395, Picture Mode
+      Size: 33
+    Entry 10: 16396, Flash Mode
+      Size: 3
+    Entry 11: 16397, Focus Mode
+      Size: 6
+    Entry 12: 16398, AF Point Selected
+      Size: 4
+    Entry 13: 16399, Auto AF Point
+      Size: 8
+    Entry 14: 16400, Focus Position
+      Size: 5
+    Entry 15: 16402, Exposure Time
+      Size: 6
+    Entry 16: 16403, F-Number
+      Size: 3
+    Entry 17: 16404, ISO Number
+      Size: 2
+    Entry 18: 16405, (unknown)
+      Size: 6
+    Entry 19: 16406, Exposure Compensation
+      Size: 3
+    Entry 20: 16407, Metering Mode
+      Size: 2
+    Entry 21: 16408, Auto Bracketing
+      Size: 2
+    Entry 22: 16409, White Balance
+      Size: 4
+    Entry 23: 16411, Blue Balance
+      Size: 2
+    Entry 24: 16412, Red Balance
+      Size: 2
+    Entry 25: 16413, Focal Length
+      Size: 2
+    Entry 26: 16414, Digital Zoom
+      Size: 4
+    Entry 27: 16415, Saturation
+      Size: 2
+    Entry 28: 16416, Contrast
+      Size: 2
+    Entry 29: 16417, Sharpness
+      Size: 2
+    Entry 30: 16418, World Time Location
+      Size: 2
+    Entry 31: 16419, Hometown City
+      Size: 3
+    Entry 32: 16420, Destination City
+      Size: 3
+    Entry 33: 16421, Hometown DST
+      Size: 2
+    Entry 34: 16422, Destination DST
+      Size: 2
+    Entry 35: 16423, (unknown)
+      Size: 20
+    Entry 36: 16425, Frame Number
+      Size: 1
+    Entry 37: 16434, Image Processing
+      Size: 20
+    Entry 38: 16449, (unknown)
+      Size: 2
+    Entry 39: 17406, (unknown)
+      Size: 22
diff --git a/test/testdata/pentax_makernote_variant_4.jpg b/test/testdata/pentax_makernote_variant_4.jpg
new file mode 100644 (file)
index 0000000..297ea1c
Binary files /dev/null and b/test/testdata/pentax_makernote_variant_4.jpg differ
diff --git a/test/testdata/pentax_makernote_variant_4.jpg.parsed b/test/testdata/pentax_makernote_variant_4.jpg.parsed
new file mode 100644 (file)
index 0000000..4ed86dc
--- /dev/null
@@ -0,0 +1,468 @@
+File pentax_makernote_variant_4.jpg
+  Content 0: ifd=0
+    Entry 0: Make (ASCII)
+      Size, Comps: 24, 24
+      Value: CASIO COMPUTER CO.,LTD.
+    Entry 1: Model (ASCII)
+      Size, Comps: 12, 12
+      Value: EX-S12     
+    Entry 2: Orientation (Short)
+      Size, Comps: 2, 1
+      Value: Top-left
+    Entry 3: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 4: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 5: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+    Entry 6: Software (ASCII)
+      Size, Comps: 18, 18
+      Value: 1.01             
+    Entry 7: DateTime (ASCII)
+      Size, Comps: 20, 20
+      Value: 2011:05:06 02:53:37
+    Entry 8: YCbCrPositioning (Short)
+      Size, Comps: 2, 1
+      Value: Co-sited
+    Entry 9: PrintImageMatching (Undefined)
+      Size, Comps: 46, 46
+      Value: 46 bytes undefined data
+  Content 1: ifd=1
+    Entry 0: Compression (Short)
+      Size, Comps: 2, 1
+      Value: JPEG compression
+    Entry 1: XResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 2: YResolution (Rational)
+      Size, Comps: 8, 1
+      Value: 72
+    Entry 3: ResolutionUnit (Short)
+      Size, Comps: 2, 1
+      Value: Inch
+  Content 2: ifd=2
+    Entry 0: ExposureTime (Rational)
+      Size, Comps: 8, 1
+      Value: 1/60 sec.
+    Entry 1: FNumber (Rational)
+      Size, Comps: 8, 1
+      Value: f/2.8
+    Entry 2: ExposureProgram (Short)
+      Size, Comps: 2, 1
+      Value: Normal program
+    Entry 3: ISOSpeedRatings (Short)
+      Size, Comps: 2, 1
+      Value: 400
+    Entry 4: ExifVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: Exif Version 2.21
+    Entry 5: DateTimeOriginal (ASCII)
+      Size, Comps: 20, 20
+      Value: 2011:05:06 02:53:37
+    Entry 6: DateTimeDigitized (ASCII)
+      Size, Comps: 20, 20
+      Value: 2011:05:06 02:53:37
+    Entry 7: ComponentsConfiguration (Undefined)
+      Size, Comps: 4, 4
+      Value: Y Cb Cr -
+    Entry 8: CompressedBitsPerPixel (Rational)
+      Size, Comps: 8, 1
+      Value: 5.066667
+    Entry 9: ExposureBiasValue (SRational)
+      Size, Comps: 8, 1
+      Value: 0.00 EV
+    Entry 10: MaxApertureValue (Rational)
+      Size, Comps: 8, 1
+      Value: 3.00 EV (f/2.8)
+    Entry 11: MeteringMode (Short)
+      Size, Comps: 2, 1
+      Value: Pattern
+    Entry 12: LightSource (Short)
+      Size, Comps: 2, 1
+      Value: Unknown
+    Entry 13: Flash (Short)
+      Size, Comps: 2, 1
+      Value: Flash fired, auto mode
+    Entry 14: FocalLength (Rational)
+      Size, Comps: 8, 1
+      Value: 6.3 mm
+    Entry 15: MakerNote (Undefined)
+      Size, Comps: 8216, 8216
+      Value: 8216 bytes undefined data
+    Entry 16: FlashPixVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: FlashPix Version 1.0
+    Entry 17: ColorSpace (Short)
+      Size, Comps: 2, 1
+      Value: sRGB
+    Entry 18: PixelXDimension (Long)
+      Size, Comps: 4, 1
+      Value: 640
+    Entry 19: PixelYDimension (Long)
+      Size, Comps: 4, 1
+      Value: 480
+    Entry 20: FileSource (Undefined)
+      Size, Comps: 1, 1
+      Value: DSC
+    Entry 21: CustomRendered (Short)
+      Size, Comps: 2, 1
+      Value: Normal process
+    Entry 22: ExposureMode (Short)
+      Size, Comps: 2, 1
+      Value: Auto exposure
+    Entry 23: WhiteBalance (Short)
+      Size, Comps: 2, 1
+      Value: Auto white balance
+    Entry 24: DigitalZoomRatio (Rational)
+      Size, Comps: 8, 1
+      Value: 0/0
+    Entry 25: FocalLengthIn35mmFilm (Short)
+      Size, Comps: 2, 1
+      Value: 36
+    Entry 26: SceneCaptureType (Short)
+      Size, Comps: 2, 1
+      Value: Standard
+    Entry 27: GainControl (Short)
+      Size, Comps: 2, 1
+      Value: High gain up
+    Entry 28: Contrast (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 29: Saturation (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+    Entry 30: Sharpness (Short)
+      Size, Comps: 2, 1
+      Value: Normal
+  Content 3: ifd=3
+  Content 4: ifd=4
+    Entry 0: InteroperabilityIndex (ASCII)
+      Size, Comps: 4, 4
+      Value: R98
+    Entry 1: InteroperabilityVersion (Undefined)
+      Size, Comps: 4, 4
+      Value: 0100
+  MakerNote
+    Entry 0: 16386, Preview Size
+      Size: 8
+    Entry 1: 16387, Preview Length
+      Size: 1
+    Entry 2: 16388, Preview Start
+      Size: 4
+    Entry 3: 16389, Model Identification
+      Size: 4
+    Entry 4: 24576, Preview Start
+      Size: 20
+    Entry 5: 24577, (unknown)
+      Size: 4
+    Entry 6: 24578, (unknown)
+      Size: 0
+    Entry 7: 24579, (unknown)
+      Size: 20
+    Entry 8: 24580, (unknown)
+      Size: 20
+    Entry 9: 24581, (unknown)
+      Size: 2
+    Entry 10: 24582, (unknown)
+      Size: 20
+    Entry 11: 24593, White Balance Bias
+      Size: 8
+    Entry 12: 24594, White Balance
+      Size: 3
+    Entry 13: 24595, (unknown)
+      Size: 2
+    Entry 14: 24596, (unknown)
+      Size: 21
+    Entry 15: 24609, (unknown)
+      Size: 24
+    Entry 16: 24610, Object Distance
+      Size: 4
+    Entry 17: 24611, (unknown)
+      Size: 2
+    Entry 18: 24625, (unknown)
+      Size: 20
+    Entry 19: 24626, (unknown)
+      Size: 20
+    Entry 20: 24627, (unknown)
+      Size: 2
+    Entry 21: 24628, Flash Distance
+      Size: 4
+    Entry 22: 24629, (unknown)
+      Size: 4
+    Entry 23: 24630, (unknown)
+      Size: 9
+    Entry 24: 24631, (unknown)
+      Size: 9
+    Entry 25: 24632, (unknown)
+      Size: 1
+    Entry 26: 24633, (unknown)
+      Size: 2
+    Entry 27: 24634, (unknown)
+      Size: 5
+    Entry 28: 24635, (unknown)
+      Size: 10
+    Entry 29: 24636, (unknown)
+      Size: 2
+    Entry 30: 24637, (unknown)
+      Size: 5
+    Entry 31: 24638, (unknown)
+      Size: 5
+    Entry 32: 24641, (unknown)
+      Size: 5
+    Entry 33: 24642, (unknown)
+      Size: 5
+    Entry 34: 24643, (unknown)
+      Size: 3
+    Entry 35: 24644, (unknown)
+      Size: 2
+    Entry 36: 24645, (unknown)
+      Size: 2
+    Entry 37: 24646, (unknown)
+      Size: 5
+    Entry 38: 24647, (unknown)
+      Size: 6
+    Entry 39: 24648, (unknown)
+      Size: 4
+    Entry 40: 24649, (unknown)
+      Size: 5
+    Entry 41: 24650, (unknown)
+      Size: 2
+    Entry 42: 24651, (unknown)
+      Size: 21
+    Entry 43: 24657, (unknown)
+      Size: 1
+    Entry 44: 24658, (unknown)
+      Size: 8
+    Entry 45: 24659, (unknown)
+      Size: 1
+    Entry 46: 24660, (unknown)
+      Size: 10
+    Entry 47: 24661, (unknown)
+      Size: 2
+    Entry 48: 24662, (unknown)
+      Size: 20
+    Entry 49: 24663, (unknown)
+      Size: 2
+    Entry 50: 24664, (unknown)
+      Size: 2
+    Entry 51: 24665, (unknown)
+      Size: 2
+    Entry 52: 24666, (unknown)
+      Size: 23
+    Entry 53: 24667, (unknown)
+      Size: 10
+    Entry 54: 24668, (unknown)
+      Size: 9
+    Entry 55: 24669, (unknown)
+      Size: 6
+    Entry 56: 24670, (unknown)
+      Size: 6
+    Entry 57: 24673, (unknown)
+      Size: 2
+    Entry 58: 24674, (unknown)
+      Size: 2
+    Entry 59: 24675, (unknown)
+      Size: 1
+    Entry 60: 24676, (unknown)
+      Size: 22
+    Entry 61: 24677, (unknown)
+      Size: 9
+    Entry 62: 24678, (unknown)
+      Size: 9
+    Entry 63: 24689, (unknown)
+      Size: 2
+    Entry 64: 24691, (unknown)
+      Size: 4
+    Entry 65: 24693, (unknown)
+      Size: 20
+    Entry 66: 24694, (unknown)
+      Size: 20
+    Entry 67: 24695, (unknown)
+      Size: 20
+    Entry 68: 24697, (unknown)
+      Size: 1
+    Entry 69: 24698, (unknown)
+      Size: 1
+    Entry 70: 24699, (unknown)
+      Size: 1
+    Entry 71: 24700, (unknown)
+      Size: 5
+    Entry 72: 24701, (unknown)
+      Size: 2
+    Entry 73: 24702, (unknown)
+      Size: 2
+    Entry 74: 24703, (unknown)
+      Size: 2
+    Entry 75: 24705, (unknown)
+      Size: 1
+    Entry 76: 24706, (unknown)
+      Size: 5
+    Entry 77: 24707, (unknown)
+      Size: 22
+    Entry 78: 24708, (unknown)
+      Size: 20
+    Entry 79: 24709, (unknown)
+      Size: 2
+    Entry 80: 24710, (unknown)
+      Size: 4
+    Entry 81: 24711, (unknown)
+      Size: 4
+    Entry 82: 24712, (unknown)
+      Size: 22
+    Entry 83: 24713, (unknown)
+      Size: 23
+    Entry 84: 24714, (unknown)
+      Size: 23
+    Entry 85: 24715, (unknown)
+      Size: 21
+    Entry 86: 24716, (unknown)
+      Size: 2
+    Entry 87: 24717, (unknown)
+      Size: 2
+    Entry 88: 24718, (unknown)
+      Size: 2
+    Entry 89: 24721, (unknown)
+      Size: 20
+    Entry 90: 24722, (unknown)
+      Size: 20
+    Entry 91: 24723, (unknown)
+      Size: 5
+    Entry 92: 24724, (unknown)
+      Size: 21
+    Entry 93: 24725, (unknown)
+      Size: 4
+    Entry 94: 24726, (unknown)
+      Size: 20
+    Entry 95: 24727, (unknown)
+      Size: 21
+    Entry 96: 24728, (unknown)
+      Size: 21
+    Entry 97: 24729, (unknown)
+      Size: 21
+    Entry 98: 24730, (unknown)
+      Size: 22
+    Entry 99: 24737, (unknown)
+      Size: 3
+    Entry 100: 24738, (unknown)
+      Size: 4
+    Entry 101: 24739, (unknown)
+      Size: 2
+    Entry 102: 24740, (unknown)
+      Size: 20
+    Entry 103: 24741, (unknown)
+      Size: 20
+    Entry 104: 24753, (unknown)
+      Size: 1
+    Entry 105: 24754, (unknown)
+      Size: 1
+    Entry 106: 24755, (unknown)
+      Size: 1
+    Entry 107: 24756, (unknown)
+      Size: 1
+    Entry 108: 24757, (unknown)
+      Size: 4
+    Entry 109: 24768, (unknown)
+      Size: 21
+    Entry 110: 24769, (unknown)
+      Size: 21
+    Entry 111: 28672, Record Mode
+      Size: 2
+    Entry 112: 28673, Self-timer
+      Size: 2
+    Entry 113: 28674, Quality Level
+      Size: 2
+    Entry 114: 28675, Focus Mode
+      Size: 2
+    Entry 115: 28677, (unknown)
+      Size: 4
+    Entry 116: 28678, Time Zone
+      Size: 6
+    Entry 117: 28679, Bestshot Mode
+      Size: 2
+    Entry 118: 28680, (unknown)
+      Size: 2
+    Entry 119: 28681, (unknown)
+      Size: 2
+    Entry 120: 28682, (unknown)
+      Size: 6
+    Entry 121: 28689, (unknown)
+      Size: 20
+    Entry 122: 28690, (unknown)
+      Size: 20
+    Entry 123: 28691, (unknown)
+      Size: 20
+    Entry 124: 28692, CCS ISO Sensitivity
+      Size: 4
+    Entry 125: 28693, Color Mode
+      Size: 2
+    Entry 126: 28694, Enhancement
+      Size: 2
+    Entry 127: 28695, Finer
+      Size: 2
+    Entry 128: 28696, (unknown)
+      Size: 2
+    Entry 129: 28697, (unknown)
+      Size: 2
+    Entry 130: 28698, (unknown)
+      Size: 2
+    Entry 131: 28699, (unknown)
+      Size: 2
+    Entry 132: 28700, (unknown)
+      Size: 2
+    Entry 133: 28701, (unknown)
+      Size: 4
+    Entry 134: 28702, (unknown)
+      Size: 2
+    Entry 135: 28703, (unknown)
+      Size: 2
+    Entry 136: 28704, (unknown)
+      Size: 4
+    Entry 137: 28705, (unknown)
+      Size: 4
+    Entry 138: 28706, (unknown)
+      Size: 4
+    Entry 139: 28707, (unknown)
+      Size: 2
+    Entry 140: 28708, (unknown)
+      Size: 2
+    Entry 141: 28709, (unknown)
+      Size: 2
+    Entry 142: 28710, (unknown)
+      Size: 2
+    Entry 143: 28711, (unknown)
+      Size: 2
+    Entry 144: 28712, (unknown)
+      Size: 2
+    Entry 145: 28713, (unknown)
+      Size: 2
+    Entry 146: 28714, (unknown)
+      Size: 2
+    Entry 147: 28715, (unknown)
+      Size: 2
+    Entry 148: 28716, (unknown)
+      Size: 2
+    Entry 149: 28717, (unknown)
+      Size: 2
+    Entry 150: 28718, (unknown)
+      Size: 4
+    Entry 151: 28719, (unknown)
+      Size: 2
+    Entry 152: 28720, (unknown)
+      Size: 2
+    Entry 153: 28929, (unknown)
+      Size: 1
+    Entry 154: 28930, (unknown)
+      Size: 1
+    Entry 155: 28931, (unknown)
+      Size: 2
+    Entry 156: 28933, (unknown)
+      Size: 2
+    Entry 157: 28934, (unknown)
+      Size: 2
+    Entry 158: 28935, (unknown)
+      Size: 2
+    Entry 159: 28936, (unknown)
+      Size: 2