From 3c4b87244352552cce8d7a9c7b97ff85b39b3d58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20S=C3=B6derlund?= Date: Thu, 9 Jan 2020 15:20:44 +0100 Subject: v4l2: camera: Handle memory mapping of buffers directly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In the upcoming FrameBuffer API the memory mapping of buffers will be left to the user of the FrameBuffer objects. Prepare the V4L2 compatibility layer to this upcoming change to ease conversion to the new API. Signed-off-by: Niklas Söderlund Reviewed-by: Laurent Pinchart --- src/v4l2/v4l2_camera_proxy.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'src/v4l2/v4l2_camera_proxy.cpp') diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp index 52f8468c..d38500a3 100644 --- a/src/v4l2/v4l2_camera_proxy.cpp +++ b/src/v4l2/v4l2_camera_proxy.cpp @@ -75,7 +75,8 @@ void V4L2CameraProxy::close() vcam_->invokeMethod(&V4L2Camera::close, ConnectionTypeBlocking); } -void *V4L2CameraProxy::mmap(size_t length, int prot, int flags, off_t offset) +void *V4L2CameraProxy::mmap(void *addr, size_t length, int prot, int flags, + off_t offset) { LOG(V4L2Compat, Debug) << "Servicing mmap"; @@ -91,13 +92,22 @@ void *V4L2CameraProxy::mmap(size_t length, int prot, int flags, off_t offset) return MAP_FAILED; } - void *val = vcam_->invokeMethod(&V4L2Camera::mmap, - ConnectionTypeBlocking, index); + FileDescriptor fd = vcam_->invokeMethod(&V4L2Camera::getBufferFd, + ConnectionTypeBlocking, index); + if (!fd.isValid()) { + errno = EINVAL; + return MAP_FAILED; + } + + void *map = V4L2CompatManager::instance()->fops().mmap(addr, length, prot, + flags, fd.fd(), 0); + if (map == MAP_FAILED) + return map; buffers_[index].flags |= V4L2_BUF_FLAG_MAPPED; - mmaps_[val] = index; + mmaps_[map] = index; - return val; + return map; } int V4L2CameraProxy::munmap(void *addr, size_t length) @@ -110,6 +120,10 @@ int V4L2CameraProxy::munmap(void *addr, size_t length) return -1; } + if (V4L2CompatManager::instance()->fops().munmap(addr, length)) + LOG(V4L2Compat, Error) << "Failed to unmap " << addr + << " with length " << length; + buffers_[iter->second].flags &= ~V4L2_BUF_FLAG_MAPPED; mmaps_.erase(iter); -- cgit v1.2.1