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

Reply via email to