Author: post
Date: 2010-11-21 22:34:33 +0100 (Sun, 21 Nov 2010)
New Revision: 296

Modified:
   RawSpeed/TiffIFD.cpp
   RawSpeed/TiffIFD.h
   RawSpeed/TiffIFDBE.cpp
Log:
Better Panasonic metadata parsing.

Modified: RawSpeed/TiffIFD.cpp
===================================================================
--- RawSpeed/TiffIFD.cpp        2010-11-14 15:40:26 UTC (rev 295)
+++ RawSpeed/TiffIFD.cpp        2010-11-21 21:34:33 UTC (rev 296)
@@ -58,7 +58,7 @@
           // Unparsable private data are added as entries
           mEntry[t->tag] = t;
         }
-      } else if (t->tag == MAKERNOTE) {
+      } else if (t->tag == MAKERNOTE || t->tag == 0x2e) {
         try {
           mSubIFD.push_back(parseMakerNote(f, t->getDataOffset(), endian));
           delete(t);
@@ -66,23 +66,17 @@
           // Unparsable makernotes are added as entries
           mEntry[t->tag] = t;
         }
-      } else if (t->tag == 0x2e) {
+      } else {
+        const unsigned int* sub_offsets = t->getIntArray();
         try {
-          FileMap file_map((uchar8*)t->getData()+12, t->count-12);
-          TiffParser tiff(&file_map);
-          tiff.parseData();
-          mSubIFD.push_back(tiff.RootIFD());
+          for (uint32 j = 0; j < t->count; j++) {
+            mSubIFD.push_back(new TiffIFD(f, sub_offsets[j]));
+          }
           delete(t);
         } catch (TiffParserException e) {
-          // Unparsable makernotes are added as entries
+          // Unparsable subifds are added as entries
           mEntry[t->tag] = t;
         }
-      } else {
-        const unsigned int* sub_offsets = t->getIntArray();
-        for (uint32 j = 0; j < t->count; j++) {
-          mSubIFD.push_back(new TiffIFD(f, sub_offsets[j]));
-        }
-        delete(t);
       }
     } else {  // Store as entry
       mEntry[t->tag] = t;
@@ -158,7 +152,7 @@
 TiffIFD* TiffIFD::parseMakerNote(FileMap *f, uint32 offset, Endianness 
parent_end)
 {
   uint32 size = f->getSize();
-  CHECKSIZE(offset + 6);
+  CHECKSIZE(offset + 20);
   TiffIFD *maker_ifd = NULL;
   const uchar8* data = f->getData(offset);
 
@@ -169,6 +163,17 @@
     offset +=4;
   }
 
+  // Panasonic has the word Exif at byte 6, a complete Tiff header starts at 
byte 12
+  // This TIFF is 0 offset based
+  if (data[6] == 0x45 && data[7] == 0x78 && data[8] == 0x69 && data[9] == 0x66)
+  {
+    parent_end = getTiffEndianness((const ushort16*)&data[12]);
+    if (parent_end == unknown)
+      ThrowTPE("Cannot determine Panasonic makernote endianness");
+    data +=20;
+    offset +=20;
+  }
+
   // Some have MM or II to indicate endianness - read that
   if (data[0] == 0x49 && data[1] == 0x49) {
     offset +=2;

Modified: RawSpeed/TiffIFD.h
===================================================================
--- RawSpeed/TiffIFD.h  2010-11-14 15:40:26 UTC (rev 295)
+++ RawSpeed/TiffIFD.h  2010-11-21 21:34:33 UTC (rev 296)
@@ -49,4 +49,23 @@
   int nextIFD;
 };
 
+inline bool isTiffSameAsHost(const ushort16* tifftag) {
+  Endianness host = getHostEndianness();
+  if (tifftag[0] == 0x4949)
+    return little == host;
+  if (tifftag[0] == 0x4d4d)
+    return big == host;
+  ThrowTPE("Unknown Tiff Byteorder :%x", tifftag[0]);
+  return false;
+}
+
+inline Endianness getTiffEndianness(const ushort16* tifftag) {
+  Endianness host = getHostEndianness();
+  if (tifftag[0] == 0x4949)
+    return little;
+  if (tifftag[0] == 0x4d4d)
+    return big;
+  return unknown;
+}
+
 } // namespace RawSpeed

Modified: RawSpeed/TiffIFDBE.cpp
===================================================================
--- RawSpeed/TiffIFDBE.cpp      2010-11-14 15:40:26 UTC (rev 295)
+++ RawSpeed/TiffIFDBE.cpp      2010-11-21 21:34:33 UTC (rev 296)
@@ -51,7 +51,7 @@
           // Unparsable private data are added as entries
           mEntry[t->tag] = t;
         }
-      } else if (t->tag == MAKERNOTE) {
+      } else if (t->tag == MAKERNOTE || t->tag == 0x2e) {
         try {
           mSubIFD.push_back(parseMakerNote(f, t->getDataOffset(), endian));
           delete(t);
@@ -59,20 +59,17 @@
           // Unparsable makernotes are added as entries
           mEntry[t->tag] = t;
         }
-      } else if (t->tag == 0x2e) {
+      } else {
+        const unsigned int* sub_offsets = t->getIntArray();
         try {
-          mSubIFD.push_back(new TiffIFD(f, t->getDataOffset()+12));
+          for (uint32 j = 0; j < t->count; j++) {
+            mSubIFD.push_back(new TiffIFDBE(f, sub_offsets[j]));
+          }
           delete(t);
         } catch (TiffParserException e) {
-          // Unparsable makernotes are added as entries
+          // Unparsable subifds are added as entries
           mEntry[t->tag] = t;
         }
-      } else {
-        const unsigned int* sub_offsets = t->getIntArray();
-        for (uint32 j = 0; j < t->count; j++) {
-          mSubIFD.push_back(new TiffIFDBE(f, sub_offsets[j]));
-        }
-        delete(t);
       }
     } else {  // Store as entry
       mEntry[t->tag] = t;


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to