Documentation menu
API compatibility
The complete public surface of agora_rtc_engine 6.6.3 is present so your code compiles. This page is about what actually does something behind each call.
Platforms
| Platform | Status |
|---|---|
| Android | Device-tested, running in production |
| macOS | Tested |
| iOS | Expected to work (same media engine); not CI-verified |
| Web | Not supported yet |
Channel & lifecycle
| createAgoraRtcEngine / initialize / release Full state machine, including double-initialize semantics. | Implemented |
| joinChannel / leaveChannel uid 0 auto-assign, double-join and leave-before-join quirks replicated. | Implemented |
| renewToken Re-exchanges at the gateway; connection is preserved. | Implemented |
| onConnectionStateChanged Agora's state/reason pairs. | Implemented |
| Auto-reconnect / onRejoinChannelSuccess Driven by the SFU's own reconnection. | Implemented |
| onTokenPrivilegeWillExpire / onRequestToken Scheduled from the Agora token's expiry, not the media credential's. | Implemented |
Audio & video
| enableAudio / enableVideo / disableAudio / disableVideo | Implemented |
| muteLocalAudioStream / muteLocalVideoStream Honoured before join and replayed on join. | Implemented |
| muteRemoteAudioStream / muteRemoteVideoStream | Implemented |
| muteAllRemoteAudioStreams / muteAllRemoteVideoStreams Applies to current and future participants. | Implemented |
| setClientRole Fires onClientRoleChanged. | Implemented |
| updateChannelMediaOptions Role change fires the callback; publish-flag-only updates are silent, as in Agora. | Implemented |
| switchCamera Works on a pre-join preview too; the view rebinds on flip. | Implemented |
| setEnableSpeakerphone / setDefaultAudioRouteToSpeakerphone | Implemented |
| startPreview / stopPreview Pre-join preview with a real camera track. | Implemented |
| setVideoEncoderConfiguration Dimensions, framerate and bitrate map onto the media engine's capture options. | Implemented |
| enableDualStreamMode / setRemoteVideoStreamType Simulcast. | Implemented |
| startScreenCapture / stopScreenCapture Published as a separate track; never targeted by switchCamera. | Implemented |
| enableAudioVolumeIndication Volumes mapped through dB onto Agora's 0–255 scale. | Implemented |
Rendering
| AgoraVideoView / VideoViewController Including the cached-controller pattern Agora's docs recommend. | Implemented |
| VideoViewController.remote | Implemented |
| setupLocalVideo / setupRemoteVideo | Implemented |
Camera effects
The filter runs on the capture path, before the encoder, so the effect is in the published stream rather than painted over the local preview. Frames never cross into Dart. Two companion packages plug in here and can both be installed: voxa_beauty for skin smoothing and lipstick, which runs entirely on the GPU with no licence or subscription, and voxa_deepar for DeepAR effects. Each carries its own native integration, so an app adds a dependency and writes no platform code.
| enableExtension Enables a natively-registered filter. A name nothing registered fails loudly rather than silently doing nothing. | Implemented |
| setExtensionProperty Licence keys, effect paths — whatever the filter reads. Properties set before a filter registers are replayed to it. | Implemented |
| VoxaVideoFilter (Android) / VoxaVideoFilters (iOS, macOS) The native extension point an effect SDK plugs into. sharedEglContext() on Android hands a filter the GL context the capturer and encoder already share, so its output reaches the encoder with no copy. | Implemented |
| getExtensionProperty Filters are write-only; nothing reads state back. | Throws −4 |
Statistics
| onRtcStats / onNetworkQuality Fields are populated from the media engine's stats; values are not numerically identical to Agora's. | Partial |
| onRemoteVideoStats / onRemoteAudioStats Subset of fields available from the SFU. | Partial |
Not implemented
These throw AgoraRtcException(-4, errNotSupported) rather than failing silently, so an app that depends on them fails at the call site instead of at runtime in front of a user.
| Media player (createMediaPlayer, …) | Throws −4 |
| Spatial audio | Throws −4 |
| Channel media relay | Throws −4 |
| Raw frame observers (registerVideoFrameObserver, …) | Throws −4 |
| RTM / signaling Out of scope: RTM is a separate Agora product. | Throws −4 |
How parity is verified
Documentation is not a specification of behaviour — the ordering quirks that break migrations are not written down anywhere. So the behaviour is recorded: a scenario app drives both SDKs through the same flow, the Agora run against the live Agora service is saved as a golden transcript, and the VoxaRTC run is diffed against it.
scenario: role_switch
✓ onJoinChannelSuccess(channel=parity, uid=1001, elapsed≈)
✓ onClientRoleChanged(old=broadcaster, new=audience)
✓ onUserJoined(remoteUid=1002)
✓ onUserPublished(remoteUid=1002, media=video)
PARITY OK — 8/8 scenariosMedia-burst events are compared as multisets (their interleaving is genuinely nondeterministic); everything else is compared in order. Several real bugs were found this way that no unit test would have caught.