Ejemplo n.º 1
0
        /// <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));
            }
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
 public static extern int ioctl(int fd, UInt64 request, ref v4l2_requestbuffers req);
Ejemplo n.º 5
0
 public static extern int ioctl(int fd, UInt64 request, ref v4l2_requestbuffers req);
Ejemplo n.º 6
0
 /// <summary>
 /// Calls VIDIOC_REQBUFS.
 /// </summary>
 public int RequestBuffers(ref v4l2_requestbuffers req)
 {
     return(ioctl(deviceHandle, v4l2_operation.RequestBuffers, ref req));
 }
Ejemplo n.º 7
0
 ioctl(int device, v4l2_operation request, ref v4l2_requestbuffers argp);