Make bufer_list to be more v4l2-less

This commit is contained in:
Kamil Trzcinski 2022-04-10 09:57:23 +02:00
parent 76f35f37c8
commit 4746484844
6 changed files with 57 additions and 56 deletions

View File

@ -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);

View File

@ -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:

View File

@ -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;

View File

@ -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;

View File

@ -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 {

View File

@ -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 = {
};