diff --git a/cmd/camera_decoder.c b/cmd/camera_decoder.c index b9ab125..5c3224a 100644 --- a/cmd/camera_decoder.c +++ b/cmd/camera_decoder.c @@ -15,8 +15,11 @@ int camera_configure_decoder(camera_t *camera) camera->decoder = device_open("DECODER", "/dev/video10"); - if (device_open_buffer_list_output(camera->decoder, src) < 0 || - device_open_buffer_list_capture(camera->decoder, src, 1.0, V4L2_PIX_FMT_YUV420, true) < 0) { + if (device_open_buffer_list_output(camera->decoder, src) < 0) { + return -1; + } + + if (device_open_buffer_list_capture(camera->decoder, NULL, 1.0, 0, true) < 0) { return -1; } diff --git a/hw/buffer_list.c b/hw/buffer_list.c index a87100d..88ba5c5 100644 --- a/hw/buffer_list.c +++ b/hw/buffer_list.c @@ -225,3 +225,37 @@ int buffer_list_stream(buffer_list_t *buf_list, bool do_on) error: return -1; } + +int buffer_list_refresh_states(buffer_list_t *buf_list) +{ + if (!buf_list) { + return -1; + } + + struct v4l2_buffer v4l2_buf = {0}; + struct v4l2_plane v4l2_plane = {0}; + + v4l2_buf.type = buf_list->type; + + if (buf_list->do_mplanes) { + v4l2_buf.length = 1; + v4l2_buf.m.planes = &v4l2_plane; + } + + if (buf_list->do_mmap) { + v4l2_buf.memory = V4L2_MEMORY_MMAP; + } else { + v4l2_buf.memory = V4L2_MEMORY_DMABUF; + } + + for (int i = 0; i < buf_list->nbufs; i++) { + v4l2_buf.index = i; + + 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); + } + +error: + return -1; +} \ No newline at end of file diff --git a/hw/buffer_list.h b/hw/buffer_list.h index f53d5ae..05a44ed 100644 --- a/hw/buffer_list.h +++ b/hw/buffer_list.h @@ -34,3 +34,4 @@ buffer_t *buffer_list_dequeue(buffer_list_t *buf_list); int buffer_list_count_enqueued(buffer_list_t *buf_list); int buffer_list_enqueue(buffer_list_t *buf_list, buffer_t *dma_buf); +int buffer_list_refresh_states(buffer_list_t *buf_list); diff --git a/hw/buffer_queue.c b/hw/buffer_queue.c index 486bdc8..ee55987 100644 --- a/hw/buffer_queue.c +++ b/hw/buffer_queue.c @@ -183,13 +183,14 @@ buffer_t *buffer_list_dequeue(buffer_list_t *buf_list) buf->mmap_reflinks = 1; uint64_t enqueued_time_us = get_monotonic_time_us(NULL, NULL) - buf->enqueued_time_us; - E_LOG_DEBUG(buf_list, "Grabbed mmap buffer=%u, bytes=%d, used=%d, frame=%d, linked=%s, enqueued_time_us=%lluus", + E_LOG_DEBUG(buf_list, "Grabbed mmap buffer=%u, bytes=%d, used=%d, frame=%d, linked=%s, enqueued_time_us=%lluus, flags=%08x", buf->index, buf->length, buf->used, buf_list->frames, buf->mmap_source ? buf->mmap_source->name : NULL, - enqueued_time_us); + enqueued_time_us, + buf->v4l2_buffer.flags); if (buf->mmap_source) { buf->mmap_source->used = 0; diff --git a/hw/device.c b/hw/device.c index 629d9e3..5e6e506 100644 --- a/hw/device.c +++ b/hw/device.c @@ -138,6 +138,13 @@ int device_open_buffer_list_output(device_t *dev, buffer_list_t *capture_list) int device_open_buffer_list_capture(device_t *dev, buffer_list_t *output_list, float div, unsigned format, bool do_mmap) { + if (!output_list) { + output_list = dev->output_list; + } + if (!output_list) { + return -1; + } + return device_open_buffer_list(dev, true, output_list->fmt_width / div, output_list->fmt_height / div, format, 0, output_list->nbufs, do_mmap);