forked from bartvdbraak/blender
208 lines
4.6 KiB
C++
208 lines
4.6 KiB
C++
/*
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* Copyright (c) 2007 The Zdeno Ash Miklas
|
|
*
|
|
* This source file is part of VideoTexture library
|
|
*
|
|
* Contributor(s):
|
|
*
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
*/
|
|
|
|
/** \file VideoBase.h
|
|
* \ingroup bgevideotex
|
|
*/
|
|
|
|
#ifndef __VIDEOBASE_H__
|
|
#define __VIDEOBASE_H__
|
|
|
|
|
|
#include "PyObjectPlus.h"
|
|
|
|
#include "ImageBase.h"
|
|
|
|
#include "Exception.h"
|
|
|
|
// source states
|
|
const int SourceError = -1;
|
|
const int SourceEmpty = 0;
|
|
const int SourceReady = 1;
|
|
const int SourcePlaying = 2;
|
|
const int SourceStopped = 3;
|
|
|
|
|
|
// video source formats
|
|
enum VideoFormat { None, RGB24, YV12, RGBA32 };
|
|
|
|
|
|
/// base class for video source
|
|
class VideoBase : public ImageBase
|
|
{
|
|
public:
|
|
/// constructor
|
|
VideoBase (void) : ImageBase(true), m_format(None), m_status(SourceEmpty),
|
|
m_repeat(0), m_frameRate(1.0)
|
|
{
|
|
m_orgSize[0] = m_orgSize[1] = 0;
|
|
m_range[0] = m_range[1] = 0.0;
|
|
}
|
|
|
|
/// destructor
|
|
virtual ~VideoBase (void) {}
|
|
|
|
/// open video file
|
|
virtual void openFile(char *file)
|
|
{
|
|
m_isFile = true;
|
|
m_status = SourceReady;
|
|
}
|
|
/// open video capture device
|
|
virtual void openCam(char *file, short camIdx)
|
|
{
|
|
m_isFile = false;
|
|
m_status = SourceReady;
|
|
}
|
|
|
|
/// play video
|
|
virtual bool play (void)
|
|
{
|
|
if (m_status == SourceReady || m_status == SourceStopped)
|
|
{
|
|
m_status = SourcePlaying;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
/// pause video
|
|
virtual bool pause (void)
|
|
{
|
|
if (m_status == SourcePlaying)
|
|
{
|
|
m_status = SourceStopped;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
/// stop video
|
|
virtual bool stop (void)
|
|
{
|
|
if (m_status == SourcePlaying)
|
|
{
|
|
m_status = SourceStopped;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// get video status
|
|
int getStatus (void) { return m_status; }
|
|
|
|
/// get play range
|
|
const double * getRange (void) { return m_range; }
|
|
/// set play range
|
|
virtual void setRange (double start, double stop)
|
|
{
|
|
if (m_isFile)
|
|
{
|
|
m_range[0] = start;
|
|
m_range[1] = stop;
|
|
}
|
|
}
|
|
|
|
// get video repeat
|
|
int getRepeat (void) { return m_repeat; }
|
|
/// set video repeat
|
|
virtual void setRepeat (int rep)
|
|
{ if (m_isFile) m_repeat = rep; }
|
|
|
|
/// get frame rate
|
|
float getFrameRate (void) { return m_frameRate; }
|
|
/// set frame rate
|
|
virtual void setFrameRate (float rate)
|
|
{ if (m_isFile) m_frameRate = rate > 0.0f ? rate : 1.0f; }
|
|
|
|
protected:
|
|
/// video format
|
|
VideoFormat m_format;
|
|
/// original video size
|
|
short m_orgSize[2];
|
|
|
|
/// video status
|
|
int m_status;
|
|
|
|
/// is source file
|
|
bool m_isFile;
|
|
|
|
/// replay range
|
|
double m_range[2];
|
|
/// repeat count
|
|
int m_repeat;
|
|
/// frame rate
|
|
float m_frameRate;
|
|
|
|
/// initialize image data
|
|
void init (short width, short height);
|
|
|
|
/// process source data
|
|
void process (BYTE * sample);
|
|
};
|
|
|
|
|
|
|
|
// python fuctions
|
|
|
|
|
|
// cast Image pointer to Video
|
|
inline VideoBase *getVideo(PyImage *self)
|
|
{ return static_cast<VideoBase*>(self->m_image); }
|
|
|
|
|
|
extern ExceptionID SourceVideoCreation;
|
|
|
|
// object initialization
|
|
template <class T> void Video_init(PyImage *self)
|
|
{
|
|
// create source video object
|
|
if (self->m_image != NULL) delete self->m_image;
|
|
HRESULT hRslt = S_OK;
|
|
self->m_image = new T(&hRslt);
|
|
CHCKHRSLT(hRslt, SourceVideoCreation);
|
|
}
|
|
|
|
|
|
// video functions
|
|
void Video_open(VideoBase *self, char *file, short captureID);
|
|
PyObject *Video_play(PyImage *self);
|
|
PyObject *Video_pause(PyImage *self);
|
|
PyObject *Video_stop(PyImage *self);
|
|
PyObject *Video_refresh(PyImage *self);
|
|
PyObject *Video_getStatus(PyImage *self, void *closure);
|
|
PyObject *Video_getRange(PyImage *self, void *closure);
|
|
int Video_setRange(PyImage *self, PyObject *value, void *closure);
|
|
PyObject *Video_getRepeat(PyImage *self, void *closure);
|
|
int Video_setRepeat(PyImage *self, PyObject *value, void *closure);
|
|
PyObject *Video_getFrameRate(PyImage *self, void *closure);
|
|
int Video_setFrameRate(PyImage *self, PyObject *value, void *closure);
|
|
|
|
/* py api */
|
|
extern PyTypeObject ImageRenderType;
|
|
extern PyTypeObject ImageMirrorType;
|
|
extern PyTypeObject ImageViewportType;
|
|
|
|
#endif /* __VIDEOBASE_H__ */
|