📄 svmodule.c
字号:
return sv_error();
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *
sv_WindowOffset(svobject *self, PyObject *args)
{
int x_offset;
int y_offset;
if (!PyArg_Parse(args, "(ii)", &x_offset, &y_offset))
return NULL;
if (svWindowOffset(self->ob_svideo, x_offset, y_offset))
return sv_error();
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *
sv_CaptureBurst(svobject *self, PyObject *args)
{
int bytes, i;
svCaptureInfo info;
void *bitvector = NULL;
PyObject *videodata = NULL;
PyObject *bitvecobj = NULL;
PyObject *res = NULL;
static PyObject *evenitem, *odditem;
if (!PyArg_Parse(args, "(iiiii)", &info.format,
&info.width, &info.height,
&info.size, &info.samplingrate))
return NULL;
switch (info.format) {
case SV_RGB8_FRAMES:
bitvector = malloc(SV_BITVEC_SIZE(info.size));
break;
case SV_YUV411_FRAMES_AND_BLANKING_BUFFER:
break;
default:
PyErr_SetString(SvError, "illegal format specified");
return NULL;
}
if (svQueryCaptureBufferSize(self->ob_svideo, &info, &bytes)) {
res = sv_error();
goto finally;
}
if (!(videodata = PyString_FromStringAndSize(NULL, bytes)))
goto finally;
/* XXX -- need to do something about the bitvector */
{
char* str = PyString_AsString(videodata);
if (!str)
goto finally;
if (svCaptureBurst(self->ob_svideo, &info, str, bitvector)) {
res = sv_error();
goto finally;
}
}
if (bitvector) {
if (evenitem == NULL) {
if (!(evenitem = PyInt_FromLong(0)))
goto finally;
}
if (odditem == NULL) {
if (!(odditem = PyInt_FromLong(1)))
goto finally;
}
if (!(bitvecobj = PyTuple_New(2 * info.size)))
goto finally;
for (i = 0; i < 2 * info.size; i++) {
int sts;
if (SV_GET_FIELD(bitvector, i) == SV_EVEN_FIELD) {
Py_INCREF(evenitem);
sts = PyTuple_SetItem(bitvecobj, i, evenitem);
} else {
Py_INCREF(odditem);
sts = PyTuple_SetItem(bitvecobj, i, odditem);
}
if (sts < 0)
goto finally;
}
} else {
bitvecobj = Py_None;
Py_INCREF(Py_None);
}
res = Py_BuildValue("((iiiii)OO)", info.format,
info.width, info.height,
info.size, info.samplingrate,
videodata, bitvecobj);
finally:
if (bitvector)
free(bitvector);
Py_XDECREF(videodata);
Py_XDECREF(bitvecobj);
return res;
}
static PyObject *
sv_CaptureOneFrame(svobject *self, PyObject *args)
{
svCaptureInfo info;
int format, width, height;
int bytes;
PyObject *videodata = NULL;
PyObject *res = NULL;
char *str;
if (!PyArg_Parse(args, "(iii)", &format, &width, &height))
return NULL;
info.format = format;
info.width = width;
info.height = height;
info.size = 0;
info.samplingrate = 0;
if (svQueryCaptureBufferSize(self->ob_svideo, &info, &bytes))
return sv_error();
if (!(videodata = PyString_FromStringAndSize(NULL, bytes)))
return NULL;
str = PyString_AsString(videodata);
if (!str)
goto finally;
if (svCaptureOneFrame(self->ob_svideo, format, &width, &height, str)) {
res = sv_error();
goto finally;
}
res = Py_BuildValue("(iiO)", width, height, videodata);
finally:
Py_XDECREF(videodata);
return res;
}
static PyObject *
sv_InitContinuousCapture(svobject *self, PyObject *args)
{
svCaptureInfo info;
if (!PyArg_Parse(args, "(iiiii)", &info.format,
&info.width, &info.height,
&info.size, &info.samplingrate))
return NULL;
if (svInitContinuousCapture(self->ob_svideo, &info))
return sv_error();
self->ob_info = info;
return Py_BuildValue("(iiiii)", info.format, info.width, info.height,
info.size, info.samplingrate);
}
static PyObject *
sv_LoadMap(svobject *self, PyObject *args)
{
PyObject *rgb;
PyObject *res = NULL;
rgb_tuple *mapp = NULL;
int maptype;
int i, j; /* indices */
if (!PyArg_Parse(args, "(iO)", &maptype, &rgb))
return NULL;
if (!PyList_Check(rgb) || PyList_Size(rgb) != 256) {
PyErr_BadArgument();
return NULL;
}
if (!(mapp = PyMem_NEW(rgb_tuple, 256)))
return PyErr_NoMemory();
for (i = 0; i < 256; i++) {
PyObject* v = PyList_GetItem(rgb, i);
if (!v)
goto finally;
if (!PyTuple_Check(v) || PyTuple_Size(v) != 3) {
PyErr_BadArgument();
goto finally;
}
for (j = 0; j < 3; j++) {
PyObject* cell = PyTuple_GetItem(v, j);
if (!cell)
goto finally;
if (!PyInt_Check(cell)) {
PyErr_BadArgument();
goto finally;
}
switch (j) {
case 0: mapp[i].red = PyInt_AsLong(cell); break;
case 1: mapp[i].blue = PyInt_AsLong(cell); break;
case 2: mapp[i].green = PyInt_AsLong(cell); break;
}
if (PyErr_Occurred())
goto finally;
}
}
if (svLoadMap(self->ob_svideo, maptype, mapp)) {
res = sv_error();
goto finally;
}
Py_INCREF(Py_None);
res = Py_None;
finally:
PyMem_DEL(mapp);
return res;
}
static PyObject *
sv_CloseVideo(svobject *self, PyObject *args)
{
if (!PyArg_Parse(args, ""))
return NULL;
if (svCloseVideo(self->ob_svideo))
return sv_error();
self->ob_svideo = NULL;
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *
doParams(svobject *self, PyObject *args,
int (*func)(SV_nodeP, long *, int), int modified)
{
PyObject *list;
PyObject *res = NULL;
long *PVbuffer = NULL;
long length;
int i;
if (!PyArg_Parse(args, "O", &list))
return NULL;
if (!PyList_Check(list)) {
PyErr_BadArgument();
return NULL;
}
if ((length = PyList_Size(list)) < 0)
return NULL;
PVbuffer = PyMem_NEW(long, length);
if (PVbuffer == NULL)
return PyErr_NoMemory();
for (i = 0; i < length; i++) {
PyObject *v = PyList_GetItem(list, i);
if (!v)
goto finally;
if (!PyInt_Check(v)) {
PyErr_BadArgument();
goto finally;
}
PVbuffer[i] = PyInt_AsLong(v);
/* can't just test the return value, because what if the
value was -1?!
*/
if (PVbuffer[i] == -1 && PyErr_Occurred())
goto finally;
}
if ((*func)(self->ob_svideo, PVbuffer, length)) {
res = sv_error();
goto finally;
}
if (modified) {
for (i = 0; i < length; i++) {
PyObject* v = PyInt_FromLong(PVbuffer[i]);
if (!v || PyList_SetItem(list, i, v) < 0)
goto finally;
}
}
Py_INCREF(Py_None);
res = Py_None;
finally:
PyMem_DEL(PVbuffer);
return res;
}
static PyObject *
sv_GetParam(PyObject *self, PyObject *args)
{
return doParams(self, args, svGetParam, 1);
}
static PyObject *
sv_GetParamRange(PyObject *self, PyObject *args)
{
return doParams(self, args, svGetParamRange, 1);
}
static PyObject *
sv_SetParam(PyObject *self, PyObject *args)
{
return doParams(self, args, svSetParam, 0);
}
static PyMethodDef svideo_methods[] = {
{"BindGLWindow", (PyCFunction)sv_BindGLWindow},
{"EndContinuousCapture",(PyCFunction)sv_EndContinuousCapture},
{"IsVideoDisplayed", (PyCFunction)sv_IsVideoDisplayed},
{"OutputOffset", (PyCFunction)sv_OutputOffset},
{"PutFrame", (PyCFunction)sv_PutFrame},
{"QuerySize", (PyCFunction)sv_QuerySize},
{"SetSize", (PyCFunction)sv_SetSize},
{"SetStdDefaults", (PyCFunction)sv_SetStdDefaults},
{"UseExclusive", (PyCFunction)sv_UseExclusive},
{"WindowOffset", (PyCFunction)sv_WindowOffset},
{"InitContinuousCapture",(PyCFunction)sv_InitContinuousCapture},
{"CaptureBurst", (PyCFunction)sv_CaptureBurst},
{"CaptureOneFrame", (PyCFunction)sv_CaptureOneFrame},
{"GetCaptureData", (PyCFunction)sv_GetCaptureData},
{"CloseVideo", (PyCFunction)sv_CloseVideo},
{"LoadMap", (PyCFunction)sv_LoadMap},
{"GetParam", (PyCFunction)sv_GetParam},
{"GetParamRange", (PyCFunction)sv_GetParamRange},
{"SetParam", (PyCFunction)sv_SetParam},
{NULL, NULL} /* sentinel */
};
static PyObject *
sv_conversion(PyObject *self, PyObject *args, void (*function)(),
int inputfactor, float factor)
{
int invert, width, height, inputlength;
char *input, *str;
PyObject *output;
if (!PyArg_Parse(args, "(is#ii)", &invert,
&input, &inputlength, &width, &height))
return NULL;
if (width * height * inputfactor > inputlength) {
PyErr_SetString(SvError, "input buffer not long enough");
return NULL;
}
if (!(output = PyString_FromStringAndSize(NULL,
(int)(width * height * factor))))
return NULL;
str = PyString_AsString(output);
if (!str) {
Py_DECREF(output);
return NULL;
}
(*function)(invert, input, str, width, height);
return output;
}
static PyObject *
sv_InterleaveFields(PyObject *self, PyObject *args)
{
return sv_conversion(self, args, svInterleaveFields, 1, 1.0);
}
static PyObject *
sv_RGB8toRGB32(PyObject *self, PyObject *args)
{
return sv_conversion(self, args, svRGB8toRGB32, 1, (float) sizeof(long));
}
static PyObject *
sv_YUVtoRGB(PyObject *self, PyObject *args)
{
return sv_conversion(self, args, svYUVtoRGB, 2, (float) sizeof(long));
}
static void
svideo_dealloc(svobject *self)
{
if (self->ob_svideo != NULL)
(void) svCloseVideo(self->ob_svideo);
PyObject_Del(self);
}
static PyObject *
svideo_getattr(svobject *self, char *name)
{
return Py_FindMethod(svideo_methods, (PyObject *)self, name);
}
PyTypeObject Svtype = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*ob_size*/
"sv.sv", /*tp_name*/
sizeof(svobject), /*tp_size*/
0, /*tp_itemsize*/
/* methods */
(destructor)svideo_dealloc, /*tp_dealloc*/
0, /*tp_print*/
(getattrfunc)svideo_getattr, /*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
};
static PyObject *
newsvobject(SV_nodeP svp)
{
svobject *p;
p = PyObject_New(svobject, &Svtype);
if (p == NULL)
return NULL;
p->ob_svideo = svp;
p->ob_info.format = 0;
p->ob_info.size = 0;
p->ob_info.width = 0;
p->ob_info.height = 0;
p->ob_info.samplingrate = 0;
return (PyObject *) p;
}
static PyObject *
sv_OpenVideo(PyObject *self, PyObject *args)
{
SV_nodeP svp;
if (!PyArg_Parse(args, ""))
return NULL;
svp = svOpenVideo();
if (svp == NULL)
return sv_error();
return newsvobject(svp);
}
static PyMethodDef sv_methods[] = {
{"InterleaveFields", (PyCFunction)sv_InterleaveFields},
{"RGB8toRGB32", (PyCFunction)sv_RGB8toRGB32},
{"YUVtoRGB", (PyCFunction)sv_YUVtoRGB},
{"OpenVideo", (PyCFunction)sv_OpenVideo},
{NULL, NULL} /* Sentinel */
};
void
initsv(void)
{
PyObject *m, *d;
m = Py_InitModule("sv", sv_methods);
d = PyModule_GetDict(m);
SvError = PyErr_NewException("sv.error", NULL, NULL);
if (SvError == NULL || PyDict_SetItemString(d, "error", SvError) != 0)
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -