CameraSource.h

Go to the documentation of this file.
00001 /*
00002 *       This file contains class that load images from specified video sequence.
00003 *
00004 *       Author:
00005 *                       Tomas Mrkvicka
00006 *                       xmrkvi03@stud.fit.vutbr.cz
00007 *
00008 */
00009 
00010 
00011 #include <windows.h>
00012 #include <dshow.h>
00013 #include <streams.h>
00014 #include <dvdmedia.h>
00015 
00016 //FORWARD DECLARATIONS
00017 namespace NSCameras
00018 {
00019         class TDSSampler;
00020         class TVideoDSFile;
00021 };
00022 
00023 #ifndef _CAMERAS_CAMERASOURCE_HH_
00024 #define _CAMERAS_CAMERASOURCE_HH_
00025 
00026 namespace NSCameras
00027 {
00028 
00029 ////////////////////////////////////////////////////////////////////////////////
00030 ////////////////////////////////////////////////////////////////////////////////
00031 ////////////////////////////////////////////////////////////////////////////////
00032 // TDSSampler
00033 
00034 /** Toto je jednoznacny identifikator pro implementovany sampler.
00035 */
00036 struct __declspec(  uuid("{0F53C699-B463-4c12-AAD1-FEB0A3EA1E40}")  ) CLSID_Sampler;
00037 
00038 ////////////////////////////////////////////////////////////////////////////////
00039 ////////////////////////////////////////////////////////////////////////////////
00040 ////////////////////////////////////////////////////////////////////////////////
00041 
00042 /** Tato trida reprezentuje DirectShow komponentu pro ziskavani a ukladani snimku
00043 *       prichazejicich sestavenym grafem.
00044 *
00045 *       Trida je odvozena od zobrazovaci tridy DirectShow a tedy ji lze pouzit misto
00046 *       zobrazovaci tridy na konci DirectShow grafu.
00047 *
00048 *       Trida uklada prisla data do snimku typu RGB. Tato data lze nasledne ziskat
00049 *       pomoci verejne dostupnych metod. Tyto metody jsou synchronizovane pro vicenasobny
00050 *       pristup vice vlaken, coz umoznuje soucasny pristup ze strany grafu DirectShow 
00051 *       a uzivatelskych volani.
00052 */
00053 class TDSSampler : public CBaseVideoRenderer 
00054 {
00055 //PUBLIC OVERRIDEN METHODS
00056 public:
00057                                                 TDSSampler( IUnknown* unk, HRESULT *hr );
00058                                                 ~TDSSampler();
00059 
00060         HRESULT                         CheckMediaType( const CMediaType* media );
00061         HRESULT                         DoRenderSample( IMediaSample* sample);
00062         HRESULT                         ShouldDrawSampleNow( IMediaSample* sample, REFERENCE_TIME* start, REFERENCE_TIME* stop );
00063 
00064 //PUBLIC METHODS
00065 public:
00066         BITMAPINFOHEADER        GetFrameInfo(void) const;
00067         void                            GetData( void * data );
00068 
00069         int                                     GetWidth(void) const;
00070         int                                     GetHeight(void) const;
00071 
00072 //PRIVATE COMPONENTS
00073 private:
00074         BITMAPINFOHEADER        m_info;                 ///< informace o vstupnim datovem toku
00075 
00076         bool                            m_rowsFliped;   ///< urcuje zda jsou radky ukladany odspodu
00077         int                                     m_rgb_width;    ///< sirka snimku v pixelech
00078         int                                     m_rgb_height;   ///< vyska snimku v pixelech
00079         int                                     m_rgb_size;             ///< velikost snimku v bajtech ( W * H * 3 )    
00080 
00081         int                                     m_img_stride;   ///< pocet bajtu v jednom radku zdrojovych snimku
00082         int                                     m_img_align;    ///< pocet zarovnavacich bajtu v jednom radku
00083 
00084         BYTE*                           m_data1;                ///< snimek ve formatu RGB
00085         BYTE*                           m_data2;                ///< snimek ve formatu RGB - do nej se zapisuje a nasledne
00086                                                                                 ///< se ukazatele vymeni        
00087 
00088         CCritSec                        m_cs;                   ///< kriticka sekce pro pristup k M_READ1                                                                       
00089 };
00090 
00091 /** Vrati sirku obrazu v pixelech.
00092 */
00093 inline int TDSSampler::GetWidth(void) const
00094 {
00095         return m_rgb_width;
00096 }
00097 
00098 /** Vrati vysku obrazu v pixelech.
00099 */
00100 inline int TDSSampler::GetHeight(void) const
00101 {
00102         return m_rgb_height;
00103 }
00104 
00105 // TDSSampler
00106 ////////////////////////////////////////////////////////////////////////////////
00107 ////////////////////////////////////////////////////////////////////////////////
00108 ////////////////////////////////////////////////////////////////////////////////
00109 // TVideoDSFile
00110 
00111 /** Tato trida reprezentuje kameru ziskavajici snimky ze zadaneho video souboru.
00112 *
00113 *       Trida sestavi DirectShow graf a zaroven jej umi kontrolovat.
00114 */
00115 class TVideoDSFile
00116 {
00117 //PUBLIC METHODS
00118 public:
00119                                                 TVideoDSFile(void);
00120                                                 ~TVideoDSFile(void);
00121 
00122         bool                            Initialize( void );
00123         bool                            Destroy(void);  
00124 
00125         int                                     GetWidth(void) const;
00126         int                                     GetHeight(void) const;
00127 
00128         void                            GetDataRGB( void * data );
00129 
00130 //PRIVATE METHODS
00131 private:
00132         bool                            EnumCamera( IBaseFilter ** camera, IPin ** cameraOut );
00133 
00134 //PRIVATE COMPONENTS
00135 private:
00136         IGraphBuilder*          m_graph;                ///< graf sestaveny pro prehravani videa
00137         IMediaControl*          m_ctrl;                 ///< rozhrani pro rizeni prehravani
00138         TDSSampler*                     m_sampler;              ///< vlastni sampler pro ziskavani obrazku
00139 
00140         int                                     m_width;                ///< sirka snimku v pixelech
00141         int                                     m_height;               ///< vyska snimku v pixelech
00142 };
00143 
00144 /** Sirka obrazu v pixelech.
00145 */
00146 inline int TVideoDSFile::GetWidth(void) const
00147 {
00148         return m_width;
00149 }
00150 
00151 /** Sirka obrazu v pixelech.
00152 */
00153 inline int TVideoDSFile::GetHeight(void) const
00154 {
00155         return m_height;
00156 }
00157 
00158 // TVideoDSFile
00159 ////////////////////////////////////////////////////////////////////////////////
00160 ////////////////////////////////////////////////////////////////////////////////
00161 ////////////////////////////////////////////////////////////////////////////////
00162 
00163 }; //END of namespace NSCameras
00164 using namespace NSCameras;
00165 
00166 #endif

Generated on Sat Nov 17 16:23:33 2007 for Image Processing Pipeline - Camera Sources Implementation by  doxygen 1.4.6-NO