Author: post
Date: 2009-08-09 19:05:05 +0200 (Sun, 09 Aug 2009)
New Revision: 104

Modified:
   RawSpeed/Cr2Decoder.cpp
   RawSpeed/Cr2Decoder.h
   RawSpeed/TiffEntry.cpp
   RawSpeed/TiffEntry.h
   RawSpeed/TiffParserHeaderless.cpp
   RawSpeed/TiffParserHeaderless.h
Log:
- Canon sRAW images are now converted back to non-WB corrected RGB.

Modified: RawSpeed/Cr2Decoder.cpp
===================================================================
--- RawSpeed/Cr2Decoder.cpp     2009-08-09 13:55:00 UTC (rev 103)
+++ RawSpeed/Cr2Decoder.cpp     2009-08-09 17:05:05 UTC (rev 104)
@@ -1,5 +1,6 @@
 #include "StdAfx.h"
 #include "Cr2Decoder.h"
+#include "TiffParserHeaderless.h"
 
 /* 
     RawSpeed - RAW file decoder.
@@ -130,7 +131,7 @@
   vector<TiffIFD*> data = mRootIFD->getIFDsWithTag(MODEL);
 
   if (data.empty())
-    ThrowRDE("CR2 Meta Decoder: Model name found");
+    ThrowRDE("CR2 Meta Decoder: Model name not found");
 
   string make = data[0]->getEntry(MAKE)->getString();
   string model = data[0]->getEntry(MODEL)->getString();
@@ -149,6 +150,29 @@
 // Interpolate and convert sRaw data.
 void Cr2Decoder::sRawInterpolate()
 {
+  vector<TiffIFD*> data = mRootIFD->getIFDsWithTag(MAKERNOTE);
+  if (data.empty())
+    ThrowRDE("CR2 sRaw: Makernote not found");
+
+  TiffIFD* exif = data[0];
+  TiffEntry *makernoteEntry = exif->getEntry(MAKERNOTE);
+  const guchar* makernote = makernoteEntry->getData();
+  TiffParserHeaderless makertiff(mFile, mRootIFD->endian);
+  makertiff.parseData(makernoteEntry->getDataOffset());
+
+  data = makertiff.RootIFD()->getIFDsWithTag((TiffTag)0x4001);
+  if (data.empty())
+    ThrowRDE("CR2 sRaw: Unable to locate WB info.");
+
+  const gushort *wb_data = data[0]->getEntry((TiffTag)0x4001)->getShortArray();
+
+  // Offset to sRaw coefficients used to reconstruct uncorrected RGB data.
+  wb_data = &wb_data[4+(126+22)/2];
+
+  sraw_coeffs[0] = wb_data[0];
+  sraw_coeffs[1] = (wb_data[1] + wb_data[2] + 1 )>>1;
+  sraw_coeffs[2] = wb_data[3];
+
   if (mRaw->subsampling.y == 1 && mRaw->subsampling.x == 2) {
     interpolate_422(mRaw->dim.x / 2, mRaw->dim.y ,0, mRaw->dim.y);
   } else {
@@ -156,9 +180,10 @@
   }
 }
 
-#define YUV_TO_RGB(Y, Cb, Cr) r = (int)Y + (( 200*(int)Cb + 22929*(int)Cr) >> 
12);\
-  g = (int)Y + ((-5640*(int)Cb - 11751*(int)Cr) >> 12);\
-  b = (int)Y + ((29040*(int)Cb - 101*(int)Cr) >> 12);
+#define YUV_TO_RGB(Y, Cb, Cr) r = sraw_coeffs[0] * ((int)Y + (( 200*(int)Cb + 
22929*(int)Cr) >> 12));\
+  g = sraw_coeffs[1] * ((int)Y + ((-5640*(int)Cb - 11751*(int)Cr) >> 12));\
+  b = sraw_coeffs[2] * ((int)Y + ((29040*(int)Cb - 101*(int)Cr) >> 12));\
+  r >>= 10; g >>=10; b >>=10;
 
 /* sRaw interpolators - ugly as sin, but does the job in reasonably speed */
 

Modified: RawSpeed/Cr2Decoder.h
===================================================================
--- RawSpeed/Cr2Decoder.h       2009-08-09 13:55:00 UTC (rev 103)
+++ RawSpeed/Cr2Decoder.h       2009-08-09 17:05:05 UTC (rev 104)
@@ -34,6 +34,8 @@
   virtual void decodeMetaData(CameraMetaData *meta);
   virtual ~Cr2Decoder(void);
 protected:
+  gint sraw_coeffs[3];
+
   void sRawInterpolate();
   void interpolate_420(int w, int h, int start_h , int end_h);
   void interpolate_422(int w, int h, int start_h , int end_h);

Modified: RawSpeed/TiffEntry.cpp
===================================================================
--- RawSpeed/TiffEntry.cpp      2009-08-09 13:55:00 UTC (rev 103)
+++ RawSpeed/TiffEntry.cpp      2009-08-09 17:05:05 UTC (rev 104)
@@ -39,7 +39,7 @@
   if (bytesize <=4) {
     data = f->getDataWrt(offset+8);
   } else { // offset
-    guint data_offset = *(guint*)f->getData(offset+8);
+    data_offset = *(guint*)f->getData(offset+8);
     CHECKSIZE(data_offset+bytesize);
     data = f->getDataWrt(data_offset);
   }

Modified: RawSpeed/TiffEntry.h
===================================================================
--- RawSpeed/TiffEntry.h        2009-08-09 13:55:00 UTC (rev 103)
+++ RawSpeed/TiffEntry.h        2009-08-09 17:05:05 UTC (rev 104)
@@ -76,8 +76,10 @@
   TiffTag tag;
   TiffDataType type;
   guint count;
+  guint getDataOffset() const { return data_offset; }
 protected:
   unsigned char* data;
+  guint data_offset;
 #ifdef _DEBUG
   int debug_intVal;
   float debug_floatVal;

Modified: RawSpeed/TiffParserHeaderless.cpp
===================================================================
--- RawSpeed/TiffParserHeaderless.cpp   2009-08-09 13:55:00 UTC (rev 103)
+++ RawSpeed/TiffParserHeaderless.cpp   2009-08-09 17:05:05 UTC (rev 104)
@@ -22,7 +22,7 @@
 #define CHECKPTR(A) if ((int)A >= ((int)(mInput->data) + size))) throw 
TiffParserException("Error reading TIFF structure. File Corrupt")
 
 
-void TiffParserHeaderless::parseData() {
+void TiffParserHeaderless::parseData(guint firstIfdOffset) {
   const unsigned char* data = mInput->getData(0);
   if (mInput->getSize() < 12)
     throw TiffParserException("Not a TIFF file (size too small)");
@@ -32,7 +32,7 @@
   else
     mRootIFD = new TiffIFDBE();
 
-  guint nextIFD = 0;
+  guint nextIFD = firstIfdOffset;
   do {
     CHECKSIZE(nextIFD);
 

Modified: RawSpeed/TiffParserHeaderless.h
===================================================================
--- RawSpeed/TiffParserHeaderless.h     2009-08-09 13:55:00 UTC (rev 103)
+++ RawSpeed/TiffParserHeaderless.h     2009-08-09 17:05:05 UTC (rev 104)
@@ -7,5 +7,6 @@
 public:
   TiffParserHeaderless(FileMap* input, Endianness _end);
   virtual ~TiffParserHeaderless(void);
-  virtual void parseData();
+  void parseData(guint firstIfdOffset);
+  virtual void parseData() {parseData(0);}
 };


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to