VideoTexture module.
[blender-staging.git] / source / gameengine / VideoTexture / VideoBase.cpp
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 WIN32
24 #define WINDOWS_LEAN_AND_MEAN
25 #include <Windows.h>
26 #endif
27
28 #include "VideoBase.h"
29
30 #include "FilterSource.h"
31
32 // VideoBase implementation
33
34
35 // initialize image data
36 void VideoBase::init(short width, short height)
37 {
38         // save original sizes
39         m_orgSize[0] = width;
40         m_orgSize[1] = height;
41         // call base class initialization
42         ImageBase::init(width, height);
43 }
44
45
46 // process video frame
47 void VideoBase::process (BYTE * sample)
48 {
49         // if scale was changed
50         if (m_scaleChange)
51                 // reset image
52                 init(m_orgSize[0], m_orgSize[1]);
53         // if image is allocated and is able to store new image
54         if (m_image != NULL && !m_avail)
55         {
56                 // filters used
57                 FilterRGB24 filtRGB;
58                 FilterYV12 filtYUV;
59                 // convert video format to image
60                 switch (m_format)
61                 {
62                 case RGB24:
63                         // use filter object for format to convert image
64                         filterImage(filtRGB, sample, m_orgSize);
65                         // finish
66                         break;
67                 case YV12:
68                         // use filter object for format to convert image
69                         filtYUV.setBuffs(sample, m_orgSize);
70                         filterImage(filtYUV, sample, m_orgSize);
71                         // finish
72                         break;
73                 }
74         }
75 }
76
77
78 // python functions
79
80
81 // exceptions for video source initialization
82 ExceptionID SourceVideoEmpty, SourceVideoCreation;
83 ExpDesc SourceVideoEmptyDesc (SourceVideoEmpty, "Source Video is empty");
84 ExpDesc SourceVideoCreationDesc (SourceVideoCreation, "SourceVideo object was not created");
85
86 // open video source
87 void Video_open (VideoBase * self, char * file, short captureID)
88 {
89         // if file is empty, throw exception
90         if (file == NULL) THRWEXCP(SourceVideoEmpty, S_OK);
91
92         // open video file or capture device
93         if (captureID >= 0) 
94                 self->openCam(file, captureID);
95         else 
96                 self->openFile(file);
97 }
98
99
100 // play video
101 PyObject * Video_play (PyImage * self)
102 { if (getVideo(self)->play()) Py_RETURN_TRUE; else Py_RETURN_FALSE; }
103
104 // stop video
105 PyObject * Video_stop (PyImage * self)
106 { if (getVideo(self)->stop()) Py_RETURN_TRUE; else Py_RETURN_FALSE; }
107
108 // get status
109 PyObject * Video_getStatus (PyImage * self, void * closure)
110 {
111         return Py_BuildValue("h", getVideo(self)->getStatus());
112 }
113
114 // refresh video
115 PyObject * Video_refresh (PyImage * self)
116 {
117         getVideo(self)->refresh();
118         return Video_getStatus(self, NULL);
119 }
120
121
122 // get range
123 PyObject * Video_getRange (PyImage * self, void * closure)
124 {
125         return Py_BuildValue("[ff]", getVideo(self)->getRange()[0],
126                 getVideo(self)->getRange()[1]);
127 }
128
129 // set range
130 int Video_setRange (PyImage * self, PyObject * value, void * closure)
131 {
132         // check validity of parameter
133         if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 2
134                 || !PyFloat_Check(PySequence_Fast_GET_ITEM(value, 0))
135                 || !PyFloat_Check(PySequence_Fast_GET_ITEM(value, 1)))
136         {
137                 PyErr_SetString(PyExc_TypeError, "The value must be a sequence of 2 longs");
138                 return -1;
139         }
140         // set range
141         getVideo(self)->setRange(PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 0)),
142                 PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 1)));
143         // success
144         return 0;
145 }
146
147 // get repeat
148 PyObject * Video_getRepeat (PyImage * self, void * closure)
149 { return Py_BuildValue("h", getVideo(self)->getRepeat()); }
150
151 // set repeat
152 int Video_setRepeat (PyImage * self, PyObject * value, void * closure)
153 {
154         // check validity of parameter
155         if (value == NULL || !PyInt_Check(value))
156         {
157                 PyErr_SetString(PyExc_TypeError, "The value must be an int");
158                 return -1;
159         }
160         // set repeat
161         getVideo(self)->setRepeat(int(PyInt_AsLong(value)));
162         // success
163         return 0;
164 }
165
166 // get frame rate
167 PyObject * Video_getFrameRate (PyImage * self, void * closure)
168 { return Py_BuildValue("f", double(getVideo(self)->getFrameRate())); }
169
170 // set frame rate
171 int Video_setFrameRate (PyImage * self, PyObject * value, void * closure)
172 {
173         // check validity of parameter
174         if (value == NULL || !PyFloat_Check(value))
175         {
176                 PyErr_SetString(PyExc_TypeError, "The value must be a float");
177                 return -1;
178         }
179         // set repeat
180         getVideo(self)->setFrameRate(float(PyFloat_AsDouble(value)));
181         // success
182         return 0;
183 }