| Message ID | 20201113063815.10288-1-laurent.pinchart@ideasonboard.com |
|---|---|
| Headers | show |
| Series |
|
| Related | show |
Hi Laurent, On 13/11/2020 06:38, Laurent Pinchart wrote: > Hello, > > This patch series improves the cam application by moving request > processing to the main thread to avoid blocking the camera manager > thread (in which the request completion signal is emitted) for extended > periods of time. This helps meeting the realtime constraints of pipeline > handlers. > > Note that move requesting processing to a different thread isn't a > magical solution, if the average processing time for a request is larger > than the frame interval, a request queue underrun will still occur. It > however helps handling random delays in request processing. > > Included in the series is a move to libevent to implement the cam event > loop. The event loop is currently based on the libcamera event > dispatcher for historical reasons. The event dispatcher API exposed by > libcamera is incomplete, as thread support is internal to libcamera. > Instead of reimplementing the missing parts in the cam event loop, or > exposing thread support in the libcamera public API, moving to libevent > allows making the event dispatcher implementation fully private (in > patch 3/5). It isn't the job of libcamera to provide such generic APIs. This series breaks simple-cam. Will you plan to update that too? If not I'll handle it, just let me know. -- Thanks Kieran > Laurent Pinchart (5): > test: Get event dispatcher from current thread > cam: Use libevent to implement event loop > libcamera: Move EventDispatcher to internal API > cam: event_loop: Add deferred calls support > cam: Move request processing to main thread > > include/libcamera/camera_manager.h | 4 -- > .../{ => internal}/event_dispatcher.h | 0 > .../internal/event_dispatcher_poll.h | 2 +- > .../libcamera/{ => internal}/event_notifier.h | 0 > include/libcamera/internal/meson.build | 3 + > include/libcamera/{ => internal}/timer.h | 0 > include/libcamera/meson.build | 3 - > src/cam/capture.cpp | 9 +++ > src/cam/capture.h | 1 + > src/cam/event_loop.cpp | 63 ++++++++++++++++--- > src/cam/event_loop.h | 24 ++++--- > src/cam/main.cpp | 16 ++--- > src/cam/meson.build | 13 +++- > src/libcamera/camera_manager.cpp | 44 +------------ > src/libcamera/device_enumerator_udev.cpp | 3 +- > src/libcamera/event_dispatcher.cpp | 2 +- > src/libcamera/event_dispatcher_poll.cpp | 5 +- > src/libcamera/event_notifier.cpp | 4 +- > src/libcamera/ipc_unixsocket.cpp | 3 +- > src/libcamera/pipeline/rkisp1/timeline.h | 3 +- > src/libcamera/process.cpp | 3 +- > .../proxy/worker/ipa_proxy_linux_worker.cpp | 2 +- > src/libcamera/thread.cpp | 3 +- > src/libcamera/timer.cpp | 4 +- > src/libcamera/v4l2_device.cpp | 3 +- > src/libcamera/v4l2_videodevice.cpp | 2 +- > test/camera/buffer_import.cpp | 8 +-- > test/camera/capture.cpp | 9 ++- > test/event-dispatcher.cpp | 5 +- > test/event-thread.cpp | 5 +- > test/event.cpp | 7 +-- > test/hotplug-cameras.cpp | 4 +- > test/ipa/ipa_interface_test.cpp | 6 +- > test/ipc/unixsocket.cpp | 5 +- > test/log/log_process.cpp | 4 +- > test/object-invoke.cpp | 2 +- > test/process/process_test.cpp | 5 +- > test/timer-thread.cpp | 5 +- > test/timer.cpp | 5 +- > test/v4l2_videodevice/buffer_sharing.cpp | 4 +- > test/v4l2_videodevice/capture_async.cpp | 4 +- > test/v4l2_videodevice/v4l2_m2mdevice.cpp | 4 +- > 42 files changed, 159 insertions(+), 142 deletions(-) > rename include/libcamera/{ => internal}/event_dispatcher.h (100%) > rename include/libcamera/{ => internal}/event_notifier.h (100%) > rename include/libcamera/{ => internal}/timer.h (100%) >
Hi Kieran, On Mon, Nov 16, 2020 at 11:47:49AM +0000, Kieran Bingham wrote: > On 13/11/2020 06:38, Laurent Pinchart wrote: > > Hello, > > > > This patch series improves the cam application by moving request > > processing to the main thread to avoid blocking the camera manager > > thread (in which the request completion signal is emitted) for extended > > periods of time. This helps meeting the realtime constraints of pipeline > > handlers. > > > > Note that move requesting processing to a different thread isn't a > > magical solution, if the average processing time for a request is larger > > than the frame interval, a request queue underrun will still occur. It > > however helps handling random delays in request processing. > > > > Included in the series is a move to libevent to implement the cam event > > loop. The event loop is currently based on the libcamera event > > dispatcher for historical reasons. The event dispatcher API exposed by > > libcamera is incomplete, as thread support is internal to libcamera. > > Instead of reimplementing the missing parts in the cam event loop, or > > exposing thread support in the libcamera public API, moving to libevent > > allows making the event dispatcher implementation fully private (in > > patch 3/5). It isn't the job of libcamera to provide such generic APIs. > > This series breaks simple-cam. > > Will you plan to update that too? > If not I'll handle it, just let me know. If you can handle it, that would be nice. Otherwise I'll do so. Sorry about the breakage :-S Regarding the event loop implementation in simple-cam, should we just copy the one from cam ? > > Laurent Pinchart (5): > > test: Get event dispatcher from current thread > > cam: Use libevent to implement event loop > > libcamera: Move EventDispatcher to internal API > > cam: event_loop: Add deferred calls support > > cam: Move request processing to main thread > > > > include/libcamera/camera_manager.h | 4 -- > > .../{ => internal}/event_dispatcher.h | 0 > > .../internal/event_dispatcher_poll.h | 2 +- > > .../libcamera/{ => internal}/event_notifier.h | 0 > > include/libcamera/internal/meson.build | 3 + > > include/libcamera/{ => internal}/timer.h | 0 > > include/libcamera/meson.build | 3 - > > src/cam/capture.cpp | 9 +++ > > src/cam/capture.h | 1 + > > src/cam/event_loop.cpp | 63 ++++++++++++++++--- > > src/cam/event_loop.h | 24 ++++--- > > src/cam/main.cpp | 16 ++--- > > src/cam/meson.build | 13 +++- > > src/libcamera/camera_manager.cpp | 44 +------------ > > src/libcamera/device_enumerator_udev.cpp | 3 +- > > src/libcamera/event_dispatcher.cpp | 2 +- > > src/libcamera/event_dispatcher_poll.cpp | 5 +- > > src/libcamera/event_notifier.cpp | 4 +- > > src/libcamera/ipc_unixsocket.cpp | 3 +- > > src/libcamera/pipeline/rkisp1/timeline.h | 3 +- > > src/libcamera/process.cpp | 3 +- > > .../proxy/worker/ipa_proxy_linux_worker.cpp | 2 +- > > src/libcamera/thread.cpp | 3 +- > > src/libcamera/timer.cpp | 4 +- > > src/libcamera/v4l2_device.cpp | 3 +- > > src/libcamera/v4l2_videodevice.cpp | 2 +- > > test/camera/buffer_import.cpp | 8 +-- > > test/camera/capture.cpp | 9 ++- > > test/event-dispatcher.cpp | 5 +- > > test/event-thread.cpp | 5 +- > > test/event.cpp | 7 +-- > > test/hotplug-cameras.cpp | 4 +- > > test/ipa/ipa_interface_test.cpp | 6 +- > > test/ipc/unixsocket.cpp | 5 +- > > test/log/log_process.cpp | 4 +- > > test/object-invoke.cpp | 2 +- > > test/process/process_test.cpp | 5 +- > > test/timer-thread.cpp | 5 +- > > test/timer.cpp | 5 +- > > test/v4l2_videodevice/buffer_sharing.cpp | 4 +- > > test/v4l2_videodevice/capture_async.cpp | 4 +- > > test/v4l2_videodevice/v4l2_m2mdevice.cpp | 4 +- > > 42 files changed, 159 insertions(+), 142 deletions(-) > > rename include/libcamera/{ => internal}/event_dispatcher.h (100%) > > rename include/libcamera/{ => internal}/event_notifier.h (100%) > > rename include/libcamera/{ => internal}/timer.h (100%)
Hello, This patch series improves the cam application by moving request processing to the main thread to avoid blocking the camera manager thread (in which the request completion signal is emitted) for extended periods of time. This helps meeting the realtime constraints of pipeline handlers. Note that move requesting processing to a different thread isn't a magical solution, if the average processing time for a request is larger than the frame interval, a request queue underrun will still occur. It however helps handling random delays in request processing. Included in the series is a move to libevent to implement the cam event loop. The event loop is currently based on the libcamera event dispatcher for historical reasons. The event dispatcher API exposed by libcamera is incomplete, as thread support is internal to libcamera. Instead of reimplementing the missing parts in the cam event loop, or exposing thread support in the libcamera public API, moving to libevent allows making the event dispatcher implementation fully private (in patch 3/5). It isn't the job of libcamera to provide such generic APIs. Laurent Pinchart (5): test: Get event dispatcher from current thread cam: Use libevent to implement event loop libcamera: Move EventDispatcher to internal API cam: event_loop: Add deferred calls support cam: Move request processing to main thread include/libcamera/camera_manager.h | 4 -- .../{ => internal}/event_dispatcher.h | 0 .../internal/event_dispatcher_poll.h | 2 +- .../libcamera/{ => internal}/event_notifier.h | 0 include/libcamera/internal/meson.build | 3 + include/libcamera/{ => internal}/timer.h | 0 include/libcamera/meson.build | 3 - src/cam/capture.cpp | 9 +++ src/cam/capture.h | 1 + src/cam/event_loop.cpp | 63 ++++++++++++++++--- src/cam/event_loop.h | 24 ++++--- src/cam/main.cpp | 16 ++--- src/cam/meson.build | 13 +++- src/libcamera/camera_manager.cpp | 44 +------------ src/libcamera/device_enumerator_udev.cpp | 3 +- src/libcamera/event_dispatcher.cpp | 2 +- src/libcamera/event_dispatcher_poll.cpp | 5 +- src/libcamera/event_notifier.cpp | 4 +- src/libcamera/ipc_unixsocket.cpp | 3 +- src/libcamera/pipeline/rkisp1/timeline.h | 3 +- src/libcamera/process.cpp | 3 +- .../proxy/worker/ipa_proxy_linux_worker.cpp | 2 +- src/libcamera/thread.cpp | 3 +- src/libcamera/timer.cpp | 4 +- src/libcamera/v4l2_device.cpp | 3 +- src/libcamera/v4l2_videodevice.cpp | 2 +- test/camera/buffer_import.cpp | 8 +-- test/camera/capture.cpp | 9 ++- test/event-dispatcher.cpp | 5 +- test/event-thread.cpp | 5 +- test/event.cpp | 7 +-- test/hotplug-cameras.cpp | 4 +- test/ipa/ipa_interface_test.cpp | 6 +- test/ipc/unixsocket.cpp | 5 +- test/log/log_process.cpp | 4 +- test/object-invoke.cpp | 2 +- test/process/process_test.cpp | 5 +- test/timer-thread.cpp | 5 +- test/timer.cpp | 5 +- test/v4l2_videodevice/buffer_sharing.cpp | 4 +- test/v4l2_videodevice/capture_async.cpp | 4 +- test/v4l2_videodevice/v4l2_m2mdevice.cpp | 4 +- 42 files changed, 159 insertions(+), 142 deletions(-) rename include/libcamera/{ => internal}/event_dispatcher.h (100%) rename include/libcamera/{ => internal}/event_notifier.h (100%) rename include/libcamera/{ => internal}/timer.h (100%)