[libcamera-devel] [PATCH v1 0/5] cam: Move request processing to main thread

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Nov 13 07:38:10 CET 2020


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%)

-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list