Platform parity matrix
The SDKs implement one shared API — same names, same semantics, same behavior on every platform. React Native and Flutter wrap the native Android and iOS players, so they inherit their engines feature-for-feature; the columns below show what the wrappers expose today. Current status, feature by feature:
| Feature | Android | iOS | Web | React Native | Flutter |
|---|---|---|---|---|---|
| Transport / state / listeners | ✅ | ✅ | ✅ same names | ✅ same names | ✅ same names |
| Analytics events (session-stamped) | ✅ | ✅ | ✅ same shapes | ✅ same shapes | ✅ same shapes |
| Error taxonomy (2000–9000) | ✅ | ✅ | ✅ same codes | ✅ same codes | ✅ same codes |
| HLS + ABR qualities | ✅ | ✅ | ✅ hls.js / native | ✅ native engines | ✅ native engines |
| DASH | ✅ | — | ✅ dash.js · Tizen / webOS via ogplayer/tv | ✅ Android side | ✅ Android side |
| Live & DVR | ✅ | ✅ | ✅ | ✅ | ✅ |
| Low-latency HLS (partial segments) | ✅ | ✅ | ✅ default profile (TV profile: off) | ✅ native engines | ✅ native engines |
| Live snapshot (DVR window, latency, wall-clock playhead) | ✅ liveInfo | ✅ liveInfo | ✅ liveInfo | ✅ ref.getLiveInfo() | ✅ getLiveInfo() |
| Subtitles (embedded + sideloaded) | ✅ | ✅ | ✅ | ✅ | ✅ |
| Multi-language audio | ✅ | ✅ | ✅ | ✅ | ✅ |
| DRM | Widevine · PlayReady | FairPlay | Widevine · PlayReady · FairPlay | Widevine · PlayReady · FairPlay | Widevine · PlayReady · FairPlay |
| DRM token providers + renewal | ✅ | ✅ | ✅ | ✅ JS function | ✅ Dart function |
FairPlay lease renewal (renewalInterval) | n/a (the CDM renews Widevine) | ✅ | — | ✅ seconds | ✅ Duration |
Silent-recovery analytics (PlaybackRecovered) | ✅ 3 reasons | by design BufferStart/BufferEnd | ✅ 4 reasons | ✅ Android side | ✅ Android side |
| Ads — Google IMA | ✅ | ✅ | ✅ | ✅ | ✅ |
| Ads — FreeWheel | ✅ native + VMAP | ✅ native + VMAP | ✅ native + VMAP | ⏳ not yet | ⏳ not yet |
| Controls chrome + theming tokens | ✅ | ✅ | ✅ | ✅ controls · icons · tokens | ✅ controls · icons · tokens |
| Custom action icons (≤8) | ✅ | ✅ | ✅ | ✅ by resource name | ✅ by resource name |
| Custom error messages | ✅ | ✅ | ✅ | ✅ message map | ✅ message map |
| Chrome localisation (strings map) | ✅ | ✅ | ✅ + locale for track names | ✅ same keys | ✅ same keys |
| Accessibility labels on the chrome | ✅ TalkBack | ✅ VoiceOver | ✅ ARIA | ✅ native | ✅ native |
| Watermarks / 9 overlay slots | ✅ | ✅ | ✅ | ✅ text + image by name | ✅ text + image by name |
| Content ratings (Kijkwijzer-style) | ✅ | ✅ | ✅ | ✅ preset artwork | ✅ preset artwork |
| Trick-play thumbnails | ✅ | ✅ | ✅ | ✅ | ✅ |
| Fullscreen (+ start-in, exit interception) | ✅ | ✅ | ✅ gesture-gated | ✅ | ✅ |
| Picture-in-picture | ✅ | ✅ | ✅ API + browser auto-enter | ✅ | ✅ |
| TV — remote-control chrome | ✅ Android TV · Google TV · Fire TV | ✅ Apple TV (tvOS 18+) | ✅ Samsung Tizen · LG webOS (ogplayer/tv) | — | — |
| Offline downloads + offline DRM | ✅ Widevine | ✅ FairPlay | — | ✅ via native | ✅ via native |
| Casting | Chromecast | AirPlay | ⏳ Remote Playback API | Chromecast · AirPlay | Chromecast · AirPlay |
| Offline license verification | ✅ | ✅ | ✅ WebCrypto | ✅ via native | ✅ via native |
| Ad-blocker policy | n/a | n/a | ✅ notice / block | n/a | n/a |