diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libcamera/v4l2_device.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp index 2139e98b..3c91eb3f 100644 --- a/src/libcamera/v4l2_device.cpp +++ b/src/libcamera/v4l2_device.cpp @@ -176,7 +176,7 @@ int V4L2Device::getControls(ControlList *ctrls) memset(v4l2Ctrls, 0, sizeof(v4l2Ctrls)); unsigned int i = 0; - for (const auto &ctrl : *ctrls) { + for (auto &ctrl : *ctrls) { unsigned int id = ctrl.first; const auto iter = controls_.find(id); if (iter == controls_.end()) { @@ -185,6 +185,31 @@ int V4L2Device::getControls(ControlList *ctrls) return -EINVAL; } + const struct v4l2_query_ext_ctrl &info = controlInfo_[id]; + ControlValue &value = ctrl.second; + + if (info.flags & V4L2_CTRL_FLAG_HAS_PAYLOAD) { + ControlType type; + + switch (info.type) { + case V4L2_CTRL_TYPE_U8: + type = ControlTypeByte; + break; + + default: + LOG(V4L2, Error) + << "Unsupported payload control type " + << info.type; + return -EINVAL; + } + + value.reserve(type, true, info.elems); + Span<uint8_t> data = value.data(); + + v4l2Ctrls[i].p_u8 = data.data(); + v4l2Ctrls[i].size = data.size(); + } + v4l2Ctrls[i].id = id; i++; } |