Companion
Properties
The VideoSDK account is deactivated, so rooms cannot be joined.
The VideoSDK account is discontinued; the server sends the specific reason in message.
Adaptive subscription was disabled while it was already off; nothing changed.
Adaptive subscription was enabled while it was already on; nothing changed.
Adaptive subscription is not enabled for this account, so it cannot be turned on.
Recording, livestream, HLS and similar add-on services are not enabled for this account.
The API key in the token has been deactivated. Joining fails.
A request to change the room mode was rejected; the mode is unchanged.
A request to change the translation language was rejected; the language is unchanged.
This device cannot decode the codec a remote participant is sending, so their video will not render. Delivered to the receiver; the sender hears about the resulting fallback through onCodecChanged instead.
The server could not start sending a participant's microphone stream to this device.
The server could not start sending a participant's camera stream to this device.
The server could not set up receiving a remote participant's stream, so it will not play.
A request to turn off another participant's microphone was rejected.
A request to turn off another participant's camera was rejected.
The same participant ID joined from another device, so this device is being removed.
A request to turn on another participant's microphone was rejected.
A request to turn on another participant's camera was rejected.
The action does not apply to this target — pausing your own stream, changing quality with no video track, an unknown pin type. The message names the specific case.
Publishing was attempted from a mode that cannot publish — only Mode.SEND_AND_RECV may send media. Change the mode first with Room.changeMode.
An action was called before the join completed, so it did not run. Wait for RoomEventListener.onRoomJoined.
The room is already in the state the action asked for, so nothing happened — leaving twice, or asking for the mode already in force. Usually harmless to ignore.
The microphone track could not be built — most often an audio profile name the SDK does not know. Check the encoderConfig you passed.
The Bluetooth SCO link would not come up after every retry, so the call is not going through the headset. The SDK stops routing to it and audio falls back, until the headset is disconnected and reconnected. Reported only while a room is active.
The Bluetooth permission was not granted at startup, so no Bluetooth device appears in the audio device list. Fires once, and only to a room active at that moment — nothing needs re-doing afterwards, because the SDK picks the devices up by itself once the permission is granted.
Not raised by the Android SDK — a camera fault arrives as one of 3017 to 3027 instead.
Not raised by the Android SDK — a refused camera arrives as 3017.
The CAMERA permission is not granted when capture starts, or the system refused the open. Request the permission, then enable the webcam again.
The camera cannot be reached: the room's media server will not carry video, or the camera list could not be read by Room.changeCam.
Another app holds the camera, or the device is at its limit for simultaneous camera clients. Nothing the app can do but tell the user and retry.
No camera matched: either the device exposes none at all, or the camera id does not exist. Room.changeCam reports 3051 for an unknown id instead.
The camera is switched off by device policy — a managed device or a work profile. Granting the app the CAMERA permission will not help; the policy has to change.
A browser autoplay fault. The Android SDK never raises it.
Capturing a snapshot of the local participant's video frame failed.
Not raised by the Android SDK — a failed camera switch arrives as 3051 or 3033.
The custom audio track handed to the join or to unmuteMic had already ended. The SDK reports it, then opens the microphone from that track's own settings and carries on.
Not raised by the Android SDK — a disposed custom share track arrives as 3031.
Not raised by the Android SDK — an ended custom share track arrives as 3031.
The custom video track handed to the join or to enableCam had already ended. The SDK reports it, then opens the camera from that track's own settings and carries on.
The request to end the room for everyone was rejected. The room is still running.
Room.fetchBase64File could not send the request, or the server refused it.
Room.uploadBase64File could not send the file, or the server refused it.
Audio capture is not available on this device. Android reports the specific microphone fault instead — 3018, 3022 or 3024.
Microphone capture was refused. Android reports 3018 instead.
The room's media server will not carry video, so screen sharing cannot start.
The screen-capture consent could not be used when the share started — it had already been spent, or it expired. Ask for consent again and retry.
Video capture is not available on this device. Android reports the specific camera fault instead — 3017, 3019, 3021, 3023 or 3026.
Camera capture was refused. Android reports 3017 or 3019 instead.
The custom audio track passed in cannot be used, so the SDK falls back to its own microphone track.
A track factory was given something it does not recognise — an unknown encoder profile name, or a camera or microphone id that matches no device.
The custom video track passed in cannot be used, so the SDK falls back to its own camera track.
The requested room mode is not one of Mode. The mode is unchanged.
A required argument was empty or malformed — a missing token or room ID passed to VideoSDK.createRoom, for example.
A camera, microphone or screen-share publish ran before the room's media connection was set up, so it did not run. Try again once the room is joined.
The media layer is still starting up. Try again in a moment.
The media connection is not up yet, so the action did not run — for Room.send, the data channel had not opened. Try again in a moment.
Not raised by the Android SDK — a refused microphone arrives as 3018.
The RECORD_AUDIO permission is not granted when the input opens, or the system refused it. Request the permission, then unmute again.
The microphone cannot be reached: the room's media server will not carry audio, or the microphone list could not be read by Room.changeMic.
The microphone could not be turned off. It may still be capturing and sending.
The audio input would not open or would not start recording, almost always because another app holds the microphone.
The device reports no audio input, so no microphone track can be created.
The microphone counterpart of 3019. Android reports 3018 or 3024 instead.
The microphone opened but the server would not accept the audio, so nothing is being sent.
The microphone input stopped after it had been recording. Unmute again to reopen it.
Simulcast was asked for with a codec that cannot carry it — AV1, VP9 or H264 — so one layer is sent instead. Video still works; remote participants just cannot switch quality. Use VP8 if you need simulcast.
No microphone matches the device passed to Room.changeMic. Nothing changes — pick one from VideoSDK.getMics.
Nothing this device can encode is on the room's codec list, so video cannot be published.
No camera matches the id passed to Room.changeCam. Nothing changes — take the ids from VideoSDK.getCameras().
The room closed after the action was accepted but before it reached the server, so it never ran. It does not mean the room was never joined — the action was simply in flight when the session ended.
The same operation is still in flight — a second unmuteMic() before the first finished, a join() while one is running, a toggle during changeMode(). The first one wins; nothing is queued, so retry after the first finishes if you need both.
The server did not answer the request before its deadline. Whether it ran is unknown, so read the state back rather than assuming it failed.
A Room.send payload is over the 15 KiB data-channel limit, so nothing was sent. Split it into smaller messages.
React Native only: camera access refused. Native Android reports 3017.
React Native only: the camera is unreachable. Native Android reports 3033.
React Native only: no camera found. Native Android reports 3021 or 3051.
React Native only: the camera track ended. Native Android reports 3027.
React Native only: microphone access refused. Native Android reports 3018.
React Native only: the microphone is unreachable. Native Android reports 3034.
React Native only: no microphone found. Native Android reports 3022 or 3059.
React Native only: the microphone track ended. Native Android reports 3028.
Signalling or media could not be established — usually a firewall or a network that blocks UDP. Worth telling the user to try another network before retrying.
An action was called while the room was reconnecting. It did not run and is not retried — call it again once RoomEventListener.onRoomStateChanged reports RoomState.CONNECTED.
Screen sharing could not be stopped. The share may still be running.
The screen share could not be published to the room.
A Room.send payload reached the data channel and the transport rejected it. A real fault, so it is announced on onError as well as thrown.
The webcam quality change was rejected. The camera keeps its current settings.
The join failed and no more specific cause was available — network unreachable, transport aborted. Retrying is reasonable.
A requested VideoEffectsConfig.Pipeline.GRAPH pipeline could not start, so video is sent without effects on VideoEffectsConfig.Pipeline.LEGACY. The camera and the call keep running. The message ends with the cause.
The codec you asked for could not be encoded on this device, so the video you send falls back to VP8. Delivered to the sender; a participant who cannot decode what you send gets CODEC_NOT_SUPPORTED instead.
The camera is there but could not be brought up: the capture session would not configure, or the camera dropped before the first frame. Retrying usually works.
The camera track could not be built — most often an encoder profile name the SDK does not know. Check the encoderConfig you passed.
The camera could not be turned off. It may still be capturing and sending.
The webcam is off, so there is nothing to act on. Thrown by Room.setWebcamQuality and Participant.captureImage; enable the webcam first.
The camera opened but the server would not accept the video, so nothing is being sent.
The camera stopped after it had been streaming — taken by a higher-priority app, unplugged, or disabled by policy. The video track is dead; enable the webcam again to get a new one.
Reading a value from the realtime store failed; no value was returned.
Starting to watch a realtime store key for changes failed; no updates will arrive.
Writing a value to the realtime store failed; the value was not stored.
Stopping watching a realtime store key failed; updates may keep arriving.
The HLS stream hit the two-hour per-session limit and was stopped. Start a new one to keep streaming.
An HLS stream that was already running stopped unexpectedly.
The API key in the token is missing or not recognised. Joining fails.
The livestream outputs passed to the start request were rejected as invalid.
The participant ID is missing or contains characters that are not allowed. Joining fails.
The permissions encoded in the token are not a valid combination. Joining fails.
The room ID is missing or not a valid ID. Joining fails.
The token is missing, malformed, or has expired. Joining fails.
The livestream hit the two-hour per-session limit and was stopped. Start a new one to keep streaming.
A livestream that was already running stopped unexpectedly.
The organization is at its concurrent HLS limit, so HLS cannot start.
The organization is at its concurrent livestream limit, so the livestream cannot start.
The room is full, so this participant cannot join. The limit is set per account.
The organization is at its concurrent recording limit, so recording cannot start.
The organization is at its limit for participants joining in receive-only mode.
The organization is at its concurrent speaker limit across all rooms.
The room is already at its speaker limit, so this participant cannot join as a speaker.
The organization is at its concurrent viewer limit across all rooms.
A request to pause every incoming stream was rejected; the streams keep playing.
Pausing a single incoming stream failed; it keeps playing.
Pinning a participant failed; the pin state is unchanged.
HLS cannot start yet because the previous HLS session is still being processed.
Recording cannot start yet because the previous recording is still being processed.
A livestream cannot start yet because the previous RTMP session is still being processed.
A published message was not delivered — the server rejected it, or the connection dropped before it was acknowledged. Nobody received it; publish again.
A topic subscription was rejected, and the listener was unregistered again — no messages will arrive.
Unsubscribing was rejected by the server, but the listener is already gone locally, so nothing is delivered.
The recording hit the two-hour per-session limit and was stopped. Start a new one to keep recording.
A recording that was already running stopped unexpectedly.
A request to remove a participant was rejected; they remain in the room.
A request to relay media from another room was rejected; no relay started.
Allowing or denying a participant's request to enter the room failed.
Accepting or rejecting an incoming media relay request failed.
A request to resume every incoming stream was rejected; the streams stay paused.
Resuming a single incoming stream failed; it stays paused.
The room ID has been disabled and can no longer be joined.
A request to change an incoming stream's quality was rejected; the quality is unchanged.
A server-side failure with no specific code. The message, if there is one, is the only detail.
A request to start composite recording was rejected.
A request to start HLS was rejected; HLS did not start.
A request to start a livestream was rejected; the livestream did not start.
A request to start recording a single participant was rejected.
A request to start recording was rejected; recording did not start.
A request to start recording an individual track was rejected.
A request to start transcription was rejected; transcription did not start.
A request to start translation was rejected; translation did not start.
A request to start the whiteboard was rejected; the whiteboard did not open.
A request to stop composite recording was rejected.
The server could not stop sending a participant's microphone stream to this device.
The server could not stop sending a participant's camera stream to this device.
A request to stop HLS was rejected; HLS may still be running.
A request to stop a livestream was rejected; the livestream may still be running.
A request to stop an active media relay was rejected; it may still be running.
A request to stop recording a single participant was rejected.
A request to stop recording was rejected; recording may still be running.
A request to stop recording an individual track was rejected.
A request to stop transcription was rejected; transcription may still be running.
A request to stop translation was rejected; translation may still be running.
A request to stop the whiteboard was rejected; it may still be open.
Moving a participant to another room failed; they stay in the current room.
Switching this participant to another room failed; they stay in the current one.
A transcription that was already running stopped unexpectedly.
A translation session that was already running stopped unexpectedly.
The token is valid but was not issued for this participant ID. Joining fails.
The request did not satisfy the account's security configuration and was refused.
The role carried by the token is not permitted to join this room.
The token is valid but was not issued for this room ID. Joining fails.
A failure the SDK could not classify. The message, if the server sent one, is the only clue.
Unpinning a participant failed; the pin state is unchanged.
A whiteboard start or stop was requested while another one is still running.
Functions
The catalogue entry for code, or null if this SDK version does not know it — a newer server can send a code this build predates, so handle the null.