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

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