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 Playerstage-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/playerstage-commit