00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <windows.h>
00012 #include <dshow.h>
00013 #include <streams.h>
00014 #include <dvdmedia.h>
00015
00016
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
00033
00034
00035
00036 struct __declspec( uuid("{0F53C699-B463-4c12-AAD1-FEB0A3EA1E40}") ) CLSID_Sampler;
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
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
00087
00088 CCritSec m_cs; ///< kriticka sekce pro pristup k M_READ1
00089 };
00090
00091
00092
00093 inline int TDSSampler::GetWidth(void) const
00094 {
00095 return m_rgb_width;
00096 }
00097
00098
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
00112
00113
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
00145
00146 inline int TVideoDSFile::GetWidth(void) const
00147 {
00148 return m_width;
00149 }
00150
00151
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