libcamera: v4l2_device: Avoid copy of V4L2ControlInfo

The V4L2Device::listControls() method creates an instance of
V4L2ControlInfo and then inserts it in the device's list of controls.
The insertion uses std::map::emplace(), but passes the V4L2ControlInfo,
resulting in a copy being performed (using the copy constructor of
V4L2ControlInfo).

Optimise this by really constructing the V4L2ControlInfo in-place. The
use of std::piecewise_construct is required for gcc-5 that seems to have
trouble with std::map::emplace() on non-copyable values in this case.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Jacopo Mondi <jacopo@jmondi.org>
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
Laurent Pinchart 2019-10-07 22:39:19 +03:00
parent abe2c1b55c
commit 764ff6fdf3

View file

@ -352,8 +352,7 @@ void V4L2Device::listControls()
ctrl.flags & V4L2_CTRL_FLAG_DISABLED)
continue;
V4L2ControlInfo info(ctrl);
switch (info.type()) {
switch (ctrl.type) {
case V4L2_CTRL_TYPE_INTEGER:
case V4L2_CTRL_TYPE_BOOLEAN:
case V4L2_CTRL_TYPE_MENU:
@ -364,12 +363,14 @@ void V4L2Device::listControls()
break;
/* \todo Support compound controls. */
default:
LOG(V4L2, Debug) << "Control type '" << info.type()
LOG(V4L2, Debug) << "Control type '" << ctrl.type
<< "' not supported";
continue;
}
controls_.emplace(ctrl.id, info);
controls_.emplace(std::piecewise_construct,
std::forward_as_tuple(ctrl.id),
std::forward_as_tuple(ctrl));
}
}