doxygen: bge scenegraph and videotexture
[blender-staging.git] / source / gameengine / VideoTexture / VideoBase.h
1 /* $Id$
2 -----------------------------------------------------------------------------
3 This source file is part of VideoTexture library
4
5 Copyright (c) 2007 The Zdeno Ash Miklas
6
7 This program is free software; you can redistribute it and/or modify it under
8 the terms of the GNU Lesser General Public License as published by the Free Software
9 Foundation; either version 2 of the License, or (at your option) any later
10 version.
11
12 This program is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License along with
17 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
18 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
19 http://www.gnu.org/copyleft/lesser.txt.
20 -----------------------------------------------------------------------------
21 */
22
23 /** \file VideoBase.h
24  *  \ingroup bgevideotex
25  */
26  
27 #if !defined VIDEOBASE_H
28 #define VIDEOBASE_H
29
30
31 #include <PyObjectPlus.h>
32
33 #include "ImageBase.h"
34
35 #include "Exception.h"
36
37 // source states
38 const int SourceError = -1;
39 const int SourceEmpty = 0;
40 const int SourceReady = 1;
41 const int SourcePlaying = 2;
42 const int SourceStopped = 3;
43
44
45 // video source formats
46 enum VideoFormat { None, RGB24, YV12, RGBA32 };
47
48
49 /// base class for video source
50 class VideoBase : public ImageBase
51 {
52 public:
53         /// constructor
54         VideoBase (void) : ImageBase(true), m_format(None), m_status(SourceEmpty),
55                 m_repeat(0), m_frameRate(1.0)
56         {
57                 m_orgSize[0] = m_orgSize[1] = 0;
58                 m_range[0] = m_range[1] = 0.0;
59         }
60
61         /// destructor
62         virtual ~VideoBase (void) {}
63
64         /// open video file
65         virtual void openFile (char * file)
66         {
67                 m_isFile = true;
68                 m_status = SourceReady;
69         }
70         /// open video capture device
71         virtual void openCam (char * file, short camIdx)
72         {
73                 m_isFile = false;
74                 m_status = SourceReady;
75         }
76
77         /// play video
78         virtual bool play (void)
79         {
80                 if (m_status == SourceReady || m_status == SourceStopped)
81                 {
82                         m_status = SourcePlaying;
83                         return true;
84                 }
85                 return false;
86         }
87         /// pause video
88         virtual bool pause (void)
89         {
90                 if (m_status == SourcePlaying)
91                 {
92                         m_status = SourceStopped;
93                         return true;
94                 }
95                 return false;
96         }
97         /// stop video
98         virtual bool stop (void)
99         {
100                 if (m_status == SourcePlaying)
101                 {
102                         m_status = SourceStopped;
103                         return true;
104                 }
105                 return false;
106         }
107
108         // get video status
109         int getStatus (void) { return m_status; }
110
111         /// get play range
112         const double * getRange (void) { return m_range; }
113         /// set play range
114         virtual void setRange (double start, double stop)
115         {
116                 if (m_isFile)
117                 {
118                         m_range[0] = start;
119                         m_range[1] = stop;
120                 }
121         }
122
123         // get video repeat
124         int getRepeat (void) { return m_repeat; }
125         /// set video repeat
126         virtual void setRepeat (int rep)
127         { if (m_isFile) m_repeat = rep; }
128
129         /// get frame rate
130         float getFrameRate (void) { return m_frameRate; }
131         /// set frame rate
132         virtual void setFrameRate (float rate)
133         { if (m_isFile) m_frameRate = rate > 0.0 ? rate : 1.0f; }
134
135 protected:
136         /// video format
137         VideoFormat m_format;
138         /// original video size
139         short m_orgSize[2];
140
141         /// video status
142         int m_status;
143
144         /// is source file
145         bool m_isFile;
146
147         /// replay range
148         double m_range[2];
149         /// repeat count
150         int m_repeat;
151         /// frame rate
152         float m_frameRate;
153
154         /// initialize image data
155         void init (short width, short height);
156
157         /// process source data
158         void process (BYTE * sample);
159 };
160
161
162
163 // python fuctions
164
165
166 // cast Image pointer to Video
167 inline VideoBase * getVideo (PyImage * self)
168 { return static_cast<VideoBase*>(self->m_image); }
169
170
171 extern ExceptionID SourceVideoCreation;
172
173 // object initialization
174 template <class T> void Video_init (PyImage * self)
175 {
176         // create source video object
177         if (self->m_image != NULL) delete self->m_image;
178         HRESULT hRslt = S_OK;
179         self->m_image = new T(&hRslt);
180         CHCKHRSLT(hRslt, SourceVideoCreation);
181 }
182
183
184 // video functions
185 void Video_open (VideoBase * self, char * file, short captureID);
186 PyObject * Video_play (PyImage * self);
187 PyObject * Video_pause (PyImage * self);
188 PyObject * Video_stop (PyImage * self);
189 PyObject * Video_refresh (PyImage * self);
190 PyObject * Video_getStatus (PyImage * self, void * closure);
191 PyObject * Video_getRange (PyImage * self, void * closure);
192 int Video_setRange (PyImage * self, PyObject * value, void * closure);
193 PyObject * Video_getRepeat (PyImage * self, void * closure);
194 int Video_setRepeat (PyImage * self, PyObject * value, void * closure);
195 PyObject * Video_getFrameRate (PyImage * self, void * closure);
196 int Video_setFrameRate (PyImage * self, PyObject * value, void * closure);
197
198
199 #endif
200