Backends
The two implementations the engine builds its pipeline from.
Both are passed in explicitly. Nothing is discovered: Kotlin/Native has no classpath service lookup, so a null here means the pipeline cannot be built, never that a platform default was found. Supplying them is how a test injects fakes, and how a new platform is reached without touching the engine.
Two objects rather than a bag of factories, because both groupings are load bearing. A MediaBackend hands over a source and the decoder factories that belong to it as one session, so the engine never has to reach a backend's internals to find its decoders. An OutputBackend pairs the clock with the sink that reports on it, so a clock and a sink that measure different time bases cannot be assembled at all.
KitePlayer.create resolves both and refuses to build a player without them, with PlaybackError.ConfigurationInvalid naming what to pass. On macOS that pair is KiteFFmpegMediaBackend() from kiteplayer-ffmpeg and AppleOutputBackend from kiteplayer-output.