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

Reply via email to