v4l2: camera: Handle memory mapping of buffers directly
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 <niklas.soderlund@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
35ac23dca1
commit
3c4b872443
5 changed files with 30 additions and 15 deletions
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue