[PATCH v3 3/7] controls: Add camera synchronisation controls for Raspberry Pi
Kieran Bingham
kieran.bingham at ideasonboard.com
Thu Jan 9 17:26:25 CET 2025
Quoting David Plowman (2025-01-09 14:32:07)
> New controls are added to control the camera "sync" algorithm, which
> allows different cameras to synchronise their frames. For the time
> being, the controls are Raspberry Pi specific, though this is expected
> to change in future.
>
> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
> Reviewed-by: Naushir Patuck <naush at raspberrypi.com>
Acked-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
> src/libcamera/control_ids_rpi.yaml | 113 +++++++++++++++++++++++++++++
> 1 file changed, 113 insertions(+)
>
> diff --git a/src/libcamera/control_ids_rpi.yaml b/src/libcamera/control_ids_rpi.yaml
> index 7524c5d2..5c2721c0 100644
> --- a/src/libcamera/control_ids_rpi.yaml
> +++ b/src/libcamera/control_ids_rpi.yaml
> @@ -58,4 +58,117 @@ controls:
> official libcamera API support for per-stream controls in the future.
>
> \sa ScalerCrop
> +
> + - SyncMode:
> + type: int32_t
> + direction: in
> + description: |
> + Enable or disable camera synchronisation ("sync") mode.
> +
> + When sync mode is enabled, a camera will synchronise frames temporally
> + with other cameras, either attached to the same device or a different
> + one. There should be one "server" device, which broadcasts timing
> + information to one or more "clients". Communication is one-way, from
> + server to clients only, and it is only clients that adjust their frame
> + timings to match the server.
> +
> + Sync mode requires all cameras to be running at (as far as possible) the
> + same fixed framerate. Clients may continue to make adjustments to keep
> + their cameras synchronised with the server for the duration of the
> + session, though any updates after the initial ones should remain small.
> +
> + \sa SyncReady
> + \sa SyncTimer
> + \sa SyncFrames
> +
> + enum:
> + - name: SyncModeOff
> + value: 0
> + description: Disable sync mode.
> + - name: SyncModeServer
> + value: 1
> + description: |
> + Enable sync mode, act as server. The server broadcasts timing
> + messages to any clients that are listening, so that the clients can
> + synchronise their camera frames with the server's.
> + - name: SyncModeClient
> + value: 2
> + description: |
> + Enable sync mode, act as client. A client listens for any server
> + messages, and arranges for its camera frames to synchronise as
> + closely as possible with the server's. Many clients can listen out
> + for the same server. Clients can also be started ahead of any
> + servers, causing them merely to wait for the server to start.
> +
> + - SyncReady:
> + type: bool
> + direction: out
> + description: |
> + When using the camera synchronisation algorithm, the server broadcasts
> + timing information to the clients. This also includes the time (some
> + number of frames in the future, called the "ready time") at which the
> + server will signal its controlling application, using this control, to
> + start using the image frames.
> +
> + The client receives the "ready time" from the server, and will signal
> + its application to start using the frames at this same moment.
> +
> + While this control value is false, applications (on both client and
> + server) should continue to wait, and not use the frames.
> +
> + Once this value becomes true, it means that this is the first frame
> + where the server and its clients have agreed that they will both be
> + synchronised and that applications should begin consuming frames.
> + Thereafter, this control will continue to signal the value true for
> + the rest of the session.
> +
> + \sa SyncMode
> + \sa SyncTimer
> + \sa SyncFrames
> +
> + - SyncTimer:
> + type: int64_t
> + direction: out
> + description: |
> + This reports the amount of time, in microseconds, until the "ready
> + time", at which the server and client will signal their controlling
> + applications that the frames are now synchronised and should be
> + used. The value may be refined slightly over time, becoming more precise
> + as the "ready time" approaches.
> +
> + Servers always report this value, whereas clients will omit this control
> + until they have received a message from the server that enables them to
> + calculate it.
> +
> + Normally the value will start positive (the "ready time" is in the
> + future), and decrease towards zero, before becoming negative (the "ready
> + time" has elapsed). So there should be just one frame where the timer
> + value is, or is very close to, zero - the one for which the SyncReady
> + control becomes true. At this moment, the value indicates how closely
> + synchronised the client believes it is with the server.
> +
> + But note that if frames are being dropped, then the "near zero" valued
> + frame, or indeed any other, could be skipped. In these cases the timer
> + value allows an application to deduce that this has happened.
> +
> + \sa SyncMode
> + \sa SyncReady
> + \sa SyncFrames
> +
> + - SyncFrames:
> + type: int32_t
> + direction: in
> + description: |
> + The number of frames the server should wait, after enabling
> + SyncModeServer, before signalling (via the SyncReady control) that
> + frames should be used. This therefore determines the "ready time" for
> + all synchronised cameras.
> +
> + This control value should be set only for the device that is to act as
> + the server, before or at the same moment at which SyncModeServer is
> + enabled.
> +
> + \sa SyncMode
> + \sa SyncReady
> + \sa SyncTimer
> ...
> --
> 2.39.5
>
More information about the libcamera-devel
mailing list