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, METH_OLDARGS}, {"EndContinuousCapture",(PyCFunction)sv_EndContinuousCapture, METH_OLDARGS}, {"IsVideoDisplayed", (PyCFunction)sv_IsVideoDisplayed, METH_OLDARGS}, {"OutputOffset", (PyCFunction)sv_OutputOffset, METH_OLDARGS}, {"PutFrame", (PyCFunction)sv_PutFrame, METH_OLDARGS}, {"QuerySize", (PyCFunction)sv_QuerySize, METH_OLDARGS}, {"SetSize", (PyCFunction)sv_SetSize, METH_OLDARGS}, {"SetStdDefaults", (PyCFunction)sv_SetStdDefaults, METH_OLDARGS}, {"UseExclusive", (PyCFunction)sv_UseExclusive, METH_OLDARGS}, {"WindowOffset", (PyCFunction)sv_WindowOffset, METH_OLDARGS}, {"InitContinuousCapture",(PyCFunction)sv_InitContinuousCapture, METH_OLDARGS}, {"CaptureBurst", (PyCFunction)sv_CaptureBurst, METH_OLDARGS}, {"CaptureOneFrame", (PyCFunction)sv_CaptureOneFrame, METH_OLDARGS}, {"GetCaptureData", (PyCFunction)sv_GetCaptureData, METH_OLDARGS}, {"CloseVideo", (PyCFunction)sv_CloseVideo, METH_OLDARGS}, {"LoadMap", (PyCFunction)sv_LoadMap, METH_OLDARGS}, {"GetParam", (PyCFunction)sv_GetParam, METH_OLDARGS}, {"GetParamRange", (PyCFunction)sv_GetParamRange, METH_OLDARGS}, {"SetParam", (PyCFunction)sv_SetParam, METH_OLDARGS}, {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 voidsvideo_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, METH_OLDARGS}, {"RGB8toRGB32", (PyCFunction)sv_RGB8toRGB32, METH_OLDARGS}, {"YUVtoRGB", (PyCFunction)sv_YUVtoRGB, METH_OLDARGS}, {"OpenVideo", (PyCFunction)sv_OpenVideo, METH_OLDARGS}, {NULL, NULL} /* Sentinel */}; voidinitsv(void){ PyObject *m, *d; m = Py_InitModule("sv", sv_methods); if (m == NULL) return; d = PyModule_GetDict(m); SvError = PyErr_NewException("sv.error", NULL, NULL); if (SvError == NULL || PyDict_SetItemString(d, "error", SvError) != 0) return;}Lines 501–966 of 966. Previous lines
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, METH_OLDARGS}, {"EndContinuousCapture",(PyCFunction)sv_EndContinuousCapture, METH_OLDARGS}, {"IsVideoDisplayed", (PyCFunction)sv_IsVideoDisplayed, METH_OLDARGS}, {"OutputOffset", (PyCFunction)sv_OutputOffset, METH_OLDARGS}, {"PutFrame", (PyCFunction)sv_PutFrame, METH_OLDARGS}, {"QuerySize", (PyCFunction)sv_QuerySize, METH_OLDARGS}, {"SetSize", (PyCFunction)sv_SetSize, METH_OLDARGS}, {"SetStdDefaults", (PyCFunction)sv_SetStdDefaults, METH_OLDARGS}, {"UseExclusive", (PyCFunction)sv_UseExclusive, METH_OLDARGS}, {"WindowOffset", (PyCFunction)sv_WindowOffset, METH_OLDARGS}, {"InitContinuousCapture",(PyCFunction)sv_InitContinuousCapture, METH_OLDARGS}, {"CaptureBurst", (PyCFunction)sv_CaptureBurst, METH_OLDARGS}, {"CaptureOneFrame", (PyCFunction)sv_CaptureOneFrame, METH_OLDARGS}, {"GetCaptureData", (PyCFunction)sv_GetCaptureData, METH_OLDARGS}, {"CloseVideo", (PyCFunction)sv_CloseVideo, METH_OLDARGS}, {"LoadMap", (PyCFunction)sv_LoadMap, METH_OLDARGS}, {"GetParam", (PyCFunction)sv_GetParam, METH_OLDARGS}, {"GetParamRange", (PyCFunction)sv_GetParamRange, METH_OLDARGS}, {"SetParam", (PyCFunction)sv_SetParam, METH_OLDARGS}, {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, METH_OLDARGS}, {"RGB8toRGB32", (PyCFunction)sv_RGB8toRGB32, METH_OLDARGS}, {"YUVtoRGB", (PyCFunction)sv_YUVtoRGB, METH_OLDARGS}, {"OpenVideo", (PyCFunction)sv_OpenVideo, METH_OLDARGS}, {NULL, NULL} /* Sentinel */ }; void initsv(void) { PyObject *m, *d; m = Py_InitModule("sv", sv_methods); if (m == NULL) return; d = PyModule_GetDict(m); SvError = PyErr_NewException("sv.error", NULL, NULL); if (SvError == NULL || PyDict_SetItemString(d, "error", SvError) != 0) return; }