Revision: 7091
http://playerstage.svn.sourceforge.net/playerstage/?rev=7091&view=rev
Author: veedee
Date: 2008-10-10 12:33:26 +0000 (Fri, 10 Oct 2008)
Log Message:
-----------
added preliminary driver for unicap/libunicap compatible devices.
Modified Paths:
--------------
code/player/trunk/server/drivers/camera/CMakeLists.txt
Added Paths:
-----------
code/player/trunk/server/drivers/camera/unicap/
code/player/trunk/server/drivers/camera/unicap/CMakeLists.txt
code/player/trunk/server/drivers/camera/unicap/unicapImage.cc
Modified: code/player/trunk/server/drivers/camera/CMakeLists.txt
===================================================================
--- code/player/trunk/server/drivers/camera/CMakeLists.txt 2008-10-10
11:59:04 UTC (rev 7090)
+++ code/player/trunk/server/drivers/camera/CMakeLists.txt 2008-10-10
12:33:26 UTC (rev 7091)
@@ -6,3 +6,4 @@
ADD_SUBDIRECTORY (sphere)
ADD_SUBDIRECTORY (uvc)
ADD_SUBDIRECTORY (yarp)
+ADD_SUBDIRECTORY (unicap)
Added: code/player/trunk/server/drivers/camera/unicap/CMakeLists.txt
===================================================================
--- code/player/trunk/server/drivers/camera/unicap/CMakeLists.txt
(rev 0)
+++ code/player/trunk/server/drivers/camera/unicap/CMakeLists.txt
2008-10-10 12:33:26 UTC (rev 7091)
@@ -0,0 +1,21 @@
+PLAYERDRIVER_OPTION (unicapimage build_unicapimage ON)
+
+#SET (UNICAP_DIR "/usr/src/unicap")
+SET (UNICAP_DIR "" CACHE STRING "Directory containing the UniCap headers and
libraries")
+MARK_AS_ADVANCED (UNICAP_DIR)
+IF ("${UNICAP_DIR}" STREQUAL "")
+ SET (unicapReqHeader "unicap.h")
+ SET (unicapExtraFlags "")
+ SET (unicapExtraLibs "-lunicap -lrt")
+ELSE ("${UNICAP_DIR}" STREQUAL "")
+ SET (unicapReqHeader "${UNICAP_DIR}/include/unicap/unicap.h")
+ SET (unicapExtraFlags "-I${UNICAP_DIR}/include/unicap")
+ SET (unicapExtraLibs "-L${UNICAP_DIR}/lib -lcanlib -lrt")
+ENDIF ("${UNICAP_DIR}" STREQUAL "")
+
+PLAYERDRIVER_REQUIRE_HEADER (unicapimage build_unicapimage ${unicapReqHeader})
+
+PLAYERDRIVER_ADD_DRIVER (unicapimage build_unicapimage
+ LINKFLAGS "-L{UNICAP_DIR}/lib -lunicap -lrt"
+ CFLAGS "-I${UNICAP_DIR}/include
-I${UNICAP_DIR}/include/unicap"
+ SOURCES unicapImage.cc)
Added: code/player/trunk/server/drivers/camera/unicap/unicapImage.cc
===================================================================
--- code/player/trunk/server/drivers/camera/unicap/unicapImage.cc
(rev 0)
+++ code/player/trunk/server/drivers/camera/unicap/unicapImage.cc
2008-10-10 12:33:26 UTC (rev 7091)
@@ -0,0 +1,318 @@
+/*
+ * Player - One Hell of a Robot Server
+ * Copyright (C) 2006 Radu Bogdan Rusu ([EMAIL PROTECTED])
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+/*
+ Desc: Driver for unicap/libunicap compatible capture devices.
+ Author: Radu Bogdan Rusu
+ Date: 10 Oct 2008
+*/
+/** @ingroup drivers */
+/** @{ */
+/** @defgroup driver_unicapimage unicapimage
+ * @brief unicapimage
+
+The unicapimage driver makes use of libunicap
+(http://www.unicap-imaging.org) to get access to certain video capture
+devices (such as the Imaging Source DFG/1394-1e converter) and provide the
+data through the @ref interface_camera interface.
+
[EMAIL PROTECTED] Compile-time dependencies
+
+- libunicap (http://www.unicap-imaging.org) should be installed.
+
[EMAIL PROTECTED] Provides
+
+- @ref interface_camera
+
[EMAIL PROTECTED] Requires
+
+- none
+
[EMAIL PROTECTED] Configuration requests
+
+- none yet
+
[EMAIL PROTECTED] Configuration file options
+
+The examples below are given for the Imaging Source DFG/1394-1e
+Video-to-Firewire converter.
+
+- color_space (integer)
+ - Default: 0 (UYVY)
+ - Possible values: 0 (UYVY), 1 (YUY2), 2 (Y411), 3 (Grey).
+ - Format of the image to provide.
+
+- video_format (integer)
+ - Default: 0 (320x240)
+ - Possible values: 0 (320x240), 1 (640x480), 2 (768x576).
+ - Resolution of the image to provide.
+
[EMAIL PROTECTED] Example
+
[EMAIL PROTECTED]
+driver
+(
+ name "unicapimage"
+ provides ["camera:0"]
+ color_space 3
+ video_format 0
+)
[EMAIL PROTECTED]
+
[EMAIL PROTECTED] Radu Bogdan Rusu
+
+ */
+/** @} */
+
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <vector>
+
+#include <libplayercore/playercore.h>
+#include <unicap.h>
+#include <unicap_status.h>
+
+////////////////////////////////////////////////////////////////////////////////
+// The UniCap_Image device class.
+class UniCap_Image : public Driver
+{
+ public:
+ // Constructor
+ UniCap_Image (ConfigFile* cf, int section);
+
+ // Destructor
+ ~UniCap_Image ();
+
+ // Implementations of virtual functions
+ virtual int Setup ();
+ virtual int Shutdown ();
+
+ // Camera interface (provides)
+ player_devaddr_t cam_id;
+ player_camera_data_t cam_data;
+ private:
+
+ // Main function for device thread.
+ virtual void Main ();
+ virtual void RefreshData ();
+
+ int color_space, video_format, device_id;
+
+ unicap_handle_t handle;
+ unicap_device_t device;
+ unicap_format_t format_spec;
+ unicap_format_t format;
+ unicap_data_buffer_t buffer;
+ unicap_data_buffer_t *returned_buffer;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// Factory creation function. This functions is given as an argument when
+// the driver is added to the driver table
+Driver* UniCap_Image_Init (ConfigFile* cf, int section)
+{
+ // Create and return a new instance of this driver
+ return ((Driver*)(new UniCap_Image (cf, section)));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Registers the driver in the driver table. Called from the
+// player_driver_init function that the loader looks for
+void unicapimage_Register (DriverTable* table)
+{
+ table->AddDriver ("unicapimage", UniCap_Image_Init);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Constructor. Retrieve options from the configuration file and do any
+// pre-Setup() setup.
+UniCap_Image::UniCap_Image (ConfigFile* cf, int section)
+ : Driver (cf, section)
+{
+ memset (&this->cam_id, 0, sizeof (player_devaddr_t));
+
+ // Outgoing camera interface
+ if (cf->ReadDeviceAddr(&(this->cam_id), section, "provides",
PLAYER_CAMERA_CODE, -1, NULL) == 0)
+ {
+ if(this->AddInterface(this->cam_id) != 0)
+ {
+ this->SetError(-1);
+ return;
+ }
+ }
+
+ // Device ID number
+ this->device_id = cf->ReadInt (section, "device", 0);
+ if (!SUCCESS (unicap_enumerate_devices (NULL, &device, this->device_id)))
+ {
+ PLAYER_ERROR2 ("Could not get info for device %i: %s!", this->device_id,
device.identifier);
+ this->SetError (-1);
+ return;
+ }
+
+ PLAYER_MSG2 (2, ">> UniCap_Image device at %i: %s", this->device_id,
device.identifier);
+
+ // Color space
+ this->color_space = cf->ReadInt (section, "color_space", 0);
+
+ // Video formats
+ this->video_format = cf->ReadInt (section, "video_format", 0);
+
+ return;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Destructor.
+UniCap_Image::~UniCap_Image()
+{
+ return;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Set up the device. Return 0 if things go well, and -1 otherwise.
+int UniCap_Image::Setup ()
+{
+ PLAYER_MSG0 (1, "> UniCap_Image starting up... [done]");
+
+ if ( !SUCCESS (unicap_open (&handle, &device)) )
+ {
+ PLAYER_ERROR1 ("Could not open device: %s!", device.identifier);
+ return (-1);
+ }
+
+ // Set the desired format
+ unicap_void_format (&format_spec);
+// format_spec.fourcc = FOURCC('U','Y','V','Y');
+
+ // Get the list of video formats of the given colorformat
+ for ( int i = 0; SUCCESS (unicap_enumerate_formats (handle, &format_spec,
&format, i)); i++)
+ PLAYER_MSG2 (2, " Available color space %d: %s", i, format.identifier);
+
+ if (!SUCCESS (unicap_enumerate_formats (handle, &format_spec, &format,
this->color_space) ) )
+ {
+ PLAYER_ERROR1 ("Failed to set color space to %d!", this->color_space);
+ return (-1);
+ }
+ else
+ PLAYER_MSG2 (2, "Selected color space %d: %s", this->color_space,
format.identifier);
+
+
+ // If a video format has more than one size, ask for which size to use
+ if (format.size_count )
+ {
+ for (int i = 0; i < format.size_count; i++)
+ PLAYER_MSG3 (2, " Available video format %d: %dx%d", i,
format.sizes[i].width, format.sizes[i].height);
+ format.size.width = format.sizes[this->video_format].width;
+ format.size.height = format.sizes[this->video_format].height;
+ }
+ PLAYER_MSG3 (2, "Selected video format %d: [%dx%d]", this->video_format,
format.size.width, format.size.height);
+
+ if (!SUCCESS (unicap_set_format (handle, &format) ) )
+ {
+ PLAYER_ERROR1 ("Failed to set video format to %d!", this->video_format);
+ return (-1);
+ }
+
+ // Start the capture process on the device
+ if (!SUCCESS (unicap_start_capture (handle) ) )
+ {
+ PLAYER_ERROR1 ("Failed to start capture on device: %s",
device.identifier);
+ return (-1);
+ }
+
+ // Initialize the image buffer
+ memset (&cam_data, 0, sizeof (cam_data));
+ memset (&buffer, 0, sizeof (unicap_data_buffer_t));
+
+ // Allocate buffer data
+ buffer.data = (unsigned char*)(malloc (format.size.width *
format.size.height * format.bpp / 8));
+ buffer.buffer_size = format.size.width * format.size.height * format.bpp / 8;
+
+ // Start the device thread
+ StartThread ();
+
+ return (0);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Shutdown the device
+int UniCap_Image::Shutdown ()
+{
+ // Stop the driver thread
+ StopThread ();
+
+ // Stop the device
+ if ( !SUCCESS (unicap_stop_capture (handle) ) )
+ PLAYER_ERROR1 ("Failed to stop capture on device: %s\n",
device.identifier);
+
+ // Close the device
+ if ( !SUCCESS (unicap_close (handle) ) )
+ PLAYER_ERROR1 ("Failed to close the device: %s\n", device.identifier);
+
+ free (buffer.data);
+ PLAYER_MSG0 (1, "> UniCap_Image driver shutting down... [done]");
+ return (0);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Main function for device thread
+void UniCap_Image::Main ()
+{
+ timespec sleepTime = {0, 1000};
+
+ // The main loop; interact with the device here
+ while (true)
+ {
+ nanosleep (&sleepTime, NULL);
+
+ // test if we are supposed to cancel
+ pthread_testcancel ();
+
+ // Refresh data
+ this->RefreshData ();
+ }
+}
+
+void UniCap_Image::RefreshData ()
+{
+ // Queue the buffer
+ // The buffer now gets filled with image data by the capture device
+ if (!SUCCESS (unicap_queue_buffer (handle, &buffer) ) )
+ return;
+
+ // Wait until the image buffer is ready
+ if (!SUCCESS (unicap_wait_buffer (handle, &returned_buffer) ) );
+// return;
+
+ cam_data.width = buffer.format.size.width;
+ cam_data.height = buffer.format.size.height;
+
+ // To do: implement the code for different formats later
+ cam_data.format = PLAYER_CAMERA_FORMAT_MONO8;
+ cam_data.image_count = buffer.buffer_size;
+ cam_data.image = new unsigned char [cam_data.image_count];
+ for (int i = 0; i < cam_data.image_count; i++)
+ cam_data.image[i] = buffer.data[i];
+
+ Publish (this->cam_id, PLAYER_MSGTYPE_DATA, PLAYER_CAMERA_DATA_STATE,
&cam_data);
+ delete [] cam_data.image;
+}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit