[libcamera-devel] [PATCH] Revert "libcamera: V4L2Device: Remove the controls order assumption in updateControls()"
Umang Jain
umang.jain at ideasonboard.com
Tue May 25 11:07:09 CEST 2021
Hi Laurent,
On 5/25/21 2:25 PM, Laurent Pinchart wrote:
> This reverts commit 34bee5e84ecba01e0ded5cacbc46c277c5a0edba.
>
> The commit introduced a breakage in the master branch, reported by
> linux-surface users already. Let's revert it while discussing the
> propert fix.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
I started facing
cam:
../../../../../tmp/portage/media-libs/libcamera-9999/work/libcamera-9999/include/libcamera/controls.h:150:
T libcamera::ControlValue::get() const [T = long]: Assertion `type_ ==
details::control_type<std::remove_cv_t<T>>::value' failed.
Aborted (core dumped)
today morning, under the impression it was due to my local changes for
IPA controls on nautilus. So, applying this revert solves the issue on
my end.
Tested-by: Umang Jain <umang.jain at ideasonboard.com>
> ---
> src/libcamera/v4l2_device.cpp | 26 +++++++++++++++++++-------
> 1 file changed, 19 insertions(+), 7 deletions(-)
>
> diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
> index 7f7e5b8fdf09..caafbc2d16bb 100644
> --- a/src/libcamera/v4l2_device.cpp
> +++ b/src/libcamera/v4l2_device.cpp
> @@ -244,6 +244,12 @@ ControlList V4L2Device::getControls(const std::vector<uint32_t> &ids)
>
> ControlList ctrls{ controls_ };
>
> + /*
> + * Start by filling the ControlList. This can't be combined with filling
> + * v4l2Ctrls, as updateControls() relies on both containers having the
> + * same order, and the control list is based on a map, which is not
> + * sorted by insertion order.
> + */
> for (uint32_t id : ids) {
> const auto iter = controls_.find(id);
> if (iter == controls_.end()) {
> @@ -617,13 +623,19 @@ void V4L2Device::updateControlInfo()
> void V4L2Device::updateControls(ControlList *ctrls,
> Span<const v4l2_ext_control> v4l2Ctrls)
> {
> - for (const v4l2_ext_control &v4l2Ctrl : v4l2Ctrls) {
> - const unsigned int id = v4l2Ctrl.id;
> + unsigned int i = 0;
> + for (auto &ctrl : *ctrls) {
> + if (i == v4l2Ctrls.size())
> + break;
>
> - ControlValue value = ctrls->get(id);
> - switch (value.type()) {
> + const struct v4l2_ext_control *v4l2Ctrl = &v4l2Ctrls[i];
> + unsigned int id = ctrl.first;
> + ControlValue &value = ctrl.second;
> +
> + const auto iter = controls_.find(id);
> + switch (iter->first->type()) {
> case ControlTypeInteger64:
> - value.set<int64_t>(v4l2Ctrl.value64);
> + value.set<int64_t>(v4l2Ctrl->value64);
> break;
>
> case ControlTypeByte:
> @@ -638,11 +650,11 @@ void V4L2Device::updateControls(ControlList *ctrls,
> * \todo To be changed when support for string controls
> * will be added.
> */
> - value.set<int32_t>(v4l2Ctrl.value);
> + value.set<int32_t>(v4l2Ctrl->value);
> break;
> }
>
> - ctrls->set(id, value);
> + i++;
> }
> }
>
More information about the libcamera-devel
mailing list