00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00027 #ifndef _CIFFCONTAINER_H_
00028 #define _CIFFCONTAINER_H_
00029
00030 #include <vector>
00031 #include <boost/shared_ptr.hpp>
00032
00033 #include "rawcontainer.h"
00034 #include "debug.h"
00035
00036 namespace OpenRaw {
00037 namespace Internals {
00038
00039 class CIFFContainer;
00040
00041 namespace CIFF {
00042
00044 enum {
00045 STORAGELOC_MASK = 0xc000,
00046 FORMAT_MASK = 0x3800,
00047 TAGCODE_MASK = 0x3fff
00049 };
00054 enum {
00055 TAG_NULLRECORD = 0x0000,
00056 TAG_FREEBYTES = 0x0001,
00057 TAG_COLORINFO1 = 0x0032,
00058 TAG_FILEDESCRIPTION = 0x0805,
00059 TAG_RAWMAKEMODEL = 0x080a,
00060 TAG_FIRMWAREVERSION = 0x080b,
00061 TAG_COMPONENTVERSION = 0x080c,
00062 TAG_ROMOPERATIONMODE = 0x080d,
00063 TAG_OWNERNAME = 0x0810,
00064 TAG_IMAGETYPE = 0x0815,
00065 TAG_ORIGINALFILENAME = 0x0816,
00066 TAG_THUMBNAILFILENAME = 0x0817,
00067
00068 TAG_TARGETIMAGETYPE = 0x100a,
00069 TAG_SHUTTERRELEASEMETHOD = 0x1010,
00070 TAG_SHUTTERRELEASETIMING = 0x1011,
00071 TAG_RELEASESETTING = 0x1016,
00072 TAG_BASEISO = 0x101c,
00073 TAG_FOCALLENGTH = 0x1029,
00074 TAG_SHOTINFO = 0x102a,
00075 TAG_COLORINFO2 = 0x102c,
00076 TAG_CAMERASETTINGS = 0x102d,
00077 TAG_SENSORINFO = 0x1031,
00078 TAG_CUSTOMFUNCTIONS = 0x1033,
00079 TAG_PICTUREINFO = 0x1038,
00080 TAG_WHITEBALANCETABLE = 0x10a9,
00081 TAG_COLORSPACE = 0x10b4,
00082
00083 TAG_IMAGESPEC = 0x1803,
00084 TAG_RECORDID = 0x1804,
00085 TAG_SELFTIMERTIME = 0x1806,
00086 TAG_TARGETDISTANCESETTING = 0x1807,
00087 TAG_SERIALNUMBER = 0x180b,
00088 TAG_CAPTUREDTIME = 0x180e,
00089 TAG_IMAGEINFO = 0x1810,
00090 TAG_FLASHINFO = 0x1813,
00091 TAG_MEASUREDEV = 0x1814,
00092 TAG_FILENUMBER = 0x1817,
00093 TAG_EXPOSUREINFO = 0x1818,
00094 TAG_DECODERTABLE = 0x1835,
00095
00096 TAG_RAWIMAGEDATA = 0x2005,
00097 TAG_JPEGIMAGE = 0x2007,
00098 TAG_JPEGTHUMBNAIL = 0x2008,
00099
00100 TAG_IMAGEDESCRIPTION = 0x2804,
00101 TAG_CAMERAOBJECT = 0x2807,
00102 TAG_SHOOTINGRECORD = 0x3002,
00103 TAG_MEASUREDINFO = 0x3003,
00104 TAG_CAMERASPECIFICATION = 0x3004,
00105 TAG_IMAGEPROPS = 0x300a,
00106 TAG_EXIFINFORMATION = 0x300b
00107 };
00108
00109 class Heap;
00110
00111
00112 class ImageSpec
00113 {
00114 public:
00115 ImageSpec()
00116 : imageWidth(0), imageHeight(0),
00117 pixelAspectRatio(0), rotationAngle(0),
00118 componentBitDepth(0), colorBitDepth(0),
00119 colorBW(0)
00120 {
00121 }
00122
00128 bool readFrom(off_t offset, CIFFContainer *container);
00129 int32_t exifOrientation() const;
00130
00131 uint32_t imageWidth;
00132 uint32_t imageHeight;
00133 uint32_t pixelAspectRatio;
00134 int32_t rotationAngle;
00135 uint32_t componentBitDepth;
00136 uint32_t colorBitDepth;
00137 uint32_t colorBW;
00138 };
00139
00140 class RecordEntry
00141 {
00142 public:
00143 typedef std::vector<RecordEntry> List;
00144
00145 RecordEntry();
00146
00151 bool readFrom(CIFFContainer *container);
00158 size_t fetchData(Heap* heap, void* buf, size_t size) const;
00163 bool isA(uint16_t _typeCode) const
00164 {
00165 Debug::Trace(DEBUG2) << "typeCode = " << typeCode << "\n";
00166 return typeCode == (TAGCODE_MASK & _typeCode);
00167 }
00168
00169 uint16_t typeCode;
00170 uint32_t length;
00171 uint32_t offset;
00172 };
00173
00175 class Heap
00176 {
00177 public:
00178 typedef boost::shared_ptr<Heap> Ref;
00179
00185 Heap(off_t start, off_t length, CIFFContainer * container);
00186
00187 RecordEntry::List & records();
00188 CIFFContainer *container()
00189 {
00190 return m_container;
00191 }
00193 off_t offset()
00194 {
00195 return m_start;
00196 }
00197 private:
00198 bool _loadRecords();
00199
00200 Heap(const Heap &);
00201 Heap & operator=(const Heap &);
00202
00203 off_t m_start;
00204 off_t m_length;
00205 CIFFContainer *m_container;
00206 RecordEntry::List m_records;
00207 };
00208
00209
00211 class HeapFileHeader
00212 {
00213 public:
00214 bool readFrom(CIFFContainer *);
00215 char byteOrder[2];
00216 uint32_t headerLength;
00217 char type[4];
00218 char subType[4];
00219 uint32_t version;
00220
00221
00222 RawContainer::EndianType endian;
00223 };
00224 }
00225
00229 class CIFFContainer
00230 : public RawContainer
00231 {
00232 public:
00233 CIFFContainer(IO::Stream *file);
00234 virtual ~CIFFContainer();
00235
00236 CIFF::Heap::Ref heap();
00237
00238 const CIFF::HeapFileHeader & header() const
00239 {
00240 return m_hdr;
00241 }
00242 CIFF::Heap::Ref getImageProps();
00243 const CIFF::RecordEntry * getRawDataRecord() const;
00244 const CIFF::ImageSpec * getImageSpec();
00245 private:
00246 bool _loadHeap();
00247 EndianType _readHeader();
00248
00249
00250 CIFFContainer(const CIFFContainer &);
00251 CIFFContainer & operator=(const CIFFContainer &);
00252
00253 friend class CIFF::HeapFileHeader;
00254 CIFF::HeapFileHeader m_hdr;
00255 CIFF::Heap::Ref m_heap;
00256 CIFF::Heap::Ref m_imageprops;
00257 bool m_hasImageSpec;
00258 CIFF::ImageSpec m_imagespec;
00259 };
00260
00261
00262 }
00263 }
00264
00265
00266
00267 #endif