diff --git a/device/buffer_list.c b/device/buffer_list.c index 0426514..2708f54 100644 --- a/device/buffer_list.c +++ b/device/buffer_list.c @@ -2,8 +2,9 @@ #include "device/buffer_list.h" #include "device/device.h" #include "opts/log.h" +#include "opts/fourcc.h" -buffer_list_t *buffer_list_open(const char *name, struct device_s *dev, unsigned width, unsigned height, unsigned format, unsigned bytesperline, bool do_capture, bool do_mmap) +buffer_list_t *buffer_list_open(const char *name, struct device_s *dev, unsigned width, unsigned height, unsigned format, unsigned bytesperline, int nbufs, bool do_capture, bool do_mmap) { buffer_list_t *buf_list = calloc(1, sizeof(buffer_list_t)); @@ -12,10 +13,36 @@ buffer_list_t *buffer_list_open(const char *name, struct device_s *dev, unsigned buf_list->do_capture = do_capture; buf_list->do_mmap = do_mmap; - if (dev->hw->buffer_list_open(buf_list, width, height, format, bytesperline) < 0) { + int got_bufs = dev->hw->buffer_list_open(buf_list, width, height, format, bytesperline, nbufs); + if (got_bufs <= 0) { goto error; } + E_LOG_INFO( + buf_list, + "Using: %ux%u/%s, bytesperline=%d", + buf_list->fmt_width, + buf_list->fmt_height, + fourcc_to_string(buf_list->fmt_format).buf, + buf_list->fmt_bytesperline + ); + + buf_list->bufs = calloc(got_bufs, sizeof(buffer_t*)); + buf_list->nbufs = got_bufs; + + for (unsigned i = 0; i < buf_list->nbufs; i++) { + char name[64]; + sprintf(name, "%s:buf%d", buf_list->name, i); + buffer_t *buf = buffer_open(name, buf_list, i); + if (!buf) { + E_LOG_ERROR(buf_list, "Cannot open buffer: %u", i); + goto error; + } + buf_list->bufs[i] = buf; + } + + E_LOG_DEBUG(buf_list, "Opened %u buffers", buf_list->nbufs); + return buf_list; error: @@ -43,34 +70,6 @@ void buffer_list_close(buffer_list_t *buf_list) free(buf_list); } -int buffer_list_set_buffers(buffer_list_t *buf_list, int nbufs) -{ - int got_bufs = buf_list->dev->hw->buffer_list_set_buffers(buf_list, nbufs); - if (got_bufs <= 0) { - goto error; - } - - buf_list->bufs = calloc(got_bufs, sizeof(buffer_t*)); - buf_list->nbufs = got_bufs; - - for (unsigned i = 0; i < buf_list->nbufs; i++) { - char name[64]; - sprintf(name, "%s:buf%d", buf_list->name, i); - buffer_t *buf = buffer_open(name, buf_list, i); - if (!buf) { - E_LOG_ERROR(buf_list, "Cannot open buffer: %u", i); - goto error; - } - buf_list->bufs[i] = buf; - } - - E_LOG_DEBUG(buf_list, "Opened %u buffers", buf_list->nbufs); - return 0; - -error: - return -1; -} - int buffer_list_set_stream(buffer_list_t *buf_list, bool do_on) { if (!buf_list) { diff --git a/device/buffer_list.h b/device/buffer_list.h index 1ee4a2f..ae51048 100644 --- a/device/buffer_list.h +++ b/device/buffer_list.h @@ -30,11 +30,10 @@ typedef struct buffer_list_s { int frames; } buffer_list_t; -buffer_list_t *buffer_list_open(const char *name, struct device_s *dev, unsigned width, unsigned height, unsigned format, unsigned bytesperline, bool do_capture, bool do_mmap); +buffer_list_t *buffer_list_open(const char *name, struct device_s *dev, unsigned width, unsigned height, unsigned format, unsigned bytesperline, int nbufs, bool do_capture, bool do_mmap); void buffer_list_close(buffer_list_t *buf_list); int buffer_list_set_stream(buffer_list_t *buf_list, bool do_on); -int buffer_list_set_buffers(buffer_list_t *buf_list, int nbufs); int buffer_list_pollfd(buffer_list_t *buf_list, struct pollfd *pollfd, bool can_dequeue); buffer_t *buffer_list_find_slot(buffer_list_t *buf_list); diff --git a/device/device.c b/device/device.c index 36d292b..d5dea59 100644 --- a/device/device.c +++ b/device/device.c @@ -75,15 +75,11 @@ int device_open_buffer_list(device_t *dev, bool do_capture, unsigned width, unsi sprintf(name, "%s:output", dev->name); } - *buf_list = buffer_list_open(name, dev, width, height, format, bytesperline, do_capture, do_mmap); + *buf_list = buffer_list_open(name, dev, width, height, format, bytesperline, nbufs, do_capture, do_mmap); if (!*buf_list) { goto error; } - if (buffer_list_set_buffers(*buf_list, nbufs) < 0) { - goto error; - } - return 0; error: diff --git a/device/device.h b/device/device.h index ade35e0..3ad817d 100644 --- a/device/device.h +++ b/device/device.h @@ -22,9 +22,8 @@ typedef struct device_hw_s { int (*buffer_list_dequeue)(buffer_list_t *buf_list, buffer_t **bufp); int (*buffer_list_pollfd)(buffer_list_t *buf_list, struct pollfd *pollfd, bool can_dequeue); - int (*buffer_list_open)(buffer_list_t *buf_list, unsigned width, unsigned height, unsigned format, unsigned bytesperline); + int (*buffer_list_open)(buffer_list_t *buf_list, unsigned width, unsigned height, unsigned format, unsigned bytesperline, int nbufs); void (*buffer_list_close)(buffer_list_t *buf_list); - int (*buffer_list_set_buffers)(buffer_list_t *buf_list, int nbufs); int (*buffer_list_set_stream)(buffer_list_t *buf_list, bool do_on); } device_hw_t; diff --git a/device/dummy/buffer_list.c b/device/dummy/buffer_list.c index 95d9137..a713b58 100644 --- a/device/dummy/buffer_list.c +++ b/device/dummy/buffer_list.c @@ -3,7 +3,7 @@ #include -int dummy_buffer_list_open(buffer_list_t *buf_list, unsigned width, unsigned height, unsigned format, unsigned bytesperline) +int dummy_buffer_list_open(buffer_list_t *buf_list, unsigned width, unsigned height, unsigned format, unsigned bytesperline, int nbufs) { buf_list->dummy = calloc(1, sizeof(buffer_list_dummy_t)); return 0; diff --git a/device/dummy/dummy.c b/device/dummy/dummy.c index ae50394..d86197f 100644 --- a/device/dummy/dummy.c +++ b/device/dummy/dummy.c @@ -18,7 +18,6 @@ device_hw_t dummy_device_hw = { .buffer_list_pollfd = dummy_buffer_list_pollfd, .buffer_list_open = dummy_buffer_list_open, .buffer_list_close = dummy_buffer_list_close, - .buffer_list_set_buffers = dummy_buffer_list_set_buffers, .buffer_list_set_stream = dummy_buffer_list_set_stream }; diff --git a/device/dummy/dummy.h b/device/dummy/dummy.h index 63911b1..2d7753e 100644 --- a/device/dummy/dummy.h +++ b/device/dummy/dummy.h @@ -30,7 +30,7 @@ int dummy_buffer_enqueue(buffer_t *buf, const char *who); int dummy_buffer_list_dequeue(buffer_list_t *buf_list, buffer_t **bufp); int dummy_buffer_list_pollfd(buffer_list_t *buf_list, struct pollfd *pollfd, bool can_dequeue); -int dummy_buffer_list_open(buffer_list_t *buf_list, unsigned width, unsigned height, unsigned format, unsigned bytesperline); +int dummy_buffer_list_open(buffer_list_t *buf_list, unsigned width, unsigned height, unsigned format, unsigned bytesperline, int nbufs); void dummy_buffer_list_close(buffer_list_t *buf_list); int dummy_buffer_list_set_buffers(buffer_list_t *buf_list, int nbufs); int dummy_buffer_list_set_stream(buffer_list_t *buf_list, bool do_on); diff --git a/device/libcamera/buffer_list.cc b/device/libcamera/buffer_list.cc index 899cb65..cba7f33 100644 --- a/device/libcamera/buffer_list.cc +++ b/device/libcamera/buffer_list.cc @@ -1,7 +1,12 @@ #include "libcamera.hh" -int libcamera_buffer_list_open(buffer_list_t *buf_list, unsigned width, unsigned height, unsigned format, unsigned bytesperline) +int libcamera_buffer_list_open(buffer_list_t *buf_list, unsigned width, unsigned height, unsigned format, unsigned bytesperline, int nbufs) { + if (!buf_list->do_capture) { + E_LOG_INFO(buf_list, "Only capture mode is supported."); + return -1; + } + buf_list->libcamera = new buffer_list_libcamera_t{}; return 0; } @@ -14,11 +19,6 @@ void libcamera_buffer_list_close(buffer_list_t *buf_list) } } -int libcamera_buffer_list_set_buffers(buffer_list_t *buf_list, int nbufs) -{ - return -1; -} - int libcamera_buffer_list_set_stream(buffer_list_t *buf_list, bool do_on) { return -1; diff --git a/device/libcamera/libcamera.cc b/device/libcamera/libcamera.cc index 75142a9..053efa5 100644 --- a/device/libcamera/libcamera.cc +++ b/device/libcamera/libcamera.cc @@ -16,7 +16,6 @@ device_hw_t libcamera_device_hw = { .buffer_list_pollfd = libcamera_buffer_list_pollfd, .buffer_list_open = libcamera_buffer_list_open, .buffer_list_close = libcamera_buffer_list_close, - .buffer_list_set_buffers = libcamera_buffer_list_set_buffers, .buffer_list_set_stream = libcamera_buffer_list_set_stream }; diff --git a/device/libcamera/libcamera.hh b/device/libcamera/libcamera.hh index a781563..2d32b78 100644 --- a/device/libcamera/libcamera.hh +++ b/device/libcamera/libcamera.hh @@ -10,6 +10,7 @@ extern "C" { #include "device/device.h" #include "device/buffer_list.h" #include "device/buffer.h" +#include "opts/log.h" }; #include @@ -54,7 +55,6 @@ int libcamera_buffer_enqueue(buffer_t *buf, const char *who); int libcamera_buffer_list_dequeue(buffer_list_t *buf_list, buffer_t **bufp); int libcamera_buffer_list_pollfd(buffer_list_t *buf_list, struct pollfd *pollfd, bool can_dequeue); -int libcamera_buffer_list_open(buffer_list_t *buf_list, unsigned width, unsigned height, unsigned format, unsigned bytesperline); +int libcamera_buffer_list_open(buffer_list_t *buf_list, unsigned width, unsigned height, unsigned format, unsigned bytesperline, int nbufs); void libcamera_buffer_list_close(buffer_list_t *buf_list); -int libcamera_buffer_list_set_buffers(buffer_list_t *buf_list, int nbufs); int libcamera_buffer_list_set_stream(buffer_list_t *buf_list, bool do_on); diff --git a/device/v4l2/buffer_list.c b/device/v4l2/buffer_list.c index 71ce9e4..2360b97 100644 --- a/device/v4l2/buffer_list.c +++ b/device/v4l2/buffer_list.c @@ -5,7 +5,7 @@ #include "opts/log.h" #include "opts/fourcc.h" -int v4l2_buffer_list_open(buffer_list_t *buf_list, unsigned width, unsigned height, unsigned format, unsigned bytesperline) +int v4l2_buffer_list_open(buffer_list_t *buf_list, unsigned width, unsigned height, unsigned format, unsigned bytesperline, int nbufs) { device_t *dev = buf_list->dev; @@ -128,23 +128,6 @@ int v4l2_buffer_list_open(buffer_list_t *buf_list, unsigned width, unsigned heig v4l2_device_set_pad_format(dev, width, height, format); } - E_LOG_INFO( - buf_list, - "Using: %ux%u/%s, bytesperline=%d", - buf_list->fmt_width, - buf_list->fmt_height, - fourcc_to_string(buf_list->fmt_format).buf, - buf_list->fmt_bytesperline - ); - - return 0; - -error: - return -1; -} - -int v4l2_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->v4l2->type; diff --git a/device/v4l2/v4l2.c b/device/v4l2/v4l2.c index 2e6e9f9..eda5b95 100644 --- a/device/v4l2/v4l2.c +++ b/device/v4l2/v4l2.c @@ -17,7 +17,6 @@ device_hw_t v4l2_device_hw = { .buffer_list_pollfd = v4l2_buffer_list_pollfd, .buffer_list_open = v4l2_buffer_list_open, .buffer_list_close = v4l2_buffer_list_close, - .buffer_list_set_buffers = v4l2_buffer_list_set_buffers, .buffer_list_set_stream = v4l2_buffer_list_set_stream }; diff --git a/device/v4l2/v4l2.h b/device/v4l2/v4l2.h index ba06640..ccf6b8d 100644 --- a/device/v4l2/v4l2.h +++ b/device/v4l2/v4l2.h @@ -38,9 +38,8 @@ int v4l2_buffer_list_dequeue(buffer_list_t *buf_list, buffer_t **bufp); int v4l2_buffer_list_refresh_states(buffer_list_t *buf_list); int v4l2_buffer_list_pollfd(buffer_list_t *buf_list, struct pollfd *pollfd, bool can_dequeue); -int v4l2_buffer_list_open(buffer_list_t *buf_list, unsigned width, unsigned height, unsigned format, unsigned bytesperline); +int v4l2_buffer_list_open(buffer_list_t *buf_list, unsigned width, unsigned height, unsigned format, unsigned bytesperline, int nbufs); void v4l2_buffer_list_close(buffer_list_t *buf_list); -int v4l2_buffer_list_set_buffers(buffer_list_t *buf_list, int nbufs); int v4l2_buffer_list_set_stream(buffer_list_t *buf_list, bool do_on); int v4l2_device_open_media_device(device_t *dev);