// render a nice avatar as a fallback
VideoRenderer(
call = call,
video = video, // ParticipantState.Media (video or screenSharing)
videoRendererConfig = videoRenderConfig(
fallbackContent = { call ->
val participants by call.state.participants.collectAsState()
val user = participants.firstOrNull { it.sessionId == video?.sessionId }
if (user != null) {
val image by user.image.collectAsState()
val name by user.name.collectAsState()
UserAvatar(
userImage = image,
userName = name
)
}
}
)
)Video Fallback
The video fallback appears when a participant's video track is unavailable.
ParticipantVideo and VideoRenderer display a user avatar as the default video fallback:

Here's an example of how to build your own video fallback. Let's say that you want to show a user avatar for video tracks that are not available.
If you use ParticipantVideo, which is built with the full participant information on top of the VideoRenderer, it will be much easier:
ParticipantVideo(
call = call,
participant = participant,
videoFallbackContent = {
val image by participant.image.collectAsState()
val name by participant.name.collectAsState()
UserAvatar(
userImage = image,
userName = name
)
}
)Customization
If you want to customize the video fallback from higher-level components, such as CallContent, you can achieve it easily by implementing videoRenderer composable parameter like the example below:
CallContent(
modifier = Modifier.background(color = VideoTheme.colors.appBackground),
onBackPressed = { finish() },
videoRenderer = { modifier, call, participant, style ->
ParticipantVideo(
modifier = modifier,
call = call,
participant = participant,
style = style,
videoFallbackContent = {
val image by participant.image.collectAsState()
val name by participant.name.collectAsState()
UserAvatar(
userImage = image,
userName = name
)
}
)
},
..
)