[1/1] libcamera: Put buffer back to V4L2BufferCache when VIDIOC_QBUF fails
diff mbox series

Message ID 20240912051409.3495486-2-chenghaoyang@google.com
State New
Headers show
Series
  • Recycle V4L2BufferCache when VIDIOC_QBUF fails
Related show

Commit Message

Cheng-Hao Yang Sept. 12, 2024, 5:09 a.m. UTC
From: Han-Lin Chen <hanlinchen@chromium.org>

The patch puts buffer back to V4L2BufferCache when VIDIOC_QBUF fails
in V4L2VideoDevice. This is to avoid cache leaks and causing assert.

Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org>
Co-developed-by: Harvey Yang <chenghaoyang@chromium.org>
---
 src/libcamera/v4l2_videodevice.cpp | 8 ++++++++
 1 file changed, 8 insertions(+)

Patch
diff mbox series

diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
index 76742e18..75a2cdb1 100644
--- a/src/libcamera/v4l2_videodevice.cpp
+++ b/src/libcamera/v4l2_videodevice.cpp
@@ -1626,11 +1626,15 @@  int V4L2VideoDevice::queueBuffer(FrameBuffer *buffer)
 	 */
 	if (planes.size() < numV4l2Planes) {
 		LOG(V4L2, Error) << "Frame buffer has too few planes";
+		cache_->put(buf.index);
+
 		return -EINVAL;
 	}
 
 	if (planes.size() != numV4l2Planes && !buffer->_d()->isContiguous()) {
 		LOG(V4L2, Error) << "Device format requires contiguous buffer";
+		cache_->put(buf.index);
+
 		return -EINVAL;
 	}
 
@@ -1673,6 +1677,8 @@  int V4L2VideoDevice::queueBuffer(FrameBuffer *buffer)
 				if (i != planes.size() - 1 && bytesused != length) {
 					LOG(V4L2, Error)
 						<< "Holes in multi-planar buffer not supported";
+					cache_->put(buf.index);
+
 					return -EINVAL;
 				}
 			}
@@ -1722,6 +1728,8 @@  int V4L2VideoDevice::queueBuffer(FrameBuffer *buffer)
 		LOG(V4L2, Error)
 			<< "Failed to queue buffer " << buf.index << ": "
 			<< strerror(-ret);
+		cache_->put(buf.index);
+
 		return ret;
 	}