[libcamera-devel] [PATCH v5 04/13] py: cam.py: Use new events support
Tomi Valkeinen
tomi.valkeinen at ideasonboard.com
Wed Jun 7 11:35:47 CEST 2023
On 07/06/2023 10:31, Laurent Pinchart wrote:
> Hi Tomi,
>
> On Mon, Jun 05, 2023 at 12:37:26PM +0300, Tomi Valkeinen wrote:
>> On 05/06/2023 12:10, Tomi Valkeinen wrote:
>>> On 05/06/2023 08:10, Laurent Pinchart wrote:
>>>> On Sat, Jun 03, 2023 at 10:56:06AM +0300, Tomi Valkeinen wrote:
>>>>> Convert cam.py to use the new event dispatching. In addition to handling
>>>>> the request-completed event, handle also disconnect, camera-added and
>>>>> camera-removed events (which only do a simple print).
>>>>>
>>>>> Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ideasonboard.com>
>>>>> Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
>>>>> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>>>>> ---
>>>>> src/py/cam/cam.py | 27 +++++++++++++++++++++------
>>>>> 1 file changed, 21 insertions(+), 6 deletions(-)
>>>>>
>>>>> diff --git a/src/py/cam/cam.py b/src/py/cam/cam.py
>>>>> index a2a115c1..1e2d1f69 100755
>>>>> --- a/src/py/cam/cam.py
>>>>> +++ b/src/py/cam/cam.py
>>>>> @@ -230,11 +230,19 @@ class CaptureState:
>>>>> # Called from renderer when there is a libcamera event
>>>>> def event_handler(self):
>>>>> try:
>>>>> - reqs = self.cm.get_ready_requests()
>>>>> -
>>>>> - for req in reqs:
>>>>> - ctx = next(ctx for ctx in self.contexts if ctx.idx == req.cookie)
>>>>> - self.__request_handler(ctx, req)
>>>>> + for ev in self.cm.get_events():
>>>>> + type = ev.type
>>>>> +
>>>>> + if type == libcam.Event.Type.CameraAdded:
>>>>> + print(f'Camera {ev.camera} added')
>>>>> + elif type == libcam.Event.Type.CameraRemoved:
>>>>> + print(f'Camera {ev.camera} removed')
>>>>> + elif type == libcam.Event.Type.Disconnect:
>>>>> + print(f'Camera {ev.camera} disconnected')
>>>>> + elif type == libcam.Event.Type.RequestCompleted:
>>>>> + self.__request_handler(ev.camera, ev.request)
>>>>> + else:
>>>>> + raise RuntimeError("Bad event type")
>>>>
>>>> This will cause issues if we later add new event types. Wouldn't it be
>>>> better to ignore unknown event types, or possibly print a (one-time)
>>>> warning message ?
>>>
>>> Right, this error should never happen. Maybe this again shows that we
>>> have some unclear behavior in the bindings. If we make it so that all
>>> the events (including CameraManager's events) must be explicitly
>>> enabled, we can only handle the ones we have enabled, and raise an error
>>> for anything else (or assert). But if we do implicitly enable some
>>> events, we have to ignore any unhandled ones.
>
> Agreed.
>
>>> I'm leaning towards the explicit behavior, as these are somewhat low
>>> level bindings.
>
> Aonther option would be to always emit all events. I think I would
> prefer that, an event subscription mechanism seems a bit over-engineered
> to me, it's additional complexity for unclear gains. Could we skip it
> for now and introduce it later if needed ?
Perhaps that's the best option. It does rub me the wrong way, though,
doing at least a double amount of allocations (presuming the buffer
completed event is not used), but in the bigger picture it's perhaps in
the who-cares category.
Tomi
More information about the libcamera-devel
mailing list