4cf913d755d3606788fd2b3c48a07eeba0dd89eb
[blender.git] / source / gameengine / VideoTexture / VideoBase.h
1 /*
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 #ifndef __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.0f ? 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