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