Author: post
Date: 2009-08-10 22:17:24 +0200 (Mon, 10 Aug 2009)
New Revision: 111

Modified:
   RawSpeed/Cr2Decoder.cpp
   RawSpeed/Cr2Decoder.h
   cameras.xml
Log:
- Added Canon EOS 40D sRaw support.
- Added Canon EOS 50D sRaw2 support.
- Fixed decoder error on last line of sRaw1 (4:2:0) images.
- Removed unused variable.

Modified: RawSpeed/Cr2Decoder.cpp
===================================================================
--- RawSpeed/Cr2Decoder.cpp     2009-08-10 18:54:25 UTC (rev 110)
+++ RawSpeed/Cr2Decoder.cpp     2009-08-10 20:17:24 UTC (rev 111)
@@ -156,7 +156,6 @@
 
   TiffIFD* exif = data[0];
   TiffEntry *makernoteEntry = exif->getEntry(MAKERNOTE);
-  const guchar* makernote = makernoteEntry->getData();
   TiffParserHeaderless makertiff(mFile, mRootIFD->endian);
   makertiff.parseData(makernoteEntry->getDataOffset());
 
@@ -173,8 +172,20 @@
   sraw_coeffs[1] = (wb_data[1] + wb_data[2] + 1 )>>1;
   sraw_coeffs[2] = wb_data[3];
 
+  // Check if sRaw2 is using old coefficients
+  data = mRootIFD->getIFDsWithTag(MODEL);
+
+  if (data.empty())
+    ThrowRDE("CR2 sRaw Decoder: Model name not found");
+
+  string model = data[0]->getEntry(MODEL)->getString();
+  gboolean isOldSraw = (model.compare("Canon EOS 40D") == 0);
+
   if (mRaw->subsampling.y == 1 && mRaw->subsampling.x == 2) {
-    interpolate_422(mRaw->dim.x / 2, mRaw->dim.y ,0, mRaw->dim.y);
+    if (isOldSraw)
+      interpolate_422_old(mRaw->dim.x / 2, mRaw->dim.y ,0, mRaw->dim.y);
+    else 
+      interpolate_422(mRaw->dim.x / 2, mRaw->dim.y ,0, mRaw->dim.y);
   } else {
     interpolate_420(mRaw->dim.x / 2, mRaw->dim.y / 2 ,0 , mRaw->dim.y / 2);
   }
@@ -185,6 +196,8 @@
   b = sraw_coeffs[2] * ((int)Y + ((29040*(int)Cb - 101*(int)Cr) >> 12));\
   r >>= 10; g >>=10; b >>=10;
 
+#define STORE_RGB(X,A,B,C) X[A] = clampbits(r,16); X[B] = clampbits(g,16); 
X[C] = clampbits(b,16);
+
 /* sRaw interpolators - ugly as sin, but does the job in reasonably speed */
 
 // Note: Thread safe.
@@ -206,32 +219,26 @@
       int Cb = c_line[off+1]- 16384;
       int Cr = c_line[off+2]- 16384;
       YUV_TO_RGB(Y, Cb, Cr);
-      c_line[off++] = clampbits(r,16); 
-      c_line[off++] = clampbits(g,16); 
-      c_line[off++] = clampbits(b,16);
+      STORE_RGB(c_line,off,off+1,off+2);
+      off+=3;
 
       Y = c_line[off];
       int Cb2 = (Cb + c_line[off+1+3] - 16384)>>1;
       int Cr2 = (Cr + c_line[off+2+3] - 16384)>>1;
       YUV_TO_RGB(Y, Cb2, Cr2);
-      c_line[off++] = clampbits(r,16); 
-      c_line[off++] = clampbits(g,16); 
-      c_line[off++] = clampbits(b,16);
+      STORE_RGB(c_line,off,off+1,off+2);
+      off+=3;
     }
     // Last two pixels
     int Y = c_line[off];
     int Cb = c_line[off+1]- 16384;
     int Cr = c_line[off+2]- 16384;
     YUV_TO_RGB(Y, Cb, Cr);
-    c_line[off++] = clampbits(r,16); 
-    c_line[off++] = clampbits(g,16); 
-    c_line[off++] = clampbits(b,16);
+    STORE_RGB(c_line,off,off+1,off+2);
 
-    Y = c_line[off];
+    Y = c_line[off+3];
     YUV_TO_RGB(Y, Cb, Cr);
-    c_line[off++] = clampbits(r,16); 
-    c_line[off++] = clampbits(g,16); 
-    c_line[off++] = clampbits(b,16);
+    STORE_RGB(c_line,off+3,off+4,off+5);
   }
 }
 
@@ -269,69 +276,53 @@
       int Cb = c_line[off+1]- 16384;
       int Cr = c_line[off+2]- 16384;
       YUV_TO_RGB(Y, Cb, Cr);
-      c_line[off] = clampbits(r,16); 
-      c_line[off+1] = clampbits(g,16); 
-      c_line[off+2] = clampbits(b,16);
+      STORE_RGB(c_line,off,off+1,off+2);
 
       Y = c_line[off+3];
       int Cb2 = (Cb + c_line[off+1+6] - 16383)>>1;
       int Cr2 = (Cr + c_line[off+2+6] - 16383)>>1;
       YUV_TO_RGB(Y, Cb2, Cr2);
-      c_line[off+3] = clampbits(r,16); 
-      c_line[off+4] = clampbits(g,16); 
-      c_line[off+5] = clampbits(b,16);
+      STORE_RGB(c_line,off+3,off+4,off+5);
 
       // Next line
       Y = n_line[off];
       int Cb3 = (Cb + nn_line[off+1]- 16383)>>1;
       int Cr3 = (Cr + nn_line[off+2]- 16383)>>1;
       YUV_TO_RGB(Y, Cb3, Cr3);
-      n_line[off] = clampbits(r,16); 
-      n_line[off+1] = clampbits(g,16); 
-      n_line[off+2] = clampbits(b,16);
+      STORE_RGB(n_line,off,off+1,off+2);
 
       Y = n_line[off+3];
       Cb = (Cb + Cb2 + Cb3 + nn_line[off+1+6] - 16382)>>2;  //Left + Above + 
Right +Below
       Cr = (Cr + Cr2 + Cr3 + nn_line[off+2+6] - 16382)>>2;
       YUV_TO_RGB(Y, Cb, Cr);
-      n_line[off+3] = clampbits(r,16); 
-      n_line[off+4] = clampbits(g,16); 
-      n_line[off+5] = clampbits(b,16);
+      STORE_RGB(n_line,off+3,off+4,off+5);
       off+=6;
     }
     int Y = c_line[off];
     int Cb = c_line[off+1]- 16384;
     int Cr = c_line[off+2]- 16384;
     YUV_TO_RGB(Y, Cb, Cr);
-    c_line[off] = clampbits(r,16); 
-    c_line[off+1] = clampbits(g,16); 
-    c_line[off+2] = clampbits(b,16);
+    STORE_RGB(c_line,off,off+1,off+2);
 
     Y = c_line[off+3];
     YUV_TO_RGB(Y, Cb, Cr);
-    c_line[off+3] = clampbits(r,16); 
-    c_line[off+4] = clampbits(g,16); 
-    c_line[off+5] = clampbits(b,16);
+    STORE_RGB(c_line,off+3,off+4,off+5);
 
     // Next line
     Y = n_line[off];
     Cb = (Cb + nn_line[off+1]- 16383)>>1;
     Cr = (Cr + nn_line[off+2]- 16383)>>1;
     YUV_TO_RGB(Y, Cb, Cr);
-    n_line[off] = clampbits(r,16); 
-    n_line[off+1] = clampbits(g,16); 
-    n_line[off+2] = clampbits(b,16);
+    STORE_RGB(n_line,off,off+1,off+2);
 
     Y = n_line[off+3];
     YUV_TO_RGB(Y, Cb, Cr);
-    n_line[off+3] = clampbits(r,16); 
-    n_line[off+4] = clampbits(g,16); 
-    n_line[off+5] = clampbits(b,16);
+    STORE_RGB(n_line,off+3,off+4,off+5);
   }
 
   if (atLastLine) {
     c_line = (gushort*)mRaw->getData(0,end_h*2);
-    n_line = (gushort*)mRaw->getData(0,end_h*2);
+    n_line = (gushort*)mRaw->getData(0,end_h*2+1);
     off = 0;
 
     // Last line
@@ -340,30 +331,71 @@
       int Cb = c_line[off+1]- 16384;
       int Cr = c_line[off+2]- 16384;
       YUV_TO_RGB(Y, Cb, Cr);
-      c_line[off] = clampbits(r,16); 
-      c_line[off+1] = clampbits(g,16); 
-      c_line[off+2] = clampbits(b,16);
+      STORE_RGB(c_line,off,off+1,off+2);
 
       Y = c_line[off+3];
       YUV_TO_RGB(Y, Cb, Cr);
-      c_line[off+3] = clampbits(r,16); 
-      c_line[off+4] = clampbits(g,16); 
-      c_line[off+5] = clampbits(b,16);
+      STORE_RGB(c_line,off+3,off+4,off+5);
 
       // Next line
       Y = n_line[off];
       YUV_TO_RGB(Y, Cb, Cr);
-      n_line[off] = clampbits(r,16); 
-      n_line[off+1] = clampbits(g,16); 
-      n_line[off+2] = clampbits(b,16);
+      STORE_RGB(n_line,off,off+1,off+2);
 
       Y = n_line[off+3];
       YUV_TO_RGB(Y, Cb, Cr);
-      n_line[off+3] = clampbits(r,16); 
-      n_line[off+4] = clampbits(g,16); 
-      n_line[off+5] = clampbits(b,16);
+      STORE_RGB(n_line,off+3,off+4,off+5);
       off+=6;
     }
   }
 }
 
+#undef YUV_TO_RGB
+
+#define YUV_TO_RGB(Y, Cb, Cr) r = sraw_coeffs[0] * (Y + Cr -512 );\
+  g = sraw_coeffs[1] * (Y + ((-778*Cb - (Cr << 11)) >> 12) - 512);\
+  b = sraw_coeffs[2] * (Y + (Cb - 512));\
+  r >>= 10; g >>=10; b >>=10;
+
+
+// Note: Thread safe.
+
+void Cr2Decoder::interpolate_422_old(int w, int h, int start_h , int end_h)
+{
+  // Last pixel should not be interpolated
+  w--; 
+
+  // Current line
+  gushort* c_line;
+
+  for (int y = start_h; y < end_h; y++) {
+    c_line = (gushort*)mRaw->getData(0,y);
+    gint r,g,b;
+    int off = 0;
+    for (int x = 0; x < w; x++) {
+      int Y = c_line[off];
+      int Cb = c_line[off+1]- 16384;
+      int Cr = c_line[off+2]- 16384;
+      YUV_TO_RGB(Y, Cb, Cr);
+      STORE_RGB(c_line,off,off+1,off+2);
+      off+=3;
+
+      Y = c_line[off];
+      int Cb2 = (Cb + c_line[off+1+3] - 16384)>>1;
+      int Cr2 = (Cr + c_line[off+2+3] - 16384)>>1;
+      YUV_TO_RGB(Y, Cb2, Cr2);
+      STORE_RGB(c_line,off,off+1,off+2);
+      off+=3;
+    }
+    // Last two pixels
+    int Y = c_line[off];
+    int Cb = c_line[off+1]- 16384;
+    int Cr = c_line[off+2]- 16384;
+    YUV_TO_RGB(Y, Cb, Cr);
+    STORE_RGB(c_line,off,off+1,off+2);
+
+    Y = c_line[off+3];
+    YUV_TO_RGB(Y, Cb, Cr);
+    STORE_RGB(c_line,off+3,off+4,off+5);
+  }
+}

Modified: RawSpeed/Cr2Decoder.h
===================================================================
--- RawSpeed/Cr2Decoder.h       2009-08-10 18:54:25 UTC (rev 110)
+++ RawSpeed/Cr2Decoder.h       2009-08-10 20:17:24 UTC (rev 111)
@@ -39,6 +39,7 @@
   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);
+  void interpolate_422_old(int w, int h, int start_h , int end_h);
   TiffIFD *mRootIFD;
 };
 

Modified: cameras.xml
===================================================================
--- cameras.xml 2009-08-10 18:54:25 UTC (rev 110)
+++ cameras.xml 2009-08-10 20:17:24 UTC (rev 111)
@@ -43,6 +43,10 @@
     <Crop x="30" y="18" width="3908" height="2602"/>
     <Sensor black="1021" white="13600"/>
   </Camera>
+  <Camera make="Canon" model="Canon EOS 40D" mode="sRaw2">
+    <Crop x="0" y="0" width="1944" height="1296"/>
+    <Sensor black="0" white="16383"/>
+  </Camera>
   <Camera make="Canon" model="Canon EOS 450D">
     <CFA width="2" height="2">
       <Color x="0" y="0">RED</Color>
@@ -67,6 +71,10 @@
     <Crop x="0" y="0" width="3272" height="2178"/>
     <Sensor black="0" white="16383"/>
   </Camera>
+  <Camera make="Canon" model="Canon EOS 50D" mode="sRaw2">
+    <Crop x="0" y="0" width="2376" height="1584"/>
+    <Sensor black="0" white="16383"/>
+  </Camera>
   <Camera make="Canon" model="Canon EOS 500D">
     <CFA width="2" height="2">
       <Color x="0" y="0">RED</Color>


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

Reply via email to