Author: post
Date: 2009-09-01 20:51:43 +0200 (Tue, 01 Sep 2009)
New Revision: 133
Modified:
RawSpeed/ByteStream.cpp
RawSpeed/Rw2Decoder.cpp
RawSpeed/Rw2Decoder.h
Log:
Experimental Panasonic RW2 support.
Modified: RawSpeed/ByteStream.cpp
===================================================================
--- RawSpeed/ByteStream.cpp 2009-09-01 14:57:08 UTC (rev 132)
+++ RawSpeed/ByteStream.cpp 2009-09-01 18:51:43 UTC (rev 133)
@@ -42,7 +42,7 @@
void ByteStream::skipBytes( guint nbytes )
{
off += nbytes;
- if (off>=size)
+ if (off>size)
throw IOException("Skipped out of buffer");
}
Modified: RawSpeed/Rw2Decoder.cpp
===================================================================
--- RawSpeed/Rw2Decoder.cpp 2009-09-01 14:57:08 UTC (rev 132)
+++ RawSpeed/Rw2Decoder.cpp 2009-09-01 18:51:43 UTC (rev 133)
@@ -24,18 +24,20 @@
*/
Rw2Decoder::Rw2Decoder(TiffIFD *rootIFD, FileMap* file) :
-RawDecoder(file), mRootIFD(rootIFD)
+RawDecoder(file), mRootIFD(rootIFD), input(0),vbits(0)
{
}
Rw2Decoder::~Rw2Decoder(void)
{
+ if (input)
+ delete input;
+ input = 0;
}
RawImage Rw2Decoder::decodeRaw()
{
- ThrowRDE("RW2 Decoder: Not supported");
-/*
+
vector<TiffIFD*> data = mRootIFD->getIFDsWithTag(PANASONIC_STRIPOFFSET);
if (data.empty())
@@ -49,24 +51,89 @@
ThrowRDE("RW2 Decoder: Multiple Strips found: %u",offsets->count);
}
-// guint width = raw->getEntry()->getInt();
- guint height = raw->getEntry((TiffTag)3)->getInt();
- guint bitPerPixel = raw->getEntry(BITSPERSAMPLE)->getInt();*/
- return NULL;
+ guint height = raw->getEntry((TiffTag)3)->getShort();
+ guint width = raw->getEntry((TiffTag)2)->getShort();
+
+ mRaw->dim = iPoint2D(width, height);
+ mRaw->bpp = 2;
+ mRaw->createData();
+
+ load_flags = 0x2008;
+ gint off = offsets->getInt();
+
+ input = new ByteStream(mFile->getData(off),mFile->getSize()-off);
+ try {
+ DecodeRw2();
+ } catch (IOException e) {
+ errors.push_back(e.what()); // We attempt to ignore, since truncated
files may be ok.
+ }
+
+ return mRaw;
}
+void Rw2Decoder::DecodeRw2()
+{
+ int x, y, i, j, sh=0, pred[2], nonz[2];
+ int w = mRaw->dim.x;
+ int h = mRaw->dim.y;
+
+ pana_bits(0);
+ for (y=0; y < h; y++) {
+ gushort* dest = (gushort*)mRaw->getData(0,y);
+ for (x=0; x < w; x++) {
+ if ((i = x % 14) == 0)
+ pred[0] = pred[1] = nonz[0] = nonz[1] = 0;
+ if (i % 3 == 2) sh = 4 >> (3 - pana_bits(2));
+ if (nonz[i & 1]) {
+ if ((j = pana_bits(8))) {
+ if ((pred[i & 1] -= 0x80 << sh) < 0 || sh == 4)
+ pred[i & 1] &= ~(-1 << sh);
+ pred[i & 1] += j << sh;
+ }
+ } else if ((nonz[i & 1] = pana_bits(8)) || i > 11)
+ pred[i & 1] = nonz[i & 1] << 4 | pana_bits(4);
+ dest[x] = pred[x&1];
+ _ASSERTE(dest < 4098);
+ }
+ }
+}
+
+unsigned Rw2Decoder::pana_bits (int nbits)
+{
+ int byte;
+
+ if (!vbits) {
+ if (input->getRemainSize() < 0x4000-load_flags) {
+ memcpy (buf+load_flags, input->getData(), input->getRemainSize());
+ input->skipBytes(input->getRemainSize());
+ } else {
+ memcpy (buf+load_flags, input->getData(), 0x4000-load_flags);
+ input->skipBytes(0x4000-load_flags);
+ if (input->getRemainSize()<load_flags) {
+ memcpy (buf, input->getData(), input->getRemainSize());
+ input->skipBytes(input->getRemainSize());
+ } else {
+ memcpy (buf, input->getData(), load_flags);
+ input->skipBytes(load_flags);
+ }
+ }
+ }
+ vbits = (vbits - nbits) & 0x1ffff;
+ byte = vbits >> 3 ^ 0x3ff0;
+ return (buf[byte] | buf[byte+1] << 8) >> (vbits & 7) & ~(-1 << nbits);
+}
+
void Rw2Decoder::checkSupport(CameraMetaData *meta) {
- ThrowRDE("RW2 Decoder: Not supported");
-/* vector<TiffIFD*> data = mRootIFD->getIFDsWithTag(MODEL);
+ vector<TiffIFD*> data = mRootIFD->getIFDsWithTag(MODEL);
if (data.empty())
- ThrowRDE("PEF Support check: Model name found");
+ ThrowRDE("RW2 Support check: Model name found");
string make = data[0]->getEntry(MAKE)->getString();
string model = data[0]->getEntry(MODEL)->getString();
- this->checkCameraSupported(meta, make, model, "");*/
+ this->checkCameraSupported(meta, make, model, "");
}
void Rw2Decoder::decodeMetaData( CameraMetaData *meta )
{
-
+ mRaw->cfa.setCFA(CFA_GREEN, CFA_RED, CFA_BLUE, CFA_GREEN2);
}
\ No newline at end of file
Modified: RawSpeed/Rw2Decoder.h
===================================================================
--- RawSpeed/Rw2Decoder.h 2009-09-01 14:57:08 UTC (rev 132)
+++ RawSpeed/Rw2Decoder.h 2009-09-01 18:51:43 UTC (rev 133)
@@ -35,4 +35,12 @@
virtual void decodeMetaData(CameraMetaData *meta);
virtual void checkSupport(CameraMetaData *meta);
TiffIFD *mRootIFD;
+private:
+ unsigned pana_bits (int nbits);
+ void DecodeRw2();
+ guint load_flags;
+ ByteStream* input;
+ guchar buf[0x4000];
+ int vbits;
+
};
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit