py: Move ControlValue helpers to py_helpers.cpp
Clean up the py_main.cpp a bit by moving the ControlValue helpers to a separate file. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
a7f73dd096
commit
4bd2d5191c
4 changed files with 113 additions and 81 deletions
|
@ -15,6 +15,7 @@ pybind11_dep = pybind11_proj.get_variable('pybind11_dep')
|
|||
pycamera_sources = files([
|
||||
'py_enums.cpp',
|
||||
'py_geometry.cpp',
|
||||
'py_helpers.cpp',
|
||||
'py_main.cpp',
|
||||
])
|
||||
|
||||
|
|
97
src/py/libcamera/py_helpers.cpp
Normal file
97
src/py/libcamera/py_helpers.cpp
Normal file
|
@ -0,0 +1,97 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
/*
|
||||
* Copyright (C) 2022, Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
|
||||
*/
|
||||
|
||||
#include "py_helpers.h"
|
||||
|
||||
#include <libcamera/libcamera.h>
|
||||
|
||||
#include <pybind11/functional.h>
|
||||
#include <pybind11/stl.h>
|
||||
#include <pybind11/stl_bind.h>
|
||||
|
||||
namespace py = pybind11;
|
||||
|
||||
using namespace libcamera;
|
||||
|
||||
template<typename T>
|
||||
static py::object valueOrTuple(const ControlValue &cv)
|
||||
{
|
||||
if (cv.isArray()) {
|
||||
const T *v = reinterpret_cast<const T *>(cv.data().data());
|
||||
auto t = py::tuple(cv.numElements());
|
||||
|
||||
for (size_t i = 0; i < cv.numElements(); ++i)
|
||||
t[i] = v[i];
|
||||
|
||||
return std::move(t);
|
||||
}
|
||||
|
||||
return py::cast(cv.get<T>());
|
||||
}
|
||||
|
||||
py::object controlValueToPy(const ControlValue &cv)
|
||||
{
|
||||
switch (cv.type()) {
|
||||
case ControlTypeBool:
|
||||
return valueOrTuple<bool>(cv);
|
||||
case ControlTypeByte:
|
||||
return valueOrTuple<uint8_t>(cv);
|
||||
case ControlTypeInteger32:
|
||||
return valueOrTuple<int32_t>(cv);
|
||||
case ControlTypeInteger64:
|
||||
return valueOrTuple<int64_t>(cv);
|
||||
case ControlTypeFloat:
|
||||
return valueOrTuple<float>(cv);
|
||||
case ControlTypeString:
|
||||
return py::cast(cv.get<std::string>());
|
||||
case ControlTypeRectangle: {
|
||||
const Rectangle *v = reinterpret_cast<const Rectangle *>(cv.data().data());
|
||||
return py::cast(v);
|
||||
}
|
||||
case ControlTypeSize: {
|
||||
const Size *v = reinterpret_cast<const Size *>(cv.data().data());
|
||||
return py::cast(v);
|
||||
}
|
||||
case ControlTypeNone:
|
||||
default:
|
||||
throw std::runtime_error("Unsupported ControlValue type");
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static ControlValue controlValueMaybeArray(const py::object &ob)
|
||||
{
|
||||
if (py::isinstance<py::list>(ob) || py::isinstance<py::tuple>(ob)) {
|
||||
std::vector<T> vec = ob.cast<std::vector<T>>();
|
||||
return ControlValue(Span<const T>(vec));
|
||||
}
|
||||
|
||||
return ControlValue(ob.cast<T>());
|
||||
}
|
||||
|
||||
ControlValue pyToControlValue(const py::object &ob, ControlType type)
|
||||
{
|
||||
switch (type) {
|
||||
case ControlTypeBool:
|
||||
return ControlValue(ob.cast<bool>());
|
||||
case ControlTypeByte:
|
||||
return controlValueMaybeArray<uint8_t>(ob);
|
||||
case ControlTypeInteger32:
|
||||
return controlValueMaybeArray<int32_t>(ob);
|
||||
case ControlTypeInteger64:
|
||||
return controlValueMaybeArray<int64_t>(ob);
|
||||
case ControlTypeFloat:
|
||||
return controlValueMaybeArray<float>(ob);
|
||||
case ControlTypeString:
|
||||
return ControlValue(ob.cast<std::string>());
|
||||
case ControlTypeRectangle:
|
||||
return ControlValue(ob.cast<Rectangle>());
|
||||
case ControlTypeSize:
|
||||
return ControlValue(ob.cast<Size>());
|
||||
case ControlTypeNone:
|
||||
default:
|
||||
throw std::runtime_error("Control type not implemented");
|
||||
}
|
||||
}
|
13
src/py/libcamera/py_helpers.h
Normal file
13
src/py/libcamera/py_helpers.h
Normal file
|
@ -0,0 +1,13 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
/*
|
||||
* Copyright (C) 2022, Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <libcamera/libcamera.h>
|
||||
|
||||
#include <pybind11/smart_holder.h>
|
||||
|
||||
pybind11::object controlValueToPy(const libcamera::ControlValue &cv);
|
||||
libcamera::ControlValue pyToControlValue(const pybind11::object &ob, libcamera::ControlType type);
|
|
@ -21,6 +21,8 @@
|
|||
#include <pybind11/stl.h>
|
||||
#include <pybind11/stl_bind.h>
|
||||
|
||||
#include "py_helpers.h"
|
||||
|
||||
namespace py = pybind11;
|
||||
|
||||
using namespace libcamera;
|
||||
|
@ -31,87 +33,6 @@ LOG_DEFINE_CATEGORY(Python)
|
|||
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static py::object valueOrTuple(const ControlValue &cv)
|
||||
{
|
||||
if (cv.isArray()) {
|
||||
const T *v = reinterpret_cast<const T *>(cv.data().data());
|
||||
auto t = py::tuple(cv.numElements());
|
||||
|
||||
for (size_t i = 0; i < cv.numElements(); ++i)
|
||||
t[i] = v[i];
|
||||
|
||||
return std::move(t);
|
||||
}
|
||||
|
||||
return py::cast(cv.get<T>());
|
||||
}
|
||||
|
||||
static py::object controlValueToPy(const ControlValue &cv)
|
||||
{
|
||||
switch (cv.type()) {
|
||||
case ControlTypeBool:
|
||||
return valueOrTuple<bool>(cv);
|
||||
case ControlTypeByte:
|
||||
return valueOrTuple<uint8_t>(cv);
|
||||
case ControlTypeInteger32:
|
||||
return valueOrTuple<int32_t>(cv);
|
||||
case ControlTypeInteger64:
|
||||
return valueOrTuple<int64_t>(cv);
|
||||
case ControlTypeFloat:
|
||||
return valueOrTuple<float>(cv);
|
||||
case ControlTypeString:
|
||||
return py::cast(cv.get<std::string>());
|
||||
case ControlTypeRectangle: {
|
||||
const Rectangle *v = reinterpret_cast<const Rectangle *>(cv.data().data());
|
||||
return py::cast(v);
|
||||
}
|
||||
case ControlTypeSize: {
|
||||
const Size *v = reinterpret_cast<const Size *>(cv.data().data());
|
||||
return py::cast(v);
|
||||
}
|
||||
case ControlTypeNone:
|
||||
default:
|
||||
throw std::runtime_error("Unsupported ControlValue type");
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static ControlValue controlValueMaybeArray(const py::object &ob)
|
||||
{
|
||||
if (py::isinstance<py::list>(ob) || py::isinstance<py::tuple>(ob)) {
|
||||
std::vector<T> vec = ob.cast<std::vector<T>>();
|
||||
return ControlValue(Span<const T>(vec));
|
||||
}
|
||||
|
||||
return ControlValue(ob.cast<T>());
|
||||
}
|
||||
|
||||
static ControlValue pyToControlValue(const py::object &ob, ControlType type)
|
||||
{
|
||||
switch (type) {
|
||||
case ControlTypeBool:
|
||||
return ControlValue(ob.cast<bool>());
|
||||
case ControlTypeByte:
|
||||
return controlValueMaybeArray<uint8_t>(ob);
|
||||
case ControlTypeInteger32:
|
||||
return controlValueMaybeArray<int32_t>(ob);
|
||||
case ControlTypeInteger64:
|
||||
return controlValueMaybeArray<int64_t>(ob);
|
||||
case ControlTypeFloat:
|
||||
return controlValueMaybeArray<float>(ob);
|
||||
case ControlTypeString:
|
||||
return ControlValue(ob.cast<std::string>());
|
||||
case ControlTypeRectangle:
|
||||
return ControlValue(ob.cast<Rectangle>());
|
||||
case ControlTypeSize:
|
||||
return ControlValue(ob.cast<Size>());
|
||||
case ControlTypeNone:
|
||||
default:
|
||||
throw std::runtime_error("Control type not implemented");
|
||||
}
|
||||
}
|
||||
|
||||
static std::weak_ptr<CameraManager> gCameraManager;
|
||||
static int gEventfd;
|
||||
static std::mutex gReqlistMutex;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue