/// <summary> /// Queries the device for information about each requested buffer. /// </summary> /// <param name="req">Struct with information about the request buffers.</param> private void fetchBuffers(v4l2_requestbuffers req) { for (uint i = 0; i < req.count; i++) { v4l2_buffer buffer = new v4l2_buffer(); buffer.index = i; buffer.type = req.type; buffer.memory = req.memory; if (ioControl.QueryBuffer(ref buffer) < 0) { throw new Exception("VIDIOC_QUERYBUF"); } buffers.Add(new Analog.Buffer(this, buffer)); } }
/// <summary> /// Requests a given number of buffers for mmap data transfer. /// </summary> private void requestBuffers() { v4l2_requestbuffers req = new v4l2_requestbuffers(); req.count = bufferCount; req.type = v4l2_buf_type.VideoCapture; req.memory = v4l2_memory.MemoryMapping; if (ioControl.RequestBuffers(ref req) < 0) { throw new Exception("VIDIOC_REQBUFS"); } if (req.count < bufferCount) { throw new Exception("VIDIOC_REQBUFS [count]"); } fetchBuffers(req); }
private unsafe V4l2FrameBuffer[] ApplyFrameBuffers() { // Apply for buffers, use memory mapping v4l2_requestbuffers req = new v4l2_requestbuffers { count = BufferCount, type = v4l2_buf_type.V4L2_BUF_TYPE_VIDEO_CAPTURE, memory = v4l2_memory.V4L2_MEMORY_MMAP }; V4l2Struct(VideoSettings.VIDIOC_REQBUFS, ref req); // Mapping the applied buffer to user space V4l2FrameBuffer[] buffers = new V4l2FrameBuffer[BufferCount]; for (uint i = 0; i < BufferCount; i++) { v4l2_buffer buffer = new v4l2_buffer { index = i, type = v4l2_buf_type.V4L2_BUF_TYPE_VIDEO_CAPTURE, memory = v4l2_memory.V4L2_MEMORY_MMAP }; V4l2Struct(VideoSettings.VIDIOC_QUERYBUF, ref buffer); buffers[i].Length = buffer.length; buffers[i].Start = Interop.mmap(IntPtr.Zero, (int)buffer.length, MemoryMappedProtections.PROT_READ | MemoryMappedProtections.PROT_WRITE, MemoryMappedFlags.MAP_SHARED, _deviceFileDescriptor, (int)buffer.m.offset); } // Put the buffer in the processing queue for (uint i = 0; i < BufferCount; i++) { v4l2_buffer buffer = new v4l2_buffer { index = i, type = v4l2_buf_type.V4L2_BUF_TYPE_VIDEO_CAPTURE, memory = v4l2_memory.V4L2_MEMORY_MMAP }; V4l2Struct(VideoSettings.VIDIOC_QBUF, ref buffer); } return(buffers); }
public static extern int ioctl(int fd, UInt64 request, ref v4l2_requestbuffers req);
/// <summary> /// Calls VIDIOC_REQBUFS. /// </summary> public int RequestBuffers(ref v4l2_requestbuffers req) { return(ioctl(deviceHandle, v4l2_operation.RequestBuffers, ref req)); }
ioctl(int device, v4l2_operation request, ref v4l2_requestbuffers argp);