KitePlayerVideo
One video composable over both rendering products, switchable while media plays.
path is a request. When it changes, the old presentation leaves composition and detaches identity-checked, then the new one attaches to the same running player; the engine keeps playing through the swap and rebuilds a coupled decoder by itself (see KitePlayer.attachRenderer). onEffectivePath reports what actually runs, which differs from path where a platform cannot honour it. On desktop both paths are real, but a native view cannot have clickable Compose content drawn over it, because macOS routes a click to the topmost native view; put such controls in an owned overlay window. The player is never owned here: opening media, playing, seeking and closing stay the caller's, exactly like KitePlayerSurface.
onRendererAttached fires once this composable's video output is attached to player: the native view attaches as soon as the player is set, the Compose canvas one frame after composition. Media does not have to wait for it: a player that opened before its output existed moves to the renderer's own decoder when the renderer arrives. It fires again after each path swap, so a one-shot caller must latch it.
keepDisplayAwake keeps the display from dimming and locking while player plays video and this composable is on screen. True by default. A paused or ended player, or one that plays audio only, lets the display sleep again. The desktop accepts it and does nothing, because the desktop JVM has no call for it.
accessibilityVideoLabel and accessibilityStateFormat are what a screen reader says about the video, on both paths: the label, and the state built from the status, the position and the duration. Null keeps the English default, "Video" and accessibilityStateText.