cinap_lenrekadd hg and python4bb9e2215 years agoHistory
966 lines · 20.5 KB · C
RawDownload
 	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