Release Notes

1.6.0.11684 - October 9, 2019

Deprecations:

  • Marking Connection.CanonicalName as obsolete. Exposed (Audio/Video)Stream.LocalCanonicalName and (Audio/Video)Stream.RemoteCanonicalName getters). CanonicalName remains unique per media source but not necessarily unique per connection;
  • Marking Stream.CanonicalName as obsolete. It will be removed in future. Use (Audio/Video)Stream.LocalCanonicalName instead. Note: the concept of Canonical Names is not applicable to DataStreams (IL-2983);

New Features:

Services:

  • Added a generic Metadata property to all LiveSwitch configuration entities to better support third-party extensibility (LS-3826);

SIP Connector:

  • Added the ability to send and receive video "fast update messages" for the case where NACKs and PLIs are not supported during a sip video call. This benefits older devices that negotiate using AVP not AVPF. This feature is not supported by all SIP providers. It will be turned on automatically after negotiation if required (LS-3615);

Media Streams:

  • Added ResetAudioPipe and ResetVideoPipe media elements to support in-memory tests that clear a frame’s buffers (IL-2910)
  • Added VideoBuffer.Convert overload that accepts a usePool parameter to control whether new data is allocated or existing data is used from the DataBufferPool (IL-2910);
  • Added support for H.264 negotiation of packetization mode 0 (single NAL), multiple profile level IDs and level asymmetry (LS-2494);
    • Added support for multiple H.264 packetizers in RtcLocalMedia by overriding CreateH264Packetizers; 
    • Added support for multiple H.264 depacketizers in RtcRemoteMedia by overriding CreateH264Depacketizers; 
    • Added support for multiple H.264 encoders in RtcLocalMedia through CreateH264Encoders;
    • Added constructor overload for OpenH264.Encoder to define a profile level ID (LS-2494);
    • Added constructor overload for H264.Packetizer to define a profile level ID and packetization mode;
    • Added constructor overload for H264.Depacketizer to define a packetization mode;
  • Added experimental support for the G.722 audio codec. This is a developer preview. Full support for G.722 will be aded in a future release (IL-30);
  • Improved performance of the PCMU and PCMA audio codecs (IL-30);
  • Updated the media track API so it automatically converts timestamps if the sample rate changes between input and output. (IL-30);
  • Added MediaSource.IsStarted/Stopped/Destroyed convenience properties (LS-3464);
  • Adds some convenience properties to MediaStream to summarize the encoding input/output min/max/target bitrates:

    • OutputMaxInputBitrate sums the OutputMaxInputEncodings bitrates.
    • OutputMinInputBitrate sums the OutputMinInputEncodings bitrates.
    • InputMaxInputBitrate sums the InputMaxInputEncodings bitrates.
    • InputMinInputBitrate sums the InputMinInputEncodings bitrates.
    • InputTargetInputBitrate sums the InputTargetInputEncodings bitrates (LS-3754);

Network Connectivity:

  • Connection.AddRemoteCandidate can now be used to add remote candidates when ICE is not in use (IL-2974);

Connection:

  • Added awaitable Connection.Closed and Connection.Failed properties as an alternative to writing a state change event handler (LS-17);
  • Fixed a bug in ManagedConnection where a failure in CreateOffer, CreateAnswer, SetLocalDescription, or SetRemoteDescription logged an error but did not immediately shut down the connection. In the case of peer connections, where an offer had already been sent, local connection is now shut down properly and the remote peer is notified of the failure so that it can manage shutting down the remote connection (LS-2494);

Console:

  • Added a switch to enable/disable the G.722 Codec. This is available in the Audio Codec Configuration section of the Channel Configuration page for a given Channel. It can be used to enable the experimental G.722 feature preview (LS-3595);
  • Fixed a bug where setting the Clustering Memory Threshold would sometimes throw a 400 error in the REST API (LS-3325);
  • Fixed for a bug where loading the Deployment Config page added backslashes to logging configuration paths (LS-3117);

Simulcast Developer Preview:

  • H264 profile levels are now used to determine the correct video encoding during a MCU simulcast (LS-3638);

Bug Fixes

Stability and Performance:

  • Improved overall performance and throughput of Gateway, Media Server, and SIP Connector (LS-3851);

Media Server:

  • Fixed a bug in the media server where clustered media servers could run into an error processing media frames due to under-retention of the RTP header buffer (LS-3657);
  • Updated goog-remb handling to ensure Chrome sends all simulcast streams right away when configured to do so (LS-3754);
  • Fixed infinite loop in clustering that occurred if invalid data was sent to the cluster socket. This infinite loop outputted poisoned buffer logs every iteration. (LS-3723);
  • Improved Media Server connection time, especially on Linux (LS-17);

SIP connector:

  • The SIP connector now respects server-based registration expiration properly. This fixes issues where the registration expires and inbound calls fail if the server doesn’t use the default expiry of 300 (LS-1107);

Media Streams:

  • Enabled error logs for the cases where attempts to set policy properties on a MediaStream in an invalid state were made. Enabling MediaStream.{CcmFirPolicy/RedFecPolicy/NackPolicy/CcmLrrPolicy/NackPliPolicy} after SDP negotiation has completed succeeded has no material impact because capability negotiation has already occurred. Ensure that these policies are set prior to the SDP exchange takes place (IL-3004);
  • Fixed a race condition causing error logs "An unexpected exception was thrown while raising receive success." due to receiving RTCP packets before concluding SRTP processing. The issue did not cause any additional side-effect beyond the log messages. (IL-3019); 
  • Fixes a bug in the Matroska output for G.711 (PCMU and PCMA) recordings causing sound warping in audio playback (IL-3041, IL-207);

Clients:

  • Fixed a cause of a potential deadlock on Cocoa and Java platforms that could occur when trying to close a Connection that is in process of gathering stats (IL-3000);

Javascript:

  • Added a fix for a memory leak where observers accumulate when joining and leaving calls. They are now disconnected when the local client leaves or when peers leave (IL-2992);

Examples:

  • Fixed a Null Reference in the .NET WINFORMS example that was thrown on attaching a remote view (LS-3647);
  • Fixed a bug in the .NET WINFORMS example that caused a black screen to be displays instead of the remote view (LS-3647);

1.5.3.11090 - September 24, 2019

Bug Fixes:

Media Streams/iOS:

  • Fixed an issue on iOS 13 devices where remote video appeared distorted and part of the screen was green (LS-3838);

Media Server:

  • Fixed a bug in the VP8 PictureId/TL0PICIDX rollover counter. This was causing video stuttering and/or artifacts after 15-20 minutes when receiving a VP8-encoded SFU downstream on 1.5 series Media Servers (LS-3782);

1.5.2.10725 - September 13, 2019

Bug Fixes

SIP Connector:

  • Fixed a bug that could cause a deadlock when answering a call via the SIP Connector (LS-3700);

Gateway:

  • Fixed a bug that could cause a deadlock when shutting down the Gateway (LS-3700);
  • Fixed a CORS issue in the v1 REST API that did not allow the ‘x-api-key’ in header (LS-3405);
  • Fixed regression where services would not retry connecting to the database if transient errors occurred during startup (LS-3510);

Media Server:

  • Fixed a bug where media servers that are being gracefully shutdown would also send out closed messages for connections they did not own (LS-3719);
  • Fixed bug where some RTCP traffic could fail to decrypt at the Media Server with simulcast enabled. This affects only Media Servers making use of simulcast features available through the Simulcast Developer Preview API (LS-3747);

SIP:

  • Fixed a parsing issue when SIP message headers contained tags in an uncommon format. This prevents a null reference exception when answering calls (LS-3686);
  • Kicking entire channels via the channel DELETE endpoint now properly kicks SIP peers as well (LS-3774);

Console:

  • Renamed the Site page's "Advanced Path Configuration" to "Advanced Information" (LS-3282);
  • Added a new read only field to the Site page's "Advanced Information" section to display the Site ID, which is a unique identifier for a given LiveSwitch installation.

WinForms:

  • Fixed the VideoChat UI layout. Some UI elements in the WinForms example were laid out without enough room and were not displayed properly (LS-3647);
  • Fixed an InvalidOperationException that was thrown in MCU mode in the WinForms example, which caused two local views in the video chat UI (LS-3647);

Xamarin

  • The Xamarin-Android example will no longer use the microphone when it is not actively in a call. This fixes an issue where the device would act like it is “in-call” when it actually is not (LS-3402);

TypeScript:

  • Fixed a bug in JavaScript where an exception raised by Connection initialization, or Local/Remote Description handling, could be processed incorrectly resulting this error in the logs "Object doesn't support property or method 'getDescription'" (IL-2987);
  • Fixed issue where Edge would throw an error when changing video/audio sources (LS-3641);

1.5.1.10002 - August 23, 2019

New Features

SIP Connector:

  • The SIP Connector’s SIP library now handles re-invites as per the RFC. Re-invites are used by some SIP providers to refresh a session timer that would hang up calls upon expiry (LS-3594);

Media Streams:

  • Added support for automatic out-of-band keyframe signalling if a platform does not support RTCP-based video feedback (LS-3581):
    • Added MessageType.KeyFrameRequest,
    • Added Message.CreateKeyFrameRequestMessage(long[] synchronizationSources),
    • Added MediaStream.OnDiscardOutboundControlFrame - raised when an RTCP control frame is filtered out due to policy restrictions or remote negotiation (LS-3581);

Bug Fixes

Media Server:

  • Fixed an issue where the v1 REST API failed to enable recording if recording was disabled in the Channel Configuration (LS-3622);

Clients:

  • Fixed a bug that could lead to deadlock on connection shutdown. This could arise when internet connectivity was temporarily unavailable (e.g. due to switching WiFi networks, toggling airplane mode, etc) (LS-3620);

JavaScript:

  • Resolved issue where HTML video elements would not unpause when added back to the DOM (LS-3412);
  • Improved TypeScript StringExtensions to perform null checks on String arguments (IL-2895);
  • When exchanging candidates with the Media Server, we no longer send locally gathered TCP Candidates. LiveSwitch MediaServer does not support TCP ICE Candidates, as such sending these candidates unnecessarily increases signalling costs. UDP relay candidates that use TCP for communication between a client and a relay server are still sent (LS-3605);

Media Streams:

  • Updated NAudio libraries to version 1.9.0.0. This version includes fixes to address errors when using the library on some Dell machines (IL-2956);
  • Fixed a bug where the same RTP Header Extensions on different streams within a connection could be assigned different IDs. This particularly affected cases with Bandwidth Adaptation and Bundling, or Simulcast enabled. This problem caused flooding in the logs with messages such as “RTP Header Extension processing: encountered not registered RTP extension header type x.“ (IL-2978);

Network Connectivity:

  • Fixed an issue when gathering ICE candidates from a TURN server whose hostname resolved to multiple IP Addresses. Previously, only the first IP address was used to gather. Now, if an error occurs connecting to an address, we try the other address(es) (IL-2946);

DTLS:

  • Improved connection time by initializing DTLS server prior to ICE completion (IL-2681);
  • Fixed a rare race condition that could cause a null reference error within the DTLS stack (IL-2681);

Examples:

  • Changed Xamarin Android example to download H.264 in the background when the app launches. This is changed from the app downloading H.264 when joining a call, which would timeout the app if it took too long. (IL-2578);
  • Fixed a bug in the .NET WINFORMS example which caused  it to fail to build (LS-3646);

1.5.0.9768 - August 14, 2019

New Features:

Bundling:

  • Exposed Connection.BundlePolicy. LiveSwitch server Connection BundlePolicy defaults to MaxCompatible. LiveSwitch client BundlePolicy for Peer-to-peer connections also defaults to MaxCompatible to maximise the interop with non-LiveSwitch WebRTC providers. LiveSwitch client BundlePolicy for MCU and SFU Connections (except for JavaScript wrappers for Microsoft Edge ORTC) default to MaxBundle to maximise socket allocation, ICE exploration and Gateway signalling efficiency. BundlePolicy setting for any types of connections for ORTC Microsoft Edge is ignored and remain as Disabled (LS-3328);
  • Added Connection.BundlePolicy = {BundlePolicy.Disabled, BundlePolicy.MaxBundle, BundlePolicy.MaxCompatibility}, which sets negotiating requirements for stream bundling as per WebRTC specifications with MaxCompatibility being default policy. If application layer is certain that both parties support stream bundling, then policy should be set to MaxBundle. Otherwise, leaving BundlePolicy in default setting of MaxCompatibility achieves full flexibility of negotiating with clients regardless of their bundling support (IL-2739);

Media Streams:

  • Added support for MID RTP Header Extension and SDES MID RTCP chunk (IL-2739);
  • Improved efficiency of RTP and RTCP packet matching when SDP answer reaches the offerer after the first RTP or RTCP packets reach the client (IL-2739);
  • Added Yuv4Mpeg.VideoSource to support using YUV4MPEG video files as a video source (I420 only) (IL-2908);
  • Added Yuv4Mpeg.VideoSink to support recording I420 images to a YUV4MPEG video file (IL-2908);

SIP:

  • The SIP Connector’s SIP library now handles re-invites as per the RFC 3261. Re-invites are used by some SIP providers to refresh a session timer that would hang up calls when it expires (LS-3594);

WinForms:

  • Added ScreenSourceApi enum to switch between CopyFromScreen and BitBlt APIs when capturing screen image data in .NET (IL-2881);
  • Updated WinForms.ScreenSource to support ScreenSourceApi.BitBlt for a 15-20% improvement in frame-rate over ScreenSourceApi.CopyFromScreen (IL-2881);

Other:

  • Added IElement.ExternalId which allows associating some external identifier with streams, sources, pipes, sinks, tracks, and branches (LS-3515);
  • Exposed Connection.TrickleIcePolicy setter (LS-3603);

Bug Fixes:

ICE:

  • Fixed a bug where IceTransport was transitioning in and out of Disconnected state at connection startup within the first 1 second of connectivity establishment (IL-2739);
  • Fixed a bug where if two peers had streams declared in connection in differing order, browsers would incorrectly match ICE Candidates precluding connectivity in some cases (particularly when relay connectivity was required) (IL-2934);

Media Streams:

  • Fixed a bug where under severe packet loss, RTP Transport was reporting negative number of PLI sent (IL-2739);

Media Stream Bandwidth Adaptation:

  • Fixed a bug where the timestamp in the the RTP abs-send-time header might be incorrect causing inefficient bandwidth adaptation on connection between native platforms and browsers (IL-2948);

JavaScript:

  • Fixed Uncaught TypeError: connection2.getRemoteConnectionInfo is not a function exception encountered on JavaScript SFU clients when the remote client updated Connection Config (LS-3222);
  • Fixed an issue when trying to establish a connection on Internet Explorer if TrickleIcePolicy was set to NotSupported (IL-2909);

  • Fixed a bug in JavaScript where a DateTime could initialize incorrectly when provided with ticks as the sole constructor parameter (LS-3576);
  • Fixed JavaScript WebRTC wrapper that was erroneously sending end-of-candidates indication as “a=“ candidates. While Google Chrome is implementing support of end-of-candidates signalling (cf. https://bugs.chromium.org/p/chromium/issues/detail?id=978582), dispatching end-of-candidates indications by other browsers (e.g. Mozilla Firefox) will be disabled (IL-2945);

SIP:

  • The SIP connector now has more robust recovery mechanisms when connectivity to the Gateway is lost (LS-3439);
  • Updated the SIP URI parsing to better follow RFC 3261. The connector is now capable of parsing all SIP URI formats where previously, odd parsing errors could occur in some edge cases (LS-3558);
  • Fixed a race condition where a call might be orphaned if the caller hangs up at the same time that the call is accepted to a conference (LS-3587);
  • Fixed SIP registration errors that occur if multiple SIP registrations already exist for a single user (LS-3617);

Gateway:

  • Fixed a bug where the Gateway would attempt to validate the user ID and device ID of a new client even if the register token did not include a user ID and device ID (LS-3573);

Media Server:

  • Fixed a bug where the media server would ignore offers sent from a client with an empty user ID (LS-3577);
  • Improved the scalability and overall performance of the Media Server’s MCU audio engine by reducing the number of active threads and reducing the number of memory copies (LS-3515);

Simulcast:

  • Fixed a bug where simulcast streams could map to the wrong track, resulting in downstream connections receiving the wrong quality stream (LS-3534);

Other:

  • Fixed a bug where the Redis server connection string was not properly retrieved from the existing server configuration files when migrating a new configuration using the CLI tool (LS-3312);
  • Fixed a bug where the license key was not always set correctly when multiple Gateway configuration files were migrated (LS-3378);
  • Fixed a general race condition when a Promise was resolved asynchronously that could result in WaitForResult blocking forever (IL-2918);
  • Fixes a bug causing outbound REMB packets to be discarded (LS-3551);
  • Fixes a bug where REMB values could be calculated incorrectly (LS-3551);

1.4.2.9041 - July 19, 2019

New Features

Stats:

  • Added MediaReceiverStats.PacketsDuplicated to track the number of duplicate packets received (IL-2927);
  • Added MediaReceiverStats.PacketsRepaired to track the number of packets recovered using FEC (IL-2927);

Breaking Change:

  • Media Servers and Sip Connectors no longer perform any write operations on the config database. This means they won’t initialize or seed a new LiveSwitch cluster. Previously on LiveSwitch installs, whatever service started up first would initialize the config store and seed the defaults. Now, only the Gateway will, the other services will wait until the database is setup. (LS-3461);

Bug Fixes

MCU Clustering issues:

  • Fixed a regression where only one peer’s feed would show up when clustering using MCU connections (LS-3458);
  • Fixed an issue where the logs of a media server would be filled with Fir frame logs but a keyframe would not be sent after clustering (LS-3458);
  • Fixed an issue when clustering MCU connections where the local preview would be placed over the wrong video in the MCU frame (LS-3502);
  • Fixed an issue where Media Server clustering could fail with a “Duplicate Connection” message. The issue occurred when two Media Servers attempted a clustered connection to each other at the same time. In this case the "Duplicate Connection" message was written into the logs of both Media Servers and both connection attempts would fail. A tie breaker now causes only one of the connections to be closed and allows the other to connect normally (LS-3505);

Webhooks:

  • Fixed a race condition in webhooks that could cause the last batch during shutdown to not be persisted properly (LS-3459);
  • Lowered the max batch size of webhooks to prevent service overload (LS-3460);
  • Trimmed the diagnostic logs from webhooks so they no longer log out all the JSON during failures as this was causing log providers to fail (LS-3460);
  • Increased the HTTP timeout to 5 minutes to allow more time for webhooks to push up data (LS-3460);

JavaScript:

  • Fixed a race condition in the ActiveX/JavaScript bridge where JavaScript could read an incorrect connection state, resulting in incorrect state transitions (e.g. connecting → connecting instead of initializing → connecting) (IL-2886);
  • Updated ConsoleLogProvider in JavaScript to use console.error, console.warn, console.info, and console.debug if available (IL-2912);
  • Fixed an issue with the default camera not always being selected on desktop browsers due to an invalid constraint (IL-2869);

  • Fixed the “TypeError: Unable to get property 'getId' of undefined or null reference” exception seen in console when connecting with Edge browser (IL-2922);

Media Streams:

  • Fixed an issue on Xamarin iOS where video was appearing squashed and the remainder of the screen was green (LS-3291);
  • Disabled H264 codec and enabled VP9 codec on all iOS and MacOS examples. Due to image quality issues with the Cocoa VideoToolbox library, the VP8 and VP9 codecs work much better than H264 on the Cocoa platforms. The image quality issues (IL-1263) are being investigated and will be fixed in a future release (IL-2775);
  • Updated the build version of NAudio library to 1.8.4.1 for DotNet platforms and 1.0.0.1 for UWP platform. The 1.3.2.6889 release fixed a bug with NAudio but the build number was not updated at the time of the fix (IL-2933);

Stats:

  • Fixed a bug where MediaReceiverStats.PacketsReceived could be reported as higher than it actually is. (IL-2927);
  • Fixed a bug where MediaReceiverStats.PacketsLost could be reported as higher (zero) than it actually is (negative). (IL-2927);

Other:

  • Fixed a bug in Java and Android where a null exception occurred when trying to get the connection config and the connection did not have an audio stream or video stream (LS-3488);
  • Fixed an issue in the media server where the ICE URIs were cached before the public ip address was discovered causing the automatic turn URIs to be internal rather than public (LS-3520);
  • Fixed an "Object reference not set to an instance of an object" error when starting LocalMedia on Internet Explorer clients (LS-3531);
  • Fixed a null pointer exception in Java client library when checking “Content-Type” in HTTP headers. Resolves an issue when querying for ICE Servers using the Xirsys library (IL-2877);
  • Updated Java and Android libraries to be compatible with Java 7 (IL-2825);

1.4.1.8650 - July 4, 2019

New Features

Auxiliary Methods:

  • Added a TryKeep to both the VideoBuffer and DataBuffer that will return false if the keep fails which can occur if the buffer has already been freed (LS-3054);
  • Added MediaTrack.FindElement/s overloads for .NET that accept a generic type parameter. (IL-2897)

Bug Fixes

Examples:

  • Fixed a java.lang.ClassCastException in the Java and Android examples when sending data channel messages (LS-2734);

Webhooks:

  • The LiveSwitch services now filter out incomplete webhooks that previously would cause crashes on startup. In the case where a webhook was missing required data a crash would occur when starting the Webhook Service. The Service now ignores malformed webhooks to prevent startup failure. (LS-3401);

REST:

  • Fixed NullReferenceException that occurs if you attempt to Patch a ChannelConfig with a null EngineConfig (LS-3436);
  • Invalid OData queries will now return a 400 instead of a 500 error (LS-3386);

Services:

  • Unified startup process for all LS services. As a result startup logs will be slightly different than before (LS-3358);

Clustering:

  • Fixed a bug that could prevent media from flowing over clustered connections (LS-3430);
  • Fixed the “Discarding outbound FIR control frame for SSRC 4294967295. Unrecognized remote synchronization source.” error that occurred during media server clustering (LS-3426);
  • Fixed an null reference exception that occurred when a media server cluster connection was shutting down (LS-3427);

Media Server and Clients:

  • Added whitelist of error codes to the client SDK that will cause a connection to transition to close instead of fail when failed but retrying would be impossible (LS-3359);
  • Modified the VideoMixer to remove the need for temporary bitmaps. This fixes the AccessViolationException which occurred intermittently when rendering the temporary bitmaps (LS-3054);

Java Client SDK:

  • Fixed a null pointer exception when trying to establish a connection on Java-based clients (LS-3323);

1.4.0.7945 - June 18, 2019

Breaking Changes:

Media Streams:

  • ImageConverter.Scale is no longer publicly settable. Use ImageConverter.TargetScale instead. Scale now reflects the current scale, which may be less than the TargetScale if bandwidth adaptation or the image converter implementation requires a lower value. Set ImageConverter.StaticOutputScale to prevent dynamic changes (IL-2769);
  • Encoder.Bitrate is no longer publicly settable. Use Encoder.TargetBitrate instead. Bitrate now reflects the current bitrate, which may be less than the TargetBitrate if bandwidth adaptation or the encoder implementation requires a lower value. Set Encoder.StaticOutputBitrate to prevent dynamic changes (IL-2769);
  • Updated VideoConfig to store frame-rate as a double (IL-2770);

New Features:

Examples:

  • Added new LogProvider class to Java example source (LS-3239);
  • Unified user interface identifiers across all examples for automated testing purposes (LS-3220);
  • Updated LiveSwitch examples to log connection state changes for iOS and macOS (LS-3229);
  • Unified user interface identifiers across all examples for automated testing purposes (LS-3220);

Auxiliary Methods:

  • Added DataBuffer.CanResize, a method that returns whether a data buffer can be resized to the requested length. Pooled data buffers cannot be resized beyond their available length, so this check is useful when increasing the size of a data buffer that may have been obtained from a DataBufferPool. (LS-3127)

Session Descriptions:

Media Streams:

Simulcast Developer Preview - Examples:

  • Updated .NET, Android, and iOS Example applications to demonstrate Simulcast Developer Preview (LS-3243);

Simulcast Developer Preview - Media Server:

  • Updated SFU downstream processing of VP8 frames to rewrite picture ID and temporal level zero index in the VP8 packet header as required. (LS-3127)
  • Added support for RID-based simulcast. (LS-2756)

Simulcast Developer Preview - Media Streams:

  • Updated MediaStream to send a=ssrc-group:SIM attribute if SSRC-based simulcast is enabled (LS-2678);
  • Updated MediaStream to send a=simulcast attribute line if RID-based simulcast is enabled (LS-2678);
  • Updated media server to include simulcast encodings in upstream connection notifications (LS-2678);
  • Added MediaStream.RemoteEncoding property to allow downstream connections to select a desired simulcast encoding (LS-2678);
  • Added support for simulcast on transcoded streams in the media server (LS-3126);
  • Added ConnectionConfig.RemoteAudioEncoding and RemoteVideoEncoding to support selection of a different upstream encoding while streaming (LS-3127);
  • Updated AudioEncoder and VideoEncoder to ignore control frames where the media synchronization source doesn’t match the encoder output synchronization source (LS-3127);
  • Add MaxFrameWidth/MaxFrameHeight and MediaTrackReport into MediaStreamInfo (LSC-134);
  • Updated VideoDepacketizer to handle keyframe interrupts for simulcast stream switching. If a start-of-frame packet is received while pending fragments still exist, and the sequence numbering is not violated, a simulcast stream switch is assumed to have taken place and the pending fragments are discarded in favour of the new frame (LS-3319);
  • Added support for switching the active sending SSRC at runtime (IL-2697);
  • Added additional convenience constructor overloads for SRControlFrame and RRControlFrame (IL-2697);
  • Added FirEntry.GetSequenceNumberDelta utility method for calculating FIR sequence number deltas while accounting for rollover (IL-2697);
  • Added Utility.Splice utility method for inserting items into or removing items from an array (IL-2697);
  • Added CurrentSynchronizationSource property to MediaPipe and MediaSink, indicating the SSRC of the current frame being processed (IL-2697);
  • Added support for sending/receiving multiple SSRCs concurrently in a single media stream (IL-2702);
  • Added Sdp.Rtp.SsrcGroupAttribute to support generating and parsing the ssrc-group SDP media attribute (IL-2710);
  • Added MediaStream.SynchronizationSourceGroups so SSRC groups can be defined (IL-2710);
  • Added MediaPipe.SynchronizationSource to support overriding the synchronization source on processed frames (IL-2710);
  • Added AudioStream.OpusDisabled/PcmuDisabled/PcmaDisabled and VideoStream.Vp8Disabled/Vp9Disabled/H264Disabled properties to support toggling codec disabled status (LS-2887);
  • Added MediaStream.GetCodecDisabled/SetCodecDisabled methods to support toggling custom codec disabled status  (LS-2887);
  • Added MediaStream.PreferredCodecs property to support custom codec preference ordering in stream initialization (LS-2887);
  • Added IMediaInput.MinInputBitrate to allow specification of minimum bitrate entering a media element in the pipeline (LS-2949);
  • Added IMediaOutput.MinOutputBitrate to allow specification of minimum bitrate existing a media element in the pipeline  (LS-2949);
  • Updated the media pipeline so an element will auto-disable if its output bitrate range does not overlap with any of its outputs' input bitrate ranges  (LS-2949);
  • Added AudioEncoder.StaticOutputBitrate and VideoEncoder.StaticOutputBitrate to indicate that the desired encoder behaviour is to lock into its output bitrate and not respond to dynamic bandwidth estimation  (LS-2949);
  • Added MediaSink.MinInputBitrate with a default value of -1 (unset)  (LS-2949);
  • Added MediaSource.MinOutputBitrate with a default value of -1 (unset)  (LS-2949);
  • Added MediaStream.MinInputBitrate and MinOutputBitrate with default values of -1 (unset)  (LS-2949);
  • Fixed a bug where MediaStream.MaxOutputBitrate did not default to a value of -1 (unset)  (LS-2949);
  • Added MediaPipe.MinInputBitrate with a default value equal to the maximum of the configured minimum input bitrate and the minimum input bitrate of the pipe’s outputs  (LS-2949);
  • Added MediaPipe.MaxInputBitrate with a default value equal to the minimum of the configured maximum input bitrate and the maximum input bitrate of the pipe’s outputs  (LS-2949);
  • Added MediaPipe.MinOutputBitrate with a default value equal to the maximum of the configured minimum output bitrate and the minimum output bitrate of the pipe’s inputs  (LS-2949);
  • Added MediaPipe.MaxOutputBitrate with a default value equal to the minimum of the configured maximum output bitrate and the maximum output bitrate of the pipe’s inputs  (LS-2949);
  • Optimized frame cloning in the media pipelining so it only clones if two or more outputs are available and not disabled (LS-2949);
  • Added the following properties to VideoStream, VideoPipe, and VideoSource:

    • OverConstrainedOutputScale, 
    • MinOutputScale, 
    • MaxOutputScale, 
    • TargetOutputScale (IL-2769);
  •  Added the following properties to VideoStream, VideoPipe, and VideoSink:
    • OverConstrainedInputScale,
    • MinInputScale,
    • MaxInputScale (IL-2769);
  • Added OverConstrainedScale property to VideoStream, VideoPipe, VideoSource, and VideoSink (IL-2769);
  • Added new FrameRateController video pipe to support frame-rate reduction (IL-2770);
  • Added the following properties to VideoStream, VideoPipe, and VideoSource:

    • OverConstrainedOutputSize
    • MinOutputSize
    • MaxOutputSize
    • TargetOutputSize
    • OverConstrainedOutputWidth
    • MinOutputWidth
    • MaxOutputWidth
    • TargetOutputWidth
    • OverConstrainedOutputHeight
    • MinOutputHeight
    • MaxOutputHeight
    • TargetOutputHeight (IL-2771);
  • Added the following properties to VideoStream, VideoPipe, and VideoSink:

    • OverConstrainedInputSize
    • MinInputSize
    • MaxInputSize
    • OverConstrainedInputWidth
    • MinInputWidth
    • MaxInputWidth
    • OverConstrainedInputHeight
    • MinInputHeight
    • MaxInputHeight (IL-2771);
  • Added OverConstrainedSize property to VideoStream, VideoPipe, VideoSource, and VideoSink  (IL-2771);

  • Added ImageScalePipe, FrameRatePipe, and ImageSizePipe to allow better test coverage of the various video constraints (scale, frame-rate, and size) and to simplify implementations  (IL-2771);
  • Added MediaSource.Min/Max/TargetOutputEncoding properties to summarize the source output constraints (IL-2766);
  • Added MediaPipe.Min/Max/TargetOutputEncoding properties to summarize the pipe output constraints (IL-2766);
  • Added MediaPipe.Min/MaxInputEncoding properties to summarize the pipe input constraints (IL-2766);
  • Added MediaSink.Min/MaxInputEncoding properties to summarize the sink input constraints (IL-2766);
  • Added MediaStream.InputMin/Max/TargetOutputEncodings properties to summarize the local track output constraints (IL-2766);
  • Added MediaStream.OutputMin/MaxInputEncodings properties to summarize the remote track input constraints (IL-2766);
  • Added MediaStreamInfo.Send/ReceiveEncodings properties to summarize the send/receive constraints (IL-2766);
  • Added convenience CameraSourceBase class to make it easy for camera-based video sources to integrate with media constraints. The TargetConfig property indicates the desired size and frame-rate. The Config property indicates the current size and frame-rate after starting the source. To update your video source:

    • Change the base class from VideoSource to CameraSourceBase.
    • Remove any class-level properties related to size and/or frame-rate.
    • Update your DoStart implementation to get as close as possible to TargetSize and TargetFrameRate (encapsulated in TargetConfig) when starting the capture thread.
    • Before starting the capture thread, set Size and FrameRate (encapsulated in Config) to the actual size and frame-rate that will be raised (IL-2778);
  • Added convenience ScreenSourceBase class to make it easy for screen-based video sources to integrate with media constraints. The TargetConfigproperty indicates the desired region (origin/size) and frame-rate. The Config property indicates the current region (origin/size) and frame-rate after starting the source. To update your video source:

    • Change the base class from VideoSource to ScreenSourceBase.
    • Remove any class-level properties related to region and/or frame-rate.
    • Update your DoStart implementation to get as close as possible to TargetRegion and TargetFrameRate (encapsulated in TargetConfig) when starting the capture thread.
    • Before starting the capture thread, set Region and FrameRate (encapsulated in Config) to the actual region and frame-rate that will be raised (IL-2778);
  • Updated AForge.CameraSource to integrate with CameraSourceBase (IL-2790);

  • Updated AForge.ScreenSource to integrate with ScreenSourceBase (IL-2789);
  • Updated WinForms.ScreenSource to integrate with ScreenSourceBase (IL-2788);
  • Added new ScreenConfig class to support screen-based capture configurations (region and frame-rate).

    • Added Rectangle class with Origin (type Point) and Size properties.
    • Added Point class with X and Y properties. (IL-2778);
  • Added ScaledSize, ScaledWidth, and ScaledHeight to EncodingInfo. These read-only properties provide a convenient way to see the result of applying Scale to Size, Width, and Height (LS-3126);
  • Added SimulcastMode enum to identify RID-based and SSRC-based simulcast. (IL-2711)
  • Added MediaStream.SimulcastMode to switch between modes. (IL-2711)
  • Added the RtpStreamId RTP header extension to outbound media when the SimulcastMode is RtpStreamId and multiple send encodings are specified. (IL-2711)
  • Added MediaTrackStats.RtpStreamIds and MediaTrackStats.RepairedRtpStreamIds. (IL-2717)
  • Added AudioEncodingConfig and VideoEncodingConfig classes to support simulcast encoding configuration. (IL-2727)
  • Added MinInputEncoding and MaxInputEncoding properties to the IMediaInput interface. (IL-2727)
  • Added MinOutputEncoding, MaxOutputEncoding, and TargetOutputEncoding properties to the IMediaOutput interface. (IL-2727)
  • Added AudioEncodings and VideoEncodings properties to the LocalMediaBase class and ILocalMedia interface to support simulcast encoding configuration. (IL-2727)

    • Note that this may require changes on your part to support simulcast if you are using a custom local media implementation that implements the ILocalMedia interface or inherits from LocalMediaBase. No changes are required if your local media class inherits directly or indirectly from RtcLocalMedia, which is the most common scenario. (All local media classes included in our public examples inherit from RtcLocalMedia.) These changes are only required if you want to use the new simulcast API. To support simulcast, override the following four methods in your custom local media implementation:

      • DoGetAudioEncodings
      • DoGetVideoEncodings
      • DoSetAudioEncodings
      • DoSetVideoEncodings
  • Added OpusConverters, OpusPacketizers, and OpusEncoders properties to RtcLocalMedia (plural versions of the existing singular properties). (IL-2727)

  • Added Vp8Converters, Vp8Packetizers, and Vp8Encoders properties to RtcLocalMedia (plural versions of the existing singular properties). (IL-2727)
  • Added Vp9Converters, Vp9Packetizers, and Vp9Encoders properties to RtcLocalMedia (plural versions of the existing singular properties). (IL-2727)
  • Added H264Converters, H264Packetizers, and H264Encoders properties to RtcLocalMedia (plural versions of the existing singular properties). (IL-2727)
  • Added Vp8Controller, Vp8Controllers, Vp9Controller, Vp9Controllers, H264Controller, and H264Controllers properties to RtcLocalMedia to support generic frame-rate control. (IL-2727)
  • Added ActiveVideoController property and OnActiveVideoControllerChange event to RtcLocalMedia to provide visibility into the active controller.
  • Added RtpStreamId and RepairedRtpStreamId to MediaComponentStats. (IL-2717)
  • Added RtpStreamId and RepairedRtpStreamId to MediaTrackStats. (IL-2717)

Simulcast Developer Preview - Signalling:

  • Added Sdp.MediaDescription.GetRidAttributes(direction). (IL-2711)
  • Added Sdp.MediaDescription.GetSsrcAttributes(name). (IL-2711)

Bug Fixes:

Connections:

  • Fixed a bug in SfuDownstreamConnection where RemoteConnectionId was not set (LS-3399);

JavaScript:

  • Fixed a bug where Util.isError was not properly identifying errors due to a missing escape character before the brackets in the regular expression (IL-2879);
  • Fixed an issue on Chrome 75+ where streams were not properly transitioning to ‘connected’ if the IceConnectionState changed from ‘checking’ to ‘connected’ before the SetRemoteDescription success callback was called (IL-2884);

Media Streams:

  • Fixed an issue where MediaStream.AbsoluteSenderTimeLocalDirection was not updated as a result of negotiation (IL-2814);
  • Fixed a bug where media stream bandwidth estimation could initially incorrectly be reported as zero due to a race condition (LS-3247);
  • Fixed a bug in RtpPacketHeader.Clone preventing HeaderExtension from being cloned (LS-3352);
  • Adjusted the NACK buffer to fix the memory usage of codec media buffers on Cocoa platforms. The memory is now released significantly quicker resolving potential crashes when large video streams were being rendered on iOS devices (LS-3372);
  • Fixed a bug in VideoDepacketizer where the FramesCorrupted and FramesReceived counters were being incremented when discarding a frame due to sequence number gaps. The FramesDiscarded counter is now the only stat that is updated in this case (LS-3319);
  • Fixed a bug in VideoDepacketizer where the FramesReceived counter was being incremented when discarding a frame due to stream corruption. The FramesCorrupted counter is now the only stat that is updated in this case  (LS-3319);

Signalling:

  • Fixed an issue where generating Sdp.MediaDescription with an invalid local port (e.g. 80) was allowed (IL-2814);
  • Fixed a bug where Sdp.MediaDescription.GetPreferredRtpMapAttributes could return a null value in the returned array if an IANA-registered payload type did not have an associated RTP map attribute (LS-3189);

Webhooks:

  • Fixed an issue where calling the Webhooks REST api while active connections are streaming could cause the gateway to hang and require restart (LS-3375);

1.3.4.7439 - June 4, 2019

Bug Fixes:

Media Server:

  • Fixed a bug where downstream bandwidth estimation was not communicated to upstream encoders. (LS-3247)
  • Fixed a bug where media server encoders would ignore bitrates configured below 768kbps. (LS-3247)

1.3.3.7181 - May 22, 2019

New Features:

  • Added X-SiteId to webhook request headers to assist in distinguishing events from distinct LiveSwitch installations (LS-3279);
  • Added Channel.GetRemoteClientInfo convenience method. (LS-3242);
  • Added Channel.GetRemoteConnectionInfo convenience method. (LS-3242);

Bug Fixes:

TypeScript/JavaScript:

  • Fixed a bug where an empty string would be considered falsey for the purposes of null coalescing in TypeScript. Creating a client with an empty string for the user ID or device ID parameters would result in a user ID or device ID being auto-generated and overwriting the empty string (which should be allowed as a valid ID) (IL-2849);
  • Removed references to ActiveXObject from the TypeScript definition file. Prevents a number of Angular CLI errors. (IL-2839);

Configuration Console:

  • Fixed an issue with the server listing on the LiveSwitch Configuration Console showing no servers when the Redis server is configured for a DefaultDatabase other than 0 (LS-3231);
  • Added an api key auth section to the swagger UI for use when the v1 API requires authentication (LS-3257);

Media Server:

  • Media servers will try to reconnect to gateway indefinitely, until they succeed or are killed, rather than crashing with a fatal “Client is already connecting” error message, or closing cleanly after 10 retries when the service is started (LS-3227);
  • Fixed a race condition in the SFU that could cause SFU downstream connections to fail if they use a media identifier and open at exactly the same time as an SFU or MCU upstream with the same media identifier (LS-3219).

Media Streams:

  • Fixed a bug in the SharpDX video view sink causing colours to appear inverted (IL-2856);

Other:

  • Removed Xamarin/Libraries/Android/arm64-v8a/libopenh264fm.so from the package because it was an invalid architecture. OpenH264 does not currently ship arm64-v8a binaries, but we will be updating the libopenh264fm managed wrapper in a future release for customers that would like to ship their own custom OpenH264 builds for arm64 devices (IL-2859, LS-3238);

1.3.2.6889 - May 8, 2019

New Features:

Configuration Tool:

  • Added “export” and “import” commands to FM.LiveSwitch.Cli to save and restore the Redis database. To ensure data integrity, note that you must shut down your service before using these commands. (LS-3165)

Signalling:

  • Added Sdp.MediaDescription.PurgeFormat convenience method to remove a media format and its associated entities from an SDP media description. (IL-2813)

Updates:

  • Updated License Agreement. (LS-3175)
  • Linux native binaries have been removed from the distributed .NET Framework packages. (IL-2835)

Bug Fixes:

Webhooks:

  • The LegacyWebhook REST endpoint will no longer return 404. It was rescued several minutes after the FM search parties started their search. (LS-3104)
  • Due to the trauma of its misadventure, the LegacyWebhook REST endpoint underwent a name change and will now be known as AdvancedWebhook. (LS-3159)

Installer:

  • The "Standalone Server" installation option now also installs a local SIP Connector (along with a Gateway and a Media Server).  (LS-3148)
  • Changed the message that appears when a service fails to start during Windows installation to direct you to https://help.frozenmountain.com/display/L1S/Server where our installation guide is located. Also improved the performance of the service status checks during installation so that failures are identified faster. (LS-3071)

SIP Connector:

  • Fixed a bug in SIP Connector causing “Received InviteFeedback for unknown invite” to appear in the client logs. (LS-3189)
  • Fixed a bug in SIP Connector where URI matching on dial plans for inbound calls did not allow a + prefix. (LS-3189)
  • Fixed a bug in SIP Connector where a “bad request” response from a SIP trunk would not propagate to the client-side Invitation for outbound calling. (LS-3189)
  • Fixed a bug where the outbound SIP caller ID was not properly set when performing a channel invite. (LS-3191)
  • Fixed pluralization of SipInboundMapping to SipInboundMappings in ApplicationConfig. The OData REST endpoint is unmodified, this only affects cases where OData includes are used. (LS-3195)

Examples:

  • Fixed an issue in the Java example where the screen share option was being ignored. (LS-1728)

Media streams:

  • Fixed a bug in RtcRemoteMedia where returning null from CreateAudioSink would cause a null reference exception. (LS-3181)
  • Updated RtcRemoteMedia so the Create__Decoder methods can return null to better support use cases where decoding is not desired (e.g. recording only). (LS-3181)
  • Added NullViewSink constructor overload that does not require an input format. (LS-3181)
  • Fixed a bug in DMO voice capturing where CPU usage was abnormally high for .NET. (IL-2634);
  • Disabled H.264 negotiation in Safari 12.1 to work around a bug in Apple’s H.264 encoder bitstream (https://bugzilla.mozilla.org/show_bug.cgi?id=1492038) discovered by the Firefox team. The bug prevents OpenH264 from being able to properly decode the bitstream, resulting in near-constant keyframe requests and stuttering video. (IL-2813)
  • Fixed an InvalidCastException error encountered when enumerating NAudio devices (LS-2856);

Data Streams:

  • Fixed an issue that was preventing DataStream connectivity establishment with Google Chrome Canary (version 76 and above), where browser was displaying error “Failed to parse SessionDescription. a=max-message-size:2147483648 Invalid SCTP max message size.“ (IL-2820)

TCP Sockets:

  • Fixed a native Android SIGSEGV exception when WiFi is disabled after establishing a connection on Android devices running a Xamarin application. (LS-2868)
  • Fixed a UWP access violation when switching WiFi networks resulting in UWP applications exiting. (LS-2965)

Signalling:

  • Updated calculation of bandwidth in SDP attribute b=TIAS to use a 1000x multiplier instead of a 1024x multiplier on kbps to follow conventions laid out in https://tools.ietf.org/html/rfc6871. (IL-2813)

Other:

  • Removed excessively verbose logging from SynchronizeQueue. (LS-3189)
  • Removed references to ActiveXObject from the TypeScript definition file preventing a number of Angular CLI errors. (IL-2839)
  • Added convenience overloads for Token.GenerateClientJoinToken that accepts a channel ID (string) instead of a full channel claim object. (LS-3189)

1.3.1.6803 - May 3, 2019

Bug Fixes:

  • A regression was introduced in 1.3.1.6703, which caused the Gateway to fail during first startup because it would not detect a newly set license key. On subsequent startups the license key was set properly. With this hotfix the regression is fixed and there is no longer any issue preventing normal service startup. (LS-3120);

1.3.1.6703 - May 1, 2019

Bug Fixes:

  • Fixed a migration issue introduced in 1.3.1.6592. When migrating configuration from 1.3.0 to 1.3.1.6592 Redis could be left in a state which in turn caused Gateway and Media Server services to fail to start. The symptom in the logs was a Null Reference Exception on service start-up. The migration operation is now fixed. If you have already migrated from 1.3.0 to 1.3.1.6592 there is no need to roll back - this case is handled by the hotfix. (LS-3183);

1.3.1.6592 - April 26, 2019

New Features:

JavaScript:

  • Added support for extension-less screen capture support on Chrome versions 72 and later using the MediaDevices.getDisplayMedia API (LS-2511);

Bug fixes:

CLI:

  • FM.LiveSwitch.Cli now requires .NET Core 2.1, matching FM.LiveSwitch.Gateway.Core, FM.LiveSwitch.MediaServer.Core and FM.LiveSwitch.SipConnector.Core (LS-3094);

Gateway:

  • Fixed a bug where using an api key to access the site entity could cause a deadlock in the Gateway (LS-3105);
  • Fixed a bug where API keys wouldn’t allow access to the v1 API (LS-3107);
  • The v1 Gateway API now accepts OAuth JWT tokens as a valid authentication option (LS-3118);

Media Server:

  • Fixed a bug where the Media Server could fail to initialize an upstream connection if OpenH264 did not download successfully (LS-2312);
  • Fixed an issue where the Media Server report interval property was not modifying the interval at which reports were sent (LS-3078);
  • Fixed an issue where when POSTing to some of the REST endpoints with a new entity, the values posted got overwritten with default values (LS-3077);
  • The report interval now must be at least 1000ms (LS-3077);
  • The UserAlias, DeviceAlias, and ClientRoles are now properly populated in the ConnectionInfo objects (LS-3063);
  • Fixed an issue where an SFU video upstream would display macro-blocking within an MCU video downstream in cases where the video mixer was started (one or more MCU video downstreams opened) then stopped (all MCU video downstreams closed) and then started again (one or more MCU video downstreams opened) (LS-2489);

Configuration Console:

  • Fixed a bug in the LiveSwitch Configuration Console where Certificates did not show up in the HTTPS and TURNS Binding sections when creating a new Deployment (LS-3012);

Webhooks:

  • Fixed a bug with mediaserver.registered webhook event, which did not fire (LS-3075);
  • Fixed a bug with channel.client.joined and channel.client.left webhook, which did not fire (LS-3075).

JavaScript:

  • Modified the settings we use for video streams to workaround an issue with Safari on iOS devices preventing multiple video streams to be active at the same time (LS-2842);
  • Fixed the “Uncaught TypeError: Cannot read property 'play' of undefined” JavaScript exception that was sometimes reported in the browser console when the video element became invalid as we were attempting to play it. We now display a more appropriate message when this happens (LS-2757);

Data Streams:

  • Brought interpretation of SDP max-message-size attribute value with the latest draft spec https://tools.ietf.org/html/draft-ietf-mmusic-sctp-sdp-26, where a 0-value indicates that the SCTP endpoint will handle messages of any size, subject to memory capacity etc. Previously, this value was interpreted as a rejection of offer by an end point (IL-2819);

Other:

  • Fixes a race condition on startup that may output license key errors in the service logs (LS-3046).

1.3.0.6160 - April 12, 2019

Breaking Changes:

  • Converted AudioProcessing, OpenH264, Opus, Vpx and Yuv native lib initializers to be synchronous (returning a boolean), eliminating memory leaks (IL-2600);
  • Renamed Utility.GenerateTieBreaker() to GenerateId() retaining its functionality (LS-1978);
  • Renamed FormatInfo.CodecName to FormatInfo.Name (LS-1978);
  • The number of lost packets reported via RTCP reports now has a 0 lower bound to avoid confusion add more strictly adhere to https://tools.ietf.org/html/rfc3550#section-6.4.1. Previously, under certain circumstances, negative values could have been reported due to the receipt of duplicate packets (LS-1978);
  • Added AudioEncoder.Bitrate and VideoEncoder.Bitrate implementations in base classes to better support dynamic bandwidth adaptation. The values of these fields reflect the current bitrates used by the encoders. Custom encoders will need to either remove their Bitrate implementation if one exists, or mark it as an override. Also see changes under New Features/Media Streams marked as IL-2690 below (IL-2690);
  • Removed Sdp.MediaDescription.SupportsRtcpMultiplexing (use existing Sdp.MediaDescription.RtcpMultiplexingSupported). Sdp.MediaDescription.SupportsIce changed to a getter (IL-2698);
  • Removed LogConfiguration.LogOverrides. Use LogConfiguration.SetTagLogLevel instead (IL-2699);
  • IceServer constructor takes server url as a parameter. Earlier, a bug led to interpreting an empty string passed to the constructor as a UDP-based stun server on localhost on some (notably NET) platforms. This is an arbitrary behaviour that was fixed. Specifying an empty string now will generate an Exception. If localhost url is required, specify “localhost“ explicitly (IL-2730);
  • IceServer constructor takes server url as a parameter. This parameter may or many not contain port. If the port is not present, for secure schemas (stuns and turns) the port now defaults to 5039, while for non-secure schemas (stun and turn) port still defaults to 3478. Also, if the port specification is invalid (e.g. stun:202.121.342.12:80z?transport=udp), this will now throw an exception (IL-2730);
  • Default logging path for LiveSwitch server suite on Linux is now /var/log/liveswitch instead of /var/log/fm (LS-2924);
  • Removed spaces from default logging path for LiveSwitch Media Server and SIP Connector on Linux (/mediaserver and /sipconnector instead of /media server and /sipconnector) (LS-2924);

Deprecations:

  • Deprecated setting Encoder.Bitrate in favour of Encoder.TargetBitrate. Since bandwidth adaptation was released, Encoder.Bitrate has become a dynamic property - reflecting the current bitrate rather than the desired Bitrate. We've introduced TargetBitrate to accommodate this (IL-2690);
  • Added IceServer.DefaultTurnPort, IceServer.DefaultTurnsPort, IceServer.DefaultStunsPort and IceServer.DefaultStunPort. IceServer.DefaultPort is deprecated (IL-2730);
  • MediaSink.Disabled setter is deprecated in favour of MediaSink.Deactivated setter. In a future release, MediaSink.Disabled setter will be removed, making the property read-only and consistent with use of Disabled elsewhere in the media chain. Use MediaSink.Deactivated instead of MediaSink.Disabled to deactivate a sink (LS-2528);
  • Deprecated Error.ErrorCode in favour of Code (LS-554, LS-2102, LS-2116, LS-2142, LS-2143);
  • Deprecated StunError.StunErrorCode in favour of StunCode (LS-554, LS-2102, LS-2116, LS-2142, LS-2143);
  • Deprecated DataStreamStats.DataChannels in favour of Channels (LS-554, LS-2102, LS-2116, LS-2142, LS-2143);
  • Deprecated FormatInfo.CodecName in favour of Name (LS-554, LS-2102, LS-2116, LS-2142, LS-2143);
  • Deprecated CandidateStats.TurnTransportProtocol in favour of RelayProtocol(LS-554, LS-2102, LS-2116, LS-2142, LS-2143);
  • Deprecated Candidate.TurnTransportProtocol in favour of RelayProtocol (LS-554, LS-2102, LS-2116, LS-2142, LS-2143);

New Features:

REST & Redis:

  • Configurations are now stored in Redis. The MediaServers and Sip Connectors connect to Redis to retrieve their configuration and also use Redis to discover the gateway url and shared secret. The existing xml-based configuration is no longer used and instead there is a simple JSON configuration with a Redis connection string (and some misc single-server options) (LS-1678);
  • The Media Server and Gateway config now have REST endpoints to either get the current configuration or to update it. This feature is not yet documented with the release of 1.3.0 as REST V2 is not yet at parity with V1. A future release will document the official V2 API (LS-1772);

Regionality:

  • Added Client.Region property. If a region is set in a register token, the Region property will be automatically populated after registration succeeds (LS-2040);
  • Added Client constructor overload that accepts a region parameter so clients can set their own region if Region is not specified in the register token  (LS-2040);

Gateway:

  • The Connectors REST API in V1 is deprecated with the new SipConnectors entity replacing it in the odata API. Please see the OData metadata for details (LS-2159);
  • A list of online gateways and their metadata is now available in the V2 OData REST API (LS-2160);
  • Added OpenTracing spans to datastore calls (LS-2690);
  • Updated the LiveSwitch Gateway to use minimum TLS 1.1 for secure connections (LS-2744);

Media Server:

  • Enabled VP9 support in LiveSwitch Media Server (LS-2073);

Stats:

  • Added CloudStatsEnabled to Site configuration to allow opt-in for upcoming LiveSwitch Cloud data stats/analysis service (LS-554, LS-2102, LS-2116, LS-2142, LS-2143);
  • Added ConnectionStatsInterval to Site/Region/Application/Channel configuration to control the frequency of connection stats messages sent to webhooks (LS-554, LS-2102, LS-2116, LS-2142, LS-2143);
  • Added ManagedConnection.DefaultStatsInterval static property to control the default frequency of connection stats messages sent to the LiveSwitch gateway for webhooks (LS-554, LS-2102, LS-2116, LS-2142, LS-2143);
  • Added ManagedConnection.StatsInterval property to control the frequency of connection stats messages sent to the LiveSwitch gateway for webhooks (LS-554, LS-2102, LS-2116, LS-2142, LS-2143);
  • Added ConnectionInfo.Error property with connection error info (LS-554, LS-2102, LS-2116, LS-2142, LS-2143);
  • Added CandidatePairStats.RequestsReceived property (LS-554, LS-2102, LS-2116, LS-2142, LS-2143);
  • Added CandidatePairStats.ResponsesSent property (LS-554, LS-2102, LS-2116, LS-2142, LS-2143);
  • Added MediaComponentStats.LrrCount property (LS-554, LS-2102, LS-2116, LS-2142, LS-2143);
  • Added MediaSenderStats.Source property with source stats (LS-554, LS-2102, LS-2116, LS-2142, LS-2143);
  • Added MediaReceiverStats.Sink property with sink stats (LS-554, LS-2102, LS-2116, LS-2142, LS-2143);

Third-party dependency updates:

  • Updated to ASP.Net Core 2.1 in the Gateway (LS-1760);
  • Updated SkiaSharp to 1.60.3 (LS-1760);
  • Updated .NET Standard libraries to 2.1 (LS-1760);
  • Updated Swagger UI package to 3.0.0(LS-1760);

Logging:

  • Updated file logging in LiveSwitch server suite to fall back to application installation directory if default logging path is not accessible (LS-2924);
  • Updated file logging in LiveSwitch server suite to use standard .log extension instead of .fmlog (LS-2924);

Media Streams:

  • Added Stream.Deactivated, which returns true if the stream direction is unset or inactive (LS-2528);
  • Added MediaSource.Deactivated, MediaPipe.Deactivated, and MediaSink.Deactivated, which can be used to disable media track elements without modifying the track structure (LS-2528);
  • Added MediaTrack.Deactivated, which indicates if the first element in the track is deactivated (LS-2528);
  • Added MediaBranch.Deactivated, which indicates if the first active track in the branch is deactivated (LS-2528);
  • Added AudioEncoder.MinCodecBitrate and VideoEncoder.MinCodecBitrate virtual properties to define minimum possible codec bitrates in kbps. Defaults to 1 (IL-2690);
  • Added AudioEncoder.MaxCodecBitrate and VideoEncoder.MaxCodecBitrate virtual properties to define maximum possible codec bitrates in kbps. Defaults to -1 (no maximum) (IL-2690);
  • Added AudioEncoder.TargetBitrate and VideoEncoder.TargetBitrate virtual properties to define target bitrates in kbps. Defaults to -1 (no target) (IL-2690);
  • Added AudioEncoder.OverConstrained and VideoEncoder.OverConstrained to indicate that MaxOutputBitrate (the maximum allowed output bitrate) is less than MinCodecBitrate (the minimum possible codec bitrate) (IL-2690);
  • Updated Opus encoder to use 6kbps as the MinCodecBitrate and 510kbps as the MaxCodecBitrate (IL-2690);
  • Updated Opus encoder to use 32kbps as the initial Bitrate (IL-2690);
  • Updated VP8/VP9/H.264 encoders to use 100kbps as the MinCodecBitrate and 100,000kbps as the MaxCodecBitrate (IL-2690);
  • Updated VP8/VP9/H.264 encoders to use 768kbps as the initial Bitrate (IL-2690);
  • Added AudioFrame.GeneratePcmFrame utility method to generate silent audio frames for development/testing (IL-2690);
  • Updated MediaSink.MaxInputBitrate and MediaSource.MaxOutputBitrate to be virtual/overridable (IL-2690);
  • Added NullAudioSink.SetMaxInputBitrate and NullVideoSink.SetMaxInputBitrate methods for development/testing (IL-2690);
  • Added NullAudioSource.SetMaxOutputBitrate and NullVideoSource.SetMaxOutputBitrate methods for development/testing (IL-2690);
  • Fixed a bug in VideoToolboxH264Encoder (iOS/macOS) where the bitrate property would return a value in bps instead of kbps, inconsistent with set operation and the rest of the API (IL-2690);
  • Fixed a bug in MediaCodecEncoder (Android) where it might not respond to a keyframe request (CCM FIR) (IL-2690);
  • Added MediaStreamStats.Senders and MediaStreamStats.Receivers. MediaStreamStats.Sender and MediaStreamStats.Receiver are still available and return the first element (or null if no elements) (IL-2703);

RTP Transport:

  • Added support for RtpStreamId and RepairedRtpStreamId RTP header and RTCP SDES extensions (LS-2500);

Networking:

  • Added additional VirtualNetwork convenience overloads (IL-2701);
  • Increased default UDP socket send/receive buffer sizes in Objective-C and Java to improve socket throughput in iOS, macOS, Android, and Java applications (IL-2726);

Signalling:

  • Added support for SDP serialization and deserialization of a=simulcast and a=rid, required for RFC-compliant simulcast support (LS-2488);

Examples:

  • Updated example .NET Framework version to 4.6.1 to use TLS 1.2 by default (LS-1541);
  • Updated the iOS and macOS Swift examples from Swift 3 to Swift 4.2 (IL-1444);
  • Updated the Web example such that it now requires a user to click the ‘Join’ button to start a session (considered best practice; addresses the recent changes to Chrome’s autoplay policy introduced in Chrome 71) (IL-2268, LS-2216);
  • Updated Java Gradle files to address issues when building with Gradle version 5.0+. Gradle versions 4.0 and newer are now required to build Java examples distributed with our SDK (LS-2592);

Other:

  • Exposed a number information objects for stats and Webhooks in FM.LiveSwitch: 
    • ApplicationInfo, 
    • AudioMixerInfo, 
    • AudioReceiverReport, 
    • AudioSenderReport, 
    • AudioSinkInfo, 
    • AudioSourceInfo,
    • AudioStreamInfo, 
    • CandidateInfo, 
    • CandidatePairInfo, 
    • CertificateInfo, 
    • ChannelInfo, 
    • CodecInfo, 
    • ConnectionInfo, 
    • ConnectorInfo, 
    • ControlTransportInfo,
    • DataChannelInfo, 
    • DataChannelReport, 
    • DataStreamInfo, 
    • ExternalNetworkInfo, 
    • GatewayInfo, 
    • InternalNetworkInfo, 
    • MediaInfo, 
    • MediaComponentInfo, 
    • MediaReceiverInfo, 
    • MediaReceiverReport,  
    • MediaSenderInfo, 
    • MediaSenderReport, 
    • MediaServerInfo, 
    • MediaSinkInfo, 
    • MediaSourceInfo, 
    • MediaStreamInfo, 
    • MessageInfo, 
    • NetworkInfo, 
    • MixerInfo, 
    • NetworkInterfaceInfo, 
    • StreamInfo, 
    • TransportInfo, 
    • VideoMixerInfo, 
    • VideoMixerInfo, 
    • VideoReceiverReport,
    • VideoSenderReport, 
    • VideoSinkInfo, 
    • VideoSourceInfo and WebhookInfo (LS-1978, LS-2834);
  • Added CandidateUtility for string to type conversion (LS-2834);

  • Refactored activity uploader to use async HTTP clients instead to prevent accidentally blocking on task pool threads (LS-2247, LS-2325);
  • Client IDs are auto-generated as GUIDs starting with this version to provide faster cache storage/lookups server-side. Client IDs passed into the Client constructor are moved to ExternalId. Added Client.ExternalId for custom application-level identification. Client IDs in tokens are no longer used (LS-2377);
  • Updated log message when an invalid response is received from the server to include HTTP status code and details about the text body of the response. Prior to this, a non-WebSync response from the WebSync server endpoint (e.g. proxy, load balancer, web server) would trigger the following message in the logs:Invalid response received from server.The additional detail should help in identifying the specific point of failure and how to best resolve the issue (WS-69);

  • Added Outbound SIP Webhook which allows users with multiple SIP trunks to select a specific trunk for a placed call (IL-2685);

  • Exposed UnixTimestamp.UtcNowMillis (LS-1978);
  • Added JsonConsoleLogProvider which logs to the console in JSON format to improve support for logging in containerized environments (LS-2298);
  • Added NetworkType.{Unknown, Wired, Wireless, Cellular, Vpn} to the public API (LS-2426);
  • Improved TypeScript/JavaScript error checking by using a regular expression to identify an error object instead of looking at object type. This fixes issues on Chrome and Edge browsers where some errors were not properly being identified (LS-2671);
  • Added DataBuffer.FromHexString static utility method (LS-1532);
  • Added DataBuffer.FromBytes static utility method as alias of DataBuffer.Wrap (LS-1532);
  • Added DataBuffer.ToBytes utility method as alias of DataBuffer.ToArray (LS-1532);
  • Fixed an issue where Webhook would stop firing when running in NET Framework 4.6.1 (LS-3067);
  • Renamed config tool to FM.LiveSwitch.Cli (LS-3055);
  • Added a http port reset feature to the cli tool (LS-3055);
  • Added a beta feature to list config models to the cli tool (LS-3055);

Bug Fixes:

ActiveX:

  • Fixed a bug when ActiveX filtering was enabled in Internet Explorer where (1) WebRTC plugin was not loaded and no option was given to the user to load it manually, (2) once override was setup, local media did not appear (IL-2587);

Android:

  • Fixed a bug where screen dimensions, orientation, etc were not updated properly when rotating Android devices that were screen-sharing (IL-2676);

DTLS:

  • Fixed a race condition where a DTLS handshake could fail on one end under poor network conditions (IL-2701);
  • Fixed a bug that mis-parsed a DTLS packet, resulting in an error in the logs at the start of a connection: Could not decrypt RTCP. Auth check failed (LS-1532);

Examples:

  • Modified all examples to account for a potential race condition causing a deadlock (LS-2679);
  • In UWP examples, added a library that is required to enable H264 encoding/decoding in UWP applications. You can now download and bundle the OpenH264 library into your application to enable H264 support (subject to OpenH264 terms and conditions) (IL-2705);

Client:

  • Updated Client to include the Gateway's error message in its failure message if a Join or Leave operation is rejected by the gateway;
  • Fixed a bug where Client.Join did not consistently resolve with the Channel instance. This behaviour has been fixed so calls are idempotent (LS-2587);
  • Fixed a bug where Client.Leave did not consistently resolve with null. This behaviour has been fixed so calls are idempotent (LS-2587);

Gateway:

  • Fixed an issue where the gateway could crash if the GetChannelConnections endpoint is called with clients that have unregistered but have connections still active (LS-2794);
  • Fixed an issue where during high load, clients may abruptly unregister themselves due to race conditions on receiving published messages (LS-2875);
  • Fixed race condition where a client might receive an invalid server response when picking up messages and unregister itself abruptly (LS-2875);
  • Fixes Unknown connect error. with a NullReferenceException cause by a race condition during client unregistration (LS-2968);

Media Server:

  • Due to variations int Operating System architectures, occasionally the MCU video mixer would pick the wrong default colour type causing a "Buffer format does not match bitmap format." exception. It now explicitly picks the platform's default colour type (LS-2308);
  • Media servers will now terminate on fatal exceptions during re-registration instead of idling until the end of time (LS-2456);
  • The destination for recordings once again has application ids and channel ids in the path (LS-2431);
  • Fixed a REST issue where tag was null when recording (LS-2538);
  • MCU video mixer can now mix using the system default colour type. This allows greater support for linux operating systems (LS-2561);
  • The Media Server now properly closes the cluster listening socket on shutdown (LS-2589);
  • The Media Server now checks for valid recording path on startup. An error is logged if it does not exist or is otherwise unavailable (LS-2543);
  • Updated inbound candidate handling to avoid a possible null key exception when receiving an SFU or MCU connection candidate after it has been closed locally (LS-2918);
  • Fixed a bug where ManagedConnection.Open could return a null value instead of a Future if the connection failed before the call to Open returned (LS-2933);

ICE:

  • Fixed a bug, where Scheduler was not closed upon discovery of public addresses by MediaServer thus retaining an unused thread (IL-2712);
  • Fixed a deadlock, where StreamSocketManager may deadlock on Connection shutdown (IL-2674);
  • Fixed a bug, where STUN and TURN URIs containing IPv6 addresses and ports were not properly parsed (LS-2869);
  • Fixed a crash that could occur when generating candidate pairs. This was most commonly encountered when disabling and re-enabling network connections (IL-2755);
  • Fixed a race condition preventing connectivity on relay-to-relay candidate pairs with the same relay server under adverse conditions (that was also causing excessive recurring logging “Received STUN Response to a connectivity check on a candidate pair with ID *id*, but candidate pair with this ID does not exist in local cache. Discarding.“). This bug was very unlikely to preclude connectivity considering that relay-to-relay candidate pairs are typically not required for connectivity establishment (except for the cases requiring TCP-connectivity for both peers); nevertheless excessive logging may be detrimental to performance (IL-2671);
  • Improved efficiency of Candidate gathering by switching the algorithm to calculate Candidate Foundation to SHA-1 (from CRC32), which improves performance on slower devices (particularly on Android) (IL-2671);

SIP Connector:

  • Media servers and SIP connectors in version 1.3.0 and beyond will now register using RSA tokens instead of PSK (LS-2406);
  • Fixed a bug where the SIP Connector could listen on a port other than the configured port (LS-2931);

Signalling:

  • Fixed a bug where: 1) RTP/RTCP muxing was assumed when a=rtcp attribute was not present in SDP offer or answer (as per RFC 5761 3.1.1); 2) default candidates were not calculated for RTCP (secondary) component when a=rtcp attribute was not included (as per RFC 3605) (IL-2698);

Sockets:

  • Fixed a bug in .NET’s TcpSocket wrapper where the remote IP was being used instead of the remote hostname in the proxy HTTP CONNECT request (LS-2368);
  • Fixed a bug in HttpFileTransfer where an attempt could be made to decompress a bzip2 octet stream even if the response status code indicated a failure (LS-2368);
  • Fixed a bug in HttpClientTransfer causing system proxy settings to be bypassed (LS-2368);
  • Added a new Proxy class to allow auth checks, getting/setting credentials, and importing/exporting the credentials cache for .NET (LS-2368);
  • Updated HttpWebRequestTransfer and TcpSocket to use Proxy credentials if available (LS-2368);

Stats:

  • Fixed a bug where TransportStats.RemoteCertificate was not populated (LS-554, LS-2102, LS-2116, LS-2142, LS-2143);

Media Streams:

  • Updated SDES chunk/item serialization to match RFC 3550 (IL-2693);

JavaScript:

  • Added a check to see if the browser supports MediaStreamTrack.getSettings before calling it. This fixes a problem on Chrome, versions 58 and older, where LocalMedia was failing to initialize (IL-2669);
  • Updated our library to properly handle the promise returned by HTMLMediaElement.play() when starting audio and video on Chrome versions 50+. Specifically, we now properly catch and log any errors that occur when starting the media (LS-2757);

Logging:

  • Fixed an issue where SyslogLog provider was throwing exception when log strings containing non-Unicode messages were sent (LS-2342);
  • Fixed a logging problem where TCP socket logging was mistakenly denoted as UDP Socket logging (IL-2694);
  • Fixed a bug where Logger was causing null reference exceptions (IL-2699);
  • Failures to send a request can happen under normal conditions, so the corresponding log statements for UDP and TCP sockets have been dropped from error-level to debug-level (IL-2754);
  • Timeouts while sending a STUN binding request or TURN allocate request can happen under normal conditions, but may still indicate a code-level problem, so the corresponding log statements have been dropped from error-level to warn-level (IL-2754);

Other:

  • Eliminated a possible race condition in ManagedConnection.Open when re-opening a closed connection (LS-2670);
  • Changed Redis Config to always save to disk when any configuration is updated (e.g. through Console). Updated config tool to properly handle this new workflow (LS-2894LS-2941);
  • Improved memory management and eliminated a number of issues causing memory leaks on shutdown in networking pipeline (UdpSocket), media pipeline (JitterBuffer, Audio/VideoMixers) (LS-2597);
  • Fixed a bug where a remote failure of the peer or media server could, in some edge cases, fail to transition the local connection to the Failed state with an appropriate Error value (LS-2861);
  • Corrected folder name for Xamarin Android armv64 native libraries. This fixes an issue with the native libraries failing to properly load on Android devices with ARM64 hardware (IL-2756);

1.2.5.3369 - January 11, 2019

New Features:

Data Streams:

  • Updated SDP descriptions of Data Streams to v26 of draft-ietf-mmusic-sctp-sdp. When new format is detected, max-message-size in SDP will restrict the data message size (as per spec). Particularly, if not present, maximum size will default to 64 KB. Native LiveSwitch default to 2GB. Implementation is backward compatible (will accept offers from pre-v21 implementations). This matches Google Chrome and Mozilla Firefox implementations (IL-2645);
  • Exposed DataStream.MaxMessageSize (allowing to alter maximum data stream message size that this peer is willing to accept; defaults to 2GB) (IL-2645);
  • Exposed DataStream.SctpPort (that represents ephemeral SCTP port used on top DTLS/UDP transports; defaults to 5000) (IL-2645);

Bug Fixes:

DTLS:

  •  Fixed a bug impacting performance where DTLS transport was attempting to decrypt incoming RTP packets containing audio and video payloads, even though decryption was being handled by SRTP (IL-2624);

ICE:

  • Fixed a regression introduced in 1.2.2.2257 where under certain conditions connectivity checks may not have been conducted on some candidate pairs (where remote candidates were learned over peer reflection and have received updated priority and type (due to delayed signalling) and the candidate pair itself has not yet completed its connectivity check). This issue was likely to occur on overloaded devices and would happen when “The priority of the candidate pair CP changed. This may lead to setting a new active candidate pair.” was seen but no connectivity was established (IL-2653);
  • Fixed a regression introduced in 1.2.1.1853, which led to a race condition, where received response to a permission request on a candidate pair containing local release candidate would stop connectivity checks on the pair that got a remote connectivity check just before that. This was causing inability to establish connectivity on candidate pairs containing local relay candidate. under adverse conditions (IL-2666);

TCP Sockets:

  • Fixed an issue with the IceLink TURN server when only TCP transport was used/configured (IL-2626);

Signalling:

  • ICE Candidate foundation attribute changed to conform to RFC 5245 (IL-2639);

JavaScript:

  • Updated Javascript libraries so that they work properly with webpack (LS-2225);

1.2.4.2770 - December 7, 2018

Known Issues:

  • UPDATE (Jan 6th, 2019): There is a known issue in the ICE gathering process that was introduced in 1.2.2.2257 where under certain conditions connectivity checks may not have been conducted on some candidate pairs. This issue is being investigated. Also, a race condition where received response to a permission request on a candidate pair containing local release candidate would stop connectivity checks on the pair that got a remote connectivity check just before that. These are being tracked as IL-2653 amd IL-2666, respectively.

New Features:

TURN:

  • Added TURN feature support to the media server. Optional turn and turns sections are now available in the media server configuration (LS-1606);

  • Added a DisableAutomaticIceServers flag to ManagedConnection to support enabling/disabling this feature on a per-connection basis. It is currently disabled by default. Existing application code that provides an IceServers array manually for ManagedConnection will implicitly disable this feature (LS-1606);

Logging:

  • Added additional logs entries to facilitate troubleshooting gateway media server reports (LS-1947);

Media Server:

  • REST API queries for media server information now include the CPU core count (LS-1907);

Bug Fixes:

ICE and Networking:

  • Fixed a bug where Datagram Socket Manager was attempting to obtain UDP relay candidates for each IP returned by DNS for a given host instead of attempting them in sequence, respecting the order provided by DNS. This issue was particularly severe for the cases where more than 5 IP addresses were returned by DNS. In this case, under certain conditions, no allocations were possible. Now socket manager attempts to gather on the subsequent IPs only if relay servers on earlier IPs failed to allocate relay candidates. TCP relay candidate allocation was not affected by this bug (IL-2615);
  • Improved reliability of UDP socket receiver under bursty network conditions, especially in .NET (LS-2011);

Encryption and Browser Interop:

  • Improved performance of SRTP encryption/decryption layer by optimizing memory usage (LS-2011);
  • Updated DTLS transport for SCTP tunnelling to include the use_srtp extension. This works around a bug introduced in Firefox 64 where data channel streams that don’t negotiate an SRTP profile are immediately closed after the DTLS handshake completes (IL-2625);

Media Streams:

  • Updated Matroska file parsing to honour unknown-length segments (IL-2562);
  • Fixed a bug in the Media Server where a video stream send to a peer in MCU mode would have incorrect colours. This only occurred if the Media Server v1.2.2 and 1.2.3 was running on Linux (LS-2089);

Artifacts:

  • libvpxfm-iOS.a was incorrectly named libvpxfm-iOS.so in the Xamarin iOS libraries (LS-2111);

1.2.3.2492 - November 23, 2018

New Features and Breaking Change:

ICE and Networking:

  • Exposed Differentiated Services Code Point (DSCP) flags for TCP/UDP socket classes allowing DSCP to be enabled for platforms where DSCP is supported   (IL-2620);
  • UDP and TCP media packets are no longer sent with Differentiated Services Code Point (DSCP) values in the IP header. LiveSwitch 1.2.0 turned DSCP on by default, but you must now “opt-in” to enable DSCP for improved quality-of-service in network environments that also support DSCP. Example usage: `fm.liveswitch.TcpSocket.AttemptIPv4Dscp = true`  (IL-2620);

Bug Fixes:

Signalling and Browser Interop:

  • Fixed an issue where media identifier SDP attributes where not included in SDP Answers in the cases when they were included in SDP offers preventing connectivity establishments with currently pre-release versions of some browsers (Chrome 72, Firefox 64 and Safari Tech Preview 70/12.1) (IL-2619);
  • Fixed an issue where Firefox 63 failed to set local SDP answers because SDP mids where not set in remote offers. If remote descriptions do not contain media identifier attributes, they will be auto-generated and included in remote descriptions (IL-2621);
  • Fixed an issue where Half Trickle ICE mode was not supported when a JavaScript-based client was in the answering role (IL-2621);

1.2.2.2294 - November 13, 2018

Bug Fix:

  • Fixed a regression introduced in 1.2.2.2257, where audio would not be properly transferred during media server clustering  (LS-2068);

1.2.2.2257 - November 6, 2018

Breaking Changes:

  • Android and Xamarin-Android’s BufferToBitmap method has been fixed to output the correct colour values in the bitmap. The BufferToBitmap method in Android and Xamarin-Android now requires RGBA format instead of ARGB format (IL-2487);
  • Added new config option to the SIP-connector for outgoing-only trunks. Instead of a registration element, use a trunk element instead and it will skip registration (IL-2590);

New Features:

Events and Logging:

  • Catching exceptions that occur in the application level code event handlers of the events raised from Connection, Stream, MediaStream and DataChannel objects. This allows to isolate the cause of error more precisely, while in the past errors in the internal Liveswitch transports were erroneously reported (IL-2550);
  • Added Connection ID to Session Description, Candidate logs. Added IceTransport ID to active candidate pair logs. Added candidate pair check status on IceTransport state transition to the Failed state in Debug level, as well comprehensive candidate pair check status logging in Verbose log for IceTransport on any CandidatePair state transition (LS-949);

DTMF:

  • Added support for relaying DTMF tones over SFU with a single Media Server - clustered Media Server support will be in a future release (LS-1672);
  • Added AudioBuffer JSON serialization methods  (LS-1672);
  • Added AudioFormat JSON serialization methods  (LS-1672);

REST:

  • Added a new event Channel.OnKick that is raised when your client is kicked from a channel via the REST API (LS-1802)
  • Added userAliasdeviceAlias, and tag to the REST GET query results for client info (applications/{applicationId}/users/{userId}/devices/{deviceId}/clients/{clientId}) (LS-1827);

Partial FIPS compatibility:

  • Implemented partial FIPS compatibility for Windows in .Net by switching hashing contexts when FIPS compatibility mode is set to true. In particular, SHA1Managed is switched to SHA1CryptoServiceProvider, SHA256Managed to SHA256CryptoServiceProvider and RijndaelManaged to AesCryptoServiceProvider. In addition, internal property generation uses GUIDs instead of MD5, a section of calls using the MD5 hashing context is replaced with SHA-256 (IL-2465);

Examples:

  • Updated Android Examples: Gradle to 4.4, Gradle plugin to 3.1.4, build.gradle directives from 'compile' to 'implementation', build tools to 27.0.3 (IL-2446);

Bug Fixes:

Gateway:

  • Null properties will no longer be included in Gateway webhooks (LS-1743);
  • Added http timing diagnostics to the Gateway (LS-1750);
  • Fixed a race condition where a null exception could occur if a user immediately unregistered after sending an offer (LS-1616);
  • Fixed a race condition where a null exception could occur if a media server unregistered before a previously send report was processed (LS-1595);

DTMF:

  • Fixed a bug where DTMF could be returned as the active audio codec in GetStats (LS-1672);
  • Fixed a bug where inserting a DTMF tone would result in an invalid warning in the logs about system timestamps not being set (LS-1672);

REST:

  • Fixed a bug where Client.OnRemoteUpdate was not raised when a client config was updated with the REST API  (LS-1827);
  • Fixed a bug where Channel.OnRemoteClientUpdate would not reflect role changes  (LS-1827);
  • Fixed a regression where Client.Update would fail if a client had roles specified (LS-1827);
  • Fixed a regression where updating a client config with the REST API would clear roles unless roles were passed in the request body  (LS-1827);

Transcoding:

  • Improved the quality of the SFU transcoding output (LS-1904);

ICE:

  • Fixed a bug where ICE candidates discovered over peer reflection remain PeerReflexive even if they are signalled by the remote peer later on. This was causing an issue where connectivity checks over remote relay candidates that arrived prior to those candidates being signalled resulted in some traffic being routed over relayed connections (rather than direct peer-to-peer links) (IL-127);

Memory Management:

  • Fixed memory leak in UDP socket code for the MediaServer and UWP client (LS-1930);
  • Fixed a bug where certain scheduled tasks were not removed from Connection on shutdown or failure causing a memory leak (IL-2570);
  • Cleaned up DTMF event handling causing memory leaks (IL-2338);
  • Fixed a memory leak relating to DTMF Senders and Receivers (IL-2338);
  • Eliminated root cause for some other memory leaks in Cocoa (IL-2517);

Encryption:

  • Fixes a bug where setting EncryptionMode to Null on a stream would result in an error unless EncryptionPolicy was downgraded from Require (IL-2581);

Image Conversion:

  • Fixed Image Converter conversions from RGB, BGR, RGBA ,BGRA, ARGB, ABGR, YV12, NV12, NV21 formats to RGB, BGR, RGBA ,BGRA, ARGB, ABGR, I420, YV12, NV12, NV21 formats. Also fixed image conversions from I420 to RGBA, BGRA, ARGB, ABGR formats (LS-840);

Xamarin:

    • Xamarin-Android and Xamarin-Forms-Android’s MediaProjectionSource will now raise frames that have buffers of format BGRA instead of ARGB (LS-840);
    • Xamarin-iOS and Xamarin-Forms-iOS’s ImageViewSink now accepts VideoFormat of BGRA frames instead of RGBA (LS-840);
    • Xamarin-iOS and Xamarin-Forms-iOS’s ScreenSource will now raise frames that have buffers of format BGRA instead of ARGB (LS-840);

Android:

    • Android’s MediaProjectionSource will now raise frames that have buffers of format BGRA instead of ARGB (LS-840);

Examples:

  • Fixed a bug in iOS, Android, and Xamarin-Android where double-tapping the screen in screen share mode would cause the app produce an exception (LS-1568);
  • Fixed crashes and hangs in Xamarin iOS example that occurred when repeatedly joining and leaving a session (LS-1803), (LS-1818), (LS-2001);
  • Fixed an example level bug in iOS, Android, and Xamarin-Android where double tapping the screen in screen share mode would cause the app produce an exception (LS-1568);
  • Fixed a bug where Connections were not removed from ConnectionCollection in Signalling class in macOS examples causing a memory leak. Updated other examples for consistency (IL-2548);
  • Added runtime permissions to the Xamarin-Android example so that it run with Android 6+ (API level 23) (IL-2533, IL-2495, LS-1789);
  • Fixed an example level bug in Xamarin-Android where LeaveAsync() produced a null reference when StartLocalMedia() promise failed (IL-2533, IL-2495, LS-1789);
  • Fixed an example level bug in Android where re-joining a session would create multiple local previews (IL-2589);
  • Fixed an example level bug in Web where an exception would occur if you attempted to join and leave in rapid succession (LS-1621), (LS-1674);
  • Fixed an example level bug for iOS Swift where the application would freeze if the join button was clicked and appropriate app permission were not granted (LS-964);
  • Properly clean up connection when exiting session after rotating Android device (IL-2555);

1.2.1.1853 - October 4, 2018

Breaking Changes:

  • Upgraded UWP NuGet package to 6.1.7 and Win2D.uwp to 1.23.0 (IL-2468);

New Features:

  • The outbound caller ID can now be set on the SIP Connector. Using the config element: <callerId displayName="" number="" /> (set under the <sip> element) the display name and number can both be set. Both values are used in a pattern whereas the arguments are properties on the ClientInfo class. For example: "{userAlias}-{userId}" is a valid pattern (LS-1603);
  • The Android example now requests permissions at runtime. See https://developer.android.com/training/permissions/requesting for more information  (LS-491);
  • TCP communications in .NET (excluding UWP) will now honour system-wide proxy settings (IL-2508);

  • Added support for handling live connections more gracefully when a media server goes offline. Client connections actively streaming to/from a stopping media server will enter the Failing/Failed states much more quickly to allow faster reconnection (LS-1831);
  • Updated runtime permission for the Android Example so that it can be deployed to the Play Store with Android 6+ (API level 23) (LS-1805);
  • Updated MediaServer service on Windows to respond faster to OS shut-down events (LS-1846);
  • Added new static properties to TcpSocket in .NET to control proxying:

    • TcpSocket.DisableProxy

    • TcpSocket.ProxyHostname

    • TcpSocket.ProxyPort

    • TcpSocket.ProxyUsername

    • TcpSocket.ProxyPassword  (IL-2508);

Bug Fixes:

Media:

  • Fixed a regression in JavaScript libraries where the SetAudioVolume call failed to work when receiving video and audio (IL-2539);
  • The VoiceCapture DMO now works much better after an undocumented MMCSS thread property is set (IL-2431);
  • Fixed a bug where the H.264 video decoder in iOS crashed on the first frame it receives (LS-1753);
  • Fixed a bug where the H.264 video encoder in iOS didn’t respond to FIR requests, resulting in a slow time-to-first-frame on the remote peer (LS-1753);

UWP:

  • Fixed bug to allow microphone capturing at 44.1Khz in UWP (IL-2468);
  • Resampler in UWP uses 50% less CPU than previously (IL-2468);
  • Added multi-channel support for UWP resampler (IL-2468);
  • Fixed UWP bug in UDP socket layer that cleans up some audio and video quality issues (IL-2468);
  • Updated app capabilities for UWP examples to include privateNetworkClientServer and internetClientServer to ensure that UWP clients can communicate over private networks and can act as servers for networking communication (enables it to connect in answering SDP role, not just in the offering role) (IL-2532);

Reliability/Reconnection improvements:

  • Fixed a race condition that can occur when a media server reconnected after a network issue. The media server would occasionally register but be unable to be assigned connections (LS-1880);
  • Fixed a race condition when opening an SFU downstream that could cause an unexpected failure in the media server if the associated SFU upstream disconnected mid-way through the opening of the SFU downstream (LS-1838);
  • Fixed a bug where peer connections that were dropping offers would never timeout (LS-1836);
  • Fixed a potential deadlock in the media pipeline if two attached elements are removed from each other simultaneously (LS-1804);
  • Fixed a race condition that caused media servers to constantly unregister and reregister after losing connection to the gateway (LS-1809);

Clustering:

  • Changed the SIP connector to use GUID connection IDs to match the rest of LiveSwitch. This prevented clustering from working with SIP connections (LS-1805);
  • Fixed a bug where clustered MCU connections would not mix audio properly (LS-1805);
  • Fixed a race condition in media server clustering that can crash a media server during a cluster disconnect (LS-1765);

Examples:

  • Fixed a bug where web example was incorrectly stating that Audio, Video and Data streams connected when in fact no video stream was present (LS-1780);

Other:

  • Fixed a bug where accepting a peer connection offer with just a data stream would fail (LS-1849);
  • Added extra safety checks with accepting a peer connection offer to ensure that the streams provided line up with the offer’s media descriptions (LS-1849);
  • If a pre-connection error occurs in the media server, it will now cancel the connection process as originally intended (LS-1782);
  • Fixed a bug where DataBufferStream.WriteBytes could increase the size of the underlying buffer by more than what is required (IL-2494);
  • Fixed a bug where the OpenH264 library downloaded at runtime would not show a proper digital signature from Cisco (IL-2494);
  • Improved Cocoa memory management to prevent over-releasing objects (IL-2205, IL-2537);
  • Fixed a bug where RTP Transport Media receiver stats were reporting Jitter in timestamp units rather than in ms (as expected) thus ignoring codec clock-rate adjustment (IL-2490);
  • Disabled IceTransport application data processing in the Closing/Failing/Closed/Failed/New/Connecting states (this data would have been discarded anyway by higher level transports) (IL-2537);
  • Fixed libaudioprocessingfm load error in Java on Linux (IL-2433);

1.2.0.1018 - September 06, 2018

Breaking Changes:

  • ConnectionConfig.LocalAudioMuted and ConnectionConfig.LocalVideoMuted are no longer nullable. These properties are now consistent with the other boolean properties in ConnectionConfig (LS-1539);
  • The direction of streams in an SFU downstream connection now only changes in response to a Connection.Update call. Previously, a remote SFU upstream connection directionality change would cause the direction of a local SFU downstream connection to change. This behaviour had the side effect of overwriting an application’s explicit stream direction with no workaround, so it was removed  (LS-1539);
  • Client.Leave now resolves with null instead of an invalid Channel reference. This also fixes a bug where Client.Leave would result with null instead of the invalid Channel when invoked after having already left. It is idempotent now (LS-1539);
  • Fixed a bug where Channel.OnRemoteUpstreamConnectionUpdate passed the event parameters in the incorrect order (new/old, instead of old/new) (LS-1249);
  • Fixed a bug where PeerConnection.OnRemoteUpdate would be raised with the ID of the local connection instead of the remote connection after a remote peer update was applied (LS-1249);
  • Fixed a bug where the second parameter passed to Channel.OnRemoteClientUpdate was a ClientConfig instead of a ClientInfo (LS-1675);
  • Calls to Client.Update require a fully-populated ClientConfig object, which can be obtained using Client.Config. The behaviour and conventions of using Client.Update now match Connection.Update (LS-1675);
  • To avoid incorrect calls to Client.Update / Connection.Update using partially-populated ClientConfig / ConnectionConfig objects, the constructors for ClientConfig / ConnectionConfig are no longer public (LS-1675);
  • Use Client.Config / Connection.Config instead to retrieve the current state, and then modify as needed before calling Client.Update / Connection.Update (LS-1675);
  • The default file logging path for Linux services has been changed from “/usr/share/Frozen Mountain Software/LiveSwitch/ServiceName” to /var/log/fm/liveswitch/servicename. If you have specified a custom log path in your configuration file, then this change will not affect you. Windows services are unaffected (LS-1383);
  • Renamed SyslogProvider to SyslogLogProvider to match naming conventions;
  • Updated LogProvider.Filter signature to accept a single LogEvent parameter. This allows for additional filtering options, and should prevent future breaking changes;
  • Renamed LogEvent.TimeStamp to LogEvent.Timestamp to match style guidelines;
  • Renamed LogEvent.LogLevel to LogEvent.Level to match naming conventions;
  • Removed of MediaFormat from ConnectionInfo in favour of Has{Format} syntax. Instead of ConnectionInfo.AudioFormats use ConnectionInfo.HasAudio and for ConnectionInfo.VideoFormats use ConnectionInfo.HasVideo;

Known Issues:

  •  Not all browsers support MediaTrack.getSettings().deviceId, and so until a device is selected, the drop-down to select input device will not accurately reflect which device actually gets used (LS-1721);

New Features:

Media Stack:

  • Added MediaFrame.Footprint and MediaBuffer.Footprint to approximate memory usage  (IL-2266);
  • Fixed a bug in DatagramSocketManager causing excessive SocketException messages to be thrown in .NET (IL-2266);
  • Added MediaPipe.ProcessBuffer async method for processing individual buffers using futures/promises and without needing to wire up events (IL-2321);
  • Updated VideoBuffer.CreateCustom so it throws an exception instead of silently failing when an invalid format or null buffer is passed in (IL-2321);
  • Added null checks to MediaBuffer.DataBuffer(s)/Format to ensure they are always non-null (IL-2321);
  • Added VoiceCaptureSource.DefaultDeviceRole (IL-2361);
  • Added AudioBuffer.CreateSound and AudioBuffer.CreateSilence convenience methods (LS-1539);
  • Added AudioFrame.CalculateTimestampDelta convenience method (LS-1539);
  • Added MediaSource/MediaPipe/MediaStream.OnRaisedFrame to support event handlers that run after a frame has been raised (LS-1539);
  • Added MediaPipe/MediaStream/MediaSink.OnProcessedFrame to support event handlers that run after a frame has been processed (LS-1539);
  • AEC support for UWP (IL-1922);
  • Added MediaCaptureAudioSource in the UWP SDK for lower-latency audio capture. Requires the April 2018 Windows 10 update (IL-2389);
  • Updated AecProcessor default TailLength to 128 with a 32-512 range (IL-2389);
  • Updated AecProcessor to allow setting the TailLength post-construction (IL-2389);
  • Updated AecProcessor to default to 48,000Hz stereo audio processing (IL-2389);
  • Updated UWP libraries to use target platform 10.0.17134.0 (April 2018 Windows) to access new low-latency API (IL-2389);
  • Updated SoundConverter to handle n-channel audio conversions (IL-2389);
  • Added SoundUtility.ConvertChannelCount to convert a PCM audio buffer from any channel count to any channel count (IL-2389);
  • Added support for screen capture in Edge using getDisplayMedia (IL-2326);
  • Increased the precision of VideoBuffer.Convert when converting YUV → RGB, RGB → YUV, and YUV → YUV (LS-840);
  • Updated VideoBuffer.Convert to adhere strictly to recommendation BT.601 (Rec.601) coefficients for RGB → YUV and YUV → RGB conversions (LS-840);
  • Added VideoBuffer constructor that accepts stride(s) (LS-840);
  • Added VideoBuffer.IsPacked and VideoBuffer.IsPlanar convenience properties (LS-840);
  • Added VideoBuffer.Get/SetA/R/G/B/Y/U/VValue convenience functions (LS-840);
  • Added VideoBuffer.ToPacked to convert planar YUV data to packed YUV data (LS-840);
  • Added Opus.Format.DefaultClockRate/DefaultChannelCount (LS-1672);
  • Added G711.Format.DefaultClockRate/DefaultChannelCount (LS-1672);
  • Added MediaStream.NackPliPolicy to control NACK PLI usage and MediaStream.NackPliEnabled to check whether NACK PLI has negotiated successfully (IL-2460);
  • Added MediaStream.CcmFirPolicy to control CCM FIR usage and MediaStream.CcmFirEnabled to check whether CCM FIR has negotiated successfully (IL-2460);
  • Exposed Format.IsFixedBitrate indicating whether a particular format is fixed bitrate. If creating custom codecs with fixed bitrate, make sure to set that property (LS-1669);

Gateway:

  • Added debug logs to the gateway showing the reason a client was disconnected (LS-1732);
  • A new allocation strategy has been added. The strategy leastConnections, will allocate the active media server that has the least amount of connections (LS-1725);
  • The MediaServer object returned from the REST api now includes a new property OverCapacityReason which contains the last reason why the media server was set to over capacity (LS-1725);
  • The gateway will now log with more details the reason for a overcapacity state change (LS-1725);
  • The default FailedConnectionThreshold has been increased to 60. This makes it transition to overcapacity if 60 failed connections happen within a 60 second window (LS-1725);

DataStream support:

  • Added DataChannels in LiveSwitch. Exposed PeerConnectionOffer.HasData, Channel.Create<Peer\SfuUpstream\SfuDownstream\Mcu>Connection(ClientInfo, DataStream), Channel.Create<Peer\SfuUpstream\SfuDownstream\Mcu>Connection(ClientInfo, AudioStream, DataStream), Channel.Create<Peer\SfuUpstream\SfuDownstream\Mcu>Connection(ClientInfo, VideoStream, DataStream), Channel.Create<Peer\SfuUpstream\SfuDownstream\Mcu>Connection(ClientInfo, AudioStream, VideoStream, DataStream) (LS-246);
  • Added DataChannelReceiveArgs.RemoteConnectionInfo, which is populated only for the SFU and MCU connections (LS-246);

Streams:

  • Added some additional convenience methods to StreamDirectionHelper (LS-1539);

Ice Transport, Gatherer, Socket managers:

  • Where supported by the platform, UDP and TCP media packets are now sent with Differentiated Services Code Point (DSCP) values in the IP header for improved quality-of-service in network environments that also support DSCP. IPv4 packets use type-of-service (IP_TOS). IPv6 packets use traffic-class (IPV6_TCLASS) (IL-2284);

Media Server:

  • RTP timestamps and sequence numbers are overwritten by the DownstreamMedia using the new BridgeContext (with unit tests) to support upstream disconnect/reconnect. The initial upstream sets the context. Secondary upstreams follow it (LS-1539);
  • Added ManagedConnection.Info convenience property which generates a ConnectionInfo object populated with the info about the current instance (LS-1249);
  • Added ManagedConnection.RemoteTag property so that peer connections can keep track of the remote connection tag as set by the remote peer (LS-1249);
  • Added ManagedConnection.LocalAudioFormats (LS-1639);
  • Added ManagedConnection.LocalVideoFormats (LS-1639);
  • Added ManagedConnection.RemoteAudioFormats (LS-1639);
  • Added ManagedConnection.RemoteVideoFormats (LS-1639);

Client:

  • Added Client.Config property to return the current client configuration (needed for Client.Update operations) (LS-1675);
  • Fixed a bug where during concurrent registrations of multiple clients, the RemoteClientInfos property may contain duplicates (LS-1777);
  • LiveSwitch.Client logs now include the client id as the scope in logs (LS-1777);
  • Fixed a bug in .NET/UWP, Java/Android, and iOS/macOS where media sender stats incorrectly reported NACK/PLI/FIR counts as NACK/PLI/FIR packets sent instead of received (IL-2486);
  • Fixed a bug in .NET/UWP, Java/Android, and iOS/macOS where media receiver stats incorrectly reported NACK/PLI/FIR counts as NACK/PLI/FIR packets received instead of sent (IL-2486);

Examples:

  • Added echo cancellation via AecContext to the Java example (LS-971);
  • Updated all examples that create an AecContext to follow best practice: AecContext should only be created if LocalMedia will also be created to make use of the AecContext (LS-971);
  • Updated Andriod, iOS, Java, MacOS, NET, Xamarin-Android, and Xamarin-iOS examples to demonstrate screen sharing (LS-421);

Logging:

  • Added Log.RegisterProvider(LogProvider, LogLevel) overload;
  • Added Log.UnregisterProvider (alias for Log.RemoveProvider);
  • Added Log.UnregisterProviders (and Log.RemoveProviders alias) to remove all registered providers;
  • Added LogEvent JSON serialization methods;
  • Updated Json class to use DataContractJsonProvider in .NET Standard (was previously initializing with NullJsonProvider due to a compilation error);
  • Updated LogProvider.GetPrefixTimestamp to use ISO-8601 standard;

Other:

  • API docs for UWP are now available at: https://docs.frozenmountain.com/liveswitch/api/uwp (IL-2366);
  • Added Certificate.IsSealed to indicate that a certificate has been serialized and is sealed (IL-2303);
  • Added exceptions thrown when attempting to modify a property of a sealed certificate (IL-2303);
  • Added Iso8601Timestamp class to support ISO-8601 serialization/deserialization (LS-1412);
  • Added DataBuffer.Copy overload that uses the DataBufferPool (LS-1672);

Bug fixes:

Installer:

  • Fixed a bug in LiveSwitch installer where existing redis configuration was not loading if a domain name is used for redis server address (LS-1726);

Gateway:

  • Fixed potential null references in GetChannelClients, GetChannelDeviceClient, and GetChannelDeviceClients REST end points when client(s) have channels and/or devices but there are no connections (LS-1456);
  • Improved the rate of detection for “dead” media servers that did not shut down gracefully (LS-978);
  • Fixed a bug in GetApplicationUsers REST end point where the incorrect number of clients and channels per user was being returned (LS-1456);
  • Gateway startup time has been improved by reducing assembly load time (LS-1539);
  • Fixed a race condition that can cause unknown behaviour during concurrent clustering from two or more media servers (LS-1592);
  • Cleaned up cluster error handling so that if a fatal connection failure occurs, the media server does not needlessly retry clustering again (LS-1587);
  • The LiveSwitch Gateway now uploads usage records in batches instead of all at once. This fixes the issue where the upload timed out due to a high amount of records (LS-1653);
  • Improved performance of the Redis provider for the Gateway (LS-1656);
  • Fixed a bug in the gateway where the idle disconnect would not work properly on clients that had capital letters in their client id (LS-1697);
  • All clustering methods now timeout if no response was received (LS-1703);
  • Fixed a bug in the gateway where a race condition during a simultaneous connection shutdown client leave could cause excess connection records to be created (LS-1702);
  • Fixed a bug where clustering methods would get delayed and time out when the underlying connection failed or gets closed. The method would still fail but will do so immediately now (LS-1708);
  • Changed a number of gateway http log messages to verbose (LS-1708);
  • Heavily optimized Redis commands in the signalling layer (LS-1715);
  • The Redis calls within the gateway layer have been optimized (LS-1724);

SIP Connector:

  • Fixed Sip connector bug where the CSeq header wasn’t incremented correctly during a proxy-authentication response. This caused issues on some sip trunk providers (LS-1612);
  • Fixed a sip connector bug where invalid inbound UDP packets would cause a null exception to be logged and thrown (LS-1611);
  • The Sip connector will no longer loop forever if a strange authorization error is returned (IL-2416);
  • The Sip connector will now properly finished calls from its state allowing the number to be redialed (LS-1589);
  • Invitation.Cancel now properly transitions it's state and only rejects the promise on an actual error (LS-1571);

Media Server:

  • Fixed a bug where the media server would not send an OnRemoteUpstreamConnectionOpen event for MCU connections initialized with a receive-only or inactive stream direction. This was preventing the OnRemoteUpstreamConnectionUpdate event from firing later if the MCU stream direction was updated to send-only or send-receive (LS-1539);
  • Fixed a bug where audio was recorded using the .mkv file extension instead of .mka  (LS-1608);
  • Fixed a bug where video was recorded as “audio-1.mkv” (LS-1608);
  • Fixed a case where Connection.Update could throw a null reference exception (LS-1539);
  • Fixed the behaviour of Connection.Update so it is idempotent. It no longer rejects the promise if nothing has changed (LS-1539);
  • Added a null check to avoid a potential null reference exception in the RedisProvider (LS-1539);
  • Fixed a bug where tag-only SFU/MCU connection updates were not broadcast to the channel or processed by the media server (LS-1249);
  • Fixed a bug where ManagedConnection.Tag was not updated locally when calling ManagedConnection.Update with a tag change (LS-1249);
  • Media servers will now retry instead of failing if a http timeout occurs (LS-1697);
  • Media servers no longer regenerate a new id after startup. This means cloudwatch logs will now match properly (LS-1686);
  • Fixed a bug where in MCU the third and subsequent clients leaving a conference would disable audio mixing for other clients that are still connected to the conference (LS-1716);

Media Server and Client:

  • Updated Connection.Update so client-side and server-side behaviour is consistent across all directionality changes (LS-1539);
  • Fixed a bug where Client.Register would resolve with null instead of the Channels array when invoked while already registered. It is idempotent now (LS-1539);
  • Fixed a bug where Client.Join would resolve with null instead of the Channel when invoked while already joined. It is idempotent now (LS-1539);
  • Fixed a bug where PeerConnection would raise OnRemoteUpdate with a null first parameter (the old ConnectionInfo object) (LS-1539);
  • Fixed a bug where frames could be raised by a MediaStream after changing the Direction to SendOnly or Inactive (LS-1539);
  • Fixed a bug where control frames could be raised by a MediaStream after changing the Direction to ReceiveOnly or Inactive (LS-1539);
  • Fixed a bug in LiveSwitch.Channel and LiveSwitch.Client which could have resulted in deadlocks (LS-1005);
  • Connections will no longer get connection timeouts before SDP answers have arrived (LS-1711);

JavaScript:

  • Fixed a bug, where on web-based platforms, browser rejecting remote offer or answer was causing cascading errors (e.g. “Could not reject promise. Rejection callback threw an unhandled exception. Cannot read property ‘getErrorCode’ of undefined“) (LS-1673);
  • Fixed a bug in TypeScript, where object being removed from InternalConcurrentDictionary was not set causing type errors. For example, in web example when Leave button was clicked, the following error was encountered: “fm.liveswitch.js:108317 Uncaught TypeError: Cannot read property 'leave' of null at Client.removeChannel (fm.liveswitch.js:108317)“ (LS-1665);
  • Fixed a bug in typescript where promise failure due to unsupported browser function was not logged to the browser console (IL-2397);
  • Fixed an bug, where SDP descriptions sent from ORTC-based browsers (i.e. Microsoft Edge) contained SSRCs for receive-only streams causing inability to process PLI/FIRs on native platforms. This, in turn, may result in remote video taking time to render in ORTC-based browsers in the receive-only connections (LS-1396);

Session Negotiation:

  • Fixed a bug in SDP answer creation where a “nack” feedback attribute would be present in an SDP answer even if NACK was not offered (LS-1539)

  • Added support for the cases when streams are passed in different order to the Connection constructor by making the SDP answerer respect the order of streams supplied in the SDP offer. Previously, streams had to be declared in the same order for both peers for connection to be established. This fixes the issue where offers from Firefox containing receive-only audio stream and send-receive video stream contained video stream placed first in the message and audio stream being second, causing errors like “There is a media type mismatch between the local stream at index 0 (Audio) and the media description at index 0 (Video)“ (IL-2194);
  • Fixed a bug where bandwidth SDP attributes could have been included in SDP media descriptions containing only fixed-bandwidth media formats. Currently, some WebRTC implementations (e.g. Google Chrome) fail to set remote descriptions in such cases with error “Failed to set remote {audio|video} description send parameters“ (LS-1669);
  • Fixed a potential Null Reference Exception in Stream.CreateSdpMediaDescription() (IL-2476);

Layout Utility:

  • Fixed a potential null reference exception in LayoutUtility on connection failure (LS-941);

Examples:

  • Fixed an example level bug where the user interface for sending messages was enabled before registration leading to a null reference (LS-646);
  • Fixed bug in the UWP example that prevented the remote view of the local camera from being hidden by the local preview (LS-1187);
  • Pressing the Leave button on the video screen now closes the call and returns to the session selection screen (LS-1180);
  • Modified iOS examples to fix a bug where 3rd peer join and leave was setting the iOS audio to very low level on remaining peers (LS-1161);
  • Fixed a bug in peer-to-peer mode where users would not connect if one user had selected audio only (LS-1517);
  • For MCU the stream Direction for audio and video streams is set to receive only if user selects receive only (LS-1517);
  • For SFU the downstreamConnection now checks remoteConnectionInfo for audio stream and video Stream and only creates them if they exist in remoteConnectionInfo (LS-1517);
  • For Peer-to-Peer openPeerAnswerConnection now checks peerConnectionOffer for audio Stream and video Stream and only creates those streams if peerConnectionOffer has them (LS-1517);
  • Fixed a bug in the web example where the drop-down devices lists were not being emptied when entering receive-only (LS-1487);
  • Fixed a bug in the web example where the drop-down video devices list was being populated in screen-share and audio only mode (LS-1487);
  • Fixed a bug in Java and Android examples, where localMedia reference was not set to null when local media was stopped. This was causing null reference exceptions in the cases when user was joined a conference in send-receive mode and then attempted to rejoin in receive-only mode (LS-1662);
  • Fixed a bug in iOS example, where remote client without userAlias was causing a null reference exceptions when attempting to display remote messages (LS-1562);

Media Stack:

  • Updated RTP transport so it handles preset sequence numbers (LS-1594);
  • Fixed a bug where MediaBuffer.RtpSequenceNumbers would return null even if there was a valid RtpHeaders array (LS-1594);
  • Updated RtpPacketHeader to initialize with invalid values (-1) to allow differentiation between set vs. unset properties (LS-1594);
  • Removed the always-on FIR generation from MediaStream. VideoStream takes care of this more intelligently already, and so the extra FIR generation is redundant. It also results in extra, unnecessary/unexpected network traffic and keyframe generation near the start of a stream (LS-1539);

  • Removed “timestamp reset” logic from jitter buffer. This was put in place to help with non-spec-compliant third party software that allows invalid (old) RTP timestamps to flow through, but has created conflicts with advances in packet loss concealment (PLC) and lost duration calculations. Since RTP timestamps *must* increase according to the spec, support for this incorrect behaviour is being removed. If you are using FreeSWITCH and switch audio sources mid-call, ensure that RTP timestamp rewriting is enabled to ensure proper RFC compliance. (LS-1539);
  • Removed “timestamp reset” logic from jitter buffer. This was put in place to help with FreeSWITCH call routing, but after further investigation, FreeSWITCH is not following the specification, and has a flag to enable proper support. Additionally, a reset on the timestamp causes packet loss concealment (PLC) to go a little haywire since we are using timestamps to calculate missing duration ranges (LS-1539);
  • Upgrade libaudioprocessing to latest code from WebRTC (as of July 2018) (IL-1922);
  • Drastically reduced file size of Android libaudioprocessing binaries (IL-1922);
  • Fixes a bug where sending DTMF tones using the native iOS/macOS SDK could fail (LS-1542);
  • Fixed a bug where Xamarin iOS was showing remote screen-share as partially filled with green colour (IL-1065);
  • Fixed a bug where ActiveX was attempting to attach local view when local video was disabled producing error “Object reference not set to an instance of an object.“ (IL-2302);
  • Updated LocalMedia so that it honours the default device as specified by the browser if no audio or video source input is set (LS-1720, LS-1543, LS-1544);
  • Updated LocalMedia so that it defaults to the user-facing camera if one is available (LS-1720, LS-1543, LS-1544);
  • Updated LocalMedia so that it honours facingMode constraints passed in to the construct (LS-1720, LS-1543, LS-1544);
  • Fixed a bug where the H.264 depacketiser would fail to de-packetize frames with a NALU start code length of 3 (IL-2473);

Ice Transport, Gatherer, Socket managers:

  • Ensured that regular KeepAlive requests do not trigger ICE nomination process in IceTransport. Improved the efficiency of CandidatePair look-ups in ICE CandidatePair CheckList (IL-1817);
  • Fixed a bug in the native iOS/macOS where RTT calculations at connection startup was invalid when connecting to other non-browser based peers (LS-1542);

Other:

  • Fixed a potential race condition where clients would unregister properly leaving orphaned records in Redis (LS-1614);
  • Fixed a bug where XCode 10 beta was throwing build error ("Cannot invoke initializer for type 'Range<String.Index>' with an argument list of type '(Range<String.Index>)'") in macOS example code (LS-1422);
  • Fixed a bug preventing the fm.icelink.android.AudioTrackSink from switching to a new type if setAudioStreamType() is called (IL-2392);
  • The ManagedTimer will now log exceptions thrown from the callback and keep running instead of crashing (LS-1564);
  • Added a safety check to the Connection constructor to verify that the Stream instances do not belong to another Connection (LS-1685);

1.1.4.747 - July 13, 2018

New Features:

  • AWS CloudWatch log provider is now available in LiveSwitch (LS-1463);
  • Added REST endpoint that returns media server stats for all media servers to match the single media server endpoint (LS-1464);
  • Full clustering threshold configurations are available on both the gateway and media server. The below xml block is valid on both the media server and gateway. Values, if set on the media server, override the gateway values. If a threshold is hit, the server will remove itself from the queue and no new connections will be assigned to it until at least the delay has passed and it is no longer passed the thresholds. The thresholds will be globally disabled if there is only one media server registered.

    <thresholds> <enabled>true</enabled> <cpuThreshold>70</cpuThreshold> <!-- CPU percentage --> <memoryThreshold></memoryThreshold> <!-- Working set (bytes)--> <bandwidthThreshold></bandwidthThreshold> <!-- Mbps bandwidth --> <overCapacityDelay></overCapacityDelay> <!-- minimum time in seconds to be unavailable once triggered --> <pendingConnectionsThreshold></pendingConnectionsThreshold> <!-- Max amount of pending connections allowed (Not enforced yet) --> <failedConnectionsThreshold></failedConnectionsThreshold> <!-- The amount of failed connections allowed in a specific time period before server is over capacity --> <failedConnectionsExpiry></failedConnectionsExpiry> <!-- The time period (in seconds) for above --> </thresholds> (LS-1533);

Bug fixes:

Media Server:

  • Fixes a bug where renegotiating direction on an SFU/MCU stream that doesn’t exist would throw a null reference exception on the media server (LS-1458);
  • Fixes a bug where renegotiating audio/video direction on an upstream SFU/MCU stream would not apply itself (LS-1458);
  • Fixes a bug where renegotiating audio direction on a downstream SFU/MCU stream would not apply itself (LS-1458);
  • Fixed a race condition where two media servers subscribing to each other concurrently had both subscriptions rejected (LS-1485);
  • Expanded the logging in the MediaServer for diagnostic purposes (LS-1496);
  • Fixed a bug in the MediaServer’s VideoMixer that caused a deadlock that cascaded through the entire media server. This occurred due to a race condition when a Channel was being closed (LS-1376);
  • Fixed an issue where the video mixer was unable to restart after it was shutdown (LS-1507);

Gateway:

  • Fixed a race condition which could cause a null reference exception while unregistering (LS-1493);
  • Fixed an issue where “Unexpected message in leave response” could show up in the logs in a case where the message was actually expected (LS-1331);
  • Fixed a bug causing HTTP to fail when referencing the .NET 4.5 build of the LiveSwitch SDK from a .NET Core project (LS-1494);
  • Dropped many of the SignallingController logs to Verbose as Debug is too noisy with them (LS-1496);
  • Fixed a bug where the GetApplicationChannels REST endpoint would return a 500 error (LS-1525);
  • Fixes an exception in the GetActiveChannels endpoint during a very specific Redis state  (LS-1535);
  • Fixes an exception in the GetApplicationSnapshot state when a client unregisters improperly (LS-1430);
  • Fixed the bug where the gateway was not forwarding client invitation cancellations to the connectors (LS-1513);

SIP Connector:

  • Fixes a crash that occurs in the SIP connector when a SIP trunk sends a malformed message (LS-1501);

Client:

  • Fixed the issue where the answerer in a P2P conference would reject all the candidate messages from the offerer (LS-1553);

Clustering:

  • Fixed an issue where media servers would stop responding and also appear to have empty channels on them during abnormal behaviour on a remote media server during a cluster connect. The operation now properly timeouts instead of hanging (LS-1525);
  • Fixed a bug where a clustered downstream would fail instead of close when it’s upstream failed (LS-1514);

Internal Connection:

  • Fixed a bug that allowed setting local and remote description on connections in closing, failing, closed and failed states. Now a promise associated with setting descriptions is going to be rejected if a connection is in one of the terminating or terminated states (IL-2363);
  • Fixed a race condition where a failure to deallocate a relay candidate (e.g. due to relay server cutting off TCP stream prior to receiving a response or reaching timeout) was causing Connection to remain in the Closing state (IL-2376);
  • Fixed a bug where malformed RTCP packets could be sent (IL-2367);

Installer:

  • Fixed a bug where installer threw an error if specified media server configuration attribute is not found (LS-1529);
  • Fixed a bug where gateway https checkboxes were getting selected if no https in config (LS-1549);
  • Fixed a bug where https certificate hash was not updating in the config file (LS-1549);
  • Fixed a bug where remote redis selection was not working and appropriate values were not getting populated (LS-1549);

Screen Sharing:

  • Fix a crash that occurs when the switching which display to share, in .Net or IE (IL-2356);

JavaScript:

  • Fixed a regression in the JavaScript SDK causing audio-only local media requests to fail with error "Cannot read property 'facingMode' of null" (IL-2365);

Other:

  • Fixed a bug causing HTTP to fail when referencing the .NET 4.5 build of the LiveSwitch SDK from a .NET Core project (LS-1494);
  • Fixed a bug in the .NET Standard libraries where HTTP requests could fail after disposing and creating a new LiveSwitch client (LS-1505, LS-1491);
  • Fixed a race condition where Channel.RemoteClientInfos would not be immediately populated after calling Client.Join (LS-1505, LS-1491);
  • Fixed a bug where the GetApplicationChannels REST endpoint would return a 500 error (LS-1525);
  • Fixed an infinite recursion bug in Collection.First(), Collection.Last(), Collection.Single() and Collection.Single(predicate) (IL-2388);
  • Fixed a bug where connectivity to browsers with remote stream directions set to receive-only or inactive was interrupted after 15 seconds and connections never transitioned to Connected state (despite connectivity being available) (IL-2391);
  • Fixed a bug in the Java StringExceptions class that would cause a PatternSyntaxException when trimming a String (IL-2404, IL-2407);

1.1.3.712 - June 27, 2018

Breaking Changes:

  • Peer connections now use an auto-generated unique ID on each side. Renamed PeerConnectionOffer.ConnectionId to PeerConnectionOffer.RemoteConnectionId. Added PeerConnection.RemoteConnectionId. This one-time change breaks compatibility with peer connections in older versions (IL-2277);
  • LiveSwitch clients with versions prior to 1.1.3 cannot create peer-to-peer connections with clients with version 1.1.3 and above. This does not impact SFU or MCU connections. 

Clients with versions prior to 1.1.3 will see the following error message: 

Could not process message.
System.ArgumentNullException: Value cannot be null.
Parameter name: key
at System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
at FM.LiveSwitch.ManagedConnectionCollection.GetById(String id)
at FM.LiveSwitch.Channel.ProcessCandidate(Message message)
at FM.LiveSwitch.Channel.ProcessConnectionMessages(Message message)
at FM.LiveSwitch.Client.ProcessChannelMessage(Message message)
at FM.LiveSwitch.Client.Receive(Message message)

This is done to improve diagnostics/logging analysis within connections by making Connection.ID unique for all peers. Previously, unique connection details were impossible to separate (LS-1512);

  • The in-memory data store for the Gateway has been removed. Redis is now the only option;
  • The GetChannel REST endpoint will no longer return recording status due to this information not being available in the LiveSwitch Gateway as it is a Media Server variable. It is still available in the Media Server Reports (LS-1274);
  • Removed Connection() constructor (i.e. the one with no parameters, at least Stream(s) parameter is needed) (LS-1227);
  • Removed SRControlFrame.Timestamp. It does not represent an absolute wall-clock time and can't be represented as a native date/time object (IL-1872)
  • Moved static NetworkTimeProtocol methods to NetworkTimeProtocol.Absolute singleton (IL-1872)
  • Removed some classes/methods (IL-1872):

    • IAudioReframer (unused)
    • AudioMixer.DisableTimestampReset (unused)
    • AudioMixer.ForceTimestampReset (unused)
    • AudioMixer.TimestampResetInterval (unused)
    • AudioMixer.ClockRate (redundant for AudioMixer.Config)
    • AudioSource.ClockRate (redundant for AudioSource.Config)
    • SoundReframer.ClockRate (redundant for SoundReframer.Config)
  • Removed auto fallback from NAudio WASAPI capturing to NAudio Wave capturing due to a design flaw, and each audio source object can only support one API. Before, if the WASAPI API was not being used, then it was impossible to select a specific input. Now the API can be specified by the client application and the correct input selected (IL-1534);
  • Changed the Log provider API to accept an object (LogEvent) instead of properties (IL-2269);
  • Renamed MediaFrame.SystemTicks to MediaFrame.SystemTimestamp to more accurately reflect the use case (LS-1313);
  • The default transport for the SIP connector has been changed to UDP as per the RFC.
    This can be changed back by placing an transport="tcp" attribute in the sip connector registration element (LS-1444);

Deprecation:

  • Some TypeScript functions have been deprecated in the fm.liveswitch.LocalMedia.ts class. These include getChromeExtensionId, setChromeExtensionId, getChromeExtensionUrl, getChromeExtensionInstalled, getChromeExtensionRequiresUserGesture, and setChromeExtensionRequiresUserGesture. These functions have been moved to the fm.liveswitch.Plugin.ts class. To avoid breaking changes they will continue be available from LocalMedia.ts for the time being, but they will be removed in the future. The Web example has been updated to reflect this change (IL-2341);

New Features:

Automated synchronization of outbound tracks and inbound timestamps, lip synchronisation:

  • Connection now auto-matches inbound streams for synchronization based on media stream IDs in remote session description (LS-1313);
  • Local session descriptions indicate support for synchronization by default, which can be overridden by setting MediaStream.LocalDescriptionMediaId to something different for each stream (LS-1313);
  • Added MediaStream.RemoteDescriptionMediaId, and Local/RemoteDescriptionTrackId convenience properties (LS-1313);
  • Source/sink/pipe/track/stream/channel IDs are no longer settable (LS-1313);
  • Added lip synchronization for outbound media server streams (LS-1313);

Socket Managers, Gatherers and ICE Transport:

  • Added TransportAddress.AddressType property and static TransportAddress.IsIPv4/6 test methods;
  • Fixed an issue where multiple local peer reflexive candidates discovered during ICE connectivity checks may have caused flood of logs indicating that the same peer reflexive candidate was discovered over and over (IL-2296);
  • Improved efficiency of local ICE Candidate book-keeping, freeing resources at connectivity start ups (IL-2296);

Media Server:

  • Added a new REST endpoint (See GetMediaServerConnectionStats in swagger) that returns real-time connection stat information for a specific media server;
  • All REST api endpoints are now powered by real-time data rather than media server reports. This removes any delay on the information obtained from the endpoints (LS-1274);
  • The SIP connector now handles received UDP keep-alives properly (LS-1445);
  • The SIP connector can now start up without a dial-plan in the configuration (LS-1447);

Gateway:

  • Added a new REST endpoint to dump out the raw datastore values for diagnostic purposes (LS-1400);
  • Fixed a bug in the gateway where invitation feedback that was sent to clients was not detected properly (`Received InviteFeedback for unknown invite.` in the client logs) (LS-1446);

Installer:

  • LS installer now supports in-built redis-server installation (LS-1320);

  • LS installer configuration upgraded from x32 to x64  (LS-1320);

  • LS installer is now reading existing configs based on type of install(x86 / x64) for upgrades  (LS-1320);

  • LS installer now supports Local/Remote Redis installation (LS-1369);
  • LS installer now stores verbose logging inside Temp directory %TEMP%/MSIxxxxx.LOG (LS-1369);

Examples:

  • Added OpenH264 to Java example (LS-502);
  • Updated LiveSwitch web example to include audio/video device switching drop-downs (IL-1173);
  •  Added a .NET STUN/TURN server example project (LS-1269);

Clients:

  • Added Client.DisableCors in JavaScript SDK to allow disabling of XHR/CORS transport (LS-1386);
  • Added Client.DisablePostMessage in JavaScript SDK to allow disabling of XHR/postMessage transport (LS-1386);
  • Added Client.DisableJsonp in JavaScript SDK to allow disabling of JSON-P transport (LS-1386);
  • webcam-capture-drive-native DLLs are no longer included with Java examples for Windows because they are no longer necessary for the application code and could be removed from clients (IL-1951);
  • Added MediaBuffer.SystemTicks to allow an absolute timestamp (with the same frequency of ManagedStopwatch) to be associated with the buffer for synchronization with other streams (IL-1872);
  • Added ManagedStopwatch to TypeScript SDK (IL-1872);
  • Added new tick-based overloads to NetworkTimeProtocol (IL-1872);
  • Added support for relative timestamps in NetworkTimeProtocol (IL-1872);
  • Updated LocalMedia.changeAudioSourceInput and LocalMedia.changeVideoSourceInput to use replaceTrack (where supported) to allow camera/mic device switching while connections are live (IL-1173);
  • Added an NAudio loopback source to allow streaming from a local playback device (supports .Net on Windows only). This works best if the playback device captured from is set to mono or stereo (IL-1534);

JavaScript:

  • Added new type detection methods to Plugin in TypeScript (IL-2297):

    • hasRtcPeerConnection
    • hasRtcDataChannel
    • hasGetUserMedia
    • hasRtcIceGatherer
    • hasRtcIceTransport
    • hasRtcDtlsTransport
    • hasRtcRtpSender
    • hasRtcRtpReceiver;
  • Added Plugin.isReady(localMedia?, dataChannels?) as a convenience method to check for any form of browser support, whether that’s ActiveX, ORTC or WebRTC (IL-2297):

  • Updated Plugin.hasWebRtcPlugin.hasOrtc and Plugin.hasNative (which wraps the former two methods) to accept optional localMedia and dataChannels parameters. Some web browsers (Chrome and Firefox on iOS) have support for core WebRTC functionality with no support for local media and/or no support for data channels (IL-2297):

Logging:

  • Added additional logging for time spent registering, unregistering, joining, and leaving (IL-2250);
  • New log provided for LogStash (`LogStashLogProvider`);

Managed Connections:

  • Added the following properties to ManagedConnection (LS-1370):
    • IcePolicy
    • KeepAliveInterval
    • PrivateIPAddress
    • PrivateIPAddresses
    • IcePortRange
    • IceAddressTypes
    • TcpConnectTimeout
    • TurnAllocateRequestLimit
    • StunBindingRequestLimit
    • StunRequestTimeout
    • IceRole
    • DtlsServerMinVersion
    • DtlsServerMaxVersion
    • DtlsClientVersion
    • DtlsCipherSuites;
    • MultiplexPolicy
    • CreateDatagramSocket
    • CreateStreamSocket;

Miscellaneous:

  • Added Future.WaitForResult and Future.WaitForPromise overloads that accept a timeout parameter (LS-1271);
  • Added Stream.State and Stream.OnStateChange (IL-1173);
  • Added Binary.ToBytes9-12, Binary.ToBytes14-15, Binary.ToBytes17, Binary.ToBytes19-23, Binary.FromBytes9-11, Binary.FromBytes14, Binary.FromBytes17, Binary.FromBytes19-23, DataBuffer.Write9-12, DataBuffer.Write14-15, DataBuffer.Write17, DataBuffer.Write19-23, DataBuffer.Read9-11, DataBuffer.Read14, DataBuffer.Read17, DataBuffer.Read19-23, DataBuffer.TryRead9-12, DataBuffer.TryRead14-15, DataBuffer.TryRead17-23, Binary.BitStringToBytes ,Added Binary.BytesToBitString (IL-2234);
  • Added DataBuffer.Copy to make an actual copy of the underlying byte array;
  • Added MathAssistant.Round function (LS-1313);
  • Changed the diagnostics dump interval to 10 seconds to make the logs less noisy (LS-1445);
  • The threadpool dump will only occur if the data has changed (LS-1445);
  • The sip connector now handles NotFound replies properly (LS-1445);

Bug fixes:

Gateway:

  • The Sip Connector now unregisters properly when the gateway is connected to Redis (LS-1363);
  • The gateway now cleans up all related media server records when a media server unregisters (LS-1363);
  • The DataStore now will not return null values if there are expired media server records (LS-1399);
  • Fixed a bug where the Applications Snapshot REST endpoint would return a 500 error if an invalid application id was given (LS-1430);
  • The get connection information REST endpoint now properly returns the correct data instead of returning a 404 (LS-1449);
  • Fixed a bug causing clustering not to start upon channel reuse (LS-1450);
  • Fixed a potential null reference exception in the logs when a media server unregisters (LS-1480);
  • Fixed a potential null reference exception in the logs when a client leaves/unregisters (LS-1483);
  • Gateway will now retry to connect to Redis service if Redis service is unavailable. Retries will occur with an increasing backoff with the aggregate timeout of 2 minutes (LS-1202);
  • Fixed a possible null reference exception in the RedisProvider (IL-2364);
  • Downgraded the log level of some log statements (Kestrel exceptions) in the gateway that occur during normal operation (LS-1471);

Media Server:

  • Bandwidth calculation from the media servers has been fixed and will no longer be zero;
  • Fixed an issue where the reporting thread would not stop properly causing a new thread every time a media server reregistered. Now only a single reporting job can exist at a time (LS-1402);
  • Updated error handling in server http client code (LS-1425);
  • Failed cluster subscriptions now properly clean up and no longer cause the cluster connection to think they are active (LS-1435);
  • Cluster unsubscribes now have a timeout incase of remote server mishaps causing no response (LS-1437);
  • Increased aggregate timeout in Media Server - Gateway connection attempts from 5 seconds to 2 minutes and introduced increasing backoff between retry attempts (LS-1202);
  • Updated media server startup logic to include full validation of the public IP address if specified in the configuration (LS-1482);
  • Updated media server startup logging to include discovered private IP addresses (LS-1482);
  • Fixed a bug where the media server was not using the result of the pre-gather STUN check at startup (LS-1482);
  • Fixed a bug in the MediaServer’s VideoMixer that caused a deadlock that cascaded through the entire media server. This occurred due to a race condition when a Channel was being closed (LS-1376);

Sip Connector:

  • The Sip connector service now correctly binds to the correct port listed in the config file (LS-1300);
  • Fixed an issue in the sip connector service where the service failed to start if the registration line was missing from the config (LS-1374);

Client:

  • Fixed an example bug where "Client already unregistering" alert was showing on leaving the session (LS-1266);
  • Fixed the this.__hashFunction is not a function error in typescript which was caused by a invalid default argument for the Managed Concurrent Dictionary (LS-1312);
  • Fixed a bug where the PostMessage transport (fallback from CORS) would fail as a result of a failure to load an embedded resource in the gateway (LS-1382);
  • Fixed a bug in the JavaScript SDK causing multiple Content-Type headers to be sent with each request (LS-1385);
  • Fixed a bug in WinForms.PictureBoxControl where the default view scale might not apply itself;

Installer:

  • Fixed a bug where installer web example was throwing configuration errors (LS-1369);
  • Fixed a bug where bootstrap mapping file was not getting copied over to installer folder (LS-1369);
  • MediaServer STUN default address fix in the installer (LS-1393);
  • Added a checkbox to the installer welcome dialog to give the user ability to install/skip web example shortcut  (LS-1393);
  • Fixed a bug in installer where Gateway Https port and certificate changes were not preserved during upgrade  (LS-1393);
  • Installer will now install a desktop shortcut that can be used to re-run the local web example (LS-1393);
  • Fixed a bug where local Redis service was not starting if there is already another Redis installation using the default Redis port (LS-1478);
  • Fixed an installer upgrade bug where Https checkboxes were not getting checked, if SSL is selected in existing configuration (LS-1506);

State Transitions:

  • Updated state transitions in Connection and Stream to ensure consistent behaviour across all platforms (LS-1330);
  • Fixed a bug in JavaScript where a connection could transition to the Connected state after a connection timeout (LS-1330);
  • Fixed a naming conflict between the IceLink and LiveSwitch type definitions (LS-1330);
  • Added IsTerminating, IsTerminated and IsTerminatingOrTerminated properties to Connection and Stream as convenient ways to detect Closing/Failing, Closed/Failed and Closing/Failing/Closed/Failed states, respectively (LS-1330);

DTLS:

  • Fixes a case where DTLS key exchange could fail with an access_denied(49) error (IL-2303);

Inner Connection:

  • Fixed a bug that allowed setting local and remote description on inner connections in closing, failing, closed and failed states. Now a promise associated with setting descriptions is going to be rejected if a connection is in one of the terminating or terminated states (IL-2363);

Socket Managers, Gatherers and ICE Transport:

  • Fixed a bug where network interface enumeration on Linux with .NET Core could throw an exception while querying interface speed;

  • Fixed symlink creation on Posix systems (LS-1128);

  • Fixed a bug where tampered packets containing STUN Binding request or STUN Binding requests containing no message integrity attribute were causing null reference exceptions in IceTransport (IL-2156);
  • Fixed a bug where poor network conditions resulted in a memory leak associated with ICE KeepAlives as a result of not receiving responses to KeepAlives (IL-2317);
  • Fixed a bug causing memory leak where Ice Transport level where Local Host Candidates and ICE Candidate Pairs contained circular dependencies (IL-2328, IL-2333);
  • Fixed a bug in ICETransport causing a Null Reference Exception when a new port was assigned by NAT when communicating on a ICE Candidate Pair with a local peer that was already a reflexive candidate (IL-2345);
  • Fixed a bug where ICE CandidatePairs did not immediately respond to TURN permission responses from TURN servers containing errors (such as 438 stale nonce) causing potential loss of connectivity over some relay connections (IL-2339);
  • Fixed a bug where round trip times on candidate pairs appeared to be significantly exaggerated when tested on local host to local host connections (IL-2353);

Media Stack:

  • Fixed OpenH264 loading so by default a *nix system should look for the downloaded .so file in the same directory as the packaged FM .so file (LS-1128);

  • Fixed a bug where the active audio/video source input was null after starting local media unless it was explicitly set ahead of time (IL-2261);
  • Fixed a bug where AudioSource did not respect explicit AudioFrame.Timestamp values when raising frames  (IL-1872);

  • Fixed a possible overflow in C# ManagedStopwatch.GetTimestamp() (IL-1872);
  • Fixed a bug where round-trip times could be calculated incorrectly around the rollover boundary of short-form NTP timestamps (IL-1872);
  • Fixed a rounding error in NetworkTimeProtocol when deserializing milliseconds (IL-1872);
  • Improved the accuracy of timestamps in the iOS/macOS AudioUnit source (IL-1872);
  • Improved the accuracy of timestamps in the iOS/macOS AVCapture source (IL-1872);
  • Improved the accuracy of timestamps generated automatically for audio sources that don't explicitly supply them (IL-1872);
  • Improved the accuracy of iOS/macOS ManagedStopwatch by using mach_absolute_time (IL-1872);
  • Improved the accuracy of "elapsed time" log statements (DTLS certificate generation, state changes, etc.) (IL-1872);
  • Improved the accuracy of NACK buffer timestamps (IL-1872);
  • Improved the accuracy of VideoEncoder/VideoDecoder.FrameRate (IL-1872);
  • Improved the accuracy of timing calculations in RTP transport (IL-1872);
  • Improved the accuracy of RTCP timestamps relative to RTP timestamps (IL-1872);
  • Removed legacy support for Wave and DirectSound from NAudio Source/Sink (IL-2244, IL-2247);
  • Fixed a memory leak in Cocoa Video Toolbox H264 decoder (IL-2337);
  • Fixed a memory leak in Rtp/Rtcp Mac cryptography context in Cocoa (IL-2337);
  • Fixed a bug where device camera was not switching on mobile browsers on the devices with multiple cameras (LS-1365);
  • Fixed a regression in the JavaScript SDK causing audio-only local media requests to fail with error "Cannot read property 'facingMode' of null" (IL-2365);
  • Fixed a null reference exception inside the AV interruption handler for AudioUnitSink/AudioUnitSource (LS-1398);

Timestamps:

  • Updated Xamarin.iOS and Xamarin.macOS AudioUnitSource to use high-resolution timestamp synchronization (IL-2248);
  • Improved timestamp synchronization for Java SoundSource (IL-2245, IL-2246);
  • Updated Android AudioRecordSource to use high-resolution AudioTimestamp on Android 7.0 or newer for improved timestamp synchronization (IL-2245, IL-2246);
  • Fixed a possible overflow in ManagedStopwatch timestamps for Java and Cocoa SDKs (IL-2245, IL-2246);
  • Added timestamp synchronization for WASAPI in NAudio Source for .NET and UWP (IL-2244, IL-2247);
  • Added timestamp synchronization for Voice Capture in DMO Source for .NET (IL-2244, IL-2247);
  • Updated NAudio libraries to support system timestamp output (IL-2244, IL-2247);

Native libraries:

  • Added stack-protector protection to the Unix (ELF) native wrappers thus enforcing secure binary properties (IL-1973);

Miscellaneous:

  • Fixed a bug where internal connection IDs in logs were changing throughout connection lifetime (LS-1227);
  • Fixed the bug where any of the LiveSwitch services would crashed if you changed the default log path (LS-1192);
  • Fixed a bug in JavaScript where registering multiple log providers would cause the logging engine to fail (LS-1387);
  • Fixed a bug in Binary.ToBytes13,  Binary.ToBytes18, Binary.FromBytes12, Binary.FromBytes13 (IL-2234);
  • Fixed possible off-by-one errors in the double conversions to long in ManagedStopwatch.ElapsedTicks and ManagedStopwatch.GetTimestamp() (LS-1313);
  • Updated media sources to auto-generate MediaFrame.Timestamp if MediaFrame.SystemTimestamp is supplied (LS-1313);
  • Fixed the casing of the ActiveX cab filename to resolve an issue where the web server would sometimes be unable to find the cab file (IL-1915);
  • Fixed a potential Null Reference Exception in logging (IL-2236);
  • Fixed a bug in the web example device switching for IE, which does not support selectedOptions - needs options[selectedIndex]instead (IL-2260);
  • Fixed a regression where DomException errors were not recognised as errors on JavaScript platforms (IL-2347);

1.1.2.591 - May 23, 2018

Bug Fixes

  • Fixed a regression in 1.1.2.555 where setting an audio source input would prevent the DMO-based audio source from starting (IL-2307);
  • Fixed a case where DTLS in .NET and Java (i.e. BouncyCastle) could randomly fail with an invalid certificate error (IL-2303);

1.1.2.563 - May 17, 2018

Bug Fixes

1.1.2.563 - May 11, 2018

Known Issues:

Xamarin Forms:

    • We have had reports that the Mono 5.10 runtime introduces issues with the Xamarin Forms examples. We are investigating, but for the time being the work around is to use an older Mono runtime (particularly, version 5.8 works);

Media Stack:

    • Fixed a possible overflow in C# ManagedStopwatch.GetTimestamp() resulting in frozen MCU video after 15 minutes (IL-1872; fixed in 1.1.3);
    • h.264 is currently not supported on media servers installed on Linux platforms (LS-1213);

Socket Managers, Gatherers and ICE Transport:

    • Fixed a bug where network interface enumeration on Linux with .NET Core could throw an exception while querying interface speed (fixed in 1.1.3);

Bug fixes:

Client:

  • LiveSwitch clients now properly close their connections when they receive a close message sent from the REST kick api (LS-1327);
Microsoft Edge:
    • Fixed a bug where the transport protocol of the remote candidates signalled in capital letters was not parsed correctly resulting in setting remote TCP-based candidates to native ICE transport of ORTC Edge (which does not support TCP candidates) causing error "Could not complete the operation due to error c0044003" when communicating to Firefox 59 (IL-2241);

    • Fixed a bug where end of remote candidates may have been signalled too early in Edge ORTC preventing from connections from being established (IL-2241);

Metrics:

  • Fixes possible overflow when calculating the Time to First Frame metric (IL-2267);

1.1.2.555 - May 7, 2018

Breaking Change:

  • Due to the new UDP socket code, the Syslog Provider now sends its messages in chunks (LS-1167);
  • Cocoa enumerations now derive from NS_ENUM instead of enum. The enums are now separated into the namespace component and the actual enum value, where enum value appears after the dot and starts with a small letter. For example, instead of FMLogLevelDebug, use FMLogLevel.debug (IL-1665);
  • The mediaServerId in the MediaServer JSON object obtained from the REST endpoint has been renamed to id (LS-1258);
  • Updated client so that the default user ID and device ID are unique identifiers instead of "default-user" and "default-device". This eliminates some unexpected behaviour such as user/device aliases overwriting each other (LS-1314);
  • If a Stun address is specified in the Media Server config file, gathering will now only occur once and the discovered public ip address will be used for all connections. If you prefer the previous behaviour of doing STUN gathering on all connections, this can be re-enabled by setting <connections pregatherStun="true> in the config file (LS-1299);

New Features:

Media Server:

  • Media streams are now transcoded when creating SFU downstreams that would have resulted in a SdpCodecMismatch error (LS-1099);
  • Updated audio/video mixer logs to include extra identifiers to make matching up items in the debug logs easier (LS-1181);
  • Added current version text to the LiveSwitch Installer welcome screen (LS-1184);
  • Added diagnostic line for the Media Server in DEBUG mode for when a SFU downstream uses transcoding (LS-1248);
  • A new config property of cluster/OverCapacityDelay sets the amount of time (in seconds) that a media server must sit in the overcapacity state before it can be changed back. This stops the media server from being set to overcapacity/undercapacity frequently if the threshold is just barely hit. Defaults to 5 seconds (LS-1258);
  • Updated MCU audio mixer to improve audio quality in poor network conditions (LS-1310);
  • Updated MCU audio mixer to improve audio quality under low-volume and high-volume conditions and with large numbers of participants (LS-1310);
  • Updated MCU audio mixer to improve performance by reducing memory copies (LS-1310);
  • Added a new SFU config option <transcoder enabled="true"> that can be used in the media server under the SFU xml element. When set to false, the Selected Transcoding Forwarding Unit is disabled and will return a codec mismatch if the upstream codec does not match the downstream offer (LS-1260);

Gateway:

  • Gateway admin page now contains significantly more details about each connection on a media server (LS-1195);
  • When binding to *, the gateway now also listens on IPv6 addresses. This solves a problem where the client experienced a 1 second delay when attempting to connect to a Gateway on localhost (LS-1228);
  • The Gateway now uses a much higher performing asynchronous pipeline for register requests. This allows much higher levels of concurrency on machines with many CPUs (LS-1228);
  • Drastically reduced the number of messages being sent from the Gateway upon client registration. This allows for more concurrent registrations before overloading the server (LS-1228);
  • Kicking connections via the REST API now works across all connection types (including SIP clients) (LS-1140);
  • SIP clients will now raise register, join, leave, and unregister messages (LS-1140);
  • Added new options for mapping media servers on the Gateway (LS-1264);
  • The Media Server REST endpoint now returns significantly more media server information (LS-1258);
  • The gateway now logs media servers that get their over capacity status changed (LS-1258);
  • The admin page will now show media servers in grey that are over capacity (LS-1258);

Client:

  • On .NET Core/Standard, the LiveSwitch client now uses HttpClient instead of HttpWebRequest due to large performance increases for HttpClient. Internal benchmarks have shown it to be up to 8x faster (LS-1228);
  • The Firefox screen sharing extension is no longer necessary and has been removed from the SDK. You can now share your screen without the need to install any extension (IL-1919);
  • Native libraries are now available for .NET on Linux. The set of available libraries is: libaudioprocessing, libopenh264, libopus, libvpx, and libyuv (IL-1502, LS-514);
  • Added an MediaPipe.OnProcessFrameException and MediaSink.OnProcessFrameException event allowing applications to respond to exceptions occurring during frame processing (LS-1119);
  • Updated Opus codec to version 1.2.1 (LS-336);
  • Updated Windows (.NET/Java) libvpxfm wrappers to eliminate debug code and improve performance (LS-336);
  • Provided a work around in WebRtcMedia and WebRtcDomVideoSink (TypeScript) that resolves the need to push black frames to Chrome to convince it to playback audio for connections that have both an AudioStream and a VideoStream (IL-2167);

  • Updated iOS LocalMedia/RemoteMedia code in the examples to demonstrate how to check if the audio session is exclusively locked by another process, and a suggestion on how to handle this case (IL-1911);
  • New channel claim property (DisableChannelNotify) to disable the NotifyJoin/NotifyLeave messages on a channel for situations where having the notifications is undesirable. For example, this can be used for a broadcast-only channel (LS-1210);
  • Added MediaFrame.Keep and MediaFrame.Free convenience methods;

Logging:

  • Xamarin.Android and Native Android Log messages modified to show Device Model (LS-1220);

Other:

  • Added Token.GenerateClientJoinToken overloads that accept a custom expiration date (LS-1223);
  • Changed the Json provider in the Gateway and Media server resulting in up to 2x the performance of the old provider (LS-1218);
  • Added milliseconds to the default log datetime output (LS-1228);
  • Enabled gzip compression for both client and server connections (LS-1228);
  • Added a log message to report the time it takes from when a connection is established, to when the first frame is decoded (LS-1304);

Known Issues:

Media Stack:

  • Fixed a possible overflow in C# ManagedStopwatch.GetTimestamp() resulting in frozen MCU video after 15 minutes (IL-1872; fixed in 1.1.3);
  • h.264 is currently not supported on media servers installed on Linux platforms (LS-1213);

Socket Managers, Gatherers and ICE Transport:

  • Fixed a bug where network interface enumeration on Linux with .NET Core could throw an exception while querying interface speed (fixed in 1.1.3);

Bug Fixes:

Media Server:

  • The Recording Log file no longer contains erroneous entries when receive-only peers join or leave (LS-886);
  • The ICE Gatherer was collecting local addresses on every connection contributing to a high startup cost for connections. This is now only done at service startup (LS-1167);
  • Transitioned the media server UDP socket code over to the .NET async sockets for better performance (LS-1167);
  • The Media Server will now log the IP addresses it will use for clustering in debug mode instead of verbose (LS-1167);
  • Used dispatch queues in the server and client to prevent processing bottlenecks in the case of a large amount of inbound messages (LS-1167);

  • Fixed an issue where the media server would crash if the recording path attribute in the config file was missing (LS-1171);
  • Fixed a bug where Chrome could not open an SFU downstream connection to a SIP client's upstream connection that negotiated without SSRCs (LS-1125);
  • Fixed a bug where the mixer wouldn't activate until the first sender arrived, resulting in no video for initial receive-only MCU connections (LS-1137);
  • Improved MCU efficiency by activating video mixer only when receiving connections are present (LS-1137);
  • Fixed a bug, where, under adverse conditions, Audio Mixer may not mix incoming payload audio data thus generating silence (LS-1162);

  • Mitigated an issue where each additional participant in the mix was making aggregate audio level of the mix significantly lower (LS-1162);

  • Removed debug logging from clustering send logic (LS-1201);
  • The Media Server will no longer go into a re-register loop if the Gateway restarts when in an Redis environment (LS-1248);
  • Fixed a transpose error that caused SFU connections to not cluster properly (LS-1256);
  • SFU connections being clustered will no longer send extra NotifyJoins (LS-1256);
  • Fixed a race condition in the media server that may occur at the start of clustering that prevents the media server from joining the cluster properly (LS-1206);
  • Fixed a case where the media server would not clean up clustered proxy clients after socket errors (LS-1261);
  • Updated clustering socket code to use high performance .NET sockets due to race condition issues in previous sockets;

Client:

  • Fixed the behaviour of Client.Update so it is idempotent, and so changed values are updated only if the promise resolves (LS-1129, LS-1132);
  • Fixed a bug in Xamarin.Android where changing the orientation from portrait to landscape was throwing a null object exception (LS-1221);
  • Fixed a bug in Xamarin.Android where exception was thrown on orientation change  followed by a peer leaving conference (LS-1237);
  • Fixed an Example bug in Xamarin.Android where leaving the session in SFU mode was throwing null exception (LS-1221, IL-1230);
  • Fixed an Example bug in Xamarin.Android where connection was not closing after leaving the conference (LS-1221, IL-1230);
  • Fixed a bug in IE where remote audio and video was not working in SFU mode (IL-1252);
  • Fixed a bug where WPF ImageSink could encounter a deadlock under heavy rendering load (IL-2140);
  • Fixed native libraries to pass Windows Store certification for UWP (LS-336);
  • Fixed a bug where the iOS AudioSource would hang on a route change notification (IL-2168);
  • Fixed a bug where a failure to initialize the audio playback on iOS/macOS would cause an exception to be thrown when destroying the remote track (IL-2166);
  • Fixed a bug where local audio/video recording was storing mixed formats (opus/pcma/pcmu) instead of single format (IL-2163);
  • Fixed a race condition where a null reference exception could be thrown by an internal transport class while tearing down a connection (IL-2174);
  • Stability improvements for AudioUnitSink in iOS/macOS and Xamarin.iOS/macOS (LS-1149);
  • Fixed a bug where AEC Context was not reset after being destroyed causing null reference exceptions under adverse conditions when rejoining the same session (IL-2179, LS-1146);
  • Fixed an issue where the SRTP transport may generate a negative RTP sequence number under adverse conditions (LS-1113);
  • Fixed a Xamarin iOS bug in the AudioUnitSource that could result in a Null Pointer when an audio interruption occurred and would cause the interruption to be unhandled (IL-2191);
  • Added UserAlias, DeviceAlias, ClientTag, and ClientRoles properties to Channel  (LS-1129, LS-1132);
  • Updated client so that the default user ID and device ID are unique identifiers instead of "default-user" and "default-device". This eliminates some unexpected behaviour such as user/device aliases overwriting each other (LS-1314);

Client and Media Server:

  • Bug where the Gateway improperly cleared maps when a clustered media server was set to over capacity multiple times is fixed (LS-1258);
  • Improved logging when an ICE or DTLS transport fails by including error information in the output (LS-1178);
  • Fixed a bug where scheduled tasks were dispatched on the scheduler thread potentially slowing down execution of batched tasks (IL-2158);
  • Fixed a bug where accessing transaction execution time in IceTransactionManager while tearing down connection resulted in Bad Access errors in Cocoa (IL-2204);
  • Due to a bug in .NET Core 2 on Linux, when wildcard bindings are used in the gateway, the IPv6 bindings will be skipped. They will be reenabled once the bug is fixed (LS-1254);

Gateway:

  • Fixed a bug where an under capacity media servers got their status set to overcapacity causing premature clustering (LS-1201);
  • Simplified unregister logic in the Gateway to remove unused property (LS-1248);
  • Cleaned up the error handling for Web Sockets in the Gateway to prevent a dump of non-useful error messages. (LS-1248);
  • Refactored the Gateway signalling layer to be 100% async (LS-1295, LS-1296, LS-1297, LS-1298);

Installer:

  • Fixed an issue with the LiveSwitch installer where the "varela.css" file was missing from  web "Chat Example" installations (LS-1212);
  • Fixed an issue with the LiveSwitch installer where configuration errors could sometimes cause the installer to hang on "Starting services..." (LS-1208);

Socket Managers, Gatherers and ICE Transport:

  • Fixed a bug where accessing transaction execution time in IceTransactionManager while tearing down connection resulted in Bad Access errors in Cocoa (IL-2204); DON'T COPY TO LS. This will make it to the original LS112 release rather than the hotfix or 113.

  • Fixed a bug where IceTransport was transitioning to Connected state prematurely (when an ICE Candidate Pair succeeded but was not nominated in ICE passive role). This was causing higher level transports (e.g. DTLS) to attempt communicating earlier than needed, resulting in potential overall communication establishment delays (IL-2228);

  • No longer rely on DTLS role when determining ICE role. ICE role now depends on who the SDP offerer is as per https://tools.ietf.org/html/draft-ietf-ice-rfc5245bis-16#section-6.1.1 This fixes a bug sometimes preventing connectivity when DTLS was not in use (IL-2228);

Media Stack:

  • Fixed a bug preventing OpenH264 to load correctly on Linux environments using Java (IL-2214);
  • Fixed a bug where Xamarin.Android using S4 had very low audio in a conference (LS-1220);
  • The H.264 Depacketizer now properly adds the PLI and FIR attributes to the SDP message. Previously, only the decoder did, so if no decoder was used, these were missing from the SDP message (LS-1273);

  • Fixed NullReferenceException in AudioMixer's circular buffer which could cause PCM audio to be garbled (IL-2090);
  • Fixed a bug in DMO VoiceCaptureSource, where Array Out of Bounds Exception was thrown when a microphone was not available (LS-1241);
  • Fixed a bug in Native Android where local camera media was not working after toggling back from screen-share option (IL-2202);
  • Fixed a bug where Xamarin.Forms.iOS was throwing null exception while leaving from screen-share mode (IL-2220);
  • Fixed an example bug where Xamarin.Forms.Android screen-share was not working (IL-1807);

  • Fixed a bug in Cocoa where screen-share was not working (IL-2221);

SIP:

  • Fixed an issue where the contact header was parsed incorrectly if it included a port number but no name field (IL-2242);
  • Fixed an issue where the chosen transport in ACK's was incorrect (IL-2242);
  • Fixed an issue where the Record-Route header wasn't properly parsed (IL-2242);

JavaScript:

  • Fixed a bug in Javascript wrappers, where logs were showing "JS runtime error: object doesn't support property or method" errors while trying to load the ActiveX object (IL-2096);

Logging:

  • Fixed a bug where {6}, {7}, {8}, or {9} would appear erroneously in native Java/Android and iOS/macOS log statements (IL-2218);
  • Added timestamps to Android logs (IL-2212);

Examples:

  • Fixed a bug in native Android where a double-tap was crashing the app in the audio-only mode (LS-1198);
  • Fixed a bug in Xamarin.Android where double-tapping high resolution MCU video was throwing out of memory errors (LS-1211, LS-1157);

  • Fixed a bug in Xamarin.Android where double-tap was not working on first try (LS-1211, LS-1157);

  • Fixed a bug in Native and Xamarin.Android where double tap was throwing null object exception in audio-only mode (LS-1211, LS-1157);

  • Fixed a bug in Xamarin.Android where double tap was not switching cameras (LS-1211, LS-1157);

  • Fixed a bug in Xamarin.Android where sending message after orientation change was throwing null exception because of Activity was setting to null (IL-2187);

  • Fixed a bug in Xamarin.Android where changing orientation was clearing the chat text (IL-2187);

  • Fixed a bug in Xamarin.Android where send text button was getting disabled on change or orientation (IL-2187);

  • Fixed a bug in Xamarin.Android where double tapping was throwing null exception on changing orientation from portrait to landscape (IL-2257);
  • Fixes the Swift example app so that any RemoteMedia objects are properly cleaned up (LS-1255);
  • Fixed a bug where closing app, in cases when Client was null, was causing a null reference exception (LS-1241)

Other:

  • Fixed a small memory leak in the HTTP transfer engine for iOS/macOS (IL-2161);
  • Fixed the behaviour of VideoLayout in Channel.OnMcuVideoLayout so the UserAlias, DeviceAlias, ClientTag, and ClientRoles properties are set for the local region, and are always correct for the remote regions (LS-1129, LS-1132);
  • Added SuppressUnmanagedCodeSecurity attribute to native p/invoke classes to reduce overhead when calling from managed code into unmanaged code (LS-336);
  • Updated zero-parameter block definitions with explicit void per new Xcode warning "this function declaration is not a prototype" (IL-2215);
  • The DispatchQueue now can run async tasks using either Promises or .NET Tasks (LS-1206);
  • Fixed a bug causing an exception (index out of bounds) to be thrown when resolving/rejecting a promise has multiple resolve/reject actions (LS-1272);
  • Fixed a bug where attempting to affect the state of Failed, or Closed, Connections (by attaching remote descriptions, etc.) could result in a Null Reference Exception (IL-2207);
  • Fixed a rounding error in ManagedStopwatch.ElapsedTicks and ManagedStopwatch.GetTimestamp (.NET, Xamarin only) (IL-1872);

1.1.1.462 - March 23, 2018

Client Breaking Changes:

  • Renamed Opus.Bandwidth.WideBanduto to Opus.Bandwidth.WideBand (typo);

Media Server Breaking Changes:

  • UpstreamBandwidthUsage and DownstreamBandwidthUsage properties from the MediaServerReport obtained via the REST API were invalid and now removed. Please use OutboundBandwidth and InboundBandwidth instead (LS-810);
  • The Type and Tag properties in the MediaServerReport obtained via the REST API will be null if media servers are not upgraded (LS-810);

New Features:

Socket Managers, Gatherers and ICE Transport:

  • Added additional Debug-level logs tracking Socket and SocketManager lifetime. Introduced additional checks around socket port binding (IL-2019);

Media Chain:

  • Added new NullAudio/VideoSink constructor overloads to make usage easier (LS-336);
  • Local/RemoteMedia.getAudio/VideoTrack() will now return null if audio/video is disabled or if audio/video is enabled but denied in the browser pop-up (e.g. with audio/video screen-sharing where the user un-checks "Share Audio" in Chrome) (IL-2036);
  • Added MediaControlFrame.StreamId so app developers can identify which stream received the RTCP data in the local track (which is typically shared across multiple connections) (IL-2069);

Diagnostics:

  • The hotpath now contains metrics that can be enabled via Diagnostics.Timings.OutputInterval to a value other than 0. When set to a non-zero value, the timings for the media chain and RTP encryption will be output on a regular interval in the logs (IL-2050);
  • Added debug-level log statements for time spent in ICE transport checking -> connected; debug-level log statements for time spent in DTLS transport connecting -> connected; info-level log statements for time spent in connection initializing -> connecting; info-level log statements for time spent in connection connecting -> connected; info-level log statements for time spent generating certificates (LS-336);
  • Updated WinForms.ScreenSource to use ManagedTimer for improved frame-rate (LS-336);
  • Added ManagedTimer.StopAsync, an async promise-based version of ManagedTimer.Stop. Supports use cases where blocking the thread isn't desirable or necessary, or where it's not necessary to wait for a currently executing callback to complete before proceeding (LS-336);

Media Server:

  • MediaServerReports obtained via the REST API now contain a ConnectionInfo object for each connection. This contains all metadata for the connection (LS-810);
  • New config option for clustering. Thresholds can be set on a global scale via the gateway or individually on the media server itself. Once the threshold is hit, the media server is considered over capacity. Available thresholds are cpuThreshold (CPU percentage), memoryThreshold (total memory usage), and bandwidthThreshold (Megabits per second) (LS-810);
  • Exposed an <mixer></mixer> element for the media server that exposes all the SKPaint properties (https://developer.xamarin.com/api/type/SkiaSharp.SKPaint/) for the video mixer. For example, <mixer><FilterQuality>high</FilterQuality></mixer> will set the FilterQuality property on SKPaint to high (LS-1008);
  • Media server now generates ECDSA certificates on-the-fly with each connection (LS-1039);
  • Added a log statement in the MediaServer for when a server is overcapacity (LS-1047, LS-1048);
  • NotifyJoin now property gets published to all media servers which will properly allow NotifyUpstreamOpens to be propagated to clients (LS-1047, LS-1048);
  • Added App to the window root in the LiveSwitch example for debug purposes (LS-1047, LS-1048);
  • LiveSwitch media servers now self report their own ip addresses instead of having the gateway rely on remote connection addresses. This allows clustering to work in more scenarios than before. There are also new config values that allow the modification of how ip addresses are discovered (LS-809);

Examples:

  • Added reconnection logic to .NET, UWP and Java examples and improved reconnection logic for iOS Swift, macOS Swift, Web, Xamarin iOS, Xamarin macOS, Xamarin Android and native Android (LS-956, LS-957, LS-958, LS-959, LS-960, LS-961 LS-962, LS-974);
  • Fixed a bug in NET example that was causing a null reference exception when trying to connect to a conference in SFU Audio-only mode (LS-1147);

Bug fixes:

Socket Managers, Gatherers and ICE Transport:

  • Fixed a bug where .NET could hang while negotiating SSL on TURNS connections, which resulted in a loss of responsiveness on the listening socket (IL-2088);

Xamarin Android:

  • Optimised Xamarin Android OpenGL Sink to remove now unnecessary memory copies and allocations (IL-2031);
  • Fixed a bug where a null reference when allocating a buffer in the Xamarin Android UnmarshaledCameraExtension caused a crash (IL-2043);
  • Updated Xamarin.Android (including Xamarin.Forms) examples to use AOT compilation with LLVM in Release mode. This significantly reduces first connection time (IL-1291);

Xamarin Forms:

  • Updated deprecated Forms.Context to Android.App.Application.Context in the Xamarin.Forms example (IL-2070);

JavaScript/TypeScript:

  • Updated JavaScript wrapper to call deprecated browser WebRTC GetUserMedia  API only if the new GetUserMedia API isn't supported OR if Chrome screen-sharing was requested. Previously deprecated API was being used when new API was not supported or code was executed by Chrome (not only in the screen-sharing sessions) (IL-2017);
  • Removed private/internal API from the TypeScript definition file (IL-2010);
  • Introduced a workaround for a known issue in ORTC Microsoft Edge where InvalidAccess exception is generated when multiple turn servers with the same transport protocol type are present. Current solution is to strip all but the first TURN server if such exception occurs (cf. https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10163458/) (LS-1044);
  • Increased timeout to receive remote candidates in ORTC Microsoft Edge to 1,500 ms from 500 ms to address an issue where remote peers do not signal end-of-candidates in the trickle-ice mode. Edge requires end-of-candidate signalling to conduct connectivity checks (LS-1044);
  • Set bundling policy for browsers to max-compat to avoid communication establishment issues with agents that have not yet implemented bundling negotiation (IL-2084);
  • Fixed a bug in TypeScript WebRTC connection wrapper where audio and video transceivers were added to native connections even if they already existed resulting in offers containing twice as many audio and video media descriptions as expected in Mozilla FireFox 59.0, which introduced support for RTP Transceivers (IL-2084);

Media Streams:

  • Now catch and log exceptions encountered while creating encoders and decoders. A failure to create an OpenH264 encoder, for example, was crashing the entire stack. Desired behaviour is to log the exception, but continue loading. AudioStream/VideoStream were handling the case already where all encoders/decoders fail to load (IL-2012);
  • An AudioTrack and/or VideoTrack is no longer created if audio and/or video is disabled, respectively. This mirrors JavaScript behaviour and allows developers to use a simple null-check to determine whether or not audio/video is enabled/disabled (IL-2012);
  • Updated OpenH264.Utility.Initialize so it resolves gracefully on platforms where OpenH264 is not supported (IL-1291);
  • Disabled EventSync for NAudio/Wasapi to minimise CPU usage on Connections with AudioStreams (IL-1760);
  • Fixed a bug for iOS where converting images to RGB and RGBA resulted in a bluish tint to the converted image (IL-2089);
  • Fixed a bug where the iOS audio unit source would not restart after an interruption preventing resumption of audio in an existing connection after receiving a call (IL-2079);
  • Updated OpenGL rendering on iOS so it continues to run while the app is inactive, but not backgrounded (IL-2107);
  • Increased the receive NACK buffer to account for large incoming video packets as previously any packet loss caused the buffer to overflow and the packet would be lost causing frozen video (LS-1127);
  • Fixed a bug where audio levels were not raised in Safari and throwing error "Could not initialize AudioContext" (IL-2094);
  • Fixed a bug where IE was failing to shutdown local media because of a javascript interop failure (IL-2093);

  • Fixed a race condition in iOS/macOS audio capture/playback when stopping local media or destroying remote media in the middle of a system audio interruption (IL-2120);
  • Fixed a race condition where remote video rendering on iOS could freeze after locking/unlocking the phone mid-connection (IL-2128);

  • Fixed a bug where Xamarin.iOS remote audio was not working because of missing audio initialization code block (LS-1149);

JavaScript/ActiveX:

  • Fixed a JavaScript bug throwing an exception in StreamDirectionHelper.isSend/ReceiveDisabled and AttributeCollection.remove when passing in an enum value as an argument (IL-2114);
  • Fixed a bug where errors in promises resolved in JavaScript were causing locked threads (IL-2093);

  • Fixed a bug where we unload observable was not release in ActiveX plugin on unload (IL-2093, IL-2096);

Media Server:

  • Fixed LiveSwitch MediaServer H264 library download location;
  • Fixed an issue where the NotifyUpstreamConnection event was fired for Receive-Only MCU connections. Layouts will no longer change due to receive only MCU connections (LS-1083);
  • The SDP format attributes that prevented Mozilla Firefox from connecting to H264-encoded SFU upstreams are now copied properly (LS-1093);
  • A MCU participant's video is now removed from the video mix if they set their local video status to disabled (LS-780);
  • The MCU video mixer now properly follows the configuration passed into the media server config file (LS-999);
  • The LiveSwitch Media Server will now exit properly if any unexpected error occurs during registration. Previously, unexpected errors were handled in a invalid method that caused the server to hang. This change will now cause the service to exit with a non-zero error code if running as a service and if an error occurs (LS-1092);
  • The Media Server will now only try to register 5 times before exiting (LS-1092);
  • Fixed a bug where after restarting a media server, anyone attempting to join an existing channel was not able to establish a connection (LS-1116);
  • Fixed an issue in the Media Server where NACKs were forwarded incorrectly (LS-1127);
  • Fixed a bug where the MCU video would appear frozen after the last upstream connection closed (LS-1136);
  • Fixed possible crash when a clustered media server receives an invalid handshake (LS-1144);
  • Fixed a bug where the mixer wouldn't activate until the first sender arrived, resulting in no video for initial receive-only MCU connections (LS-1137);
  • Improved MCU efficiency by activating video mixer only when receiving connections are present (LS-1137);
  • Fixed a bug in LiveSwitch MediaServer where synchronisation of processing early candidates was not properly enforced causing a race condition that could lead to runtime concurrent modification exceptions (LS-1160);
  • Fixed a rare issue where an uninstall would fail because the installer was not able to delete the downloaded openh264 dll (LS-1100);
  • Clustering SFU no longer results in macroblocking (LS-1094);

Gateway:

  • Fixed a null reference exception triggered when individual client secret keys were missing in the config file (LS-1087);

LiveSwitch Client:

  • Adds a new overload for Client.Join that only requires an auth token (LS-1120);
  • Fixed a bug where closed/failed connections might not be removed from the Channel.Connections collection (LS-1121);

Sip Connector:

  • Removed erroneous duplicate line in the outbound CANCEL message that caused the call to not be canceled (LS-1091);

LiveSwitch Client:

  • The LiveSwitch client now properly rejects the Join promise if an error is received (LS-1060);

Others:

  • Fixed a bug causing the long overflow that occurred in the ManagedStopwatch. Overflow is now delayed until extinction of the current era (LS-1086);
  • Fixed a bug where promise was silently discarding all the exceptions during resolution. Now all the exceptions are being logged (IL-2115);
  • Made SysLogProvider more efficient (IL-2123);

1.1.0.419 - March 2, 2018

 Bug Fixes:

Media Server:

  • Inverted a bad channel check in AudioFormat.FromFormatInfo (LS-1069);
  • Fixed an edge case where frames in the mixer were released prematurely (LS-1069);

Media Streams:

  • Fixed a bug in RTP Packet Header serialisation. The bug previously caused corrupted data to be sent via clustering that prevented it from working (LS-1069);

Other:

  • Fixed a bug in ImageConverter where scaling could result in odd stride values and slanted/diagonal video (IL-1912);
  • Improved UWP socket receive performance (IL-1965, IL-1966).

1.1.0.409 - February 21, 2018

Client Breaking Changes:

  • Removed the ImageScaler abstract method from the RtcLocalMedia object since it is no longer used. Updated all examples to match (IL-1916);
  • MediaFrame.RtpSequenceNumber is now an int instead of a long;
  • Renamed the OpenH264 native binary downloaded from Cisco to include the version number. The new file name can be retrieved using OpenH264.Utility.GetLibraryName(); however we recommend the following:

    Replace the download logic in your implementation to use the new OpenH264.Utility.DownloadOpenH264() method instead of using the manual implementation of DownloadOpenH264() that was previously used in our examples. This will simplify client logic, as well as ensure that no further breaking changes to the download functionality as we will take care of it inside of the new download utility.
  • VideoFrame.Duration has been removed. (MediaFrame.Duration was moved to AudioFrame.Duration);
  • Audio duration properties/parameters are now fixed-point instead of floating-point;
  • AudioSource.FrameDuration cannot be modified after being set in the constructor;
  • Switched the default Connection.MultiplexPolicy to MultiplexPolicy.Required. MultiplexPolicy.Negotiated policy property is still available and must be set when connecting to legacy services that do not support RTP/RTCP multiplexing. This is inline with the recent changes to Google Chrome;

New Features:

Socket Manager, Gatherers and ICE Transport:

  • Responding to IceRoleConflict errors as per RFC 5245 7.1.3.1;
  • Detecting and resolving ICERole conflicts as per RFC 5245 7.2.1.1 (including generating IceRoleConflict errors if needed);
  • Added support for TURNS in client stack (except for ORTC Edge) (IL-1999). Updated all examples to use the new stun, turn, and turns url located at the FrozenMountain.com domain (LS-1916);
  • TcpSocket now verifies the peer hostname when connecting with SSL/TLS (IL-1995);
  • WebSocket now enforces peer hostname verification  (IL-1995);
  • Fixed a bug where IceGatherer would attempt to allocate over UDP to a TURNS server  (IL-1995);
  • Updated .NET's TCP socket client authentication to honour the Connect timeout. This resolves an odd issue where things would appear to hang when communicating over TLS with a TCP server listener (IL-1995);

Encryption:

  • Added support for ECDSA-based signing for X.509 certificates:
    • Three (D)TLS cipher suites have been added to support ECDSA:
      • DtlsCipherSuite.EcdheEcdsaAes128CbcSha
      • DtlsCipherSuite.EcdheEcdsaAes128GcmSha256
      • DtlsCipherSuite.EcdheEcdsaAes128CbcSha256
    • Two (D)TLS cipher suites have been added to support CBC-SHA256 for RSA:
      • DtlsCipherSuite.RsaAes128CbcSha256
      • DtlsCipherSuite.EcdheRsaAes128CbcSha256
    • Six (D)TLS cipher suites have been removed in favour of the more-secure ECDHE variants:
      • DtlsCipherSuite.DhRsaAes128CbcSha
      • DtlsCipherSuite.EcdhRsaAes128CbcSha
      • DtlsCipherSuite.DheRsaAes128CbcSha
      • DtlsCipherSuite.DhRsaAes128GcmSha256
      • DtlsCipherSuite.EcdhRsaAes128GcmSha256
      • DtlsCipherSuite.DheRsaAes128GcmSha256
    • Two (D)TLS cipher suites have been renamed to clarify that they are RSA-based:
      • DtlsCipherSuite.Aes128Sha is now RsaAes128Sha.
      • DtlsCipherSuite.Aes128GcmSha256 is now RsaAes128GcmSha256;
    • Added EcdsaKey to the public API. Added DtlsCertificate and TlsCertificate.DefaultKeyType of type AsymmetricKeyType (Rsa/Ecdsa) to set default signature algorithm for generated certificates;
  • ECDSA is now the default key-signing algorithm for all connections;
  • The default RSA key size has been increased to 2048 from 1024 per the WebRTC spec;
  • The DTLS cipher suite list has been re-organized to prefer algorithms that support perfect forward secrecy (PFS);

SDP Message Generation and Processing:

  • Inserting Product name and version into SDP Origin attribute of the local SDP Offer/Answers;
  • Allow remote SDP offers to have "a=setup:" role to be "active" and "passive" in addition "actpass" and process them accordingly;

LiveSwitch Messaging:

  • LiveSwitch SDK Client now includes new Channel.Invite method to invite external users to a conference. The current supported protocols are 'tel' and 'sip'. A SIP connector is required to use this feature;
  • The Client.Invite method returns an Invitation object that will receive feedback from ongoing invite requests;

Media Streams:

  • Added MediaStream.InputFormats, an array of negotiated input formats;
  • Added MediaStream.DisabledInputFormats, an array of disabled input formats;
  • Added MediaStream.ChangeInputFormat(Format) to change the current input format (send codec, e.g. from H.264 to VP8);
  • Added MediaStream.DisableInputFormat(Format) to disable an input format and, if disabling the current format, switch to the next most preferred format;
  • Added MediaStream.EnableInputFormat(Format) to re-enable a disabled input format;
  • Added AudioStream.InsertDtmfTone(s) methods;
  • Added AudioStream.OnSendDtmfTone(Change) events;
  • Added AudioStream.OnReceiveDtmfTone(Change) events;
  • Added support for "injected" codecs, of which DTMF (telephone-event) is the first;

  • AudioDecoder now uses timestamps instead of sequence numbers when identifying gaps in the audio stream;
  • Added AudioBuffer/Format.IsDtmf convenience properties;

  • Added SoundUtility.CalculateDuration/DataLength helper methods;
  • Added AudioDecoder.MissingDuration convenience property for custom audio decoders that implement their own FEC/PLC so they know if there is a gap in the audio stream and how much time is missing;
  • Added native library support for Linux;
  • Updated AudioFrame.Duration so it is automatically calculated when a PCM buffer is added;
OpenH264:
    • Upgraded OpenH264 library to version 1.7.0;
    • Created DownloadOpenH264 method in the OpenH264.Utility class so LiveSwitch can detect and download the correct binary from Cisco instead of relying on the application code to do this;
    • Created GetLibraryName method in the OpenH264.Utility class so client applications can get the correct file name when there are version changes, or other file name changes. Nevertheless, using the new DownloadOpenH264 method is preferred;

Streams (overall):

  • Exposed stream.getLocalSend(), stream.getLocalReceive(), stream.setLocalSend(), stream.setLocalReceive(), stream.getRemoteSend(), stream.getRemoteReceive(), stream.getRemoteDirection() in JavaScript (and ActiveX);

Layout Manager:

  • Added LayoutManager.SwapRemoteView(s) and SwapRemoteMedia to support cases where the view from a connection is known to replace an existing view (IL-1936);

  • Added LayoutManager.LayoutOnMainThread to make it easier to trigger layout from a background (or UI) thread without having to write UI dispatch code (IL-1936);

Examples:

  • Added support for Xamarin macOS as well as a corresponding example;
  • Added support for SharpDX-based GPU video rendering in .NET 4.0+ WinForms apps. Return a SharpDX.WinForms.Sink in CreateViewSink;
  • ActiveX installer executable is now signed - previously only the cab itself was signed (IL-1997);
  • Exposed Dmo.Utility.IsSupported;
  • Exposed Dmo.Utility.Disabled making it easy to disable the DMOs at runtime;
  • Fixed a bug in LiveSwitch Installer node server to redirect index.html to index.htm LiveSwitch Installer node server 404 message log improvements;

Media Server:

  • Media server's now can specify a region in their config file. New connections will try and connect to media servers in their own region first. Conferences spanning regions will cluster (LS-873);

Gateway:

  • Added new REST endpoint to list all registered connectors. (Currently only SIP connector is available) (LS-973);
  • Generic connection close messages generated by the LiveSwitch Gateway are now propagated properly (LS-1015);
  • Refactored LiveSwitch Handlers so that clients connecting via the connector can be proxied and treated as individual clients with their own bindings (LS-936);

SIP Connector:

  • The Sip Connector now supports outgoing calls;
  • The Sip Connector's config file now follows the same conventions that the Gateway and Media Server use;
  • Installer now supports Sip Connector .NET Standard libraries (LS-927);
  • Configuration migration logic is added to the installer to convert legacy SIP config to latest (LS-927);

Miscellaneous:

  • Added Connection ID to Session Description, Candidate logs. Added IceTransport ID to active candidate pair logs. Added candidate pair check status on IceTransport state transition to the Failed state in Debug level, as well comprehensive candidate pair check status logging in Verbose log for IceTransport on any CandidatePair state transition (LS-949);

  • Client SDK Token's now contain a region property to determine which region a client will be in (LS-873);
  • Converted Sip connector to .NET standard and unified all service code;
  • All installer config levels are set to "Debug" instead of "Info" (LS-927);
  • Logging logic added to installer to write custom error messages to EventViewer (LS-927);
  • Safari receive-only connections now supported without permission requirements for media capture devices (i.e. camera and microphone) (IL-2041);
  • Fixed a bug in NACK generation causing packet retransmissions for invalid sequence numbers resulting in quality issues under poor network conditions (LS-1040);

 Bug Fixes:

Socket Manager, Gatherers and ICE Transport:

  • Fixed an error where IceRoleConflict errors were mistakenly interpreted as StunTurnAllocationQuotaReached;
  • Improved UDP/TCP socket sending performance in .NET and Xamarin (IL-1904);
  • Ice Gatherer now transitions to the Failed state only when all the related Socket Managers have failed. Previously, a failure of a single Socket Manager for a given Gatherer (i.e. a failure of a single socket on a given interface) used to cause Gatherer to fail as well. Additionally, Connection no longer fails when only one Gatherer fails but other Gatherers succeed (IL-1814);
  • Fixed a bug where remote IPv6 addresses not conforming to https://tools.ietf.org/html/rfc5952#section-4.2.2 (i.e. where a single 16-bit 0 field was shortened to "::") were not properly registered in IceTransport. Also ixed a bug where in UWP in the process of connectivity checks IPv6 addresses were incorrectly parsed and reported in the way that did not conform to https://tools.ietf.org/html/rfc5952 (capitalisation and not shortening of 16-bit 0 fields). Both issues resulted in causing certain candidates to appear twice in candidate pair pairing process and be reported as peer-reflexive candidates (IL-1998);
  • A chatty log message in native iOS/macOS UdpSocket is now verbose-level instead of debug-level;

Layout Manager/Example User Interface:

  • Fixed a bug where messaging tab was covered by the keyboard and users were not able to send/receive messages during a video conference;
  • Fixed a bug where Android was crashing on double tap in screen-share mode;
  • Fixed potential deadlock in native iOS/macOS LayoutManager dealloc;
  • Fixed a bug where iOS example was crashing on double tap in screen-share mode (IL-1608);

Media Streams:

  • Fixed a bug in Xamarin iOS where an interrupted AudioUnitSink would fail to reinitialize when the interruption had ended;
  • Rtp Transport no longer overwrites RTP sequence and/or timestamp if they are already set;
  • Enabled AecContext for Android x86 in IceLink and LiveSwitch examples;
  • Fixed a bug where the SoundConverter could generate timestamps with a slight skew;
  • Fixed a parsing bug in the Matroska file sources;
  • Cloned media frames now include any dynamic properties that have been set;
  • Fixed potential deadlock in native/Xamarin iOS/macOS AVCaptureSource start/stop;
  • Improved Java Linux support for OpenH264 so that it matches other platforms (IL-1943);
  • The AecContext is now disposed of correctly in the .NET example. This prevented the .NET example from shutting down when closed (IL-1884);
  • Cloned media frames now include any dynamic properties that have been set;

Streams (overall):

  • Fixed a bug where setting Stream.LocalSend or Stream.LocalReceive to a negative value was not actually disabling sending or receiving functionality on the stream (IL-1990);

Encryption:

  • Fixed bug in certificate serialization when using SHA-256 signature algorithm;

Internal Utility Methods:

  • Fixed an error that would cause string arrays with commas to deserialise incorrectly;
  • JsonSerializer now properly returns null if a null string is passed into SerializeStringArray (LS-938);

SDP Message Generation and Processing:

  • Fixed a bug, where Microsoft Edge failed to connect to peers that were offering multiple versions of a codec with varying coded parameters (in particular impacting connectivity to Google Chrome and Mozilla Firefox in answering mode) (IL-1938);

Signalling:

  • Fixed a bug where iOS/macOS would fail to connect to the gateway if WebSockets were enabled client-side and SSL/TLS was used (IL-1993)

Gateway:

  • Calling Client.Update now properly propagates to all connected clients in joined channels;
  • Fixed a bug in the LiveSwitch Gateway admin page where responsive layout was not working on smaller devices;
  • Client.Update calls are now properly persisted for when new clients join;
  •  Gatewaynow cleans up properly after a media server unexpectedly unregisters (LS-967);

Media Server:

  • Inbound packetized buffers are now wrapped in the correct class so the SFU can properly handle them ( LS-932 );
  • The MCU now clears the mixer canvas when one of the input's resolution changes (LS-811);
  • Media Server now properly only returns PCMU in the answer if Opus isn't offered (LS-913);
  • Media Server now cleans up properly after a media server unexpectedly unregisters (LS-967);
  • Started batching liveswitch message requests which prevents timeouts during high periods of use for Media Server and Sip Connector (LS-991, LS-992, LS-993);

SIP Connector:

  • SIP Digest Authentication is now compatible with 3CX (LS-933);
  • SIP Connector now can use auth id's when registering to a trunk (LS-933);
  • SIP now handles a ProxyAuthorize during registrations (LS-933);
  • The Sip Connector Webhook now POSTs proper json (LS-934);
  • The Sip Connector webhook now url encodes the uri (LS-935);
  • Sip Connector clients can now be the first members of a conference (LS-937);
  • Sip Connectors can now have empty dial plans (LS-925);
  • Fixed a bug where sip connector name was using a . symbol at the end under installed service descriptions (LS-926);
  • The Sip Connector now starts the sip trunk re-register timer property when configured to use the TCP transport (LS-991, LS-992, LS-993);

Miscellaneous:

  • Fixed a bug where thread suspension for less than 50 ms led to longer thread suspension then expected resulting in imprecise event scheduling;
  • Fixed a bug in Android Logger where messages longer than 2000 characters may have been logged several times (e.g. longer SDP Offer/Answers);
  • Fixed error loading libyuvfm.so on Android x86 devices (IL-2038);
  • Fixed an example bug for Swift iOS and macOS where remote medias and connections were not being disposed of;
  • Eliminated a potential deadlock on client shutdown;
  • Fixed a bug where incorrect values for AndroidSupportedAbis would lead to spontaneous crashes on any android device that is not armeabi-v7a (IL-1924);
  • Reverted a change that caused LiveSwitch logs to be truncated. (The logs will now always flush immediately);
  • Improved HTTP transfer performance on iOS/macOS (LS-965).

1.0.5.353 - January 18, 2018

Client Bug Fixes:

  • Fixed a bug, where RTP data was sometimes not re-sent in response to incoming NACKs;
  • Fixed a bug causing race conditions in inter-thread dispatch in Xamarin Android;
  • Fixed synchronization around events and improved memory management in Cocoa;
  • Fixed a bug in the Xamarin Android example where a missing permission caused connections to fail to be established when built in release mode;

Server Bug Fixes:

  • Fixed a bug, where RTP data was sometimes not re-sent in response to incoming NACKs.

1.0.5.337 - January 8, 2018

Server Bug Fixes:

  • Calling Client.Update now properly propagates to all connected clients in joined channels.

1.0.5.335 - January 5, 2018

Server Bug Fixes:

  • Fixed media server exception thrown when connecting an audio-only or audio/video SFU downstream to a video-only SFU upstream;
  • Removed NIC bandwidth check for load distribution checks in Media Server clustering algorithm. Media Server just returns summed bandwidth property for all connections now.

Client SDK Bug Fixes:

  • Client.Update now bypasses the setters and updates the value directly avoiding the exception.

1.0.5.333 - January 2, 2018

New Server Features:

  • Added support for single-tier SFU and MCU Media Server clustering;
  • Media Server now properly records all upstreams when triggering recording via the REST api;
  • Optimizations in the media server's generic NACK pipeline to reduce bandwidth usage;
  • Added no-delay flags to TCP sockets to improve performance;
  • Added support for SDP extmap attributes as per https://tools.ietf.org/html/rfc5285#section-5;
  • Added support for Abs-send-time RTP HeaderExtension. Abs-send-time is inserted in RTP packets containing Video payloads if negotiated with the the other peer. Sending abs-send-time is currently negotiated only from non-Javascript clients to Javascript clients that support it;
  • Added a verbose log level;
  • Media server now records events to a file called 'log.json' in the recording directory when recording is started or stopped;
  • Experimental bandwidth adaptation support in the media server. Off by default;

New Client SDK Features:

  • LiveSwitch now supports IE using ActiveX;
  • There is now a new messages type that is used to transmit error codes to signal what went wrong with registrations, token handshakes, SDP negotiation, authentication, connections and more;
  • Added no-delay flags to TCP sockets to improve performance;
    Added ManagedStopwatch.Reset method;
  • Added CandidateStats.TurnProtocol to indicate whether a relay candidate was gathered over TCP;
  • Exposed Sdp/Rtp/ExtMapAttribute, Sdp/Message.GetSessionLevelRtpExtMapAttributes(), Sdp/MediaDescription.GetRtpExtMapAttributes(), Sdp/AttributeType. RtpExtMapAttribute;
  • Exposed MediaStream.AbsoluteSenderTimeLocalDiection, MediaStream.AbsoluteSenderTimeRemoteDirection, MediaStream.AbsoluteSenderTimeDirection which get the current local, remote and the aggregate direction for the RTP Header Extension for Absolute Sender Time;
  • Exposed stream.UseSdes property that gets or sets a value indicating whether a stream may use Sdes encryption. When set to true, SDP media description will include SDES Crypto attribute. If Dtls encryption is negotiated, Sdes encryption will be disabled and the property will be set to false. Currently set to true by default for MediaStream;
  • Added ManagedConnection.DefaultLocalDtlsCertificate(s) for easy certificate caching;
  • Added output device switching support for .NET (NAudio) and TypeScript;
  • Added Utility.Initialize methods to AudioProcessing/OpenH264/Opus/Vpx/Yuv to pre-load native libraries. This allows native libraries to be loaded when an app is first starting rather than the first time a connection is being established. We recommend doing this on all platforms, but it is especially beneficial in Xamarin apps where it decreases connection time by 2-4 seconds (depending on hardware speed, etc);
  • Added a Verbose log-level (one level higher than Debug). Noisy transport and codec logging such as RTP RTT (previously Debug-level), Opus packet loss reports (previously Warn-level), and several other items are now at the new Verbose-level;
  • Added ILog.IsVerboseEnabled, IsInfoEnabled, IsWarnEnabled, IsErrorEnabled, and IsFatalEnabled to complement the existing IsDebugEnabled;
  • Logging thread will no longer start up until the first log is processed and there is an available log provider to receive it;
  • Changed the log thread scope to instance instead of static. This allows to run multiple AsyncLoggers in parallel;
  • Added FirControlFrame/FirEntry classes;
  • Added support for raising outbound FIR packets from VideoEncoder, used in lieu of PLI packets until the first keyframe arrives per https://tools.ietf.org/html/rfc5104#section-3.5.1. Note that MediaStream will automatically convert an FIR that is raised from a MediaTrack to a PLI (and vice versa) based on negotiated local vs. remote capabilities;
  • Updated outbound FIR/PLI throttling to use round-trip times as per https://tools.ietf.org/html/rfc5104#section-3.5.1 recommendations. Added inbound FIR/PLI throttling based on the same algorithm to prevent a misbehaving remote peer from over-saturating the network. Combined, these two changes should result in faster recovery on faster networks and reduced congestion on slower networks. An increase in sequence numbering for FIR packets will reset throttling;
  • Added VideoBuffer.ToPlanar() to generate planar representation of packed data;
  • Added VideoBuffer.CreateCustom with DataBuffer parameter to support re-use of existing DataBuffer allocation;
  • Added support for processing inbound FIR packets to VideoDepacketizer and VideoDecoder;
  • Added AudioStream(RemoteMedia) and VideoStream(RemoteMedia) constructor overloads;
  • CandidatePairStats.CurrentRoundTripTime is now reported;
  • Added VideoBuffer.IsKeyFrame property (checks DataBuffer for VP8/VP9/H.264 and returns true elsewhere);
  • Updated VideoStream to ensure that initial outbound traffic starts with a keyframe;
  • Added AudioFormat.IsPcmu/Pcma/Opus convenience properties;
  • Added VideoFormat.IsVp8/Vp9/H264 convenience properties;
  • Added no-delay flags to TCP sockets to improve performance;
  • Exposed AudioBuffer.IsPcmu, AudioBuffer.IsPcma, AudioBuffer.IsOpus, VideoBuffer.IsI420, VideoBuffer.IsYv12, VideoBuffer.IsNv12, VideoBuffer.IsNv21, VideoBuffer.IsRgb, VideoBuffer.IsBgr, VideoBuffer.IsRgba, VideoBuffer.IsBgra, VideoBuffer.IsArgb, VideoBuffer.IsAbgr, VideoBuffer.IsVp8, VideoBuffer.IsVp9, VideoBuffer.IsH264 properties;
  • Introduced support for TRANSACTION_TRANSMIT_COUNTER STUN Attribute (defined in https://tools.ietf.org/html/rfc7982#section-3.1) aiding Round Trip Time (RTT) and future fractional loss calculations;
  • Introduced peer-to-peer and peer-to-relay server RTT calculations on the IceTransport layer allowing for the more precise RTT calculations. Switched RtpTransport to use RTT calculated by the IceTransport (falling back to the RTT calculations based on RTCP ReceiverReports when IceTransport RTT calculations are not available);
  • Exposed MediaStream.BandwidthAdaptationPolicy controlling whether experimental bandwidth adaptation algorithms are enabled for the given media stream. Disabled by default. When enabled, encoders dynamically change their bitrates to adapt and mitigate packet loss encountered on the network;
  • Added CandidateStats.TurnProtocol to indicate whether a relay candidate was gathered over TCP;
  • Exposed voice communication blacklist for Android. Android and Xamarin.Android device can be added to blacklist to use mic mode;

  • Added IMediaElement.Persistent so media elements can persist beyond the lifetime of their parents. This applies to MediaTrack, MediaBranch, MediaSource, MediaPipe, and MediaSink. An example of how this is beneficial is the AecContext output track can be attached to the RemoteMedia audio track and take advantage of pipelining without AecContext being destroyed with the RemoteMedia;

  • Added MediaTrack.ActiveSink to easily reference the currently active sink;

  • Exposed DataBuffer.Read12(), Binary.FromBytes12(), Binary.TryFromBytes12();
  • Exposed StreamDirectionHelper.DirectionToString(StreamDirection), StreamDirectionHelper.DirectionFromString() that aid SDP direction parsing;
  • Added support for SDP extmap attributes as per https://tools.ietf.org/html/rfc5285#section-5;
  • Exposed a bunch of properties that can be used to fine-tune Java's VideoComponentSink (anti-aliasing, interpolation mode, rendering speed, etc.);
  • Exposed Sdp/Rtp/ExtMapAttribute, Sdp/Message.GetSessionLevelRtpExtMapAttributes(), Sdp/MediaDescription.GetRtpExtMapAttributes(), Sdp/AttributeType. RtpExtMapAttribute;
  • Added support for Abs-send-time RTP HeaderExtension. Abs-send-time is inserted in RTP packets containing Video payloads if negotiated with the the other peer. Sending abs-send-time is currently negotiated only from non-Javascript clients to Javascript clients that support it if required for bandwidth adaptation;
  • Added support for RTCP message for Receiver Estimated Maximum Bitrate (goog-remb) as per https://tools.ietf.org/id/draft-alvestrand-rmcat-remb-03.html ;
  • Exposed MediaStream.AbsoluteSenderTimeLocalDiection, MediaStream.AbsoluteSenderTimeRemoteDirection, MediaStream.AbsoluteSenderTimeDirection which get the current local, remote and the aggregate direction for the RTP Header Extension for Absolute Sender Time;
  • Added support for msid, mslabel and label SDP attributes for the media stream descriptions;
  • Modified debug level logging by removing unnecessary verbose VPX log messages;
  • Added ImageViewLayoutManager and ImageViewSink for JavaFX to the Java SDK;
  • Added AudioStream(RemoteMedia) and VideoStream(RemoteMedia) constructor overloads;
  • Added some extra null-safety checks into the Jitter/NACK buffers. (Doesn't need to be included in release notes);
  • Added VideoBuffer.IsKeyFrame property (checks DataBuffer for VP8/VP9/H.264 and returns true elsewhere);
  • Updated VideoStream to ensure that initial outbound traffic starts with a keyframe (deltas are dropped until a keyframe comes through);
  • Added AudioFormat.IsPcmu/Pcma/Opus convenience properties;
  • Java examples now auto-download the OpenH264 binary from Cisco;
  • Added a more helpful log message for debugging where OpenH264 libraries are being loaded from, if loading fails. For MacOS, changed the default load location for the OpenH264 libraries from /user/local/lib/libopenh264.3.dylib to @loader_path/openh264.dylib, so it will now load from the same directory that the libopenh264fm<JNI>.dylib file is located in. It is possible to revert this change by running the following command against our wrapper dylib: install_name_tool -change @loader_path/openh264.dylib /usr/local/lib/libopenh264.3.dylib libopenh264fm<JNI>.dylib ;
  • Added VideoFormat.IsVp8/Vp9/H264 convenience properties;
  • All minified js/css files removed from web examples;
  • Exposed stream.UseSdes property that gets or sets a value indicating whether a stream may use Sdes encryption. When set to true, SDP media description will include SDES Crypto attribute. If Dtls encryption is negotiated, Sdes encryption will be disabled and the property will be set to false. Currently set to true by default for MediaStream. Set to false for DataStreams (setting this value to true for DataStream will result in an exception);
  • Exposed UnixTimeStamp.DateTimeToUnixMillis(DateTime dateTime), UnixTimeStamp.UnixMillisToDateTime(long unix), UnixTimeStamp.TicksToUnixMillis(long ticks), UnixTimeStamp.UnixMillisToTicks(long unix);
  • An HTML5 MediaStream can be used as the source for LocalMedia by passing it into the constructor as 'audio' and/or 'video';
  • Added Connection.DefaultLocalDtlsCertificate(s) for easy certificate caching;
  • Added FakeAudioSource and FakeVideoSource for testing/simulation;
  • Java SoundSource and SoundSink now display more useful strings (the name of the device instead of the description) when querying LocalMedia.AudioSourceInputs and RemoteMedia.AudioSourceOutputs;
  • Added Matroska.AudioSource and Matroska.VideoSource;
  • Added NullAudioSink and NullVideoSink.

Server Bug Fixes:

  • Fixed a bug in RTP Packet parsing where RTP Packets containing Header Extensions were improperly parsed and treated as Rtcp packets;
  • SIP clients calling in and hanging up now generate OnRemoteUpstreamConnectionOpen/Close events in the LiveSwitch client SDK;
  • When upgrading on Windows Server, the default stun address has been fixed to turn.liveswitch.fm instead of turn.icelink.fm;
  • Installer will now properly update the https Gateway url based on the port selected;
  • Fixed RedisStore startup exception due to a regression caused when porting to .NET Core;
  • Fixed a bug in Redis.Provider.cs where it was trying to update a MediaServer status instead of creating it for the first time during registration;
  • Fixed a few null refs when updating and setting client meta data when using a RedisStore;
  • Message pipes now properly chain together and will be called in order;
  • LiveSwitch now logs properly in the Frozen Mountain Software folder instead of Frozen Mountain;
  • Fixed bug where OnMessage would raise instead of OnUserMessage, OnDeviceMessage, or OnClientMessage when a remote peer called SendUserMessage, SendDeviceMessage, or SendClientMessage, respectively;
  • Fixed 500 error when requesting media server reports before a media server has sent it's first report;
  • Resolve issue with macro-blocking on SFU downstreams when packet loss on the SFU upstream-side is introduced.

Client SDK Breaking Changes:

  • BaseStats.UnixTimestamp now uses milliseconds precision as per https://w3c.github.io/webrtc-stats/ to align with type DOMHighResTimeStamp;
  • Removed redundant "EnableSpsPpsIdAddition" OpenH264 configuration property. Use "SpsPpsIdStrategy" instead;
  • In Javascript, a STUN/TURN server URI that contains no transport restriction is now enterpreted to require both TCP and UDP transport protocols if both protocols are supported. For example, "turn:turn.icelink.fm:443" URIs imply that both TCP and UDP candidates are required, whereas "turn:turn.icelink.fm:443?transport=udp" restricts collected candidates to UDP only. For further info, please refer to the "URI Scheme Syntax" section of RFC 7065 (https://tools.ietf.org/html/rfc7065#section-3.1). This brings JavaScript behavior on par with all other IceLink platforms.

Client SDK Bug Fixes:

  • The Cocoa AudioUnit Sink is now initialized when it begins receiving data instead of during instantiation. This allows it to be created before the AVAudioSession has been activated, which is necessary for CallKit (https://developer.apple.com/documentation/callkit) integration;
  • Fixed an issue where the local camera preview was positioned incorrectly in some cases when using the floating layout mode;
  • Fixed an issue where unnecessary locks could slow down the process of raising ICE candidates;
  • Fixed a race condition, which could cause an exception to be thrown when using pooled DataBuffers on the Pixel;
  • Fixed a bug where the ActiveX control's component GUIDs did not match those from the JavaScript SDK, which would prevent the ActiveX control from loading;
  • Fixed a bug where, under adverse network conditions, the RTPTransport class would throw multiple exceptions with the error mesage: "An item with the same key has already been added";
  • Fixed a bug in the CRC implementation that prevented OpenH264 downloads for MacOS;
  • Fixed a memory leak in the CameraSource class of Xamarin Android;
  • Fixed a bug in the Firefox screen-sharing implementation, where the extension would prompt you to select from a list of application windows instead of screens;
  • Fixed a bug where the ActiveX plugin would not honour the flags to enable or disable audio and video in the LocalMedia constructor;
  • The Cocoa OpenGL View is now properly reinitialized when an app regains the foreground;
  • Updated MediaTrack.GetSinkOutputs, MediaTrack.SinkOutput and MediaTrack.ChangeSinkOutput to handle branching;
  • Introduced an additional safety check ensuring that at least one stream is passed into Javascript Connection constructor;
  • Fixed an issue where MediaSource.GetInputs and MediaSink.GetOutputs could return null instead of an empty array;

  • Fixed an issue where RemoteMedia.GetAudioSinkOutputs and RemoteMedia.GetVideoSinkOutputs always returned an empty array;
  • Fixed an issue where LocalMedia.ChangeAudioSourceInput and LocalMedia.ChangeVideoSourceInput could return null instead of a rejected promise;
  • Fixed an issue where RemoteMedia.ChangeAudioSinkOutput and RemoteMedia.ChangeVideoSinkOutput could return null instead of a rejected promise;
  • Fixed an issue where MediaTrack.ChangeSourceInput and MediaTrack.ChangeSinkOutput could return null instead of a rejected promise;
  • Fixed a stack overflow exception in PipelineJson calls. This was noticeable when debugging media tracks. Visual Studio evaluates the PipelineJson property and crashes the app;

  • Internalized ManagedStopwatch.Frequency to avoid complicated calculations. We aren't factoring in Frequency when we use ManagedStopwatch elsewhere in the code, so this is a preventative measure to avoid difficult-to-trace timing bugs;
  • Fixed a bug in RTP Packet parsing where RTP Packets containing Header Extensions were improperly parsed and treated as Rtcp packets;

  • Fixed a bug where incomplete local SDP description was sometimes logged;
  • Added support for choosing different webcam drivers in Sarxos;
  • Reduced CPU usage of WPF ImageSink;

  • Switched to using the video-capture-library by Roxlu when on Java in Windows environment;
  • Fixed an example bug where leaving a conference when no network is available could cause a crash;
  • Fixed a bug converting NV12 and NV21 images to other formats;
  • Fixed a bug where Xamarin.iOS remote video was not displayed on iOS devices;
  • Fixed a bug causing a crash when decreaing bitrate using SetBitrate() for OpenH264;
  • Fixed a bug where calling VideoBuffer.Create with a YUV format could generate an image with an incorrect colour. This was most readily apparent when calling VideoBuffer.CreateBlack, which previously returned a green image. The fix improved the smoothness of the colour rotations in FakeVideoSource as well;
  • Fixed a bug where muting local video on Android and UWP would generate green frames instead of black frames by updating VideoBuffer.Mute so it handles packed YUV formats, which is the default output format for Android camera capture;
  • Fixed bug that could prevent IceLink/LiveSwitch from correctly decoding H.264 video sent from Chrome;
  • Fixed a bug where VP9 encoder was creating invalid log statements "VP9 Encoder generated keyframe." Now this log statement is issued only when the keyframe is generated;
  • Fixed a bug preventing switching the audio playback device in Java;
  • Fixed a bug where internal TcpSocket timeout prevented the success event from firing preventing data transmitted over TCP from being received;
  • Fixed a bug in Swift examples, where setOnFailureBlock in Signalling was set twice;
  • Improved thread safety on encryption and stats counters for outbound RTCP traffic;
  • Fixed a bug in Xamarin Android example where virtual method 'java.lang.Class.getClassLoader()' was being invoked on a null object reference;
  • Improved performance of WinForms.ScreenSource, AForge.MotionJpegSource, and Wpf.ImageSink;
  • Fixed an an issue where the ObjectiveC and Swift headers had a version of 0.0.0.0 in the comment header;
  • Fixed an issue causing green flickering in Android (due to planar bug in libyuv wrapper);

  • Fixed a bug in JavaScript for ORTC (Microsoft Edge), where connections started with MediaStreams without local media trigger null reference exceptions at initialization.

1.0.4.287 - December 7, 2017

Client SDK Bug Fixes:

  • Stripping incoming offers of SDES cryptos if DTLS fingerprints are also present fixing interop with Google Chrome 63;

1.0.4.283 - December 6, 2017

Server Bug Fixes:

  • A regression was found in 1.0.4.273 where if IPv6 was disabled, the websocket success logic never fired in the media server leaving the socket in a state of limbo. If the media server's web socket was then improperly shut down while in this state of limbo, the gateway web socket code ended up in an infinite loop. This caused media servers to not be able to send or receive data on IPv4 networks, which is the default for Google Cloud;
  • Message pipes now properly chain together and will be called in order.

1.0.4.273 - November 25, 2017

New Server Features:

  • Gateway and media server are using .NET Standard in preparation for Linux packages.
  • When a Media Server unregister event occurs, it now sends a close message to other Media Servers;
  • Added support for gateway messages pipes to process gateway signalling messages in a blocking manner;
  • Added REST API for querying the status of an application, channel, user, device, client, or connection;
  • Added REST API for kicking a client or groups of clients out of a channel;
  • Added REST API for updating a channel claim;
  • Added REST API for updating client details (user alias, device alias, tag, and roles);
  • Added REST API for starting/stopping recording;
  • Exposed Connection.CreateStreamSocket and Connection.CreateDatagramSocket functions that allow to modify socket factories for Ice.Gatherer;
  • Added support for expiration time ("exp") in auth tokens;
  • Added reconnection logic to TypeScript and Android examples;
  • Added screen capture checkbox to Web example;
  • SIP connector now handles info and update messages;
  • Increased trial client concurrency limit to 50 (was 10).

New Client SDK Features:

  • LiveSwitch clients no longer require license keys;
  • Added LocalMedia/RemoteMedia.OnAudioLevel and AudioTrack.OnLevel support for Safari;
  • Added Channel.Claim to view the current claim details for a channel;
  • Added Channel.OnClaimUpdate, raised when the claim details are updated by the server;
  • Added Client.OnUpdate, raised when the client details are updated by the server;
  • ExposedRenderDevice property on the VoiceCaptureDMO;
  • Changed Xirsys Extension to usethe global DNS address instead of US-east;
  • Modified AudioStream and VideoStream constructors to throw Exceptions when they are instantiated with no sources and sinks;
  • Added debug-level logging for cases where control frames are discarded due to lack of support by remote peer after negotiation;
  • Added new cross-platform video size querying API:
    • LocalMedia/RemoteMedia.VideoSize property and OnVideoSize event, raised when a frame is processed by the first video track
    • VideoTrack.Size property and OnSize event, raised when a frame is processed by the track;
  • Added newcross-platformvideo snapshot API:
    • LocalMedia/RemoteMedia.GrabVideoFrame, an async method that captures a snapshot of the next video buffer processed by the first video track
    • VideoTrack.GrabFrame, an async method that captures a snapshot of the next buffer processed by the track;
  • Added new cross-platformVideoBuffer.Convert API to convert image formats - RGB, BGR, ARGB, ABGR, RGBA, BGRA, I420, YV12, NV12, and NV21 are supported. This allows snapshots to be converted easily to a desired format for serialization without having to do complicated image conversions yourself;
  • Added new LocalMedia properties:
    • OpusConverter, the sound converter for Opus
    • OpusPacketizer, the packetizer for Opus
    • PcmuConverter, the sound converter for PCMU
    • PcmuPacketizer, the packetizer for PCMU
    • PcmaConverter, the sound converter for PCMA
    • PcmaPacketizer, the packetizer for PCMA
    • Vp8Converter, the image converter for VP8
    • Vp8Packetizer, the packetizer for VP8
    • Vp9Converter, the image converter for VP9
    • Vp9Packetizer, the packetizer for VP9
    • H264Converter, the image converter for H.264
    • H264Packetizer, the packetizer for H.264
    • ActiveAudioConverter, the activeaudio track converter
    • ActiveAudioEncoder, the active audio track encoder
    • ActiveAudioPacketizer, the activeaudio track packetizer
    • ActiveVideoConverter, the active video track converter
    • ActiveVideoEncoder, the activevideo track encoder
    • ActiveVideoPacketizer, the activevideo track packetizer;
  • Added new RemoteMedia properties:
    • OpusDepacketizer, the depacketizer for Opus
    • OpusConverter, the converter for Opus
    • PcmuDepacketizer, the depacketizer forPCMU
    • PcmuConverter, the converter forPCMU
    • PcmaDepacketizer, the depacketizer forPCMA
    • PcmaConverter, the converter forPCMA
    • Vp8Depacketizer, the depacketizer forVP8
    • Vp8Converter, the converter forVP8
    • Vp9Depacketizer, the depacketizer forVP9
    • Vp9Converter, the converter forVP9
    • H264Depacketizer, the depacketizer forH.264
    • H264Converter, the converter forH.264
    • ActiveAudioDepacketizer, the activeaudio track depacketizer
    • ActiveAudioDecoder, the activeaudio track decoder
    • ActiveAudioConverter, the activeaudio track converter
    • ActiveVideoDepacketizer, the activevideo track depacketizer
    • ActiveVideoDecoder, the activevideo track decoder
    • ActiveVideoConverter, the activevideo track converter;
  • Added new LocalMedia events:
    • OnActiveAudioConverterChange, raised when the active audio track converter changes
    • OnActiveAudioEncoderChange, raised when the active audio track encoder changes
    • OnActiveAudioPacketizerChange, raised when the active audio track packetizer changes
    • OnActiveVideoConverterChange, raised when the activevideo track converter changes
    • OnActiveVideoEncoderChange, raised when the activevideo trackencoder changes
    • OnActiveVideoPacketizerChange, raised when the activevideo trackpacketizer changes;
  • Added new RemoteMedia events:
    • OnActiveAudioDepacketizerChange, raised when the active audio track depacketizer changes
    • OnActiveAudioDecoderChange, raised when the active audio track decoder changes
    • OnActiveAudioConverterChange, raised when the active audio track converter changes
    • OnActiveVideoDepacketizerChange, raised when the activevideo trackdepacketizer changes
    • OnActiveVideoDecoderChange, raised when the activevideo trackdecoder changes
    • OnActiveVideoConverterChange, raised when the active video track converter changes;
  • Added new LocalMedia virtual methods to allow overrides:
    • CreateOpusPacketizer
    • CreatePcmuPacketizer
    • CreatePcmaPacketizer
    • CreateVp8Packetizer
    • CreateVp9Packetizer
    • CreateH264Packetizer
    • CreateSoundConverter;
  • Added new RemoteMedia virtual methods to allow overrides:
    • CreateOpusDepacketizer
    • CreatePcmuDepacketizer
    • CreatePcmaDepacketizer
    • CreateVp8Depacketizer
    • CreateVp9Depacketizer
    • CreateH264Depacketizer
    • CreateSoundConverter;
  • Added LocalMedia/RemoteMedia.OnAudioLevel and AudioTrack.OnLevel support for Safari;

Server Bug Fixes:

  • Fixed a bug where token expiry was not enforced;
  • Fixed a bug in TurnServer pass-through when a relay-to-relay connection between Chrome and IceLink uses the same TURN server;
  • The installer showed "(Collection)" as one of the SSL certificate options when installing on a fresh box. Cleanedthat up so the drop-down is empty when no certificates are installed yet;
  • Fixed a bug where restrictions placed in channel claims were not enforced;
  • TCP receiver now uses a circular buffer to account for packet fragmentation on the byte stream;

Client SDK Bug Fixes:

  • Updated ManagedConnection.OnRemoteUpdate so it is raised after the connection has been updated;
  • Fixed a bug in the Xamarin.iOS and Xamarin.Android example applications that caused Audio Only mode to fail;
  • Fixed a bug where timestamp reset logging would repeat ad nauseum;
  • Fixed a bug in Java where releasing the SoundSource could block and prevent proper shut down of local media;
  • The onAudioLevel event was causing audio level calculations to occur with each frame, causing audio performance issues on Android, Java and iOS;
  • Fixed a memory leak in CameraSource of Xamarin.Android that caused crashes after some time. On older devices this would occur quickly and on high-end devices after 20 minutes or so;
  • Screenshare sink in Xamarin.iOS was changed to ImageViewSink instead of using default OpenGLSink in order to allow screen sharing to work;
  • TCP receiver now uses a circular buffer to account for packet fragmentation on the byte stream;
  • Codecs were not negotiated properly when native peers (Android, iOS, NET, etc) in send-only or receive-only mode were negotiating P2P connections with non-WebRTC compliant peers (Safari 11, Edge 38, etc);
  • Fixed a bug causing connectivity to fail during longevity tests on Android;
  • Ensured that web only mirrors the local preview if the camera is user-facing (facingMode==user);
  • Fixed a bug in Connection where Connection did not wait for Scheduler to shutdown potentially leaving some Scheduler tasks running for some time after Connection transitioned to the Closed or failed state;
  • Fixed a bug when multiple remote peers were connected to a local Java client. Video would flicker between the remote peers since the underlying image buffer was being updated while it was still rendering the previous image;
  • Fixed race condition in iOS and macOS examples that could occur if startLocalMedia was called immediately after stopLocalMedia;
  • Fixed a bug where certain UI tasks were not dispatched on the main thread in FMIceLinkCocoaImageViewSink and FMIceLinkCocoaLayoutManager causing random crashes to be possible;
  • Fixed an example bug platform wide where if the remote client did not attach a view a null pointer exception occurred;
  • Fixed a bug where relay candidates discovered over TCP where assigned equivalent priorities to the relay candidates discovered over UDP, which was intermittently causing Ice transport to prefer TCP-based candidate pairs over UDP-based candidate pairs. UDP-based relay candidates now get higher priority than the TCP based ones;
  • Fixed a bug in iOS whereUI thread was updated from a background thread. This was producing a warning in the latest version of XCode. As best practices, setting status bar orientation should be dispatched to main thread and app status should be set through notifications;
  • ObjC example on iOS 11 were showing exception(-1) continually. This was due to the order certain properties were set in the AudioUnitSink so we were able to work-around the issue by changing the order;
  • Changed default settings for Voice Capture Source causing DMO to not work in some platforms;
  • Fixed an Android example bug that caused chat messages to be mistakenly cleared on device rotation;
  • Fixed a crash in iOS caused when using screen-share as the video source;
  • Fixed a bug in the Android and Xamarin.Android examples where local/remote recording targeted the wrong path.

1.0.3.218 - October 26, 2017

Bug Fixes:

  • Fixed a problem where hardware-encoded VP8 streams from Firefox rendered with macro-blocking.

1.0.3.197 - October 18, 2017

Bug Fixes:

  • Resolved a regression in the Srtp.Listener causing performance issues in A/V rendering.

1.0.3.161 - October 13, 2017

New Server Features:

  • The LiveSwitch Gateway now supports Redis for multi-gateway setups;

  • Upstream connection tags are now included in OnRemoteUpstream events now. Also added PeerConnectionOffer.ConnectionTag. Tagging connections can be useful in multi-connection setups where one connection is streaming a screen-share session and another is streaming a camera session;
  • Added support for gateway messages sinks to process gateway signalling messages in a non-blocking manner;
  • Added ManagedConnection.DtlsCertificate(s) (native platforms only);
  • Added ManagedConnection.LocalDescription;
  • Added ManagedConnection.RemoteDescription;
  • Added ManagedConnection.TrickleIcePolicy;
  • Updated Channel/Client/ManagedConnection to extend Dynamic;
  • Added support for wild-card RTCP feedback attributes (i.e. `a=rtcp-fb:* nack`);
  • Revised the client state change handling to be thread-safe.

New Client SDK Features:

  • Added support for Xamarin.Android and Xamarin.iOS;
  • WPF ImageSink has new constructors that accept a Dispatcher which will be used to create a new Image;
  • Added support for wild-card RTCP feedback attributes (i.e. `a=rtcp-fb:* nack`);
  • Added reconnection logic to iOS example;
  • Upgraded JavaScript libraries to TypeScript 2.

Server Bug Fixes:

  • Added additional error logging in core and media transports;
  • Added try/catch wrappers around native codec initializers to log exceptions instead of bailing. Primary case is when OpenH264 fails to load. Connection should still proceed with VP8;
  • Fixed a potential collection modified enumeration exception in Ice.Gatherer that could occur if SocketManagers were modified while enumerating the list;
  • Fixed a bug where 8-byte receiver reports could be sent with a length parameter indicating only 4 bytes;
  • Updated the jitter buffer to handle cases where the remote RTP sender resets its timestamp;
  • Fixed a bug in SRTP Context (responsible for encryption) where null reference exceptions could cause application crush and added more detailed error logging;
  • Fixed a bug in Connection where Connection did not wait for Scheduler to shutdown potentially leaving some Scheduler tasks running for some time after Connection transitioned to the Closed or failed state;
  • Fixed a bug where deadlocks could occur while performing simultaneous operations.

Client SDK Bug Fixes:

  • Fixed a bug where 8-byte receiver reports could be sent with a length parameter indicating only 4 bytes;
  • Fixed an issue where camera was not switching on double tap on Android example;
  • Updated the jitter buffer to handle cases where the remote RTP sender resets its timestamp;
  • Fixed a bug where the Java-based TURN relay server was throwingintermittent Out-of-Memory exceptions when TCP connection were established. Improved efficiency of TCP Stream handling on all platforms on both IceLink client and server sides;
  • Fixed a bug where SDP offers and answers were not displayed in JavaScript;
  • Eliminated duplicate ICE candidate logging that can cause confusion when diagnosing network connectivity issues;
  • Moved build version logging to the License static constructor so it's consistently logged one time regardless of how setting/checking license keys works;
  • Fixed a logical bug that prevented license key information from being logged;
  • Fixed issue with setting strides when scaling video;
  • Fixed bug where SDP could include an RTP map for Opus at something other than 48000/2;
  • WPF ImageSink will no longer check access using Application.Current.Dispatcher when an Image is passed into the constructor, and instead use Image.Dispatcher;
  • Fixed warning message (and possible memory corruption) when shutting down a DMO source;
  • Added lock to fix crash that could happen in a lossy network;
  • Fixed a bug that would cause +[NSThread runBlock:]: unrecognized selector sent to class;
  • Added additional error logging in core and media transports;
  • Fixed a bug in SRTP Context (responsible for encryption) where null reference exceptions could cause application crush and added more detailed error logging;
  • Fixed a potential collection modified enumeration exception in Ice.Gatherer that could occur if SocketManagers were modified while enumerating;
  • MediaStream.OnProcessControlFrame now fires when RTCP is generated from lower-level transports, providing access to SRControlFrames, RRControlFrames, and SdesControlFrames being sent;
  • Fixed a bug where peers in receive-only mode were sending SRControlFrames instead of RRControlFrames;
  • Fixed a bug where error responses from TURN servers were not properly parsed preventing TURN allocations from succeeding under certain conditions, which were particularly severe with TCP connections;
  • Fixed a bug where relay candidates discovered over TCP where assigned equivalent priorities to the relay candidates discovered over UDP, which was intermittently causing Ice transport to prefer TCP-based candidate pairs over UDP-based candidate pairs. UDP-based relay candidates now get higher priority than the TCP based ones.

Client SDK Breaking Change:

  • Removed Error(ErrorCode) constructor. Use Error(ErrorCode, Exception) instead.
  • ImageUtility.BitmapToBuffer will always produce 24-bit RGB output, regardless of whether the input was PixelFormat.Format24bppRgb or PixelFormat.Format32bppArgb. This allows for consistent behaviour when developing video sources and pipes that interact with third-party APIs that produce inconsistent output;
  • Updated WebRtcConnection to generate audio/video descriptions for every audio/video stream passed in, even if the stream has no source or sink (e.g. an SFU upstream with only a video track);
  • For .NET applications, libopus-0.dll and libyuv.dll are no longer required.

1.0.2.156 - September 15, 2017

New Server Features:

  • Clients are now able to update their meta-data - UserAlias, DeviceAlias, Tag - via the Client.Update(ClientConfig clientConfig) method;
  • Connections are now able to update their Tag as well as set Mute and Disabled flags via the Connection.Update(...) methods;
  • Added enhanced HTTP logging in LiveSwitch Gateway. The Gateway can now log all HTTP requests and related response codes.

New Client SDK Features:

  • Added support for Java clients along with an example app;
  • Added Voice Capture DMO Audio Source. This uses built-in Windows AEC to provide much higher quality echo cancellation. The examples have been updated to demonstrate its usage. View the guide on Migrating to DMO for more information;
  • Added OnStarted, OnStopped, and OnDestroyed events to MediaTrack;
  • Added OnAudioStarted, OnAudioStopped, OnVideoStarted, and OnVideoStopped events to LocalMedia. This is especially useful in Chrome when screen-sharing to capture the "Stop Sharing" button-click event;
  • Added OnAudioDestroyed and OnVideoDestroyed events to LocalMedia and RemoteMedia;

Client SDK Breaking Changes:

  • Fixed an issue where frames raised on different branches would conflict with each other. MediaTracks follow a depth-first frame-raise algorithm. Previously, each branch in a track could add frames that would be accessible by other branches in the track. Now each branch raises MediaFrames containing MediaBuffers ONLY from it's parent. If you have a custom media track and are concerned that this affects you, please email support@frozenmountain.com for more information.

Server Bug Fixes:

  • Fixed a bug where MCU audio mixing wasn't mixing in SFU participants when in hybrid (SFU+MCU) mode;
  • Fixed a bug where SDP offers and answers were not displayed in Javascript;
  • LiveSwitch Server Installer now only checks local machine for SSL certificates to avoid permission conflicts on older Windows operating systems;
  • Fixed a bug causing memory leaks and phantom threads, caused by a Scheduler instance, which would not stop when Connection instances transitioned into Closed and Failed states;

Client SDK Bug Fixes:

  • Disabled the recording indicator temporarily to avoid performance overhead of memory copies and unexpected data format changes;
  • Fixed a bug that causes a crash on iOS if the specified frame rate is out of the permitted range;
  • Fixed a bug where not all STUN server IP addresses obtained via DNS resolution were used to connect to STUN servers. Previously, only the first IP address was used to obtain server reflexive and relay candidates. This caused issues when both IPv6 and IPv4 addresses were sent in response to a DNS query;
  • Fixed a bug where crypto attributes were sent to another party on renegotiation when DTLS was already in use;
  • Fixed a bug where IceTransport would prematurely transition to the Disconnected state when it was still trying to establish original connectivity and had not yet timed out;
  • The active candidate pair now serializes independently of candidate pairs from gathered lists;
  • Fixed improper IPv6 address formatting in logs;
  • Fixed a bug in ICETransport, ensuring that duplicate Relay Candidates that are found are not deallocated;
  • Fixed an issue where frames raised on different branches would conflict with each other;
  • Fixed a minor bug in DataBuffer pooling where buffers were not invalidated properly;
  • Fixed an intermittent bug, where processing SDP Crypto attributes from remote descriptions could cause a crash;
  • Fixed a bug where media packets could be sent through the SRTP Transport when it was not in the Connected state;
  • Added a fallback to NAudio for the cases when Wasapi is not available;
  • Fixed a bug where the timestamp for RTP packets would roll-over at the signed integer boundary instead of the unsigned integar boundary, causing audio/video to freeze.

1.0.1.155 - August 11, 2017

Client SDK Breaking Changes:

  • A number of class members in Cocoa have been deprecated and will be removed in a subsequent release. For now, these deprecated members have been renamed. Full list of the members can be found here: http://docs.frozenmountain.com/icelink3/3.1.0-cocoa-api-changes.html

  • BlueTooth permissions are now required for Android. On some devices, audio is not routed to the proper output channel. In order to tackle this issue, logic has been added in AudioRecordSource to route the audio to the selected output channel - Speaker, Headphones, or BlueTooth Headset.

New Server Features:

  • Updated the Media Server to use the new HalfTrickle TrickleIcePolicy setting; previously, trickle ICE was disabled altogether. This allows the LiveSwitch Media Server to use trickle ICE with clients that support it and fall back to non-trickle ICE with those that do not.
  • The installer will now detect localhost installations and will, by default, blank out the fields that set the STUN server and public IP address for localhost installations.
  • Updated the Gateway messaging format so that a LiveSwitch Gateway can now reject "register" messages that are of a previous API version. This means that LiveSwitch server components must be upgraded before LiveSwitch clients.
  • Mute and un-mute actions are now communicated through the LiveSwitch Gateway. If a peer mutes their local audio or video, a notification is sent to other peers in the same channel.
  • Documentation is no longer bundled with the LiveSwitch distribution. Refer to https://docs.frozenmountain.com/ for documentation.

New Client SDK Features:

  • Added a cross-platform GetStats API, which allows accessing underlying statistical information for all types of connections (SFU, MCU and peer to peer). The API is available on all desktop and mobile platforms; including Chrome, Firefox, Safari and Internet Explorer.
  • Added AMD and CommonJS headers to the JavaScript SDK to support ReactJS and NodeJS module conventions.
  • Added support for scaling the resolution of images that pass through a LocalMediaTrack. Among other things, this can be used to downscale the resolution of a video stream prior to streaming it.
  • Added detection for new Safari APIs. We expect that Safari 11 will remove support for the legacy WebRTC APIs for its official release, so we are proactively guarding against this.
  • Exposed MediaStream.LocalMedia, MediaStream.RemoteMedia, MediaStream.LocalMedia and MediaStream.RemoteTrack. This means that you will no longer have to hold a reference to these objects in your application logic.
  • Merged Android audio enhancements from the examples into the core SDK for the AudioRecordSource class. This means that you no longer need to implement these enhancements yourself in application logic.
  • On native platforms, MaxInputBitrate now only takes RemoteBandwidth into account when restricting encoder bitrates. This simplifies the LiveSwitch API and better matches how web browsers are handling LocalBandwidth and RemoteBandwidth properties.
  • Updated the AudioProcessing library to be able to use sample rates above 16kHz.

Server Bug Fixes:

  • The in-memory data store now properly adds and removed registrations.
  • Exceptions that occur during startup are now properly logged and the service will exit gracefully.
  • Fixed a crash that could occur when an exception is thrown, while a client disconnects ungracefully while writing to a stream.
  • Fixed a bug for Android where the local preview was pushed behind remote video after rotation of the device.
  • Fixed a bug where, after enabling recording in the Media Server configuration, running a session between two endpoints did not record the session.
  • Fixed a bug where bandwidth was not being restricted in the SDP answer of a Media Server in SFU-mode.
  • Fixed a bug in the base64 decoder where tokens with stripped-padding could not be decoded properly.
  • Fixed a bug where, for 4-way peer-to-peer connections, each endpoint showed a duplicate layout for one of the peers.

Client SDK Bug Fixes:

  • Fixed a bug in iOS, where if VideoToolbox was enabled at the same time as VPX, an exception was thrown.
  • Fixed a race condition that could occur by refactoring internal logic in the LogProvider class.
  • Added minifyEnabled=false to the Android examples to demonstrate how to work around a ProGuard issue. During the signing of release builds, the Java API could obfuscate native code, causing codecs and real-time processing libs to thrown an exception.
  • Fixed a memory leak that could occur during the ICE discovery process.
  • Fixed a bug where LiveSwitch would not attempt to bind sockets to alternative ports when a bind operation failed due to WSAEACCES 10013. Previously, binding to the alternative ports proceeded only if WSAEADDRINUSE 10048 was encountered.
  • Fixed a bug in Chrome 59 where, if the camera's requested framerate didn't match the device's capabilities, a constraint error would be thrown.
  • Resolved several issues in Android due to various hardware limitations. Many of these issues had work-arounds that were demonstrated in the examples - these are now incorporated into the core. Some notable issues were: low-playing volume, helicopter noise, unable to stream audio.
  • Fixed a bug in the web examples where the Leave button could not be clicked when the Screen Capture option was selected in Chrome, but the user declined to install the extension.
  • Fixed a bug on Android 4.2.2 where Opus would set its bitrate multiple times when bitrate changes occurred.
  • Fixed a bug where setting the Gain property on a LocalMedia instance did not adjust the audio volume.
  • Fixed an issue where the OpenH264 libraries provided by Cisco could no longer be downloaded, due to a missing Content-Type header.
  • Fixed a bug where Opus was transmitting DTX (muted audio) on some Android Nexus devices.
  • Fixed a bug that would cause audio transmission on iOS devices to stop if the audio source was changed while streaming.

1.0.0.151 - July 25, 2017

  • Hotfix to resolve an issue where participants in SFU and P2P mode were not being cleared from the backing cache provider causing a Channel to accumulate dangling participants over time.

1.0.0.150 - July 6, 2017

  • Initial release.