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