Author: post
Date: 2012-07-08 15:09:24 +0200 (Sun, 08 Jul 2012)
New Revision: 429
Modified:
RawSpeed/Cr2Decoder.cpp
RawSpeed/Cr2Decoder.h
data/cameras.xml
Log:
Add Canon 5D Mk III mRaw/sRaw format.
Modified: RawSpeed/Cr2Decoder.cpp
===================================================================
--- RawSpeed/Cr2Decoder.cpp 2012-07-08 11:16:48 UTC (rev 428)
+++ RawSpeed/Cr2Decoder.cpp 2012-07-08 13:09:24 UTC (rev 429)
@@ -191,14 +191,20 @@
string model = data[0]->getEntry(MODEL)->getString();
bool isOldSraw = (model.compare("Canon EOS 40D") == 0);
+ bool isNewSraw = hints.find("sraw_new") != hints.end();
if (mRaw->subsampling.y == 1 && mRaw->subsampling.x == 2) {
if (isOldSraw)
interpolate_422_old(mRaw->dim.x / 2, mRaw->dim.y , 0, mRaw->dim.y);
+ else if (isNewSraw)
+ interpolate_422_new(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);
+ if (isNewSraw)
+ interpolate_420_new(mRaw->dim.x / 2, mRaw->dim.y / 2 , 0 , mRaw->dim.y /
2);
+ else
+ interpolate_420(mRaw->dim.x / 2, mRaw->dim.y / 2 , 0 , mRaw->dim.y / 2);
}
}
@@ -288,21 +294,21 @@
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;
+ int Cb2 = (Cb + c_line[off+1+6] - 16384) >> 1;
+ int Cr2 = (Cr + c_line[off+2+6] - 16384) >> 1;
YUV_TO_RGB(Y, Cb2, Cr2);
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;
+ int Cb3 = (Cb + nn_line[off+1] - 16384) >> 1;
+ int Cr3 = (Cr + nn_line[off+2] - 16384) >> 1;
YUV_TO_RGB(Y, Cb3, Cr3);
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;
+ Cb = (Cb + Cb2 + Cb3 + nn_line[off+1+6] - 16384) >> 2; //Left + Above +
Right +Below
+ Cr = (Cr + Cr2 + Cr3 + nn_line[off+2+6] - 16384) >> 2;
YUV_TO_RGB(Y, Cb, Cr);
STORE_RGB(n_line, off + 3, off + 4, off + 5);
off += 6;
@@ -319,8 +325,8 @@
// Next line
Y = n_line[off];
- Cb = (Cb + nn_line[off+1] - 16383) >> 1;
- Cr = (Cr + nn_line[off+2] - 16383) >> 1;
+ Cb = (Cb + nn_line[off+1] - 16384) >> 1;
+ Cr = (Cr + nn_line[off+2] - 16384) >> 1;
YUV_TO_RGB(Y, Cb, Cr);
STORE_RGB(n_line, off, off + 1, off + 2);
@@ -408,4 +414,159 @@
}
}
+/* Algorithm found in EOS 5d Mk III */
+
+#undef YUV_TO_RGB
+
+#define YUV_TO_RGB(Y, Cb, Cr) r = sraw_coeffs[0] * (Y + Cr);\
+ g = sraw_coeffs[1] * (Y + ((-778*Cb - (Cr << 11)) >> 12) );\
+ b = sraw_coeffs[2] * (Y + Cb);\
+ r >>= 10; g >>=10; b >>=10;
+
+void Cr2Decoder::interpolate_422_new(int w, int h, int start_h , int end_h) {
+ // Last pixel should not be interpolated
+ w--;
+
+ // Current line
+ ushort16* c_line;
+
+ for (int y = start_h; y < end_h; y++) {
+ c_line = (ushort16*)mRaw->getData(0, y);
+ int 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);
+ }
+}
+
+
+// Note: Not thread safe, since it writes inplace.
+void Cr2Decoder::interpolate_420_new(int w, int h, int start_h , int end_h) {
+ // Last pixel should not be interpolated
+ w--;
+
+ bool atLastLine = FALSE;
+
+ if (end_h == h) {
+ end_h--;
+ atLastLine = TRUE;
+ }
+
+ // Current line
+ ushort16* c_line;
+ // Next line
+ ushort16* n_line;
+ // Next line again
+ ushort16* nn_line;
+
+ int off;
+ int r, g, b;
+
+ for (int y = start_h; y < end_h; y++) {
+ c_line = (ushort16*)mRaw->getData(0, y * 2);
+ n_line = (ushort16*)mRaw->getData(0, y * 2 + 1);
+ nn_line = (ushort16*)mRaw->getData(0, y * 2 + 2);
+ 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);
+
+ Y = c_line[off+3];
+ int Cb2 = (Cb + c_line[off+1+6] - 16384) >> 1;
+ int Cr2 = (Cr + c_line[off+2+6] - 16384) >> 1;
+ YUV_TO_RGB(Y, Cb2, Cr2);
+ STORE_RGB(c_line, off + 3, off + 4, off + 5);
+
+ // Next line
+ Y = n_line[off];
+ int Cb3 = (Cb + nn_line[off+1] - 16384) >> 1;
+ int Cr3 = (Cr + nn_line[off+2] - 16384) >> 1;
+ YUV_TO_RGB(Y, Cb3, Cr3);
+ STORE_RGB(n_line, off, off + 1, off + 2);
+
+ Y = n_line[off+3];
+ Cb = (Cb + Cb2 + Cb3 + nn_line[off+1+6] - 16384) >> 2; //Left + Above +
Right +Below
+ Cr = (Cr + Cr2 + Cr3 + nn_line[off+2+6] - 16384) >> 2;
+ YUV_TO_RGB(Y, Cb, Cr);
+ 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);
+ 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);
+
+ // Next line
+ Y = n_line[off];
+ Cb = (Cb + nn_line[off+1] - 16384) >> 1;
+ Cr = (Cr + nn_line[off+2] - 16384) >> 1;
+ YUV_TO_RGB(Y, Cb, Cr);
+ STORE_RGB(n_line, off, off + 1, off + 2);
+
+ Y = n_line[off+3];
+ YUV_TO_RGB(Y, Cb, Cr);
+ STORE_RGB(n_line, off + 3, off + 4, off + 5);
+ }
+
+ if (atLastLine) {
+ c_line = (ushort16*)mRaw->getData(0, end_h * 2);
+ n_line = (ushort16*)mRaw->getData(0, end_h * 2 + 1);
+ off = 0;
+
+ // Last line
+ 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);
+
+ Y = c_line[off+3];
+ YUV_TO_RGB(Y, Cb, Cr);
+ STORE_RGB(c_line, off + 3, off + 4, off + 5);
+
+ // Next line
+ Y = n_line[off];
+ YUV_TO_RGB(Y, Cb, Cr);
+ STORE_RGB(n_line, off, off + 1, off + 2);
+
+ Y = n_line[off+3];
+ YUV_TO_RGB(Y, Cb, Cr);
+ STORE_RGB(n_line, off + 3, off + 4, off + 5);
+ off += 6;
+ }
+ }
+}
+
} // namespace RawSpeed
Modified: RawSpeed/Cr2Decoder.h
===================================================================
--- RawSpeed/Cr2Decoder.h 2012-07-08 11:16:48 UTC (rev 428)
+++ RawSpeed/Cr2Decoder.h 2012-07-08 13:09:24 UTC (rev 429)
@@ -44,6 +44,8 @@
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);
+ void interpolate_420_new(int w, int h, int start_h , int end_h);
+ void interpolate_422_new(int w, int h, int start_h , int end_h);
TiffIFD *mRootIFD;
};
Modified: data/cameras.xml
===================================================================
--- data/cameras.xml 2012-07-08 11:16:48 UTC (rev 428)
+++ data/cameras.xml 2012-07-08 13:09:24 UTC (rev 429)
@@ -307,6 +307,9 @@
<Vertical x="0" width="120"/>
<Horizontal y="2" height="78"/>
</BlackAreas>
+ <Hints>
+ <Hint name="sraw_new" value=""/>
+ </Hints>
</Camera>
<!-- Unconfirmed: -->
<Camera make="Canon" model="Canon EOS 5D Mark III" mode="sRaw1">
@@ -432,10 +435,10 @@
</CFA>
<Crop x="78" y="20" width="3906" height="2600"/>
<Sensor black="1023" white="15100"/>
- <BlackAreas>
- <Vertical x="2" width="74"/>
- <Horizontal y="4" height="14"/>
- </BlackAreas>
+ <BlackAreas>
+ <Vertical x="2" width="74"/>
+ <Horizontal y="4" height="14"/>
+ </BlackAreas>
</Camera>
<Camera make="Canon" model="Canon EOS-1D Mark III" mode="sRaw1">
<Crop x="0" y="0" width="0" height="0"/>
@@ -516,7 +519,7 @@
<Vertical x="0" width="120"/>
<Horizontal y="0" height="98"/>
</BlackAreas>
- </Camera>
+</Camera>
<Camera make="Canon" model="Canon EOS-1D X" mode="sRaw1">
<Crop x="0" y="0" width="0" height="0"/>
<Sensor black="0" white="16383"/>
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit