# Cinder

- Main Page
- Related Pages
- Namespaces
- Classes
- Files

- File List
- File Members

# include/cinder/Capture.h

Go to the documentation of this file.

    00001 /*
    00002  Copyright (c) 2010, The Barbarian Group
    00003  All rights reserved.
    00004
    00005  Redistribution and use in source and binary forms, with or without modification, are permitted provided that
    00006  the following conditions are met:
    00007
    00008     * Redistributions of source code must retain the above copyright notice, this list of conditions and
    00009     the following disclaimer.
    00010     * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
    00011     the following disclaimer in the documentation and/or other materials provided with the distribution.
    00012
    00013  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
    00014  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    00015  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
    00016  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
    00017  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    00018  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
    00019  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    00020  POSSIBILITY OF SUCH DAMAGE.
    00021 */
    00022
    00023 #pragma once
    00024
    00025 #include "cinder/Cinder.h"
    00026 #include "cinder/Surface.h"
    00027 #include "cinder/Exception.h"
    00028
    00029 #if defined( CINDER_MAC )
    00030 #   if defined( __OBJC__ )
    00031         @class CaptureCocoa;
    00032         @class QTCaptureDevice;
    00033 #   else
    00034         class CaptureCocoa;
    00035         class QTCaptureDevice;
    00036 #   endif
    00037 #elif defined( CINDER_MSW )
    00038 #   include "msw/videoInput/videoInput.h"
    00039 #endif
    00040
    00041 #include <map>
    00042
    00043 namespace cinder {
    00044
    00045 class Capture {
    00046  public:
    00047     class Device;
    00048
    00049     Capture() {}
    00050     Capture( int32_t width, int32_t height, const Device &device = Device() );
    00051     ~Capture() {}
    00052
    00054     void        start();
    00056     void        stop();
    00058     bool        isCapturing();
    00059
    00061     bool        checkNewFrame() const;
    00062
    00064     int32_t     getWidth() const { return mObj->mWidth; }
    00066     int32_t     getHeight() const { return mObj->mHeight; }
    00068     Vec2i       getSize() const { return Vec2i( getWidth(), getHeight() ); }
    00070     float       getAspectRatio() const { return getWidth() / (float)getHeight(); }
    00072     Area        getBounds() const { return Area( 0, 0, getWidth(), getHeight() ); }
    00073
    00075     Surface8u   getSurface() const;
    00077     Device      getDevice() const { return mObj->mDevice; }
    00078
    00080     static const std::vector<Device>&   getDevices( bool forceRefresh = false );
    00082     static Device                       findDeviceByName( const std::string &name );
    00083
    00085     class Device {
    00086       public:
    00088         const std::string&      getName() const { return mName; }
    00090         bool                    checkAvailable() const;
    00092         bool                    isConnected() const;
    00093
    00095     #if defined( CINDER_MAC )
    00096         const std::string&      getUniqueId() const { return mUniqueId; }
    00097     #else
    00098         int                     getUniqueId() const { return mUniqueId; }
    00099     #endif
    00100
    00101     #if defined( CINDER_MAC )
    00102         Device() {} // this represents a null device
    00103     #else
    00104         Device() : mUniqueId( 0 ) {}
    00105     #endif
    00106      protected:
    00107     #if defined( CINDER_MAC )
    00108         Device( QTCaptureDevice* device );
    00109     #else
    00110         Device( const std::string &name, int uniqueId ) : mName( name ), mUniqueId( uniqueId ) {}
    00111     #endif
    00112
    00113         std::string     mName;
    00114     #if defined( CINDER_MAC )
    00115         std::string     mUniqueId;
    00116     #else
    00117         int             mUniqueId;
    00118     #endif
    00119
    00120         friend class Capture;
    00121     };
    00122
    00123  protected:
    00124     struct Obj {
    00125         Obj( int32_t width, int32_t height, const Capture::Device &device );
    00126         virtual ~Obj();
    00127
    00128 #if defined( CINDER_MAC )
    00129         CaptureCocoa        *mImpl;
    00130 #elif defined( CINDER_MSW )
    00131         int                             mDeviceID;
    00132         // this maintains a reference to the mgr so that we don't destroy it before
    00133         // the last Capture is destroyed
    00134         shared_ptr<class CaptureMgr>    mMgrPtr;
    00135         bool                            mIsCapturing;
    00136         shared_ptr<class SurfaceCache>  mSurfaceCache;
    00137 #endif
    00138         int32_t             mWidth, mHeight;
    00139         mutable Surface8u   mCurrentFrame;
    00140         Capture::Device     mDevice;
    00141     };
    00142
    00143     shared_ptr<Obj>                     mObj;
    00144     static bool                         sDevicesEnumerated;
    00145     static std::vector<Capture::Device> sDevices;
    00146
    00147   public:
    00149
    00150     typedef shared_ptr<Obj> Capture::*unspecified_bool_type;
    00151     operator unspecified_bool_type() { return ( mObj.get() == 0 ) ? 0 : &Capture::mObj; }
    00152     void reset() { mObj.reset(); }
    00154 };
    00155
    00156 class CaptureExc : public Exception {
    00157 };
    00158
    00159 class CaptureExcInitFail : public CaptureExc {
    00160 };
    00161
    00162 class CaptureExcInvalidChannelOrder : public CaptureExc {
    00163 };
    00164
    00165 } //namespace cinder