-
Bumped protobuf-javalite to 3.25.9, which fixes the unbounded parser recursion reported as CVE-2024-7254. - #1002 (@adrian-niculescu)
-
Fix CachingTokenSource treating a JWT with no exp as still valid, so a token that never expires stays cached forever. Require exp; keep nbf optional. - #1008 (@SashaMIT)
- Add
TokenSource.fromDevelopmentTokenServer, the new name for the now-deprecatedTokenSource.fromSandboxTokenServer(SandboxTokenServerOptionsis likewise deprecated in favor ofDevelopmentTokenServerOptions) - #994 (@MaxHeimbrock)
-
Use source-specific default video degradation preferences: camera tracks default to maintaining framerate, screen share tracks default to maintaining resolution, and other video sources default to balanced. This matches client-sdk-js. Video tracks published with an explicit
sourceother than camera or screen share now use balanced rather than WebRTC's implicit choice; setdegradationPreferenceon the publish options to override. - #991 (@xianshijing-lk)The resolved preference is now also applied to the backup codec's sender. Previously only the primary encoder was configured and the backup encoder let libwebrtc derive a preference implicitly, so the two encoders could adapt along different axes off the same video source.
-
Add SDK size documentation to README explaining multi-architecture native libraries and how to measure actual size impact - #981 (@xianshijing-lk)
-
Fix
ScreenAudioCapturercrashing the audio thread when itsMediaProjectionis revoked (for example via the system "stop sharing" chip) before the first microphone buffer arrives.initAudioRecordnow returns false when theAudioRecordcannot be created instead of throwing inside WebRTC's audio record thread, where an unhandled exception kills the process; onlystartRecording()was guarded before.AudioRecord.readfailures are also handled now: the return value was ignored, so once the projection died the buffer's stale contents (the last captured frame) were mixed into the microphone track on every callback, an audible loop until the callback was detached. On a read error the capturer releases itsAudioRecordand degrades to mic-only audio. - #982 (@adrian-niculescu)releaseAudioResourcesis also safe to call whileinitAudioRecordis still running. It runs on the app's thread while init runs on the audio record thread, and it used to observe a nullaudioRecordand do nothing, so the recorder that init went on to publish stayed running until finalization. Leaked recorders hold the playback capture input open, and later capture attempts fail once enough of them accumulate. -
Fix
ScreenCaptureServicestaying bound when screen share setup is cancelled.ScreenCaptureConnectionrecorded a binding only onceonServiceConnectedarrived, so a coroutine cancelled beforeconnect()returned left theServiceConnectionregistered, andBIND_AUTO_CREATEkept the service alive for the lifetime of the context.LocalParticipant.setScreenShareEnabledawaits the bind internally and abandons the track it just created if cancelled, so nothing reachedstop()on that path. A cancelled connect now releases the binding itself once no caller is left waiting on it, andstop()unbinds on the same wider condition. Callers stay tracked untilconnect()actually returns, so a cancellation landing after the service connected but before the caller resumed releases the binding too. This also covers the documented case wherebindServiceleaves a connection registered while reporting failure or throwing. - #983 (@adrian-niculescu)Two paths that could leave
connect()suspended forever are fixed as well.stop()racing a connect no longer strands the caller, since requesting the bind and registering the waiter now happen under one lock, and a failedbindServiceno longer leaves the state claiming a bind is in flight for the next caller to wait on. -
Fixed setTrackEnabled leaking track resources when cancelled before the track is published, including the sender negotiated for a failed publish, and LocalScreencastVideoTrack leaking its SurfaceTextureHelper on dispose. - #986 (@adrian-niculescu)
-
Fix silent mic race between Room.connect audio publish and setMicrophoneEnabled - #988 (@MaxHeimbrock)
-
Fix custom RTCConfigurations not picking up server-provided ice servers when user-provided list is empty - #993 (@davidliu)
-
Fix: only latch WebRTC initialization after PeerConnectionFactory.initialize succeeds, so a failed native library load stays retryable and surfaces as a catchable exception instead of poisoning the process and crashing on the next LiveKit.create() call. - #992 (@shivanshu877)
- Add
LocalAudioTrack.applyOptions, which allows updating the audio track options on the fly. - #974 (@davidliu)
-
Fix custom LocalAudioTrackOptions not applying correctly - #974 (@davidliu)
-
Properly update the server info after reconnect - #962 (@davidliu)
-
Scoped the protobuf consumer keep rule to the SDK's generated messages and the well-known types they embed, instead of every GeneratedMessageLite subclass in the consuming app. - #975 (@adrian-niculescu)
-
Fix native memory leaks on video track publish/unpublish cycles (#521).
LocalVideoTrack.dispose()now disposes its backingVideoSource, which was previously left undisposed and leaked for the lifetime of the process (only the track and capturer were released). Unpublishing a video track now also stops itsRtpTransceiver, along with any extra transceivers added for backup codecs; since a new transceiver is created on every publish, removing the track from its sender alone left them retained until the connection closed. - #971 (@adrian-niculescu)
-
Fix audio output getting stuck on the earpiece after reconnecting on a reused
Room(Android 12+).AudioSwitchHandler.stop()now clears itsaudioSwitchreference synchronously (and the field is@Volatile) so a subsequentstart()reliably observes the teardown and re-creates the switch, instead of racing the posted teardown runnable and reusing a stale, already-stopped switch. - #967 (@YashJainSC) -
Emit
TrackSubscriptionFailedevents throughRoomandRemoteParticipantwhen the server detects a subscription failure - #959 (@davidliu) -
Clarified documentation regarding data stream receivers and errors - #965 (@davidliu)
-
Allow customizing
maxRoundTripLatencyonLocalParticipant.performRpcfor high-latency networks - #953 (@1egoman)
-
Change proguard rule for protobufs to official recommended rule, allowing unused protobuf classes to be removed with minification - #946 (@1egoman)
-
Increased max data packet size for
LocalParticipant.publishDatato 65535 bytes (64KB - 1) - #948 (@1egoman)
-
docs(audio): clarify that
AudioSwitchHandler.selectDevice()is sticky and overridespreferredDeviceList. Document that callers who only need a different priority order should setpreferredDeviceListinstead, and thatselectDevice(null)clears a sticky selection. - #941 (@daxiondi) -
fix: resume joinContinuation when LEAVE received during reconnect handshake to avoid reconnection loop hanging issue - #934 (@YashJainSC)
-
Fixed silent loss of reliable data when DataChannel.send returned false and when buffered items were replayed across multiple resumes. - #921 (@adrian-niculescu)
-
Fix byte streams not sending the name of the bytestream - #939 (@davidliu)
-
Update AudioSwitch to handle potential exception when unregistering audio device listeners - #944 (@davidliu)
-
Fix Room.connect not properly throwing ConnectException for websocket connection failures during Room.join() - #926 (@davidliu)
-
Fix reconnect potentially getting cancelled by websocket failure - #926 (@davidliu)
-
Fixed RTCEngine.addTrack leaking pendingTrackResolvers entries on timeout or caller cancellation, which previously caused subsequent publishes of the same track to fail with DuplicateTrackException until the connection was torn down. - #920 (@adrian-niculescu)
-
Fix exception when resending data channel messages after a resume - #923 (@davidliu)
-
Fix potential leak for StreamSender caused by exceptions - #913 (@davidliu)
-
Update audio handling to use AudioManager communication device APIs on S and above - #910 (@davidliu)
-
Rethrow cancellation exceptions for coroutines - #913 (@davidliu)
-
Implement changing preferred audio device list on AudioSwitchHandler mid-call - #910 (@davidliu)
- Fix LocalParticipant.publishData throwing exception for packets over 15KB - #902 (@xianshijing-lk)
-
Fix resume not working sometimes after connection loss/gain - #894 (@davidliu)
-
Fix transcription attributes not converting correctly - #889 (@davidliu)
-
Specifically keep native libwebrtc methods from being obfuscated - #893 (@davidliu)
-
Properly cancel jobs awaiting on DataChannel low buffer instead of completing on dispose - #897 (@davidliu)
-
Fix exception not being caught when using LocalParticipant.publishData - #897 (@davidliu)
-
Ensure child jobs are cleaned up on ICE reconnect timeout - #870 (@davidliu)
-
Cancel websocket when join coroutine is cancelled - #871 (@davidliu)
-
Concurrency fixes for SignalClient connection - #871 (@davidliu)
-
Fixed ScreenCaptureConnection suspending forever when bindService fails and crashing when resuming canceled continuations. - #838 (@adrian-niculescu)
-
Migrate from Klaxon decoding to kotlinx-serialization for AgentAttribute deserialization - #851 (@davidliu)
-
perf: Skip Klaxon parsing for empty agent attribute maps - #849 (@YashJainSC)
-
Fix exception when parsing AgentAttribute inputs and outputs - #847 (@davidliu)
-
Properly reset network callback manager after disconnect - #841 (@davidliu)
-
Fixed audio focus not being abandoned on pre-O devices due to mismatched listener instance. - #837 (@adrian-niculescu)
-
Fixed file descriptor leak in ByteStreamSender where Source was not closed after reading. - #839 (@adrian-niculescu)
-
Fixed data race in
CameraEventsDispatchHandlerby usingCopyOnWriteArraySetfor thread-safe iteration. - #822 (@adrian-niculescu) -
Fixed Room getting stuck in CONNECTING state after failed connect attempts. - #836 (@adrian-niculescu)
-
Fix thread visibility issues in SignalClient that could cause messages to be silently dropped. - #819 (@adrian-niculescu)
-
Fix race condition when sending sync state before tracks are subscribed - #831 (@davidliu)
-
Don't throw on invalid values for Agent enum types - #847 (@davidliu)
-
Add overload for TokenSource.fromEndpoint that accepts a string for the url - #844 (@davidliu)
-
Fixed non-local return in
onConnectionQualitythat caused lost connection quality updates for remaining participants when one participant was not found in the list. - #817 (@adrian-niculescu) -
Fixed impossible empty streams check in Room.onAddTrack that could crash if WebRTC called onAddTrack with an empty streams array. - #816 (@adrian-niculescu)
-
Improve thread-safety and reconnection reliability for hasPublished flag. - #814 (@adrian-niculescu)
-
Fixed
ConcurrentModificationExceptioninLocalAudioTrack.dispose()when sinks are registered. - #820 (@adrian-niculescu) -
Fix LocalParticipant jobs map clean-up when unpublishing tracks. - #807 (@adrian-niculescu)
-
Fixed PeerConnectionTransport coroutine scope not being cancelled on close. - #818 (@adrian-niculescu)
-
Improve reconnection reliability by hardening state flags and synchronizing data channel receive state. - #806 (@adrian-niculescu)
-
Remove reference to internal OkHttp method - #811 (@davidliu)
-
Increase RTC negotiation reliability by dropping outdated sdp answers and forwarding offer ids - #813 (@davidliu)
-
Fixed ProGuard/R8 minification crash in release builds when using AgentAttributes. Added @Keep annotations to Klaxon-based data classes and updated ProGuard rules to prevent obfuscation of reflection-based JSON parsing classes. #808 - #809 (@adrian-niculescu)
-
Update WebRTC-SDK to 137.7151.05. - #824 (@davidliu)
- Fixes echo cancellation and noise suppression failing to enable.
- Fixes microphone not shutting off when muted.
-
Change TokenSource.fetch methods to return Result to explicitly handle exceptions - #802 (@davidliu)
-
Add support for multiple listeners on AudioSwitchHandler - #802 (@davidliu)
-
Deprecate Room.withPreconnectAudio method. - #802 (@davidliu)
- Set AudioTrackPublishDefaults.preconnect = true on the RoomOptions instead to use the preconnect buffer.
-
Expose agentAttributes as a value on Participant - #802 (@davidliu)
-
Expose the server info of the currently connected server on Room - #802 (@davidliu)
-
Fix crash when cleaning up local participant - #802 (@davidliu)
-
Fix crash when creating audio track for communication mode workaround - #805 (@davidliu)
- Fixed camera indicator remaining on after network disconnection by disposing orphaned tracks from failed reconnection attempts (#296) - #798 (@adrian-niculescu)
- Extract CameraXProvider and expose it. - #754 (@KasemJaffer)
- Fix camera lookup to check physicalId - #792 (@KasemJaffer)
- #721 Fixed publisher negotiation race condition causing ICE timeouts. - #789 (@adrian-niculescu)
-
End to end encryption for data channels option - #762 (@davidliu)
- Added EncryptionType fields to DataReceived events and StreamInfo objects to indicate the encryption status.
-
Add TokenSource implementation for use with token servers - #769 (@davidliu)
-
Remove unneeded suspend modifier from registerRpcMethod - #757 (@davidliu)
-
Fix crash when publishing disposed tracks - #758 (@davidliu)
-
Fix race condition when releasing Room object - #756 (@davidliu)
-
Fix VirtualBackgroundVideoProcessor not responding to changes in backgroundImage - #752 (@davidliu)
-
Ensure room is disconnected before releasing resources - #756 (@davidliu)
-
Fix crash caused by extra simulcast layers equal to original resolution - #749 (@davidliu)
-
Wrap exceptions thrown in sendText and sendFile into Result - #749 (@davidliu)
-
Return streamInfo from datastream send helper methods - #741 (@davidliu)
-
Add simulcastLayers to VideoTrackPublishOptions for directly specifying the resolutions to use - #746 (@davidliu)
-
E2E reliability for data channels with resending after reconnects - #738 (@davidliu)
-
Fix default simulcast layers using a lower than intended resolution - #746 (@davidliu)
-
Properly use screenShareTrackPublishDefaults when manually publishing a screenshare track - #746 (@davidliu)
- Fixed ProGuard rules to keep JniInit class for WebRTC native registration (#735) - #736 (@adrian-niculescu)
-
Fix IllegalStateException when switchCamera of localVideoTrack - #725 (@binkos)
-
Make blurRadius in the VirtualBackgroundTransformer variable to allow for dynamically changing the value. - #731 (@binkos)
-
Add sendText and sendFile helper methods to LocalParticipant for ease of use - #732 (@davidliu)
-
Add default name of "unknown" for StreamByteOptions to allow for no-arg construction - #732 (@davidliu)
- Refactor some internal data message sending methods to use Result instead of throwing Exceptions to - #703 (@davidliu) fix crashes.
-
Avoid a crash on reconnection when a track is disposed - #691 (@jeankruger)
- Change isMicrophoneEnabled, isCameraEnabled, isScreenshareEnabled to FlowObservable variables - #685 (@davidliu)
-
Fix switchCamera not working if the camera id is physical id - #676 (@KasemJaffer)
-
Fix sending pre-connect audio data when byte buffer has backing array - #678 (@davidliu)
-
Specify default values for StreamTextOptions and streamText - #688 (@davidliu)
-
Add pre-connect audio for use with agents - #666 (@davidliu)
See Room.withPreconnectAudio for details.
-
CameraX: support for selecting cameras by their physical id - #668 (@KasemJaffer)
-
Add rpc handler methods to Room class for convenience. - #663 (@davidliu)
-
Fix outgoing datastreams incorrectly padding data - #666 (@davidliu)
- Fixes disconnect issue - #656 (@jeankruger)
-
Fix CameraXSession not setting the target capture format correctly - #652 (@davidliu)
-
Improved handling of track publication failures by introducing a new TrackPublicationFailed event and fixing a broken state issue where the track remained active but inaccessible, causing the microphone or camera to stay on without a published track and leading to unreliable republishing. - #637 (@jeankruger)
-
Fix ConcurrentModificationException in IncomingDataStreamManager - #642 (@davidliu)
-
Dedupe supported codecs to provide valid SDP - #643 (@davidliu)
- Unpublish the screen sharing track on stop and introduce ScreenCaptureParams to be able to define the notification and set a callback for onStop - #626 (@jeankruger)
-
Fix publish deadlock when no response from server - #618 (@davidliu)
-
Add SCREEN_SHARE_AUDIO as a Track.Source.Type - #610 (@davidliu)
-
Surface canPublishSources, canUpdateMetadata, and canSubscribeMetrics on ParticipantPermission - #610 (@davidliu)
-
Fast fail attempts to publish without permissions - #618 (@davidliu)
- Fixes deadlock on publish track - #604 (@jeankruger)
-
Fix documented default of preferredDeviceList in AudioSwitchHandler - #584 (@davidliu)
-
Allow access to participant field in ParticipantAttributesChanged event - #591 (@binkos)
-
Default prioritizing speaker over earpiece - #579 (@davidliu)
-
Explicitly expose AudioSwitchHandler from Room for easier audio handling - #579 (@davidliu)
-
Add use cases to CameraX createCameraProvider - #536 (@KasemJaffer)
-
Default to scaling and cropping camera output to fit desired dimensions - #558 (@davidliu)
- This behavior may be turned off through the
VideoCaptureParams.adaptOutputToDimensions
- This behavior may be turned off through the
-
Add separate default capture/publish options for screenshare tracks - #552 (@davidliu)
-
Add AudioPresets and increase default audio max bitrate to 48kbps - #551 (@davidliu)
-
Added VideoFrameCapturer for pushing video frames directly - #538 (@davidliu)
-
Fix surface causing null pointer exception on some devices - #544 (@KasemJaffer)
-
Properly dispose peer connection on RTC thread - #506 (@davidliu)
-
Documentation updates for LocalParticipant methods - #510 (@davidliu)
-
Fix local video tracks not rendering processed frames - #495 (@davidliu)
-
Add utility class NoDropVideoProcessor to force video processing while not connected - #495 (@davidliu)
-
More fixes for crashes caused by using disposed track - #497 (@davidliu)