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