Revision: 7850
          http://playerstage.svn.sourceforge.net/playerstage/?rev=7850&view=rev
Author:   gbiggs
Date:     2009-06-14 23:23:57 +0000 (Sun, 14 Jun 2009)

Log Message:
-----------
Applied patch #2805687

Modified Paths:
--------------
    code/player/trunk/server/drivers/camera/1394/CMakeLists.txt
    code/player/trunk/server/drivers/camera/1394/camera1394.cc
    code/player/trunk/server/drivers/camera/1394/camera1394.h.in

Modified: code/player/trunk/server/drivers/camera/1394/CMakeLists.txt
===================================================================
--- code/player/trunk/server/drivers/camera/1394/CMakeLists.txt 2009-06-14 
23:12:53 UTC (rev 7849)
+++ code/player/trunk/server/drivers/camera/1394/CMakeLists.txt 2009-06-14 
23:23:57 UTC (rev 7850)
@@ -3,6 +3,7 @@
 IF (build_camera1394)
     SET (c1394CFlags 
"-I${PROJECT_SOURCE_DIR}/server/drivers/blobfinder/cmvision 
-I${CMAKE_CURRENT_BINARY_DIR}")
     SET (DC1394_DMA_SETUP_CAPTURE_ARGS 0)
+    SET (DC1394_2_LINUX 0)
     SET (c1394Sources camera1394.cc 
${PROJECT_SOURCE_DIR}/server/drivers/blobfinder/cmvision/conversions.c)
 
     INCLUDE (CheckIncludeFiles)
@@ -12,9 +13,14 @@
         CHECK_INCLUDE_FILES (libraw1394/raw1394.h haveRaw1394H)
         IF (haveRaw1394H)
             SET (c1394LinkFlags "-lraw1394 -ldc1394")
+           SET (HAVE_LIBRAW1394 1)
         ELSE (haveRaw1394H)
             SET (c1394LinkFlags "-ldc1394")
         ENDIF (haveRaw1394H)
+        CHECK_INCLUDE_FILES ("dc1394/dc1394.h;dc1394/linux/control.h" 
haveLinuxControlH)
+       IF (haveLinuxControlH)
+            SET (DC1394_2_LINUX 1)
+       ENDIF (haveLinuxControlH)
     ELSE (haveControlH)
         SET (c1394LinkFlags "-lraw1394 -ldc1394_control")
         PLAYERDRIVER_REQUIRE_HEADER (camera1394 build_camera1394 
libraw1394/raw1394.h)

Modified: code/player/trunk/server/drivers/camera/1394/camera1394.cc
===================================================================
--- code/player/trunk/server/drivers/camera/1394/camera1394.cc  2009-06-14 
23:12:53 UTC (rev 7849)
+++ code/player/trunk/server/drivers/camera/1394/camera1394.cc  2009-06-14 
23:23:57 UTC (rev 7850)
@@ -53,9 +53,18 @@
 
  @par Configuration file options
 
+ - guid (string [16 digits])
+ - Default: None
+ - The GUID of the 1394 camera to use (only for libdc1394 >= 2.0)
+ - Example: guid "0800460200060121"
+ - Currently, if using libdc1394 >= 2.0 
+   - You should use GUID if you are on port > 0
+   - To get GUID, run Player once with no GUID and look at the .player log 
file for the GUID of detected cameras.
+
  - port (integer)
  - Default: 0
  - The 1394 port the camera is attached to.
+ - v2 of the dc1394 API no longer supports ports other than 0.  If your camera 
is on a port > 0, and you are on Linux, you probably have 
/usr/include/dc1394/linux/control.h, which should allow you to use ports > 0 
(if this file was detected during ./configure).  Otherwise, use the GUID of the 
camera.
 
  - node (integer)
  - Default: 0
@@ -134,7 +143,8 @@
 
  - whitebalance (string)
  - Default: None
- - Sets the manual camera white balance setting. Only valid option:
+ - Sets the manual camera white balance setting. Valid modes are:
+ - "auto" (only for dc1394 v2)
  - a string containing two suitable blue and red value unsigned integers
 
  - dma_buffers
@@ -181,6 +191,17 @@
 #include <libplayercore/playercore.h>
 #include <libplayercore/error.h>
 
+#if DC1394_2_LINUX == 1
+
+extern "C" {
+#include <dc1394/linux/control.h>
+  void get_port(dc1394camera_t* camera, uint& cam_port){
+    dc1394_camera_get_linux_port(camera, &cam_port);  
+  }
+}
+#endif
+
+
 // for color and format conversion (located in cmvision)
 #include "conversions.h"
 
@@ -291,16 +312,17 @@
        Camera1394(ConfigFile* cf, int section);
 
 public:
-       virtual int SetZoom(unsigned int brightness);
+       virtual int SetZoom(unsigned int zoom);
        virtual int GetZoom(unsigned int* zoom);
        virtual int SetFocus(unsigned int focus);
        virtual int GetFocus(unsigned int* focus);
        virtual int SetIris(unsigned int iris);
        virtual int GetIris(unsigned int* iris);
        virtual int SetBrightness(unsigned int brightness);
-       virtual int SetExposure(unsigned int brightness);
-       virtual int SetShutter(unsigned int brightness);
+       virtual int SetExposure(unsigned int exposure);
+       virtual int SetShutter(unsigned int shutter);
        virtual int SetGain(unsigned int gain);
+       virtual int SetWhiteBalance(const char* whitebalance);
 
        // Main function for device thread.
 private:
@@ -329,6 +351,8 @@
        // Video device
        unsigned int port;
        unsigned int node;
+        char guid[1024];
+        bool use_guid;
 
 #ifdef HAVE_LIBRAW1394
 private: raw1394handle_t handle;
@@ -403,7 +427,8 @@
        IntProperty MinZoom, MaxZoom, Zoom;
        IntProperty MinFocus, MaxFocus, Focus;
        IntProperty MinIris, MaxIris, Iris;
-       IntProperty Brightness, Exposure, RedBalance, BlueBalance, Shutter, 
Gain;
+       IntProperty Brightness, Exposure, Shutter, Gain;
+        StringProperty WhiteBalance;
        /*  private: bool setFocus, setIris, setBrightness, setExposure, 
setWhiteBalance, setShutter, setGain;
         private: bool autoFocus, autoIris, autoBrightness, autoExposure, 
autoShutter, autoGain;
         private: unsigned int focus, iris, brightness, exposure, redBalance, 
blueBalance, shutter, gain;
@@ -441,12 +466,11 @@
                        MaxIris("max_iris", PROPERTY_NOT_SET, true, this, cf, 
section),
                        Iris("iris", PROPERTY_NOT_SET, false, this, cf, 
section),
                        Brightness("brightness", PROPERTY_NOT_SET, false, this, 
cf, section),
-                       Exposure("exposure", PROPERTY_NOT_SET, false, this,
-                       cf, section), RedBalance("red_balance", 
PROPERTY_NOT_SET, false,
-                       this, cf, section), BlueBalance("blue_balance", 
PROPERTY_NOT_SET,
-                       false, this, cf, section), Shutter("shutter", 
PROPERTY_NOT_SET,
-                       false, this, cf, section), Gain("gain", 
PROPERTY_NOT_SET, false,
-                       this, cf, section) {
+                       Exposure("exposure", PROPERTY_NOT_SET, false, this, cf, 
section), 
+                       Shutter("shutter", PROPERTY_NOT_SET, false, this, cf, 
section), 
+                        Gain("gain", PROPERTY_NOT_SET, false, this, cf, 
section), 
+                        WhiteBalance("whitebalance", "None", false, this, cf, 
section)
+{
        float fps;
 
        this->data = NULL;
@@ -456,6 +480,16 @@
 #endif
        this->method = methodNone;
 
+       const char* str;
+       // The guid of the camera
+       str = cf->ReadString(section, "guid", "NONE");
+       this->use_guid=false;
+       if (strcmp(str,"NONE"))
+         {
+           use_guid=true;
+           strcpy(this->guid,str); 
+         }
+       
        // The port the camera is attached to
        this->port = cf->ReadInt(section, "port", 0);
 
@@ -483,7 +517,6 @@
        // Image size. This determines the capture resolution. There are a 
limited
        // number of options available. At 640x480, a camera can capture at
        // _RGB or _MONO or _MONO16.
-       const char* str;
        str = cf->ReadString(section, "mode", "640x480_yuv422");
        /*
         if (0==strcmp(str,"160x120_yuv444"))
@@ -660,8 +693,7 @@
                        //dc1394_release_camera(this->camera);
                        break;
                        case methodVideo:
-                       //dc1394_dma_unlisten(this->camera);
-                       //dc1394_dma_release_camera(this->camera);
+                         dc1394_capture_stop(this->camera);
                        break;
                }
                dc1394_camera_free(this->camera);
@@ -925,6 +957,56 @@
        return 0;
 }
 
+
+int Camera1394::SetWhiteBalance(const char* whitebalance) {
+  bool setWhiteBalance = false;
+  bool autoWhiteBalance = false;
+  unsigned int blueBalance, redBalance;
+  
+  if (!strcmp(whitebalance,"auto"))
+    {
+#if LIBDC1394_VERSION == 0200
+      setWhiteBalance=true;
+      autoWhiteBalance=true;
+#else
+      setWhiteBalance=false;
+#endif
+    }
+  else
+    {
+      autoWhiteBalance=false;
+      if(sscanf(whitebalance,"%u %u",&blueBalance,&redBalance)==2)
+       setWhiteBalance=true;
+      else
+       PLAYER_ERROR1("didn't understand white balance values [%s]", 
whitebalance);
+    }
+  
+  if (setWhiteBalance)
+    {
+#if LIBDC1394_VERSION == 0200
+      if (DC1394_SUCCESS != dc1394_feature_set_mode(this->camera, 
FEATURE_WHITE_BALANCE,autoWhiteBalance ? DC1394_FEATURE_MODE_AUTO : 
DC1394_FEATURE_MODE_MANUAL))
+       {
+         PLAYER_ERROR("Unable to set White Balance mode");
+         this->SafeCleanup();
+         return -1;
+       }
+      if (!autoWhiteBalance)
+       if (DC1394_SUCCESS != 
dc1394_feature_whitebalance_set_value(this->camera,blueBalance,redBalance))
+#else
+         if (DC1394_SUCCESS != dc1394_set_white_balance(this->handle, 
this->camera.node,blueBalance,redBalance))
+#endif
+           {
+             PLAYER_ERROR("Unable to set White Balance");
+             this->SafeCleanup();
+             return -1;
+           }
+    }
+  
+  
+  return 0;
+}
+
+
 
////////////////////////////////////////////////////////////////////////////////
 // Set up the device (called by server thread).
 int Camera1394::MainSetup() {
@@ -938,55 +1020,90 @@
        // Create a handle for the given port (port will be zero on most
        // machines)
 #if LIBDC1394_VERSION == 0200
-       // First we try to find a camera
-       int err;
-       dc1394_t *d;
-       dc1394camera_list_t *list;
-
-       d = dc1394_new ();
-       err = dc1394_camera_enumerate (d, &list);
-       if (err != DC1394_SUCCESS)
+  // First we try to find a camera
+  int err;
+  dc1394_t *d;
+  dc1394camera_list_t *list;
+  
+  d = dc1394_new ();
+  err = dc1394_camera_enumerate (d, &list);
+  if (err != DC1394_SUCCESS)
+    {
+      PLAYER_ERROR1("Could not get Camera List: %d\n", err);
+      return -1;
+    }
+  
+  if (list->num == 0)
+    {
+      PLAYER_ERROR("No cameras found");
+      return -1;
+    }
+  
+  char* temp=(char*)malloc(1024*sizeof(char));
+  for (unsigned i=0; i < list->num; i++)
+    {
+      uint32_t camNode, camGeneration;
+      
+      // Create a camera
+      this->camera = dc1394_camera_new (d, list->ids[i].guid);
+      if (!camera)
+       PLAYER_ERROR1("Failed to initialize camera with guid %016llx",
+                     list->ids[i].guid);
+      else PLAYER_MSG1(2,"Found camera with GUID %016llx",
+                      list->ids[i].guid);
+      
+      if (this->use_guid) {
+       
+       quadlet_t value[3];
+       
+       value[0]= camera->guid & 0xffffffff;
+       value[1]= (camera->guid >>32) & 0x000000ff;
+       value[2]= (camera->guid >>40) & 0xfffff;
+       
+       sprintf(temp,"%06x%02x%08x", value[2], value[1], value[0]);
+       
+       PLAYER_MSG2(5,"Comparing %s to %s",this->guid,temp);
+       if (strcmp(temp,this->guid)==0)
+         break;
+      }
+      else 
        {
-               PLAYER_ERROR1("Could not get Camera List: %d\n", err);
-               return -1;
-       }
-
-       if (list->num == 0)
-       {
-               PLAYER_ERROR("No cameras found");
-               return -1;
-       }
-
-       for (unsigned i=0; i < list->num; i++)
-       {
-               uint32_t camNode, camGeneration;
-
-               // Create a camera
-               this->camera = dc1394_camera_new (d, 
list->ids[this->node].guid);
-
-               // Get the node of the camera
-               dc1394_camera_get_node(this->camera, &camNode, &camGeneration);
-
-               // Make sure we have the correct camera
-               if (camNode == this->node)
+         // Get the node of the camera
+         dc1394_camera_get_node(this->camera, &camNode, &camGeneration);
+         
+         // Make sure we have the correct camera
+         if (camNode == this->node)
+#if DC1394_2_LINUX == 1 
+           {
+             unsigned int cam_port;
+             get_port(this->camera, cam_port);
+             if (cam_port == this->port)
                break;
-               else
-               dc1394_camera_free(this->camera);
+           }
+#else
+         break;
+#endif
        }
+      this->SafeCleanup();
+    }
+  free (temp);
+  dc1394_camera_free_list (list);
+  
+  if (!camera)
+    {
+      if (this->use_guid)
+       PLAYER_ERROR1("Could not find camera with guid %s",
+                     this->guid);
+      else 
+#if DC1394_2_LINUX == 1
+       PLAYER_ERROR2("Could not find camera with node %d, port %d",
+                     this->node, this->port);
+#else
+      PLAYER_ERROR("On this system, you cannot specify a node/port.  You 
should specify the GUID of the camera.");
+#endif
+      return -1;
+    }
 
-       if (!camera)
-       {
-               PLAYER_ERROR1("Failed to initialize camera with guid %llx",
-                               list->ids[0].guid);
-               this->SafeCleanup();
-               return -1;
-       }
-
-       dc1394_camera_free_list (list);
-
-       //dc1394_cleanup_iso_channels_and_bandwidth(camera);
-       /* Above has been removed from API. */
-
 #else
        this->handle = dc1394_create_handle(this->port);
        if (this->handle == NULL) {
@@ -1038,19 +1155,13 @@
                }
        }
 
-       if ((this->BlueBalance != PROPERTY_NOT_SET) && (this->RedBalance != 
PROPERTY_NOT_SET)) {
-#if LIBDC1394_VERSION == 0200
-               if (DC1394_SUCCESS != 
dc1394_feature_whitebalance_set_value(this->camera,this->BlueBalance,this->RedBalance))
-#else
-               if (DC1394_SUCCESS != dc1394_set_white_balance(this->handle,
-                               this->camera.node, this->BlueBalance, 
this->RedBalance))
-#endif
-               {
-                       PLAYER_ERROR("Unable to set White Balance");
-                       this->SafeCleanup();
-                       return -1;
-               }
+       if (strcmp(this->WhiteBalance,"None")) {
+         if (this->SetWhiteBalance(this->WhiteBalance)) {
+           this->SafeCleanup();
+           return -1;
+         }
        }
+       
 
        // Collects the available features for the camera described by node and
        // stores them in features.

Modified: code/player/trunk/server/drivers/camera/1394/camera1394.h.in
===================================================================
--- code/player/trunk/server/drivers/camera/1394/camera1394.h.in        
2009-06-14 23:12:53 UTC (rev 7849)
+++ code/player/trunk/server/drivers/camera/1394/camera1394.h.in        
2009-06-14 23:23:57 UTC (rev 7850)
@@ -1,2 +1,3 @@
-#cmakedefine HAVE_LIBRAW1394 1
-#define DC1394_DMA_SETUP_CAPTURE_ARGS ${DC1394_DMA_SETUP_CAPTURE_ARGS}
\ No newline at end of file
+#define HAVE_LIBRAW1394 ${HAVE_LIBRAW1394}
+#define DC1394_DMA_SETUP_CAPTURE_ARGS ${DC1394_DMA_SETUP_CAPTURE_ARGS}
+#define DC1394_2_LINUX ${DC1394_2_LINUX}


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensing option that enables unlimited
royalty-free distribution of the report engine for externally facing 
server and web deployment.
http://p.sf.net/sfu/businessobjects
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to