string NefDecoder::getMode() { ostringstream mode; vector<TiffIFD*> data = mRootIFD->getIFDsWithTag(CFAPATTERN); TiffIFD* raw = FindBestImage(&data); int compression = raw->getEntry(COMPRESSION)->getInt(); uint32 bitPerPixel = raw->getEntry(BITSPERSAMPLE)->getInt(); if (1 == compression) mode << bitPerPixel << "bit-uncompressed"; else mode << bitPerPixel << "bit-uncompressed"; return mode.str(); }
void NefDecoder::DecodeUncompressed() { vector<TiffIFD*> data = mRootIFD->getIFDsWithTag(CFAPATTERN); TiffIFD* raw = FindBestImage(&data); uint32 nslices = raw->getEntry(STRIPOFFSETS)->count; const uint32 *offsets = raw->getEntry(STRIPOFFSETS)->getIntArray(); const uint32 *counts = raw->getEntry(STRIPBYTECOUNTS)->getIntArray(); uint32 yPerSlice = raw->getEntry(ROWSPERSTRIP)->getInt(); uint32 width = raw->getEntry(IMAGEWIDTH)->getInt(); uint32 height = raw->getEntry(IMAGELENGTH)->getInt(); uint32 bitPerPixel = raw->getEntry(BITSPERSAMPLE)->getInt(); vector<NefSlice> slices; uint32 offY = 0; for (uint32 s = 0; s < nslices; s++) { NefSlice slice; slice.offset = offsets[s]; slice.count = counts[s]; if (offY + yPerSlice > height) slice.h = height - offY; else slice.h = yPerSlice; offY = MIN(height, offY + yPerSlice); if (mFile->isValid(slice.offset, slice.count)) // Only decode if size is valid slices.push_back(slice); } if (0 == slices.size()) ThrowRDE("NEF Decoder: No valid slices found. File probably truncated."); mRaw->dim = iPoint2D(width, offY); mRaw->createData(); if (bitPerPixel == 14 && width*slices[0].h*2 == slices[0].count) bitPerPixel = 16; // D3 & D810 if(hints.find("real_bpp") != hints.end()) { stringstream convert(hints.find("real_bpp")->second); convert >> bitPerPixel; }
void NefDecoder::DecodeUncompressed() { vector<TiffIFD*> data = mRootIFD->getIFDsWithTag(CFAPATTERN); TiffIFD* raw = FindBestImage(&data); uint32 nslices = raw->getEntry(STRIPOFFSETS)->count; const uint32 *offsets = raw->getEntry(STRIPOFFSETS)->getIntArray(); const uint32 *counts = raw->getEntry(STRIPBYTECOUNTS)->getIntArray(); uint32 yPerSlice = raw->getEntry(ROWSPERSTRIP)->getInt(); uint32 width = raw->getEntry(IMAGEWIDTH)->getInt(); uint32 height = raw->getEntry(IMAGELENGTH)->getInt(); uint32 bitPerPixel = raw->getEntry(BITSPERSAMPLE)->getInt(); vector<NefSlice> slices; uint32 offY = 0; for (uint32 s = 0; s < nslices; s++) { NefSlice slice; slice.offset = offsets[s]; slice.count = counts[s]; if (offY + yPerSlice > height) slice.h = height - offY; else slice.h = yPerSlice; offY += yPerSlice; if (mFile->isValid(slice.offset + slice.count)) // Only decode if size is valid slices.push_back(slice); } if (0 == slices.size()) ThrowRDE("NEF Decoder: No valid slices found. File probably truncated."); mRaw->dim = iPoint2D(width, offY); mRaw->createData(); if (bitPerPixel == 14 && width*slices[0].h*2 == slices[0].count) bitPerPixel = 16; // D3 offY = 0; for (uint32 i = 0; i < slices.size(); i++) { NefSlice slice = slices[i]; ByteStream in(mFile->getData(slice.offset), slice.count); iPoint2D size(width, slice.h); iPoint2D pos(0, offY); try { if (hints.find(string("coolpixmangled")) != hints.end()) readCoolpixMangledRaw(in, size, pos, width*bitPerPixel / 8); else if (hints.find(string("coolpixsplit")) != hints.end()) readCoolpixSplitRaw(in, size, pos, width*bitPerPixel / 8); else readUncompressedRaw(in, size, pos, width*bitPerPixel / 8, bitPerPixel, true); } catch (RawDecoderException e) { if (i>0) mRaw->setError(e.what()); else throw; } catch (IOException e) { if (i>0) mRaw->setError(e.what()); else ThrowRDE("NEF decoder: IO error occurred in first slice, unable to decode more. Error is: %s", e.what()); } offY += slice.h; } }