24 #include <boost/scoped_array.hpp>
25 #include <libopenraw/libopenraw.h>
26 #include <libopenraw++/thumbnail.h>
27 #include <libopenraw++/rawdata.h>
30 #include "io/stream.h"
32 #include "mrwcontainer.h"
37 using namespace Debug;
45 {
"21860002", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_MINOLTA,
46 OR_TYPEID_MINOLTA_MAXXUM_5D) },
47 {
"21810002", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_MINOLTA,
48 OR_TYPEID_MINOLTA_MAXXUM_7D) },
49 {
"27730001", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_MINOLTA,
50 OR_TYPEID_MINOLTA_DIMAGE5) },
51 {
"27660001", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_MINOLTA,
52 OR_TYPEID_MINOLTA_DIMAGE7) },
53 {
"27790001", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_MINOLTA,
54 OR_TYPEID_MINOLTA_DIMAGE7I) },
55 {
"27780001", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_MINOLTA,
56 OR_TYPEID_MINOLTA_DIMAGE7HI) },
57 {
"27820001", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_MINOLTA,
58 OR_TYPEID_MINOLTA_A1) },
59 {
"27200001", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_MINOLTA,
60 OR_TYPEID_MINOLTA_A2) },
61 {
"27470002", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_MINOLTA,
62 OR_TYPEID_MINOLTA_A200) },
72 : IFDFile(_f, OR_RAWFILE_TYPE_MRW, false)
82 IFDDir::Ref MRWFile::_locateCfaIfd()
92 IFDDir::Ref MRWFile::_locateMainIfd()
98 void MRWFile::_identifyId()
106 std::string version = mc->prd->string_val(MRW::PRD_VERSION);
115 ::or_error err = OR_ERROR_NOT_FOUND;
116 list.push_back (640);
127 ::or_error ret = OR_ERROR_NOT_FOUND;
130 dir = _locateExifIfd();
132 Trace(WARNING) <<
"EXIF dir not found\n";
136 maker_ent = dir->getEntry(IFD::EXIF_TAG_MAKER_NOTE);
138 Trace(WARNING) <<
"maker note offset entry not found\n";
142 off = maker_ent->offset();
144 IFDDir::Ref ref(
new IFDDir(mc->ttw->offset() +
145 MRW::DataBlockHeaderLength + off,
149 uint32_t tnail_offset = 0;
150 uint32_t tnail_len = 0;
151 thumb_ent = ref->getEntry(MRW::MRWTAG_THUMBNAIL);
153 tnail_offset = thumb_ent->offset();
154 tnail_len = thumb_ent->count();
156 else if(ref->getValue(MRW::MRWTAG_THUMBNAIL_OFFSET, tnail_offset)) {
157 if(!ref->getValue(MRW::MRWTAG_THUMBNAIL_LENGTH, tnail_len)) {
158 Trace(WARNING) <<
"thumbnail lenght entry not found\n";
164 Trace(WARNING) <<
"thumbnail offset entry not found\n";
168 Trace(DEBUG1) <<
"thumbnail offset found, "
169 <<
" offset == " << tnail_offset <<
" count == "
170 << tnail_len <<
"\n";
171 void *p = thumbnail.allocData (tnail_len);
173 + MRW::DataBlockHeaderLength
176 if (fetched != tnail_len) {
177 Trace(WARNING) <<
"Unable to fetch all thumbnail data: "
178 << fetched <<
" not " << tnail_len
182 ((
unsigned char *)p)[0] = 0xFF;
186 return OR_ERROR_NONE;
195 return OR_ERROR_NOT_FOUND;
198 uint16_t y = mc->prd->uint16_val (MRW::PRD_SENSOR_LENGTH);
199 uint16_t x = mc->prd->uint16_val (MRW::PRD_SENSOR_WIDTH);
200 uint8_t bpc = mc->prd->uint8_val (MRW::PRD_PIXEL_SIZE);
202 bool is_compressed = (mc->prd->uint8_val(MRW::PRD_STORAGE_TYPE) == 0x59);
207 uint32_t finaldatalen = 2 * x * y;
209 (is_compressed ? x * y + ((x * y) >> 1) : finaldatalen);
211 if(options & OR_OPTIONS_DONT_DECOMPRESS) {
212 finaldatalen = datalen;
214 if(is_compressed && (options & OR_OPTIONS_DONT_DECOMPRESS)) {
223 Trace(DEBUG1) <<
"datalen = " << datalen <<
224 " final datalen = " << finaldatalen <<
"\n";
225 void *p = data.allocData(finaldatalen);
228 if(!is_compressed || (options & OR_OPTIONS_DONT_DECOMPRESS)) {
232 Unpack unpack(x, IFD::COMPRESS_NONE);
233 size_t blocksize = unpack.block_size();
234 boost::scoped_array<uint8_t> block(
new uint8_t[blocksize]);
235 uint8_t * outdata = (uint8_t*)data.data();
238 Trace(DEBUG2) <<
"fatchData @offset " << offset <<
"\n";
243 Trace(DEBUG2) <<
"got " << got <<
"\n";
248 Trace(DEBUG2) <<
"unpacked " << out
249 <<
" bytes from " << got <<
"\n";
251 }
while((got != 0) && (fetched < datalen));
253 if (fetched < datalen) {
254 Trace(WARNING) <<
"Fetched only " << fetched <<
255 " of " << datalen <<
": continuing anyway.\n";
257 uint16_t bpat = mc->prd->uint16_val (MRW::PRD_BAYER_PATTERN);
258 or_cfa_pattern cfa_pattern = OR_CFA_PATTERN_NONE;
262 cfa_pattern = OR_CFA_PATTERN_RGGB;
265 cfa_pattern = OR_CFA_PATTERN_GBRG;
270 data.setCfaPattern(cfa_pattern);
273 return OR_ERROR_NONE;