Author: post
Date: 2009-12-12 12:41:00 +0100 (Sat, 12 Dec 2009)
New Revision: 171
Modified:
RawSpeed/ArwDecoder.cpp
RawSpeed/Camera.cpp
RawSpeed/Camera.h
RawSpeed/CameraMetaData.cpp
RawSpeed/CameraMetaData.h
RawSpeed/RawDecoder.cpp
RawSpeed/RawDecoder.h
RawSpeed/TiffParser.cpp
cameras.xml
Log:
- Add support for Sony E-550 ARW.
- Add Aliases to xml definition and code.
- Add possibility for hints to xml definition and code.
- Add decoder version requirements check to xml definition and code.
- Deleted unused xml dump code, since we don't want to maintain it.
Modified: RawSpeed/ArwDecoder.cpp
===================================================================
--- RawSpeed/ArwDecoder.cpp 2009-12-11 21:57:59 UTC (rev 170)
+++ RawSpeed/ArwDecoder.cpp 2009-12-12 11:41:00 UTC (rev 171)
@@ -58,6 +58,15 @@
guint height = raw->getEntry(IMAGELENGTH)->getInt();
guint bitPerPixel = raw->getEntry(BITSPERSAMPLE)->getInt();
+ // Sony E-550 marks compressed 8bpp ARW with 12 bit per pixel
+ // this makes the compression detect it as a ARW v1.
+ // This camera has however another MAKER entry, so we MAY be able
+ // to detect it this way in the future.
+ data = mRootIFD->getIFDsWithTag(MAKE);
+ string make = data[0]->getEntry(MAKE)->getString();
+ if (!make.compare("SONY"))
+ bitPerPixel = 8;
+
gboolean arw1 = counts->getInt() * 8 != width * height * bitPerPixel;
if (arw1)
height += 8;
@@ -109,8 +118,7 @@
if (len == 3 && bits.getBitNoFill()) len = 0;
if (len == 4)
while (len < 17 && !bits.getBitNoFill()) len++;
- bits.fill();
- gint diff = bits.getBitsNoFill(len);
+ gint diff = bits.getBits(len);
if ((diff & (1 << (len - 1))) == 0)
diff -= (1 << len) - 1;
sum += diff;
Modified: RawSpeed/Camera.cpp
===================================================================
--- RawSpeed/Camera.cpp 2009-12-11 21:57:59 UTC (rev 170)
+++ RawSpeed/Camera.cpp 2009-12-12 11:41:00 UTC (rev 171)
@@ -56,6 +56,13 @@
mode = string("");
}
+ key = xmlGetProp(cur, (const xmlChar *)"decoder_version");
+ if (key) {
+ decoderVersion = getAttributeAsInt(cur, cur->name, "decoder_version");
+ } else {
+ decoderVersion = 0;
+ }
+
cur = cur->xmlChildrenNode;
while (cur != NULL) {
parseCameraChild(doc, cur);
@@ -63,6 +70,31 @@
}
}
+Camera::Camera( const Camera* camera, guint alias_num)
+{
+ if (alias_num >= camera->aliases.size())
+ ThrowCME("Camera: Internal error, alias number out of range specified.");
+
+ make = camera->make;
+ model = camera->aliases[alias_num];
+ mode = camera->mode;
+ cfa = camera->cfa;
+ black = camera->black;
+ white = camera->white;
+ supported = camera->supported;
+ cropSize = camera->cropSize;
+ cropPos = camera->cropPos;
+ decoderVersion = camera->decoderVersion;
+ for (guint i = 0; i < camera->blackAreas.size(); i++) {
+ blackAreas.push_back(camera->blackAreas[i]);
+ }
+
+ map<string,string>::const_iterator mi = camera->hints.begin();
+ for (; mi != camera->hints.end(); ++mi) {
+ hints.insert(make_pair((*mi).first, (*mi).second));
+ }
+}
+
Camera::~Camera(void) {
}
@@ -105,6 +137,24 @@
}
return;
}
+
+ if (!xmlStrcmp(cur->name, (const xmlChar *) "Aliases")) {
+ cur = cur->xmlChildrenNode;
+ while (cur != NULL) {
+ parseAlias(doc, cur);
+ cur = cur->next;
+ }
+ return;
+ }
+
+ if (!xmlStrcmp(cur->name, (const xmlChar *) "Hints")) {
+ cur = cur->xmlChildrenNode;
+ while (cur != NULL) {
+ parseHint(doc, cur);
+ cur = cur->next;
+ }
+ return;
+ }
}
void Camera::parseCFA(xmlDocPtr doc, xmlNodePtr cur) {
@@ -190,4 +240,37 @@
return i;
}
+void Camera::parseAlias( xmlDocPtr doc, xmlNodePtr cur )
+{
+ if (!xmlStrcmp(cur->name, (const xmlChar *) "Alias")) {
+ cur = cur->xmlChildrenNode;
+ while (NULL != cur) {
+ if (cur && !xmlStrcmp(cur->name, (const xmlChar *) "text"))
+ aliases.push_back(string((const char*)cur->content));
+ cur = cur->next;
+ }
+ }
+}
+
+void Camera::parseHint( xmlDocPtr doc, xmlNodePtr cur )
+{
+ if (!xmlStrcmp(cur->name, (const xmlChar *) "Hint")) {
+ xmlChar *key;
+ string hint_name, hint_value;
+ key = xmlGetProp(cur, (const xmlChar *)"name");
+ if (key)
+ hint_name = string((const char*)key);
+ else
+ ThrowCME("CameraMetadata: Could not find name for hint for %s %s
camera.", this->make, this->model);
+
+ key = xmlGetProp(cur, (const xmlChar *)"value");
+ if (key)
+ hint_value = string((const char*)key);
+ else
+ ThrowCME("CameraMetadata: Could not find value for hint for %s %s
camera.", this->make, this->model);
+
+ hints.insert(make_pair(hint_name, hint_value));
+ }
+}
+
} // namespace RawSpeed
Modified: RawSpeed/Camera.h
===================================================================
--- RawSpeed/Camera.h 2009-12-11 21:57:59 UTC (rev 170)
+++ RawSpeed/Camera.h 2009-12-12 11:41:00 UTC (rev 171)
@@ -31,11 +31,13 @@
{
public:
Camera(xmlDocPtr doc, xmlNodePtr cur);
+ Camera(const Camera* camera, guint alias_num);
void parseCameraChild(xmlDocPtr doc, xmlNodePtr cur);
virtual ~Camera(void);
string make;
string model;
string mode;
+ vector<string> aliases;
ColorFilterArray cfa;
guint black;
guint white;
@@ -43,12 +45,16 @@
iPoint2D cropSize;
iPoint2D cropPos;
vector<BlackArea> blackAreas;
- void parseCFA( xmlDocPtr doc, xmlNodePtr cur );
- void parseBlackAreas( xmlDocPtr doc, xmlNodePtr cur );
-
+ gint decoderVersion;
+ map<string,string> hints;
private:
int StringToInt(const xmlChar *in, const xmlChar *tag, const char*
attribute);
int getAttributeAsInt( xmlNodePtr cur , const xmlChar *tag, const char*
attribute);
+protected:
+ void parseCFA( xmlDocPtr doc, xmlNodePtr cur );
+ void parseAlias( xmlDocPtr doc, xmlNodePtr cur );
+ void parseHint( xmlDocPtr doc, xmlNodePtr cur );
+ void parseBlackAreas( xmlDocPtr doc, xmlNodePtr cur );
};
} // namespace RawSpeed
Modified: RawSpeed/CameraMetaData.cpp
===================================================================
--- RawSpeed/CameraMetaData.cpp 2009-12-11 21:57:59 UTC (rev 170)
+++ RawSpeed/CameraMetaData.cpp 2009-12-12 11:41:00 UTC (rev 171)
@@ -51,11 +51,12 @@
while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"Camera"))) {
Camera *camera = new Camera(doc, cur);
- string id =
string(camera->make).append(camera->model).append(camera->mode);
- if (cameras.end() != cameras.find(id))
- printf("CameraMetaData: Duplicate entry found for camera: %s %s,
Skipping!\n", camera->make.c_str(), camera->model.c_str());
- else
- cameras[id] = camera;
+ addCamera(camera);
+
+ // Create cameras for aliases.
+ for (guint i = 0; i < camera->aliases.size(); i++) {
+ addCamera(new Camera(camera, i));
+ }
}
cur = cur->next;
}
@@ -80,39 +81,6 @@
ctxt = 0;
}
-void CameraMetaData::dumpXML() {
- map<string, Camera*>::iterator i = cameras.begin();
- for (; i != cameras.end(); i++) {
- dumpCameraXML((*i).second);
- }
-}
-
-void CameraMetaData::dumpCameraXML(Camera* cam) {
- cout << "<Camera make=\"" << cam->make << "\" model = \"" << cam->model <<
"\">" << endl;
- cout << "<CFA width=\"2\" height=\"2\">" << endl;
- cout << "<Color x=\"0\" y=\"0\">" <<
ColorFilterArray::colorToString(cam->cfa.getColorAt(0, 0)) << "</Color>";
- cout << "<Color x=\"1\" y=\"0\">" <<
ColorFilterArray::colorToString(cam->cfa.getColorAt(1, 0)) << "</Color>" <<
endl;
- cout << "<Color x=\"0\" y=\"1\">" <<
ColorFilterArray::colorToString(cam->cfa.getColorAt(0, 1)) << "</Color>";
- cout << "<Color x=\"1\" y=\"1\">" <<
ColorFilterArray::colorToString(cam->cfa.getColorAt(1, 1)) << "</Color>" <<
endl;
- cout << "</CFA>" << endl;
- cout << "<Crop x=\"" << cam->cropPos.x << "\" y=\"" << cam->cropPos.y << "\"
";
- cout << "width=\"" << cam->cropSize.x << "\" height=\"" << cam->cropSize.y
<< "\"/>" << endl;
- cout << "<Sensor black=\"" << cam->black << "\" white=\"" << cam->white <<
"\"/>" << endl;
- if (!cam->blackAreas.empty()) {
- cout << "<BlackAreas>" << endl;
- for (guint i = 0; i < cam->blackAreas.size(); i++) {
- BlackArea b = cam->blackAreas[i];
- if (b.isVertical) {
- cout << "<Vertical x=\"" << b.offset << "\" width=\"" << b.size <<
"\"/>" << endl;
- } else {
- cout << "<Horizontal y=\"" << b.offset << "\" height=\"" << b.size <<
"\"/>" << endl;
- }
- }
- cout << "</BlackAreas>" << endl;
- }
- cout << "</Camera>" << endl;
-}
-
Camera* CameraMetaData::getCamera(string make, string model, string mode) {
string id = string(make).append(model).append(mode);
if (cameras.end() == cameras.find(id))
@@ -120,4 +88,13 @@
return cameras[id];
}
+void CameraMetaData::addCamera( Camera* cam )
+{
+ string id = string(cam->make).append(cam->model).append(cam->mode);
+ if (cameras.end() != cameras.find(id))
+ printf("CameraMetaData: Duplicate entry found for camera: %s %s,
Skipping!\n", cam->make.c_str(), cam->model.c_str());
+ else
+ cameras[id] = cam;
+}
+
} // namespace RawSpeed
Modified: RawSpeed/CameraMetaData.h
===================================================================
--- RawSpeed/CameraMetaData.h 2009-12-11 21:57:59 UTC (rev 170)
+++ RawSpeed/CameraMetaData.h 2009-12-12 11:41:00 UTC (rev 171)
@@ -35,10 +35,9 @@
xmlDocPtr doc;
xmlParserCtxtPtr ctxt; /* the parser context */
map<string,Camera*> cameras;
- void dumpXML();
Camera* getCamera(string make, string model, string mode);
protected:
- void dumpCameraXML(Camera* cam);
+ void addCamera(Camera* cam);
};
} // namespace RawSpeed
Modified: RawSpeed/RawDecoder.cpp
===================================================================
--- RawSpeed/RawDecoder.cpp 2009-12-11 21:57:59 UTC (rev 170)
+++ RawSpeed/RawDecoder.cpp 2009-12-12 11:41:00 UTC (rev 171)
@@ -25,6 +25,7 @@
namespace RawSpeed {
RawDecoder::RawDecoder(FileMap* file) : mFile(file), mRaw(RawImage::create()) {
+ decoderVersion = 0;
}
RawDecoder::~RawDecoder(void) {
@@ -120,6 +121,9 @@
if (!cam->supported)
ThrowRDE("Camera not supported (explicit). Sorry.");
+
+ if (cam->decoderVersion > decoderVersion)
+ ThrowRDE("Camera not supported in this version. Update RawSpeed for
support.");
}
void RawDecoder::setMetaData(CameraMetaData *meta, string make, string model,
string mode) {
Modified: RawSpeed/RawDecoder.h
===================================================================
--- RawSpeed/RawDecoder.h 2009-12-11 21:57:59 UTC (rev 170)
+++ RawSpeed/RawDecoder.h 2009-12-12 11:41:00 UTC (rev 171)
@@ -62,6 +62,8 @@
virtual void setMetaData(CameraMetaData *meta, string make, string model,
string mode);
void Decode12BitRaw(ByteStream &input, guint w, guint h);
void TrimSpaces( string& str);
+ gint getDecoderVersion() {return decoderVersion;};
+ gint decoderVersion;
};
} // namespace RawSpeed
Modified: RawSpeed/TiffParser.cpp
===================================================================
--- RawSpeed/TiffParser.cpp 2009-12-11 21:57:59 UTC (rev 170)
+++ RawSpeed/TiffParser.cpp 2009-12-12 11:41:00 UTC (rev 171)
@@ -120,6 +120,9 @@
if (!make.compare("SONY ")) {
return new ArwDecoder(mRootIFD, mInput);
}
+ if (!make.compare("SONY")) {
+ return new ArwDecoder(mRootIFD, mInput);
+ }
if (!make.compare("PENTAX Corporation ")) {
return new PefDecoder(mRootIFD, mInput);
}
Modified: cameras.xml
===================================================================
--- cameras.xml 2009-12-11 21:57:59 UTC (rev 170)
+++ cameras.xml 2009-12-12 11:41:00 UTC (rev 171)
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="showcameras.xsl" ?>
-<!DOCTYPE Cameras SYSTEM
"http://rawspeed.klauspost.com/dtd/cameras/1.1/cameras.dtd">
+<!DOCTYPE Cameras SYSTEM
"http://rawspeed.klauspost.com/dtd/cameras/1.2/cameras.dtd">
<Cameras>
<Camera make="Canon" model="Canon EOS 20D">
@@ -943,7 +943,7 @@
<Crop x="0" y="0" width="4599" height="3064"/>
<Sensor black="0" white="4095"/>
</Camera>
- <Camera make="SONY" model="DSLR-A550" supported="no">
+ <Camera make="SONY" model="DSLR-A550">
<CFA width="2" height="2">
<Color x="1" y="1">BLUE</Color>
<Color x="1" y="0">GREEN</Color>
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit