Error codes
Every playback error surfaces as an OGPlayerError with a stable numeric
code that is identical across Android, iOS and web. Build your error UX
(logging, retry policies, user-facing copy in any language) against this table
once.
| Code | Name | Category | Retryable | Meaning |
|---|---|---|---|---|
| 2000 | NETWORK_CONNECTION_FAILED | Network | yes | Could not reach the server (offline, DNS, TLS). |
| 2001 | NETWORK_TIMEOUT | Network | yes | The request timed out. |
| 2002 | NETWORK_HTTP_STATUS | Network | 5xx yes | HTTP error status; 2000 + status when known (e.g. 2404). |
| 3000 | SOURCE_MALFORMED | Source | no | The manifest/container could not be parsed. |
| 3001 | SOURCE_UNSUPPORTED | Source | no | The stream format is not supported on this device. |
| 3002 | SOURCE_NOT_FOUND | Source | no | The stream URL does not exist. |
| 4000 | DRM_LICENSE_FAILED | DRM | no | The license request failed. |
| 4001 | DRM_LICENSE_HTTP_STATUS | DRM | 5xx yes | License-server HTTP error; 4000 + status when known. |
| 4002 | DRM_TOKEN_FETCH_FAILED | DRM | yes | Your tokenProvider threw or timed out. |
| 4003 | DRM_PROVISIONING_FAILED | DRM | yes | Device provisioning failed. |
| 4004 | DRM_SESSION_EXPIRED | DRM | yes | The license expired and could not renew. |
| 4005 | DRM_UNSUPPORTED | DRM | no | No usable DRM system on this device/browser. |
| 5000 | DECODER_INIT_FAILED | Renderer | no | Codec initialisation failed. |
| 5001 | DECODING_FAILED | Renderer | no | Decoding failed mid-stream. |
| 5002 | AUDIO_OUTPUT_FAILED | Renderer | no | The audio pipeline failed. |
| 6000 | BEHIND_LIVE_WINDOW | Live | yes | Playback fell behind the DVR window (the SDK first retries at the live edge). |
| 9000 | UNKNOWN | Unknown | no | Anything unmapped — carries the platform cause. |
Custom error messages
Section titled “Custom error messages”The player’s error overlay is yours: give the UI config an
errorMessageProvider and return your own copy — any language — for any code.
Returning nothing falls back to the SDK default. The raw error still reaches
onError unchanged.
// AndroidOGUiConfig.Builder() .setErrorMessageProvider { error -> myStrings.forErrorCode(error.code) // e.g. "Oeps! … (code 2404)" } .build()// iOSvar config = OGUIConfig()config.errorMessageProvider = { error in myStrings.forErrorCode(error.code)}// Webel.config = { errorMessageProvider: (error) => myStrings.forErrorCode(error.code),};