VideoTexture: use PyObjectPlus.h instead of Python.h for compatibility with Python2.3
[blender.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 #if !defined VIDEOBASE_H
24 #define VIDEOBASE_H
25
26
27 #include <PyObjectPlus.h>
28
29 #include "ImageBase.h"
30
31 #include "Exception.h"
32
33 // source states
34 const int SourceError = -1;
35 const int SourceEmpty = 0;
36 const int SourceReady = 1;
37 const int SourcePlaying = 2;
38 const int SourceStopped = 3;
39
40
41 // video source formats
42 enum VideoFormat { None, RGB24, YV12 };
43
44
45 /// base class for video source
46 class VideoBase : public ImageBase
47 {
48 public:
49         /// constructor
50         VideoBase (void) : ImageBase(true), m_format(None), m_status(SourceEmpty),
51                 m_repeat(0), m_frameRate(1.0)
52         {
53                 m_orgSize[0] = m_orgSize[1] = 0;
54                 m_range[0] = m_range[1] = 0.0;
55         }
56
57         /// destructor
58         virtual ~VideoBase (void) {}
59
60         /// open video file
61         virtual void openFile (char * file)
62         {
63                 m_isFile = true;
64                 m_status = SourceReady;
65         }
66         /// open video capture device
67         virtual void openCam (char * file, short camIdx)
68         {
69                 m_isFile = false;
70                 m_status = SourceReady;
71         }
72
73         /// play video
74         virtual bool play (void)
75         {
76                 if (m_status == SourceReady || m_status == SourceStopped)
77                 {
78                         m_status = SourcePlaying;
79                         return true;
80                 }
81                 return false;
82         }
83         /// stop/pause video
84         virtual bool stop (void)
85         {
86                 if (m_status == SourcePlaying)
87                 {
88                         m_status = SourceStopped;
89                         return true;
90                 }
91                 return false;
92         }
93
94         // get video status
95         int getStatus (void) { return m_status; }
96
97         /// get play range
98         const double * getRange (void) { return m_range; }
99         /// set play range
100         virtual void setRange (double start, double stop)
101         {
102                 if (m_isFile)
103                 {
104                         m_range[0] = start;
105                         m_range[1] = stop;
106                 }
107         }
108
109         // get video repeat
110         int getRepeat (void) { return m_repeat; }
111         /// set video repeat
112         virtual void setRepeat (int rep)
113         { if (m_isFile) m_repeat = rep; }
114
115         /// get frame rate
116         float getFrameRate (void) { return m_frameRate; }
117         /// set frame rate
118         virtual void setFrameRate (float rate)
119         { if (m_isFile) m_frameRate = rate > 0.0 ? rate : 1.0f; }
120
121 protected:
122         /// video format
123         VideoFormat m_format;
124         /// original video size
125         short m_orgSize[2];
126
127         /// video status
128         int m_status;
129
130         /// is source file
131         bool m_isFile;
132
133         /// replay range
134         double m_range[2];
135         /// repeat count
136         int m_repeat;
137         /// frame rate
138         float m_frameRate;
139
140         /// initialize image data
141         void init (short width, short height);
142
143         /// process source data
144         void process (BYTE * sample);
145 };
146
147
148
149 // python fuctions
150
151
152 // cast Image pointer to Video
153 inline VideoBase * getVideo (PyImage * self)
154 { return static_cast<VideoBase*>(self->m_image); }
155
156
157 extern ExceptionID SourceVideoCreation;
158
159 // object initialization
160 template <class T> void Video_init (PyImage * self)
161 {
162         // create source video object
163         if (self->m_image != NULL) delete self->m_image;
164         HRESULT hRslt = S_OK;
165         self->m_image = new T(&hRslt);
166         CHCKHRSLT(hRslt, SourceVideoCreation);
167 }
168
169
170 // video functions
171 void Video_open (VideoBase * self, char * file, short captureID);
172 PyObject * Video_play (PyImage * self);
173 PyObject * Video_stop (PyImage * self);
174 PyObject * Video_refresh (PyImage * self);
175 PyObject * Video_getStatus (PyImage * self, void * closure);
176 PyObject * Video_getRange (PyImage * self, void * closure);
177 int Video_setRange (PyImage * self, PyObject * value, void * closure);
178 PyObject * Video_getRepeat (PyImage * self, void * closure);
179 int Video_setRepeat (PyImage * self, PyObject * value, void * closure);
180 PyObject * Video_getFrameRate (PyImage * self, void * closure);
181 int Video_setFrameRate (PyImage * self, PyObject * value, void * closure);
182
183
184 #endif
185