diff --git a/device/hw/buffer.c b/device/hw/buffer.c index a880510..1218e49 100644 --- a/device/hw/buffer.c +++ b/device/hw/buffer.c @@ -14,10 +14,10 @@ buffer_t *buffer_open(const char *name, buffer_list_t *buf_list, int index) { buf->mmap_reflinks = 1; buf->used = 0; - buf->v4l2_buffer.type = buf_list->type; + buf->v4l2_buffer.type = buf_list->v4l2.type; buf->v4l2_buffer.index = index; - if (buf_list->do_mplanes) { + if (buf_list->v4l2.do_mplanes) { buf->v4l2_buffer.length = 1; buf->v4l2_buffer.m.planes = &buf->v4l2_plane; buf->v4l2_plane.data_offset = 0; @@ -31,7 +31,7 @@ buffer_t *buffer_open(const char *name, buffer_list_t *buf_list, int index) { E_XIOCTL(buf_list, dev->fd, VIDIOC_QUERYBUF, &buf->v4l2_buffer, "Cannot query buffer %d", index); - if (buf_list->do_mplanes) { + if (buf_list->v4l2.do_mplanes) { buf->offset = buf->v4l2_plane.m.mem_offset; buf->length = buf->v4l2_plane.length; } else { @@ -48,7 +48,7 @@ buffer_t *buffer_open(const char *name, buffer_list_t *buf_list, int index) { if (buf_list->do_dma) { struct v4l2_exportbuffer v4l2_exp = {0}; - v4l2_exp.type = buf_list->type; + v4l2_exp.type = buf_list->v4l2.type; v4l2_exp.index = index; v4l2_exp.plane = 0; E_XIOCTL(buf_list, dev->fd, VIDIOC_EXPBUF, &v4l2_exp, "Can't export queue buffer=%u to DMA", index); diff --git a/device/hw/buffer_list.c b/device/hw/buffer_list.c index fff99fa..3c4f758 100644 --- a/device/hw/buffer_list.c +++ b/device/hw/buffer_list.c @@ -9,7 +9,7 @@ buffer_list_t *buffer_list_open(const char *name, struct device_s *dev, unsigned buf_list->device = dev; buf_list->name = strdup(name); - buf_list->type = type; + buf_list->v4l2.type = type; switch(type) { case V4L2_BUF_TYPE_VIDEO_OUTPUT: @@ -20,7 +20,7 @@ buffer_list_t *buffer_list_open(const char *name, struct device_s *dev, unsigned case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: buf_list->do_mmap = do_mmap; buf_list->do_dma = do_mmap; - buf_list->do_mplanes = true; + buf_list->v4l2.do_mplanes = true; break; case V4L2_BUF_TYPE_VIDEO_CAPTURE: @@ -32,7 +32,7 @@ buffer_list_t *buffer_list_open(const char *name, struct device_s *dev, unsigned case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: buf_list->do_dma = do_mmap; buf_list->do_mmap = do_mmap; - buf_list->do_mplanes = true; + buf_list->v4l2.do_mplanes = true; buf_list->do_capture = true; break; @@ -69,9 +69,9 @@ void buffer_list_close(buffer_list_t *buf_list) int buffer_list_set_format(buffer_list_t *buf_list, unsigned width, unsigned height, unsigned format, unsigned bytesperline) { - struct v4l2_format *fmt = &buf_list->v4l2_format; + struct v4l2_format fmt = { 0 }; - fmt->type = buf_list->type; + fmt.type = buf_list->v4l2.type; unsigned orig_width = width; unsigned orig_height = height; @@ -91,46 +91,46 @@ retry: } E_LOG_DEBUG(buf_list, "Get current format ..."); - E_XIOCTL(buf_list, buf_list->device->fd, VIDIOC_G_FMT, fmt, "Can't set format"); + E_XIOCTL(buf_list, buf_list->device->fd, VIDIOC_G_FMT, &fmt, "Can't set format"); - if (buf_list->do_mplanes) { - fmt->fmt.pix_mp.colorspace = V4L2_COLORSPACE_JPEG; + if (buf_list->v4l2.do_mplanes) { + fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_JPEG; if (width) - fmt->fmt.pix_mp.width = width; + fmt.fmt.pix_mp.width = width; if (height) - fmt->fmt.pix_mp.height = height; + fmt.fmt.pix_mp.height = height; if (format) - fmt->fmt.pix_mp.pixelformat = format; - fmt->fmt.pix_mp.field = V4L2_FIELD_ANY; - fmt->fmt.pix_mp.num_planes = 1; - fmt->fmt.pix_mp.plane_fmt[0].bytesperline = bytesperline; - //fmt->fmt.pix_mp.plane_fmt[0].sizeimage = bytesperline * orig_height; + fmt.fmt.pix_mp.pixelformat = format; + fmt.fmt.pix_mp.field = V4L2_FIELD_ANY; + fmt.fmt.pix_mp.num_planes = 1; + fmt.fmt.pix_mp.plane_fmt[0].bytesperline = bytesperline; + //fmt.fmt.pix_mp.plane_fmt[0].sizeimage = bytesperline * orig_height; } else { - fmt->fmt.pix.colorspace = V4L2_COLORSPACE_RAW; + fmt.fmt.pix.colorspace = V4L2_COLORSPACE_RAW; if (width) - fmt->fmt.pix.width = width; + fmt.fmt.pix.width = width; if (height) - fmt->fmt.pix.height = height; + fmt.fmt.pix.height = height; if (format) - fmt->fmt.pix.pixelformat = format; - fmt->fmt.pix.field = V4L2_FIELD_ANY; - fmt->fmt.pix.bytesperline = bytesperline; - //fmt->fmt.pix.sizeimage = bytesperline * orig_height; + fmt.fmt.pix.pixelformat = format; + fmt.fmt.pix.field = V4L2_FIELD_ANY; + fmt.fmt.pix.bytesperline = bytesperline; + //fmt.fmt.pix.sizeimage = bytesperline * orig_height; } E_LOG_DEBUG(buf_list, "Configuring format (%s)...", fourcc_to_string(format).buf); - E_XIOCTL(buf_list, buf_list->device->fd, VIDIOC_S_FMT, fmt, "Can't set format"); + E_XIOCTL(buf_list, buf_list->device->fd, VIDIOC_S_FMT, &fmt, "Can't set format"); - if (buf_list->do_mplanes) { - buf_list->fmt_width = fmt->fmt.pix_mp.width; - buf_list->fmt_height = fmt->fmt.pix_mp.height; - buf_list->fmt_format = fmt->fmt.pix_mp.pixelformat; - buf_list->fmt_bytesperline = fmt->fmt.pix_mp.plane_fmt[0].bytesperline; + if (buf_list->v4l2.do_mplanes) { + buf_list->fmt_width = fmt.fmt.pix_mp.width; + buf_list->fmt_height = fmt.fmt.pix_mp.height; + buf_list->fmt_format = fmt.fmt.pix_mp.pixelformat; + buf_list->fmt_bytesperline = fmt.fmt.pix_mp.plane_fmt[0].bytesperline; } else { - buf_list->fmt_width = fmt->fmt.pix.width; - buf_list->fmt_height = fmt->fmt.pix.height; - buf_list->fmt_format = fmt->fmt.pix.pixelformat; - buf_list->fmt_bytesperline = fmt->fmt.pix.bytesperline; + buf_list->fmt_width = fmt.fmt.pix.width; + buf_list->fmt_height = fmt.fmt.pix.height; + buf_list->fmt_format = fmt.fmt.pix.pixelformat; + buf_list->fmt_bytesperline = fmt.fmt.pix.bytesperline; } if (bytesperline > 0 && buf_list->fmt_bytesperline != bytesperline) { @@ -173,7 +173,7 @@ int buffer_list_set_buffers(buffer_list_t *buf_list, int nbufs) { struct v4l2_requestbuffers v4l2_req = {0}; v4l2_req.count = nbufs; - v4l2_req.type = buf_list->type; + v4l2_req.type = buf_list->v4l2.type; v4l2_req.memory = buf_list->do_mmap ? V4L2_MEMORY_MMAP : V4L2_MEMORY_DMABUF; E_LOG_DEBUG(buf_list, "Requesting %u buffers", v4l2_req.count); @@ -216,7 +216,7 @@ int buffer_list_set_stream(buffer_list_t *buf_list, bool do_on) return 0; } - enum v4l2_buf_type type = buf_list->type; + enum v4l2_buf_type type = buf_list->v4l2.type; E_XIOCTL(buf_list, buf_list->device->fd, do_on ? VIDIOC_STREAMON : VIDIOC_STREAMOFF, &type, "Cannot set streaming state"); buf_list->streaming = do_on; @@ -239,9 +239,9 @@ int buffer_list_refresh_states(buffer_list_t *buf_list) struct v4l2_buffer v4l2_buf = {0}; struct v4l2_plane v4l2_plane = {0}; - v4l2_buf.type = buf_list->type; + v4l2_buf.type = buf_list->v4l2.type; - if (buf_list->do_mplanes) { + if (buf_list->v4l2.do_mplanes) { v4l2_buf.length = 1; v4l2_buf.m.planes = &v4l2_plane; } @@ -257,7 +257,7 @@ int buffer_list_refresh_states(buffer_list_t *buf_list) E_XIOCTL(buf_list, buf_list->device->fd, VIDIOC_QUERYBUF, &v4l2_buf, "Can't query buffer (flags=%08x)", i); E_LOG_INFO(buf_list, "Buffer: %d, Flags: %08x. Offset: %d", i, v4l2_buf.flags, - buf_list->do_mplanes ? v4l2_plane.m.mem_offset : v4l2_buf.m.offset); + buf_list->v4l2.do_mplanes ? v4l2_plane.m.mem_offset : v4l2_buf.m.offset); } error: diff --git a/device/hw/buffer_list.h b/device/hw/buffer_list.h index 109c9af..c9da521 100644 --- a/device/hw/buffer_list.h +++ b/device/hw/buffer_list.h @@ -13,19 +13,18 @@ typedef struct buffer_list_s { device_t *device; buffer_t **bufs; int nbufs; - int type; - struct v4l2_format v4l2_format; - bool do_mplanes; - bool do_mmap; - bool do_dma; - bool do_capture; + bool do_mmap, do_dma, do_capture; + + struct { + bool do_mplanes; + int type; + } v4l2; unsigned fmt_width, fmt_height, fmt_format, fmt_bytesperline, fmt_interval_us; bool do_timestamps; - uint64_t last_enqueued_us; - uint64_t last_dequeued_us; + uint64_t last_enqueued_us, last_dequeued_us; bool streaming; int frames; diff --git a/device/hw/buffer_queue.c b/device/hw/buffer_queue.c index d43d74b..c555f86 100644 --- a/device/hw/buffer_queue.c +++ b/device/hw/buffer_queue.c @@ -38,7 +38,7 @@ bool buffer_consumed(buffer_t *buf, const char *who) if (!buf->enqueued && buf->mmap_reflinks == 0) { // update used bytes - if (buf->buf_list->do_mplanes) { + if (buf->buf_list->v4l2.do_mplanes) { buf->v4l2_plane.bytesused = buf->used; buf->v4l2_plane.length = buf->length; buf->v4l2_plane.data_offset = 0; @@ -137,7 +137,7 @@ int buffer_list_enqueue(buffer_list_t *buf_list, buffer_t *dma_buf) E_LOG_DEBUG(buf, "mmap copy: dest=%p, src=%p (%s), size=%zu, space=%zu, time=%dllus", buf->start, dma_buf->start, dma_buf->name, dma_buf->used, buf->length, after-before); } else { - if (buf_list->do_mplanes) { + if (buf_list->v4l2.do_mplanes) { buf->v4l2_plane.m.fd = dma_buf->dma_fd; } else { buf->v4l2_buffer.m.fd = dma_buf->dma_fd; @@ -163,10 +163,10 @@ buffer_t *buffer_list_dequeue(buffer_list_t *buf_list) struct v4l2_buffer v4l2_buf = {0}; struct v4l2_plane v4l2_plane = {0}; - v4l2_buf.type = buf_list->type; + v4l2_buf.type = buf_list->v4l2.type; v4l2_buf.memory = V4L2_MEMORY_MMAP; - if (buf_list->do_mplanes) { + if (buf_list->v4l2.do_mplanes) { v4l2_buf.length = 1; v4l2_buf.m.planes = &v4l2_plane; } @@ -174,7 +174,7 @@ buffer_t *buffer_list_dequeue(buffer_list_t *buf_list) E_XIOCTL(buf_list, buf_list->device->fd, VIDIOC_DQBUF, &v4l2_buf, "Can't grab capture buffer (flags=%08x)", v4l2_buf.flags); buffer_t *buf = buf_list->bufs[v4l2_buf.index]; - if (buf_list->do_mplanes) { + if (buf_list->v4l2.do_mplanes) { buf->used = v4l2_plane.bytesused; } else { buf->used = v4l2_buf.bytesused; diff --git a/device/hw/device.h b/device/hw/device.h index c452bb4..1e4cc63 100644 --- a/device/hw/device.h +++ b/device/hw/device.h @@ -8,8 +8,6 @@ typedef struct buffer_list_s buffer_list_t; typedef struct device_s device_t; typedef struct device_hw_s { - int (*device_hw_open)(device_t *device); - int (*device_hw_close)(device_t *device); } device_hw_t; typedef struct device_s { diff --git a/device/v4l2/device.c b/device/v4l2/device.c index 825b3dd..9366b39 100644 --- a/device/v4l2/device.c +++ b/device/v4l2/device.c @@ -7,3 +7,7 @@ device_t *device_v4l2_open(const char *name, const char *path) { return device_open(name, path, &device_hw_v4l2); } + +device_hw_t device_hw_v4l2 = { + +};