[libcamera-devel] [PATCH 12/14] py: use geometry classes
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue May 17 10:40:20 CEST 2022
Hi Tomi,
Thank you for the patch.
On Mon, May 16, 2022 at 05:10:20PM +0300, Tomi Valkeinen wrote:
> Now that we have proper geometry classes in the Python bindings, change
> the existing bindings and the .py files accordingly.
>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ideasonboard.com>
Neat :-)
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> src/py/cam/cam.py | 7 ++++--
> src/py/cam/cam_kms.py | 3 ++-
> src/py/cam/cam_qt.py | 3 ++-
> src/py/cam/cam_qtgl.py | 3 ++-
> src/py/libcamera/pymain.cpp | 41 ++++++++--------------------------
> src/py/libcamera/utils/conv.py | 4 ++--
> 6 files changed, 22 insertions(+), 39 deletions(-)
>
> diff --git a/src/py/cam/cam.py b/src/py/cam/cam.py
> index 63c67126..347175b7 100755
> --- a/src/py/cam/cam.py
> +++ b/src/py/cam/cam.py
> @@ -160,8 +160,11 @@ def configure(ctx):
> for idx, stream_opts in enumerate(streams):
> stream_config = camconfig.at(idx)
>
> - if 'width' in stream_opts and 'height' in stream_opts:
> - stream_config.size = (stream_opts['width'], stream_opts['height'])
> + if 'width' in stream_opts:
> + stream_config.size.width = stream_opts['width']
> +
> + if 'height' in stream_opts:
> + stream_config.size.height = stream_opts['height']
>
> if 'pixelformat' in stream_opts:
> stream_config.pixel_format = libcam.PixelFormat.from_name(stream_opts['pixelformat'])
> diff --git a/src/py/cam/cam_kms.py b/src/py/cam/cam_kms.py
> index 7d11564b..da3dd4e0 100644
> --- a/src/py/cam/cam_kms.py
> +++ b/src/py/cam/cam_kms.py
> @@ -125,7 +125,8 @@ class KMSRenderer:
> })
>
> for fb in ctx['allocator'].buffers(stream):
> - w, h = cfg.size
> + w = cfg.size.width
> + h = cfg.size.height
> stride = cfg.stride
> fd = fb.fd(0)
> drmfb = pykms.DmabufFramebuffer(self.card, w, h, fmt,
> diff --git a/src/py/cam/cam_qt.py b/src/py/cam/cam_qt.py
> index 64f49f33..8bef9b57 100644
> --- a/src/py/cam/cam_qt.py
> +++ b/src/py/cam/cam_qt.py
> @@ -136,7 +136,8 @@ class MainWindow(QtWidgets.QWidget):
> def buf_to_qpixmap(self, stream, fb):
> with fb.mmap() as mfb:
> cfg = stream.configuration
> - w, h = cfg.size
> + w = cfg.size.width
> + h = cfg.size.height
> pitch = cfg.stride
>
> if cfg.pixel_format.name == 'MJPEG':
> diff --git a/src/py/cam/cam_qtgl.py b/src/py/cam/cam_qtgl.py
> index 261accb8..4bbcda6c 100644
> --- a/src/py/cam/cam_qtgl.py
> +++ b/src/py/cam/cam_qtgl.py
> @@ -268,7 +268,8 @@ class MainWindow(QtWidgets.QWidget):
> def create_texture(self, stream, fb):
> cfg = stream.configuration
> fmt = cfg.pixel_format.fourcc
> - w, h = cfg.size
> + w = cfg.size.width
> + h = cfg.size.height
>
> attribs = [
> EGL_WIDTH, w,
> diff --git a/src/py/libcamera/pymain.cpp b/src/py/libcamera/pymain.cpp
> index 1dd70d9c..d7bd71ef 100644
> --- a/src/py/libcamera/pymain.cpp
> +++ b/src/py/libcamera/pymain.cpp
> @@ -6,7 +6,6 @@
> */
>
> /*
> - * \todo Add geometry classes (Point, Rectangle...)
> * \todo Add bindings for the ControlInfo class
> */
>
> @@ -61,11 +60,11 @@ static py::object controlValueToPy(const ControlValue &cv)
> return py::cast(cv.get<std::string>());
> case ControlTypeRectangle: {
> const Rectangle *v = reinterpret_cast<const Rectangle *>(cv.data().data());
> - return py::make_tuple(v->x, v->y, v->width, v->height);
> + return py::cast(v);
> }
> case ControlTypeSize: {
> const Size *v = reinterpret_cast<const Size *>(cv.data().data());
> - return py::make_tuple(v->width, v->height);
> + return py::cast(v);
> }
> case ControlTypeNone:
> default:
> @@ -99,14 +98,10 @@ static ControlValue pyToControlValue(const py::object &ob, ControlType type)
> return controlValueMaybeArray<float>(ob);
> case ControlTypeString:
> return ControlValue(ob.cast<std::string>());
> - case ControlTypeRectangle: {
> - auto array = ob.cast<std::array<int32_t, 4>>();
> - return ControlValue(Rectangle(array[0], array[1], array[2], array[3]));
> - }
> - case ControlTypeSize: {
> - auto array = ob.cast<std::array<int32_t, 2>>();
> - return ControlValue(Size(array[0], array[1]));
> - }
> + 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");
> @@ -397,15 +392,7 @@ PYBIND11_MODULE(_libcamera, m)
> .def("__str__", &StreamConfiguration::toString)
> .def_property_readonly("stream", &StreamConfiguration::stream,
> py::return_value_policy::reference_internal)
> - .def_property(
> - "size",
> - [](StreamConfiguration &self) {
> - return std::make_tuple(self.size.width, self.size.height);
> - },
> - [](StreamConfiguration &self, std::tuple<uint32_t, uint32_t> size) {
> - self.size.width = std::get<0>(size);
> - self.size.height = std::get<1>(size);
> - })
> + .def_readwrite("size", &StreamConfiguration::size)
> .def_readwrite("pixel_format", &StreamConfiguration::pixelFormat)
> .def_readwrite("stride", &StreamConfiguration::stride)
> .def_readwrite("frame_size", &StreamConfiguration::frameSize)
> @@ -416,18 +403,8 @@ PYBIND11_MODULE(_libcamera, m)
>
> pyStreamFormats
> .def_property_readonly("pixel_formats", &StreamFormats::pixelformats)
> - .def("sizes", [](StreamFormats &self, const PixelFormat &pixelFormat) {
> - std::vector<std::tuple<uint32_t, uint32_t>> fmts;
> - for (const auto &s : self.sizes(pixelFormat))
> - fmts.push_back(std::make_tuple(s.width, s.height));
> - return fmts;
> - })
> - .def("range", [](StreamFormats &self, const PixelFormat &pixelFormat) {
> - const auto &range = self.range(pixelFormat);
> - return make_tuple(std::make_tuple(range.hStep, range.vStep),
> - std::make_tuple(range.min.width, range.min.height),
> - std::make_tuple(range.max.width, range.max.height));
> - });
> + .def("sizes", &StreamFormats::sizes)
> + .def("range", &StreamFormats::range);
>
> pyFrameBufferAllocator
> .def(py::init<std::shared_ptr<Camera>>(), py::keep_alive<1, 2>())
> diff --git a/src/py/libcamera/utils/conv.py b/src/py/libcamera/utils/conv.py
> index 30f6733e..5a4bc282 100644
> --- a/src/py/libcamera/utils/conv.py
> +++ b/src/py/libcamera/utils/conv.py
> @@ -73,8 +73,8 @@ def demosaic(data, r0, g0, g1, b0):
>
>
> def to_rgb(fmt, size, data):
> - w = size[0]
> - h = size[1]
> + w = size.width
> + h = size.height
>
> fmt = fmt.name
>
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list