[libcamera-devel] [PATCH v7 11/13] py: support controls in the start method

Laurent Pinchart laurent.pinchart at ideasonboard.com
Thu May 5 20:02:45 CEST 2022


Hi Tomi and David,

Thank you for the patch.

On Thu, May 05, 2022 at 01:41:02PM +0300, Tomi Valkeinen wrote:
> From: David Plowman <david.plowman at raspberrypi.com>
> 
> Libcamera has for a while allowed controls to be set in the camera's

s/Libcamera/libcamera/

> start method. The Python bindings need to permit this too.
> 
> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ideasonboard.com>

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> ---
>  src/py/libcamera/pymain.cpp | 25 ++++++++++++++++++++++---
>  1 file changed, 22 insertions(+), 3 deletions(-)
> 
> diff --git a/src/py/libcamera/pymain.cpp b/src/py/libcamera/pymain.cpp
> index c442ad50..6375e326 100644
> --- a/src/py/libcamera/pymain.cpp
> +++ b/src/py/libcamera/pymain.cpp
> @@ -250,15 +250,34 @@ PYBIND11_MODULE(_libcamera, m)
>  		.def_property_readonly("id", &Camera::id)
>  		.def("acquire", &Camera::acquire)
>  		.def("release", &Camera::release)
> -		.def("start", [](Camera &self) {
> +		.def("start", [](Camera &self, py::dict controls) {
>  			self.requestCompleted.connect(handleRequestCompleted);
>  
> -			int ret = self.start();
> +			const ControlInfoMap &controlMap = self.controls();
> +			ControlList controlList(controlMap);
> +			for (const auto& [hkey, hval]: controls) {
> +				auto key = hkey.cast<std::string>();
> +
> +				auto it = find_if(controlMap.begin(), controlMap.end(),
> +						  [&key](const auto &kvp) {
> +							  return kvp.first->name() == key; });
> +
> +				if (it == controlMap.end())
> +					throw runtime_error("Control " + key + " not found");
> +
> +				const auto &id = it->first;
> +				auto obj = py::cast<py::object>(hval);
> +
> +				controlList.set(id->id(), PyToControlValue(obj, id->type()));
> +			}
> +
> +			int ret = self.start(&controlList);
>  			if (ret)
>  				self.requestCompleted.disconnect(handleRequestCompleted);
>  
>  			return ret;
> -		})
> +		},
> +		py::arg("controls") = py::dict())
>  
>  		.def("stop", [](Camera &self) {
>  			int ret = self.stop();

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list