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