Cinder

  • Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

include/cinder/CaptureImplDirectShow.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/Capture.h"
00027 #include "cinder/Surface.h"
00028 #include "msw/videoInput/videoInput.h"
00029 
00030 namespace cinder {
00031 
00032 class CaptureImplDirectShow {
00033  public:
00034     class Device;
00035 
00036     CaptureImplDirectShow( int32_t width, int32_t height, const Capture::DeviceRef device );
00037     CaptureImplDirectShow( int32_t width, int32_t height );
00038     ~CaptureImplDirectShow();
00039     
00040     void start();
00041     void stop();
00042     
00043     bool        isCapturing();
00044     bool        checkNewFrame() const;
00045 
00046     int32_t     getWidth() const { return mWidth; }
00047     int32_t     getHeight() const { return mHeight; }
00048     
00049     Surface8u   getSurface() const;
00050     
00051     const Capture::DeviceRef getDevice() const { return mDevice; }
00052     
00053     static const std::vector<Capture::DeviceRef>&   getDevices( bool forceRefresh = false );
00054 
00055     class Device : public Capture::Device {
00056       public:
00057         bool                        checkAvailable() const;
00058         bool                        isConnected() const;
00059         Capture::DeviceIdentifier   getUniqueId() const { return mUniqueId; }
00060 
00061         Device( const std::string &name, int uniqueId ) : Capture::Device(), mUniqueId( uniqueId ) { mName = name; }
00062      protected:
00063         int             mUniqueId;
00064     };
00065  protected:
00066     void    init( int32_t width, int32_t height, const Capture::Device &device );
00067 
00068     int                             mDeviceID;
00069     // this maintains a reference to the mgr so that we don't destroy it before
00070     // the last Capture is destroyed
00071     shared_ptr<class CaptureMgr>    mMgrPtr;
00072     bool                            mIsCapturing;
00073     shared_ptr<class SurfaceCache>  mSurfaceCache;
00074 
00075     int32_t             mWidth, mHeight;
00076     mutable Surface8u   mCurrentFrame;
00077     Capture::DeviceRef  mDevice;
00078 
00079     static bool                         sDevicesEnumerated;
00080     static std::vector<Capture::DeviceRef>  sDevices;
00081 };
00082 
00083 } //namespace
00084