static void Video_device_dealloc(Video_device *self) { if(self->fd >= 0) { if(self->buffers) { Video_device_unmap(self); } v4l2_close(self->fd); } self->ob_type->tp_free((PyObject *)self); }
static PyObject *Video_device_close(Video_device *self) { if(self->fd >= 0) { if(self->buffers) { Video_device_unmap(self); } v4l2_close(self->fd); self->fd = -1; } Py_RETURN_NONE; }
static PyObject *Video_device_create_buffers(Video_device *self, PyObject *args) { int buffer_count; if(!PyArg_ParseTuple(args, "I", &buffer_count)) { return NULL; } ASSERT_OPEN; if(self->buffers) { PyErr_SetString(PyExc_ValueError, "Buffers are already created"); return NULL; } struct v4l2_requestbuffers reqbuf; reqbuf.count = buffer_count; reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; reqbuf.memory = V4L2_MEMORY_MMAP; if(my_ioctl(self->fd, VIDIOC_REQBUFS, &reqbuf)) { return NULL; } if(!reqbuf.count) { PyErr_SetString(PyExc_IOError, "Not enough buffer memory"); return NULL; } self->buffers = malloc(reqbuf.count * sizeof(struct buffer)); if(!self->buffers) { PyErr_NoMemory(); return NULL; } int i; for(i = 0; i < reqbuf.count; i++) { struct v4l2_buffer buffer; buffer.index = i; buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buffer.memory = V4L2_MEMORY_MMAP; if(my_ioctl(self->fd, VIDIOC_QUERYBUF, &buffer)) { return NULL; } self->buffers[i].length = buffer.length; self->buffers[i].start = v4l2_mmap(NULL, buffer.length, PROT_READ | PROT_WRITE, MAP_SHARED, self->fd, buffer.m.offset); if(self->buffers[i].start == MAP_FAILED) { PyErr_SetFromErrno(PyExc_IOError); Video_device_unmap(self); return NULL; } ++self->buffer_count; } Py_RETURN_NONE; }