Author: post
Date: 2010-11-13 23:25:07 +0100 (Sat, 13 Nov 2010)
New Revision: 289

Modified:
   RawSpeed/TiffIFD.cpp
   RawSpeed/TiffIFD.h
   RawSpeed/TiffIFDBE.cpp
Log:
Parse Camera Maker notes in separate function, and add support for different 
types.

Modified: RawSpeed/TiffIFD.cpp
===================================================================
--- RawSpeed/TiffIFD.cpp        2010-11-07 12:28:28 UTC (rev 288)
+++ RawSpeed/TiffIFD.cpp        2010-11-13 22:25:07 UTC (rev 289)
@@ -48,7 +48,7 @@
   for (uint32 i = 0; i < entries; i++) {
     TiffEntry *t = new TiffEntry(f, offset + 2 + i*12);
 
-    if (t->tag == SUBIFDS || t->tag == EXIFIFDPOINTER || t->tag == 
DNGPRIVATEDATA || t->tag == MAKERNOTE) {   // subIFD tag
+    if (t->tag == SUBIFDS || t->tag == EXIFIFDPOINTER || t->tag == 
DNGPRIVATEDATA || t->tag == MAKERNOTE || t->tag == 0x2e) {   // subIFD tag
       if (t->tag == DNGPRIVATEDATA) {
         try {
           TiffIFD *maker_ifd = parseDngPrivateData(t);
@@ -60,12 +60,23 @@
         }
       } else if (t->tag == MAKERNOTE) {
         try {
-          mSubIFD.push_back(new TiffIFD(f, t->getDataOffset()));
+          mSubIFD.push_back(parseMakerNote(f, t->getDataOffset(), endian));
           delete(t);
         } catch (TiffParserException e) {
           // Unparsable makernotes are added as entries
           mEntry[t->tag] = t;
         }
+      } else if (t->tag == 0x2e) {
+        try {
+          FileMap file_map((uchar8*)t->getData()+12, t->count-12);
+          TiffParser tiff(&file_map);
+          tiff.parseData();
+          mSubIFD.push_back(tiff.RootIFD());
+          delete(t);
+        } catch (TiffParserException e) {
+          // Unparsable makernotes are added as entries
+          mEntry[t->tag] = t;
+        }
       } else {
         const unsigned int* sub_offsets = t->getIntArray();
         for (uint32 j = 0; j < t->count; j++) {
@@ -132,10 +143,7 @@
 
   TiffIFD *maker_ifd;
   try {
-    if (makernote_endian == getHostEndianness())
-      maker_ifd = new TiffIFD(maker_map, org_offset);
-    else
-      maker_ifd = new TiffIFDBE(maker_map, org_offset);
+    maker_ifd = parseMakerNote(maker_map, org_offset, makernote_endian);
   } catch (TiffParserException e) {
     delete[] maker_data;
     delete maker_map;
@@ -146,6 +154,40 @@
   return maker_ifd;
 }
 
+/* This will attempt to parse makernotes and return it as an IFD */
+TiffIFD* TiffIFD::parseMakerNote(FileMap *f, uint32 offset, Endianness 
parent_end)
+{
+  uint32 size = f->getSize();
+  CHECKSIZE(offset + 6);
+  TiffIFD *maker_ifd = NULL;
+  const uchar8* data = f->getData(offset);
+
+  // Pentax makernote starts with AOC\0 - If it's there, skip it
+  if (data[0] == 0x41 && data[1] == 0x4f && data[2] == 0x43 && data[3] == 0)
+  {
+    data +=4;
+    offset +=4;
+  }
+
+  // Some have MM or II to indicate endianness - read that
+  if (data[0] == 0x49 && data[1] == 0x49) {
+    offset +=2;
+    parent_end = little;
+  } else if (data[0] == 0x4D && data[1] == 0x4D) {
+    parent_end = big;
+    offset +=2;
+  }
+
+  // Attempt to parse the rest as an IFD
+  if (parent_end == getHostEndianness())
+    maker_ifd = new TiffIFD(f, offset);
+  else
+    maker_ifd = new TiffIFDBE(f, offset);
+
+  // If the structure cannot be read, a TiffParserException will be thrown.
+  return maker_ifd;
+}
+
 TiffIFD::~TiffIFD(void) {
   for (map<TiffTag, TiffEntry*>::iterator i = mEntry.begin(); i != 
mEntry.end(); ++i) {
     delete((*i).second);
@@ -202,6 +244,7 @@
   return 0;
 }
 
+
 bool TiffIFD::hasEntry(TiffTag tag) {
   return mEntry.find(tag) != mEntry.end();
 }

Modified: RawSpeed/TiffIFD.h
===================================================================
--- RawSpeed/TiffIFD.h  2010-11-07 12:28:28 UTC (rev 288)
+++ RawSpeed/TiffIFD.h  2010-11-13 22:25:07 UTC (rev 289)
@@ -43,6 +43,7 @@
   bool hasEntryRecursive(TiffTag tag);
   TiffEntry* getEntryRecursive(TiffTag tag);
   TiffIFD* parseDngPrivateData(TiffEntry *t);
+  TiffIFD* TiffIFD::parseMakerNote(FileMap *f, uint32 offset, Endianness 
parent_end);
   Endianness endian;
 protected:
   int nextIFD;

Modified: RawSpeed/TiffIFDBE.cpp
===================================================================
--- RawSpeed/TiffIFDBE.cpp      2010-11-07 12:28:28 UTC (rev 288)
+++ RawSpeed/TiffIFDBE.cpp      2010-11-13 22:25:07 UTC (rev 289)
@@ -53,12 +53,20 @@
         }
       } else if (t->tag == MAKERNOTE) {
         try {
-          mSubIFD.push_back(new TiffIFDBE(f, t->getDataOffset()));
+          mSubIFD.push_back(parseMakerNote(f, t->getDataOffset(), endian));
           delete(t);
         } catch (TiffParserException e) {
           // Unparsable makernotes are added as entries
           mEntry[t->tag] = t;
         }
+      } else if (t->tag == 0x2e) {
+        try {
+          mSubIFD.push_back(new TiffIFD(f, t->getDataOffset()+12));
+          delete(t);
+        } catch (TiffParserException e) {
+          // Unparsable makernotes are added as entries
+          mEntry[t->tag] = t;
+        }
       } else {
         const unsigned int* sub_offsets = t->getIntArray();
         for (uint32 j = 0; j < t->count; j++) {


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

Reply via email to