LivestreamPlayer

fun LivestreamPlayer(modifier: Modifier = Modifier, call: Call, enablePausing: Boolean = true, onPausedPlayer: (isPaused: Boolean) -> Unit? = {}, backstageContent: @Composable BoxScope.(Call) -> Unit = { LivestreamBackStage(call) }, videoRendererConfig: VideoRendererConfig = videoRenderConfig(), livestreamFlow: Flow<ParticipantState.Video?> = call.state.participants.flatMapLatest { participants -> // Re-sort by ingress source priority before picking. The grid-level preset // already orders ingress sources first, but applying the livestream-specific // priority here makes the picker independent of whatever preset is active — // changing the grid preset cannot accidentally affect the livestream host. // Stable sort preserves the upstream order among equal-priority participants. val sorted = participants.sortedWith( bySourcePriority( ParticipantSource.PARTICIPANT_SOURCE_RTMP, ParticipantSource.PARTICIPANT_SOURCE_WHIP, ParticipantSource.PARTICIPANT_SOURCE_SRT, ParticipantSource.PARTICIPANT_SOURCE_RTSP, ), ) if (sorted.isEmpty()) { flow { emit(null) } } else { combine( sorted.map { participant -> participant.videoEnabled.map { enabled -> participant to enabled } }, ) { pairs -> pairs.firstOrNull { (_, enabled) -> enabled }?.first } } }.flatMapLatest { participant -> participant?.video ?: flow { emit(null) } }, rendererContent: @Composable BoxScope.(Call) -> Unit = defaultRenderer, overlayContent: @Composable BoxScope.(Call) -> Unit = defaultLivestreamPlayerOverlay, liveStreamEndedContent: @Composable BoxScope.(Call) -> Unit = { LivestreamEndedUi(call) }, liveStreamHostVideoNotAvailableContent: @Composable BoxScope.(Call) -> Unit = { HostVideoNotAvailableUi(call) }, liveStreamErrorContent: @Composable BoxScope.(Call, () -> Unit) -> Unit = { _, retryJoin -> LivestreamErrorUi(call, retryJoin) }, onRetryJoin: () -> Unit = {})

Renders a livestream video player UI based on the current state of the provided call.

This composable adapts its content based on the livestreamState, displaying backstage, live, ended, or error views accordingly. It supports pause/resume controls, retry logic, and customizable UI slots for various livestream stages.

Parameters

modifier

Modifier used to style the livestream container.

call

The call instance providing state and media tracks for rendering.

enablePausing

Whether the livestream video can be paused and resumed by the viewer.

onPausedPlayer

Callback to observe pause/resume interactions.

backstageContent

UI shown when the host hasn't started the livestream.

videoRendererConfig

Configuration for how the video is rendered internally.

livestreamFlow

A Flow emitting the video track of the host or primary speaker.

rendererContent

UI responsible for rendering the host’s video stream.

overlayContent

UI layered on top of the video for participant counts, controls, etc.

liveStreamEndedContent

UI shown when the livestream has ended.

liveStreamHostVideoNotAvailableContent

UI shown when the host has no video available.

liveStreamErrorContent

UI shown in case of an error joining or rendering the livestream.

onRetryJoin

Callback triggered when retrying to join the livestream after a failure.