Release Notes

1.2.4.2770 - December 7, 2018

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.