Fix reflinks

This commit is contained in:
Kamil Trzcinski
2022-04-05 15:03:47 +02:00
parent 77fc9bfdbb
commit 1112be661e
2 changed files with 24 additions and 5 deletions

View File

@ -33,15 +33,31 @@ int main(int argc, char *argv[])
//camera.width = 4656; camera.height = 3496; //camera.width = 4656; camera.height = 3496;
//camera.width = 3840; camera.height = 2160; //camera.width = 3840; camera.height = 2160;
//camera.width = 1280; camera.height = 720; //camera.width = 1280; camera.height = 720;
camera.nbufs = 4; camera.nbufs = 1;
#if 1
camera.format = V4L2_PIX_FMT_SRGGB10P; camera.format = V4L2_PIX_FMT_SRGGB10P;
//camera.format = V4L2_PIX_FMT_YUYV; camera.allow_dma = false;
if (camera_open(&camera, "/dev/video2") < 0) { if (camera_open(&camera, "/dev/video2") < 0) {
goto error; goto error;
} }
#else
//camera.width = 1920; camera.height = 1080;
camera.width = 1280; camera.height = 720;
// camera.format = V4L2_PIX_FMT_YUYV;
camera.format = V4L2_PIX_FMT_MJPEG;
camera.allow_dma = false;
if (camera_open(&camera, "/dev/video0") < 0) {
goto error;
}
#endif
#if 0 #if 0
if (camera_configure_decoder(&camera) < 0) {
goto error;
}
#elif 0
if (camera_configure_direct(&camera) < 0) { if (camera_configure_direct(&camera) < 0) {
goto error; goto error;
} }

View File

@ -30,7 +30,11 @@ bool buffer_consumed(buffer_t *buf)
} }
pthread_mutex_lock(&buffer_lock); pthread_mutex_lock(&buffer_lock);
if (!buf->enqueued && buf->mmap_reflinks == 1) { if (buf->mmap_reflinks > 0) {
buf->mmap_reflinks--;
}
if (!buf->enqueued && buf->mmap_reflinks == 0) {
// update used bytes // update used bytes
if (buf->buf_list->do_mplanes) { if (buf->buf_list->do_mplanes) {
buf->v4l2_plane.bytesused = buf->used; buf->v4l2_plane.bytesused = buf->used;
@ -44,17 +48,16 @@ bool buffer_consumed(buffer_t *buf)
buf->enqueued_time_us = get_monotonic_time_us(NULL, &buf->v4l2_buffer.timestamp); buf->enqueued_time_us = get_monotonic_time_us(NULL, &buf->v4l2_buffer.timestamp);
E_XIOCTL(buf, buf->buf_list->device->fd, VIDIOC_QBUF, &buf->v4l2_buffer, "Can't queue buffer."); E_XIOCTL(buf, buf->buf_list->device->fd, VIDIOC_QBUF, &buf->v4l2_buffer, "Can't queue buffer.");
buf->enqueued = true; buf->enqueued = true;
buf->mmap_reflinks--;
} }
pthread_mutex_unlock(&buffer_lock); pthread_mutex_unlock(&buffer_lock);
return true; return true;
error: error:
{ {
buffer_t *mmap_source = buf->mmap_source; buffer_t *mmap_source = buf->mmap_source;
buf->mmap_source = NULL; buf->mmap_source = NULL;
buf->mmap_reflinks--;
pthread_mutex_unlock(&buffer_lock); pthread_mutex_unlock(&buffer_lock);
if (mmap_source) { if (mmap_source) {