Index: src/player/CameraNode.cpp =================================================================== --- src/player/CameraNode.cpp (revision 3354) +++ src/player/CameraNode.cpp (working copy) @@ -82,37 +82,8 @@ int Height = Args.getArgVal("captureheight"); string sPF = Args.getArgVal("pixelformat"); - if (sSource == "firewire") { -#if defined(AVG_ENABLE_1394)\ - || defined(AVG_ENABLE_1394_2) - m_pCamera = CameraPtr(new FWCamera(sDevice, IntPoint(Width, Height), sPF, - FrameRate, true)); -#else - AVG_TRACE(Logger::ERROR, "Firewire camera specified, but firewire " - "support not compiled in."); -#endif - } else if (sSource == "v4l") { -#if defined(AVG_ENABLE_V4L2) - int Channel = Args.getArgVal("channel"); - - m_pCamera = CameraPtr(new V4LCamera(sDevice, Channel, - IntPoint(Width, Height), sPF, true)); -#else - AVG_TRACE(Logger::ERROR, "Video4Linux camera specified, but " - "Video4Linux support not compiled in."); -#endif - } else if (sSource == "directshow") { -#if defined(AVG_ENABLE_DSHOW) - m_pCamera = CameraPtr(new DSCamera(sDevice, IntPoint(Width, Height), sPF, - FrameRate, true)); -#else - AVG_TRACE(Logger::ERROR, "DirectShow camera specified, but " - "DirectShow is only available under windows."); -#endif - } else { - AVG_TRACE(Logger::ERROR, - "Unable to set up camera. Camera source '"+sSource+"' unknown."); - } + m_pCamera = Player::get()->getSubsystemManager() + .createCamera(sSource, sDevice, IntPoint(Width, Height), sPF, FrameRate, false); if (m_pCamera) { m_pCamera->setFeature(CAM_FEATURE_BRIGHTNESS, @@ -133,6 +104,9 @@ Args.getArgVal("whitebalance")); m_pCamera->setFeature(CAM_FEATURE_STROBE_DURATION, Args.getArgVal("strobeduration")); + } else { + AVG_TRACE(Logger::ERROR, + "Unable to set up camera. Camera source '"+sSource+"' unknown."); } } Index: src/player/Player.cpp =================================================================== --- src/player/Player.cpp (revision 3354) +++ src/player/Player.cpp (working copy) @@ -127,6 +127,16 @@ registerNodeType(LineNode::createDefinition()); registerNodeType(RectNode::createDefinition()); registerNodeType(CurveNode::createDefinition()); + +#if defined(AVG_ENABLE_1394) || defined(AVG_ENABLE_1394_2) + m_SubsystemManager.registerCameraSubsystem("firewire", Camera::buildCamera); +#endif +#if defined(AVG_ENABLE_V4L2) + m_SubsystemManager.registerCameraSubsystem("v4l", Camera::buildCamera); +#endif +#if defined(AVG_ENABLE_DSHOW) + m_SubsystemManager.registerCameraSubsystem("ds", Camera::buildCamera); +#endif m_pTestHelper = new TestHelper(this); @@ -1342,4 +1352,9 @@ PluginManager::get().loadPlugin(name); } +SubsystemManager& Player::getSubsystemManager() +{ + return m_SubsystemManager; } + +} Index: src/player/SubsystemManager.h =================================================================== --- src/player/SubsystemManager.h (revision 0) +++ src/player/SubsystemManager.h (revision 0) @@ -0,0 +1,31 @@ + + +#ifndef _SubsystemManager_H_ +#define _SubsystemManager_H_ + +#include "../api.h" + +#include "../imaging/Camera.h" + +#include +#include + +namespace avg { + +typedef CameraPtr (*CameraBuilder)(const std::string& sDevice, const IntPoint& Size, + const std::string& sPF, double FrameRate, bool bColor); + +class AVG_API SubsystemManager +{ +public: + void registerCameraSubsystem(const std::string& name, CameraBuilder builder); + CameraPtr createCamera(const std::string& name, const std::string& sDevice, + const IntPoint& Size, const std::string& sPF, double FrameRate, bool bColor) const; + +private: + std::map m_CameraSubsystems; +}; + +} + +#endif Property changes on: src/player/SubsystemManager.h ___________________________________________________________________ Added: svn:executable + * Index: src/player/SubsystemManager.cpp =================================================================== --- src/player/SubsystemManager.cpp (revision 0) +++ src/player/SubsystemManager.cpp (revision 0) @@ -0,0 +1,25 @@ + + +#include "SubsystemManager.h" + +using namespace std; + +namespace avg { + +void SubsystemManager::registerCameraSubsystem(const string& name, CameraBuilder builder) +{ + m_CameraSubsystems.insert(map::value_type(name, builder)); +} + +CameraPtr SubsystemManager::createCamera(const string& name, const string& sDevice, + const IntPoint& Size, const string& sPF, + double FrameRate, bool bColor) const +{ + map::const_iterator buildIter = m_CameraSubsystems.find(name); + if (buildIter == m_CameraSubsystems.end()) { + return CameraPtr(); + } + return buildIter->second(sDevice, Size, sPF, FrameRate, bColor); +} + +} Property changes on: src/player/SubsystemManager.cpp ___________________________________________________________________ Added: svn:executable + * Index: src/player/Player.h =================================================================== --- src/player/Player.h (revision 3354) +++ src/player/Player.h (working copy) @@ -34,6 +34,7 @@ #include "DisplayParams.h" #include "CursorState.h" #include "MouseState.h" +#include "SubsystemManager.h" #include "../base/IFrameListener.h" @@ -133,6 +134,8 @@ void loadPlugin(const std::string& name); void setPluginPath(const std::string& newPath); std::string getPluginPath() const; + + SubsystemManager& getSubsystemManager(); private: void initConfig(); void initGraphics(); @@ -162,6 +165,7 @@ typedef std::map NodeIDMap; NodeIDMap m_IDMap; NodeRegistry m_NodeRegistry; + SubsystemManager m_SubsystemManager; TrackerEventSource * m_pTracker; Index: src/player/Makefile.am =================================================================== --- src/player/Makefile.am (revision 3354) +++ src/player/Makefile.am (working copy) @@ -33,7 +33,7 @@ Event.h KeyEvent.h PanoImage.h TestHelper.h \ RasterNode.h CameraNode.h TrackerEventSource.h TrackerCalibrator.h \ TouchEvent.h EventStream.h BoostPython.h Sound.h MouseState.h \ - VectorNode.h LineNode.h RectNode.h CurveNode.h\ + VectorNode.h LineNode.h RectNode.h CurveNode.h SubsystemManager.h \ $(GL_INCLUDES) TESTS=testcalibrator testplayer @@ -68,7 +68,7 @@ Arg.cpp Node.cpp AreaNode.cpp RasterNode.cpp DivNode.cpp \ VideoBase.cpp Video.cpp \ Player.cpp PluginManager.cpp NodeRegistry.cpp ArgBase.cpp ArgList.cpp \ - DisplayEngine.cpp Region.cpp \ + SubsystemManager.cpp DisplayEngine.cpp Region.cpp \ PanoImage.cpp Words.cpp CameraNode.cpp NodeDefinition.cpp GroupNode.cpp \ Timeout.cpp Event.cpp DisplayParams.cpp CursorState.cpp CanvasNode.cpp \ Image.cpp EventDispatcher.cpp KeyEvent.cpp CursorEvent.cpp MouseEvent.cpp\ Index: src/imaging/Camera.h =================================================================== --- src/imaging/Camera.h (revision 3354) +++ src/imaging/Camera.h (working copy) @@ -57,9 +57,20 @@ std::string cameraFeatureToString(CameraFeature Feature); +class Camera; + +typedef boost::shared_ptr CameraPtr; + class AVG_API Camera { public: + template + static CameraPtr buildCamera(const std::string& sDevice, const IntPoint& Size, + const std::string& sPF, double FrameRate, bool bColor) + { + return CameraPtr(new CameraType(sDevice, Size, sPF, FrameRate, bColor)); + } + virtual ~Camera() {}; virtual void open() = 0; virtual void close() = 0; @@ -77,8 +88,6 @@ }; -typedef boost::shared_ptr CameraPtr; - } #endif