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