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