RawImage NakedDecoder::decodeRawInternal() { mRaw->dim = iPoint2D(width, height); mRaw->createData(); ByteStream input(mFile->getData(offset), mFile->getSize()-offset); iPoint2D pos(0, 0); readUncompressedRaw(input, mRaw->dim, pos, width*bits/8, bits, BitOrder_Jpeg16); return mRaw; }
RawImage NakedDecoder::decodeRawInternal() { uint32 width=0, height=0, filesize=0, bits=0, offset=0; if(cam->hints.find("full_width") != cam->hints.end()) { string tmp = cam->hints.find(string("full_width"))->second; width = (uint32) atoi(tmp.c_str()); } else ThrowRDE("Naked: couldn't find width"); if(cam->hints.find("full_height") != cam->hints.end()) { string tmp = cam->hints.find(string("full_height"))->second; height = (uint32) atoi(tmp.c_str()); } else ThrowRDE("Naked: couldn't find height"); if(cam->hints.find("filesize") != cam->hints.end()) { string tmp = cam->hints.find(string("filesize"))->second; filesize = (uint32) atoi(tmp.c_str()); } else ThrowRDE("Naked: couldn't find filesize"); if(cam->hints.find("offset") != cam->hints.end()) { string tmp = cam->hints.find(string("offset"))->second; offset = (uint32) atoi(tmp.c_str()); } if(cam->hints.find("bits") != cam->hints.end()) { string tmp = cam->hints.find(string("bits"))->second; bits = (uint32) atoi(tmp.c_str()); } else bits = (filesize-offset)*8/width/height; BitOrder bo = BitOrder_Jpeg16; // Default if(cam->hints.find("order") != cam->hints.end()) { string tmp = cam->hints.find(string("order"))->second; if (tmp.compare("plain") == 0) { bo = BitOrder_Plain; } else if (tmp.compare("jpeg") == 0) { bo = BitOrder_Jpeg; } else if (tmp.compare("jpeg16") == 0) { bo = BitOrder_Jpeg16; } else if (tmp.compare("jpeg32") == 0) { bo = BitOrder_Jpeg32; } } mRaw->dim = iPoint2D(width, height); mRaw->createData(); ByteStream input(mFile->getData(offset), mFile->getSize()-offset); iPoint2D pos(0, 0); readUncompressedRaw(input, mRaw->dim, pos, width*bits/8, bits, bo); return mRaw; }
RawImage Rw2Decoder::decodeRawInternal() { vector<TiffIFD*> data = mRootIFD->getIFDsWithTag(PANASONIC_STRIPOFFSET); bool isOldPanasonic = FALSE; if (data.empty()) { if (!mRootIFD->hasEntryRecursive(STRIPOFFSETS)) ThrowRDE("RW2 Decoder: No image data found"); isOldPanasonic = TRUE; data = mRootIFD->getIFDsWithTag(STRIPOFFSETS); } TiffIFD* raw = data[0]; uint32 height = raw->getEntry((TiffTag)3)->getShort(); uint32 width = raw->getEntry((TiffTag)2)->getShort(); if (isOldPanasonic) { ThrowRDE("Cannot decode old-style Panasonic RAW files"); TiffEntry *offsets = raw->getEntry(STRIPOFFSETS); TiffEntry *counts = raw->getEntry(STRIPBYTECOUNTS); if (offsets->count != 1) { ThrowRDE("RW2 Decoder: Multiple Strips found: %u", offsets->count); } int off = offsets->getInt(); if (!mFile->isValid(off)) ThrowRDE("Panasonic RAW Decoder: Invalid image data offset, cannot decode."); int count = counts->getInt(); if (count != (int)(width*height*2)) ThrowRDE("Panasonic RAW Decoder: Byte count is wrong."); if (!mFile->isValid(off+count)) ThrowRDE("Panasonic RAW Decoder: Invalid image data offset, cannot decode."); mRaw->dim = iPoint2D(width, height); mRaw->createData(); ByteStream input_start(mFile->getData(off), mFile->getSize() - off); iPoint2D pos(0, 0); readUncompressedRaw(input_start, mRaw->dim,pos, width*2, 16, BitOrder_Plain); } else { mRaw->dim = iPoint2D(width, height); mRaw->createData(); TiffEntry *offsets = raw->getEntry(PANASONIC_STRIPOFFSET); if (offsets->count != 1) { ThrowRDE("RW2 Decoder: Multiple Strips found: %u", offsets->count); } load_flags = 0x2008; int off = offsets->getInt(); if (!mFile->isValid(off)) ThrowRDE("RW2 Decoder: Invalid image data offset, cannot decode."); input_start = new ByteStream(mFile->getData(off), mFile->getSize() - off); DecodeRw2(); } // Read blacklevels if (raw->hasEntry((TiffTag)0x1c) && raw->hasEntry((TiffTag)0x1d) && raw->hasEntry((TiffTag)0x1e)) { mRaw->blackLevelSeparate[0] = raw->getEntry((TiffTag)0x1c)->getInt() + 15; mRaw->blackLevelSeparate[1] = mRaw->blackLevelSeparate[2] = raw->getEntry((TiffTag)0x1d)->getInt() + 15; mRaw->blackLevelSeparate[3] = raw->getEntry((TiffTag)0x1e)->getInt() + 15; } return mRaw; }
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; } }