Release Notes

3.2.2.624 - May 23, 2018

Bug Fixes

  • Fixed a regression in 3.2.2.607 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 access error or invalid certificate error (IL-2303);

3.2.2.616 - May 17, 2018

Bug Fixes

3.2.2.616 - May 11, 2018

Bug Fixes:

TURNS:

  • Fixed a bug in the TURNS example and API where a self-signed certificate was needlessly required by the server's Start method. This self-signed certificate was not used for anything as TURNS requires a proper certificate signed via certificate authority, it simply resulted in a confusing log message: "Generating self-signed TLS certificate" (IL-2258);

Data Channels:

  • Fixed an issue that was causing DataChannels to stop delivering packets at 20% or higher packet loss from the NET, Cocoa and Java-based platforms - Javascripts-based platforms (except for ActiveX) were not affected, Under certain conditions packets were stopped delivering under smaller packet loss (IL-2274);

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:

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

3.2.2.607 - May 7, 2018

New Features:

Logging:

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

Bug Fixes:

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);

Data Streams:

  • Fixed a bug where SCTP-based DataChannels in iOS and macOS were crashing with [__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 0] exception on packet loss (IL-2208);
  • Fixed a bug where DataChannel synchronisation may have resulted in deadlocks under adverse circumstances (e.g. requesting to close a connection that was in process of opening a data channel) (IL-2237);

  • Fixed a bug where DataChannel.Id was not available when accessing this property via ActiveX plugin (IL-2237);

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);

  • 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);

  • Fixed a bug where UWP audio to other platforms (except for browsers) was broken (IL-2227);

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);

Xamarin Examples:

  • 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);

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);

Other:

  • 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);

3.2.2.567 - April 13, 2018

Breaking Changes:

  • 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);

New Features:

JavaScript:

  • 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);

Linux:

  • 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);

Cocoa:

  • Cocoa NS_ENUM values are now properly displayed in the web API reference (IL-1665);

Socket Managers, Gatherers and ICE Transport:

  • Added UdpSocket/TcpSocket.OnSocketCreated for .NET (IL-2091);

Signalling:

  • Exposed Connection.TieBreaker setter (IL-2186);

Data Streams:

  • Fixed a bug in SCTP-based Data Channels where, under adverse race conditions, selective acknowledgement processing was delayed so that messages were reported to be delivered only after new messages were added to the outgoing queue (IL-1983);
  • Improved efficiency of SCTP outgoing and incoming data queue selective acknowledgement generation and processing increasing data throughput (IL-421);
  • Eliminated the requirement to limit data messages sent over SCTP-based reliable data channels to 16 KB (IL-421);

Media Streams:

  • 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);

Examples:

  • Added "localView" identifier to local view and "remoteView_{id}" identifier to remote view for iOS, macOS, Java, Android, and TypeScript examples (IL-2189);
  • The examples have been updated to use WebSync version 4.9.32. This version features improvements to the underlying HTTP client (IL-1967, IL-2190);

Bug Fixes:

WPF:

  • 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);

Media Streams:

  • Enabled AEC in java example (IL-1209);
  • 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 remote audio and video were not rendered when stream direction was receive-only when used in IE ActiveX plugin (IL-1252);
  • 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);
  • DTMF tones now send the proper timestamp to remote peers (IL-2109);
  • Received DTMF tones now properly update when the duration is extended (IL-2109);
  • Added SuppressUnmanagedCodeSecurity attribute to native p/invoke classes to reduce overhead when calling from managed code into unmanaged code (LS-336);

Socket Managers, Gatherers and ICE Transport:

  • Improved logging when an ICE or DTLS transport fails by including error information in the output (LS-1178);
  • Fixed a memory leaks in Java TURN server related to UDP allocations (IL-2118) and a memory and thread leak in Java and NET TURN servers (IL-2169);
  • Fixed a bug where scheduled tasks were dispatched on the scheduler thread potentially slowing down execution of batched tasks (IL-2158);

Signalling:

  • Fixed a bug where FM.IceLink.WebSync4.JoinConferenceArgs.OnRemoteClient was called, prompting application code for a new Connection even if that Connection was later abandoned because a connection already existed for that remote user. This, under some circumstances, was causing multiple connections to be created per remote user ID triggering infinite reconnection attempts (IL-2186);

Examples:

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

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

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

  • Remove extra line of code in the iOS-Swift example (copy-pasta);

3.2.1.472 - March 23, 2018

Bug Fixes:

Media Streams:

  • Fixed a bug in 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 thus preventing remote video from freezing (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);
  • 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);

Other:

  • 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);

3.2.1.456 - March 7, 2018

Breaking Changes:

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

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);

Connection:

  • Added Connection.Audio/Video/DataStream(s) convenience properties (LS-336);
  • Added ConnectionStats.Audio/VideoStream(s) convenience properties (LS-336);
  • Added Connection.HasAudio/Video/Data convenience properties (LS-336);
  • Added SessionDescription.HasAudio/Video/Data convenience properties (LS-336);
  • Added Sdp.Message.Audio/Video/Application/Text/MessageDescription(s) convenience properties (LS-336);
  • Added Sdp.MediaDescription.IsAudio/Video/Application/Text/Message convenience properties (LS-336);
  • Added new NullAudio/VideoSink constructor overloads to make usage easier (LS-336);

Media Streams:

  • 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);

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);

Examples:

  • Fixed a bug in the IceLink Android example where keyboard was popping up while starting video activity and also on changing orientation (landscape/portrait) (IL-1839);

Media Streams:

  • Catch and logs 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);

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);

Signalling:

  • Fixed a bug in JavaScript where one client was going into renegotiation loop if other client closes the browser window. Now it's leaving immediately (IL-1758);
  • Fixed a race condition in WebSync4.ClientExtensions that was resulting in multiple connections being opened when connectivity with a peer was failing and reconnection was being attempted. this problem happened in the very low latency scenarios (IL-2081);

Others:

  • Fixed a bug causing the long overflow that occurred in the ManagedStopwatch. Overflow will now occur after humanity is dead (LS-1086);

3.2.0.443 - March 2, 2018

Bug Fixes:

  • 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);
  • Fixed a bug where connection.getStats() would result in a NULL REF exception in some cases (IL-2061);

  • CocoaOpenGLView has improved initialization for handling the app starting when backgrounded (for example when using CallKit);
  • Fixed a bug in the RTP Packet Header serialisation (LS-1069).

3.2.0.431- February 21, 2018

Bug Fixes:

  • 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).

3.2.0.419 - February 14, 2018

Breaking Changes:

  • Populating CandidatePairStats.CurrentRoundTripTime and CandidatePairStats.TotalRoundTripTime as per https://www.w3.org/TR/webrtc-stats/#candidatepair-dict*specification (CandidatePairStats.CurrentRoundTripTime is now instantaneous rather than smoothed round trip time). Both properties were preiviously integers now they are floats;
  • 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;
  • For all IceLink 3 example applications, the default signalling channel has been changed from "/auto-signalling/{channelId}" to "/{channelId}". This is to facilitate interop between IceLink 3 examples and IceLink 2 examples, but as a side-effect this affects interop between the example applications for the IceLink 3 releases prior to IceLink 3.2.0;

    With the above signalling change, in order for IceLink 3.2.0 to interop with version 3.0.x and 3.1.x, the prefix "/auto-signalling/" needs to be either removed from the 3.0 and 3.1 examples or added to the 3.2 examples. The benefit of this change is IceLink 2 and IceLink 3 examples now interop out of the box. Note that this is not a breaking change in the product, it is just a change in the example code and demos. IceLink 3.2 series still interops with older versions so no changes are required to customer code for signalling considerations.

  • 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;
  • Removed the ImageScaler abstract method from the RtcLocalMedia object since it is no longer used. Updated all examples to match (IL-1916).

New Features:

Socket Manager, Gatherers and ICE Transport:

  • Exposed Connection.OnIceConnectionStateChange and Connection.IceConnectionState;
  • Exposed CandidatePairStats.RequestsSent, CandidatePairStats.ResponsesReceieved, CandidatePairStats.ConsentRequestsSent, CandidatePairStats.ConsentReponsesReceived, CandidatePairStats.ConsentRequestsReceived, CandidatePairStats.ConsentResponsesSent;
  • 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 UWP and 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 static RsaCrypto.DefaultKeySize property to allow overriding the default key size (1024) for all generated keys;
  • Added RsaCrypto.CreateRsaKey overload that accepts a key size parameter;
  • Added TlsCertificate and TlsFingerprint;
  • 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);
  • Added TcpSocket.Certificate in .NET to allow certificate binding for TURNS. Expects an X509Certificate2 loaded from the local machine (IL-1979);

Signalling:

  • 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;

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;
  • Exposing MediaComponentStats.SliCount;
  • 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;
  • Updated AudioFrame.Duration so it is automatically calculated when a PCM buffer is added;
  • Exposed Dmo.Utility.IsSupported;
  • Exposed Dmo.Utility.Disabled making it easy to disable the DMOs at runtime;
  • Exposed CodecStats.CodecType as defined in https://w3c.github.io/webrtc-stats
OpenH264:
    • Added OpenH264 support for UWP (note that download at run-time is not supported, so MPEG LA patent royalties will apply if used);
    • Upgraded OpenH264 library to version 1.7.0;
    • Created DownloadOpenH264 method in the OpenH264.Utility class so IceLink 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);

STUN and TURN servers:

  • Updated Java and .NET Server examples to demonstrate TLS on 443/5349;
  • Added support for TURNS in server stack (.NET and Java only);

UWP:

  • For UWP, added the ability to change MediaCaptureVideoSource's CaptureElement.Stretch property, so that LocalMedia's VideoSource function can set the property programmatically;

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);

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);

  • ActiveX installer executable is now signed - previously only the cab itself was signed (IL-1997);
  • Added support for SharpDX-based GPU video rendering in .NET 4.0+ WinForms apps. Simply return a SharpDX.WinForms.Sink in CreateViewSink.

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, Xamarin, and UWP (IL-1904);
  • Fixed a bug where a number of TCP connection failures could cause the TURN server to stop responding (IL-1979);
  • 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);
  • Addressed an issue where UWP cannot render one channel audio by upscaling to stereo before playback (IL-1965);

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);

Signalling:

  • 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);

Miscellaneous:

  • Fixed a bug where thread suspension for less than 50 ms led to longer thread suspension then expected resulting in imprecise event scheduling;
  • Fix error loading libyuvfm.so on Android x86 devices (IL-2038);
  • 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 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);
  • Fixed a bug in the .NET LayoutManager example where a missing System.Drawing namespace in a reference to the Color object in VideoChat.cs was causing the example not to build (IL-2025).

3.1.4.370 - January 18, 2018

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 that caused inability of UWP on Desktop to reset the video profile.

3.1.4.350 - January 3, 2018

Bug Fix:

  • Fixed a race condition in iOS/macOS that can cause a crash when an object is deallocated while an event is being raised. This was reproducible on some iOS devices on relatively rare occasions when a connection close was called while the connection was still initializing (elrjweklrj).

3.1.4.334 - December 19, 2017

New Features:

  • 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 VideoEncoder;
  • 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;
  • Implemented Xamarin.Forms iOS screen-share;
  • Xamarin.Forms Android screen-share frame rate changed from 1 to 3 fps;
  • 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;
  • Performance: fixed bug in UWP MediaCaptureVideoSource DataBuffer pool usage causing excessive memory allocations.
  • Performance: updated UWP MediaCaptureVideoSource to use NV12.
  • Performance: updated UWP Win2D Sink to discard frames if overloaded.
  • Performance: updated UWP Win2D Sink to re-use bitmap allocations.
  • Performance: updated UWP audio playback on desktop to use NAudio WASAPI.
  • Fixed layout bug in UWP video preview so image fills available space while maintaining aspect ratio and without cropping.
  • Fixed bug in UWP NAudio Source preventing mono-channel audio capture.
  • Added Matroska.AudioSource and Matroska.VideoSource;
  • Added support for VP9 to Matroska.VideoRecorder;
  • Added LocalMatroskaMedia to IceLink example (big-buck-bunny);
  • Updated UWP MediaCaptureVideoSource to check device profiles if available for closest video configuration to what was requested.
  • Updated UWP MediaCaptureVideoSource to more closely adhere to requested frame rate.
  • Updated UWP example to pause/resume local video when minimizing/restoring. Fixes bug where minimizing the app would cause local video to freeze and never recover.
  • Updated UWP example to bypass echo cancellation on Hololens.
  • Updated UWP example AecContext to use correct AEC tail length.
  • Updated UWP ImageUtility to allow NV12 and ABGR formats when converting to and from video buffers.
  • Added NullAudioSink and NullVideoSink.
  • Updated UWP example so virtual keyboard can be dismissed using Enter. Improves UX on Windows Phone as well as Xbox.
  • Updated UWP example to support Xbox as much as it can currently without Kinect (video is receive-only, audio is disabled until NAudio can be fixed).
  • Modified the UWP example so that AecContext.CreateOutputMixerSink is now using NAudio instead of AudioGraph;
  • Modified the UWP example so that AecContext.CreateProcessor is now using an automatic tail length;
  • Modified the UWP example so that AecContext.CreateAudioSource is now initializing with the AEC config instead of the default Opus config;
  • Modified the UWP example so that the AecContext instance is now created based on the CPU architecture, not device form factor;
  • Modified the UWP example to exclude the FM.IceLink.AudioProcessing library for ARM platforms;
  • Modified the UWP example to remove the LoadPackagedLibrary and LoadLibrary extern definitions;

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;

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;
  • Excluded the SetDllDirectory method from the UWP native library wrappers to allow UWP libraries to be used in Windows Store apps;
  • 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 and UWP camera capture;
  • Fixed a bug in Xamarin Forms Android which was failing to compile with the error ScreenSource could not be found;
  • 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 bug where UWP would letterbox (add black bars to) the video stream in some cases. This also improves video capturing performance at lower resolutions;
  • 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;
  • Fixed a bug in Xamarin Android example where local video was mistakenly paused when the app was screen sharing;
  • 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;

  • Fixed a bug in the examples that could cause WebSync client reconnection to fail when network connectivity was lost.

3.1.3.309 - December 7, 2017

Bug Fixes:

  • Google Chrome v63 dropped support for negotiating SDES/DTLS cryptos, so stripped incoming offers of SDES cryptos if DTLS fingerprints are also present, fixing interop between Chrome and other browsers/platforms;

3.1.3.267 - November 27, 2017

Bug Fixes:

  • Fixed a bug where ActiveX in Internet Explorer was showing black screen due to installation failure;
  • Fixed a bug in UWP due to an old NAudio.Universal.dll reference. Updated the binaries and references so that the examples build properly;
  • Fixed a bug in the OpenH264 wrapper causing an access violation when targeting x86 architectures in .NET;

3.1.3.231 - November 10, 2017

New Features:

  • Added support for SSL load balancer termination in HTTPS redirect for the Web example;
  • Exposed Connection.CreateStreamSocket and Connection.CreateDatagramSocket functions that allow implementations to modify socket factories for Ice.Gatherer;
  • Exposed Stream.LocalSend and Stream.LocalReceive flags indicating whether local peer supports sending and receiving media on a given stream and updated examples accordingly;
  • Exposed Stream.RemoteSend and Stream.RemoteReceive flags indicating whether local peer supports sending and receiving media on a given stream;
  • Exposed Stream.RemoteDirection getter indicating stream direction reported by the remote peer;
  • Exposed Stream.UseDtls setter setting a value indicating whether DTLS encryption is in use on the stream;
  • Exposed RenderDevice property on the VoiceCaptureDMO;
  • Defaulted to the front camera in web on mobile;
  • Changed Xirsys Extension to use the 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 new cross-platform video 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-platform VideoBuffer.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 active audio track converter
    • ActiveAudioEncoder, the active audio track encoder
    • ActiveAudioPacketizer, the active audio track packetizer
    • ActiveVideoConverter, the active video track converter
    • ActiveVideoEncoder, the active video track encoder
    • ActiveVideoPacketizer, the active video track packetizer;
  • Added new RemoteMedia properties:
    • OpusDepacketizer, the depacketizer for Opus
    • OpusConverter, the converter for Opus
    • PcmuDepacketizer, the depacketizer for PCMU
    • PcmuConverter, the converter for PCMU
    • PcmaDepacketizer, the depacketizer for PCMA
    • PcmaConverter, the converter for PCMA
    • Vp8Depacketizer, the depacketizer for VP8
    • Vp8Converter, the converter for VP8
    • Vp9Depacketizer, the depacketizer for VP9
    • Vp9Converter, the converter for VP9
    • H264Depacketizer, the depacketizer for H.264
    • H264Converter, the converter for H.264
    • ActiveAudioDepacketizer, the active audio track depacketizer
    • ActiveAudioDecoder, the active audio track decoder
    • ActiveAudioConverter, the active audio track converter
    • ActiveVideoDepacketizer, the active video track depacketizer
    • ActiveVideoDecoder, the active video track decoder
    • ActiveVideoConverter, the active video 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 active video track converter changes
    • OnActiveVideoEncoderChange, raised when the active video track encoder changes
    • OnActiveVideoPacketizerChange, raised when the active video track packetizer 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 active video track depacketizer changes
    • OnActiveVideoDecoderChange, raised when the active video track decoder 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;

Bug Fixes:

  • 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 connections with non-WebRTC compliant peers (Safari 11, Edge 38, etc);

  • Fixed a bug causing connectivity to fail during longevity tests on Android; 
  • Defaulted to the front camera in web on mobile;
  • There were a couple reports of echo cancellation failing (as in not working at all) in the ActiveX control since updating it to use DMO. This was resolved by setting default values for the DMO processor;
  • 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 a bug in TurnServer when bypass is enabled but one side prefers to use channel-data over send indications. This affects Chrome-to-IceLink connections in relay/relay mode using the same TURN server;
  • 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 TurnServer pass-through when a relay-to-relay connection between Chrome and IceLink uses the same TURN server;
  • Fixed a bug in iOS where UI 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 where timestamp reset logging would repeat ad nauseous;
  • Fixed a bug in the Android and Xamarin.Android examples where local/remote recording targeted the wrong path;
  • Fixed a bug where Stream.EncryptionPolicy was not respected for SDES encryption negotiation;
  • Fixed a bug, where updates to Stream.LocalDescription were not checked against direction capabilities of that stream allowing to declare stream directions incompatible with the source and sink setup (e.g. to declare send-receive local direction for the cases when no media sources were present);
  • Fixed a bug in Java where releasing the SoundSource could block and prevent proper shut down of local media.

3.1.2.223 - October 26, 2017

Bug Fixes:

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

3.1.2.198 - October 18, 2017

Bug Fixes:

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

3.1.2.187 - October 12, 2017

Bug Fixes:

  • The rebuild of libopusfm.dll and libyuvfm.dll for 3.1.2.157 accidentally added a dependency on the Visual C++ Redistributable. This has been fixed;
  • 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.

3.1.2.157 - October 4, 2017

New Features:

  • 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`);
  • Upgraded JavaScript libraries to TypeScript 2.

Bug Fixes:

  • Fixed a bug where the Java-based TURN relay server was throwing intermittent 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 a potential memory leak in the examples via unregistering events when leaving session to prevent events firing too many times;
  • 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;
  • Fixed a bug where in the Web example, if pressing the Enter key instead of clicking the join button, the example would open a tab to install the Chrome extension;
  • WPF ImageSink will no longer check access using Application.Current.Dispatcher when an Image is passed into the constructor, and instead use Image.Dispatcher;
  • Fix 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;
  • Added internet permission in Xamarin.Android example to resolve name resolution error for release build.

  • Channel count in AecContext should be set to 2 in Xamarin.Android example to resolve helicopter noise on some devices

  • Fixed a race condition in Xamarin.Android example. In StartLocalMedia layoutManager was being invoked from background thread instead of UI thread which would cause a crash on slower devices;

  • 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;
  • Removed redundant listeners from Xamarin.Android example as Bluetooth and headphone connection detection now happens in the AudioRecordSource.

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;
  • For UWP applications, FM.IceLink.Uwp.NAudio.dll has been renamed to FM.IceLink.NAudio.dll for consistency with naming conventions for other client platforms.
  • For .NET applications, libopus-0.dll and libyuv.dll are no longer required.
  • For Xamarin.Android (including Forms) applications, libopus.dll is no longer required.

3.1.1.132 - 2017-09-20

Bug Fixes:

  • Fixed a bug where iOS Safari would display WebRTC/HTML5 video in full-screen mode instead of inline in the page;
  • Fixed a bug where remote video doesn't render in the latest version of Safari 11 on iPhone;
  • Xamarin.Android libs shipped in Libraries folder were JNI instead of non-JNI libs;
  • Xamarin.Forms.iOS libs in Examples folder were not updated from 3.1.0.121; 
  • Fixed a bug where FileStream.Open crashed if attempting to write to a file without a directory prefix (filename-only instead of absolute path) which caused a crash when toggling recording in the .NET example;
  • Fixed a regression where 32bit iOS devices were crashing by adding 32-bit support to AtomicLong for iOS/macOS. Also fixed the return value of CompareAndSwap for AtomicLong/Integer.

3.1.1.124 - 2017-09-07

New Features:

  • 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 DMOfor 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;

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.

Known Issues:

  • The Java-based TURN relay server currently has a bug causing intermittent Out-of-Memory exceptions when TCP connection are established. The issues has been addressed and will be fixed in the upcoming 3.1.2 release of IceLink.

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;
  • Fixes a bug in the Android Chat.WebSync4 example that would cause a crash if the back button was pressed before the local media had started;
  • 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 in the Android Chat.WebSync4 example where, after rotation, long pressing the video to get to the context menu caused a crash;
  • Fixed a race condition in the iOS and macOS Chat.WebSync4 examples that could occur if startLocalMedia was called immediately after stopLocalMedia;
  • 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;
  • 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;
  • Android and Android for Xamarin now use the In-Call volume control instead of the Media volume control now;
  • Improved the audio quality on Android for Xamarin. Mic or Voice_Communication mode will be dynamically selected for better performance;
  • Fixed a bug in Android Xamarin echo cancellation;
  • 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 double-tapping to switch cameras in Android caused 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;
  • Fixed a race condition in the UWP Chat.WebSync4 example that occurred when stopping local media;
  • Fixed a potential thread deadlock that could occur in the UWP AudioGraphSink class on shutdown;
  • Fixed a memory leak in the UWP Chat.WebSync4 example which occurred because audio and video InputAvailable events were never removed from the Application instance;
  • Fixed a bug in the UWP Chat.WebSync4 example where the user could click the leave button, tearing down the conference and local media before it had been started, which could cause COM errors.

3.1.0.121 - 2017-08-10

New Features:

  • Added a GetStats() API to Connection and all subcomponents, allowing access to underlying statistical information. Available on all desktop and mobile platforms; including Chrome, Firefox, Safari and Internet Explorer web browsers;
  • Added AMD and CommonJS headers to the JavaScript SDK to support ReactJS and Node.js module naming;
  • Exposed FM.IceLink.TrickleIcePolicy.HalfTrickle, which indicates that Trickle ICE will only be used when a client is in answering role and the peer has indicated that it supportes Trickle-Ice. This feature speeds up connectivity in the cases when support for Trickle Ice cannot be verified prior to the call establishment and, therefore, is preferred to TrickleIcePolicy.NotSupported. Continue to use TrickleIcePolicy.FullTrickle for the connections where Trickle Ice is known to be supported prior to the call establishment;
  • Exposed Stream.SdesPolicy which indicates whether SDES Crypto attributes should be sent in session descriptions associated with compatible streams (i.e. only for the Audio and Video streams). If communicating with legacy Chrome versions (i.e. Chrome 58), sending crypto attributes in the offer may cause crashes. Stream.SdesPolicy should be set to Disabled if communicating with Chrome 58;
  • Added support for scaling resolution of images passing through a LocalMediaTrack. This is useful, for example, where downscaling video resolution before streaming is helpful;
  • Added fullscreen mode to the Web Examples. You can now hover over video and click to expand;
  • Added detection for new Safari APIs. It is quite likely that Safari 11 will remove support for the legacy WebRTC API for its official release;
  • Exposed MediaStream.Local/RemoteMedia and Local/RemoteTrack to remove the need to maintain mappings of remote medias in application logic;
  • Merged down Android audio enhancements from the examples into AudioRecordSource so it no longer needs to be maintained in application logic;
  • On native platforms, MaxInputBitrate now only takes RemoteBandwidth into account when restricting Encoder bitrates. This is in an effort to match to unify the API and match how web browsers are handling Local/RemoteBandwidth properties;
  • Updated the AudioProcessing library to be able to use any arbitrary sample rate.

Breaking Changes:

  • A number of class members in Cocoa have been deprecated and will be removed in the subsequent releases. 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 permission 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.

Known Issues:

  • Xamarin.Android audio quality is still experiencing several edge-case issues on select manufacturer/OS version combinations. The Samsung Galaxy Tab A, would experience a "helicopter noise"; some Google Nexus devices running Android 5.1 or 6.1.1 would have low audio volume; and the same Google Nexus devices would stream muted (DTX) audio streams from Opus. The Opus issue is resolved in Xamarin.Android for this release; however the above issues that were addressed for the various Android devices (noted in the Bug Fixes below), have not been ported to Xamarin.Android yet. Those changes  will be in place for 3.1.1 coming out the first week of September.

Bug Fixes:

  • Resolved several issues in Android due to various hardware limitations. Some of these work-arounds already existed in the examples, but merged them all down to AudioRecordSource to simplify maintenance. Some notable device issues were that some Android devices played low-volume, others had a sound like helicopter noise, some couldn't stream audio due to various device driver and manufacturer inconsistencies. These work-arounds will be ported to Xamarin.Android in the next release;Fixed a regression in 3.0.14.119, where SCTP Cookie could not be authenticated preventing connections with DataStreams from being established;
  • Fixed a bug where the Xamarin Example crashed when long pressing on the screen to get a context menu;
  • Fixed a bug in iOS where if VideoToolbox was enabled at the same time as VPX an exception was thrown;
  • Fixed a bug causing a race condition by refactoring public lists to arrays in LogProvider;
  • Added minifyEnabled=false to the Android examples to demonstrate how to work around a Progaurd issue: during the signing of release builds the Java API could obfuscate native code, causing codecs and real-time processing libs to throw an exception;
  • Fixed a bug causing memory leak with CandidatePair objects during the ICE discovery process;
  • Fixed a bug where Icelink did not attempt binding sockets to alternative ports when a bind operation failed due to the WSAEACCES 10013 error. Previously, binding to the alternative ports proceeded only if WSAEADDRINUSE 10048 was encountered. Socket implementations in Cocoa and Java continue operating as expected;
  • Fixed a bug in TCP socket in Java, where TCP socket in server mode was not properly shut down under certain conditions, which resulted in 100% CPU load on Java-based relay servers in unnecessary threads;
  • Fixed a bug where in Chrome 59, if the camera framerate requested didn't match the actual device's capabilities, Chrome 59 would throw a constraint error;
  • Xamarin.Android Screenshare source was throwing an NV21 format not supported error causing Screeshare not to work;
  • Fixed a bug in the Web examples where the Leave button could not be clicked when Screen Capture was selected in Chrome, but the extension was chosen not to be installed by the end user;
  • Fixed a bug where, on Android 4.4.2, Opus was setting it’s bitrate multiple times when bitrate changes occurred;
  • Fixed a bug where setting Gain on LocalMedia was not adjusting audio volume;
  • Worked around an issue where OpenH264 could not be downloaded. Cisco changed their servers so that the Content-Type is no longer set. This meant we were no longer detecting the bzip2 content type and uncompress. We’re now checking the file extension to decompress the download;
  • Fixed a bug in Android and Xamarin.Android where Opus was transmitting DTX (muted audio) on some Android Nexus devices;
  • Fixed a bug causing stop of audio transmission on iOS when audio source was changed while streaming;
  • Fixed a bug in iOS which caused crash if multiple video codecs were enabled.

3.0.14.119 - 2017-07-07

New Features:

  • Exposed Stream.OnDirectionChange event that is raised when a change in stream direction has occurred (e.g. as a result of the direction renegotiation);
  • Exposed FM.IceLink.IcePolicy.Negotiated, which indicates that ICE connectivity checks will be conducted only if supported by the other party;
  • Exposed FM.IceLink.Sdp.MediaDescription.SupportsIce indicating whether the SDP Media Description suggests support for Ice (by evaluating whether it contains Ice Ufrag and Ice Password SDP attributes);
  • Added additional logging for UdpSocket in .NET indicating reasons for the failure to bind UdpSockets to specific addresses.

Breaking Changes:

  • Modified the names of the following enums without affecting their functionality: FM.IceLink.EncryptionPolicy.Preferred to FM.IceLink.EncryptionPolicy.Negotiated, FM.IceLink.MultiplexPolicy.Negotiate to FM.IceLink.MultiplexPolicy.Negotiated, FM.IceLink.MultiplexPolicy.Require to FM.IceLink.MultiplexPolicy.Required;

Bug Fixes:

  • Fixed a bug where SDP processing was crashing when a media stream did not contain any payload types;
  • Switched back to the SAVPF profile from SAVP profile for the Audio streams;
  • SSRC is no longer verified for the media streams where no synchronization sources were reported in the media components of the remote SDP messages;
  • RTP/RTCP multiplexing support is now assumed if no RTCP attribute appears in the remote SDP message;
  • Fixed a bug where Active Candidate Pair was not set when connectivity was re-established on the existing connections, causing "video-freezing";
  • An excess of PLC packets were generated by PCMU/PCMA on first frame in the receiver. No more;
  • SoundConverter was not re-calculating timestamps if the clock rate changed, resulting in bad audio playback at the receiver. It is re-calculating now as needed;
  • MediaRecorder (Matroska, Ogg, and Ivf) starts its timestamp at 0 now, avoiding extra calculation effort in post-processing;
  • Fixed a bug preventing establishing TCP relay sessions over Java-based TURN servers;
  • Fixed a bug in internal string processing in Cocoa, where third party Category extensions to NSString could overwrite method indexOf preventing proper string processing.

3.0.13.116 - 2017-06-28

Bug Fixes:

  • Fixed a bug where when StreamDirection was set to SendOnly, Audio/Video was not being transmitted;
  • Fixed a bug where if network connectivity was lossed for 2-10 seconds, Audio/Video/Data were not being transmitted when connectivity was re-established on prior or new active candidate pairs;
  • Fixed an issue hindering TCP connectivity over relay connections on Java and .NET platforms.

3.0.13.107 - 2017-06-26

New Features:

  • Added plugin-free Safari support for iOS 11 and Safari 11 (preview 32+);
  • MediaStream now waits for Rtp.Transport to start before setting it's InputFormats to ensure the first keyframe is not being thrown out at the transport layer, speeding up time-to-first-frame and apparent connection startup time significantly;
  • Well-known media format descriptions (RTP payload types) reported in the media lines (m-lines) of SDP messages are now parsed in the cases when RTP Map attributes containing these payload types are not present. Required for the interop with the legacy systems;
  • Candidates reported in the media and connection (i.e. m and c) lines of SDP messages are now parsed if these candidates are not reported separately in the SDP message. Required for the interop with the legacy systems;
  • Exposed Connection.IcePolicy indicating whether ICE connectivity checks are required;
  • Exposed FMIceLinkCocoaAVCaptureSource.videoConfig getter and setter;
  • Demonstrated custom signalling via ManualSignalling object in Examples on all platforms;
  • Removed DataChannels from Examples so that all platforms can interop with the Edge browser by default;
  • Exposed Stream.EncryptionPolicy indicating whether encryption is required, preferred or disabled on a given stream;
  • Exposed VideoCaptureDevice in AForge.CameraSource;
  • Connection state transitions are now logged as Info-level messages;
  • RTP Media Transport Profiles are now appropriately set in the SDP messages indicating whether encryption and feedback (e.g. NACK PLI) is used;
  • Exposed Stream.OnDirectionChange event that is raised when a change in stream direction has occurred (e.g. as a result of the direction renegotiation);
  • Reduced compile time warnings in iOS and macOS examples;
  • Added AecContext to ActiveX API.

Bug Fixes:

  • Fixed a bug, where messages transmitted over ReliableData Transport were not properly buffered prior to ReliableTransport transitioning to the Opening and Open states resulting in Connection shutting down when messages were being sent in New state, just prior to the transport being open;
  • Fixed a bug where under certain conditions switching active candidate pair that just lost connectivity led to reset of encryption transports leading to the eventual overall loss of connectivity;
  • Fixed a couple possible null-ref exceptions in RTCP Transport;
  • Fixed a bug in IPv6 where private IPs were paired with public;
  • Resolved IPv6 exceptions when ICE tries to gather candidates for special purpose (reserved) IPv6 addresses;
  • Added a fix preventing runtime exception when loading icelink.js and plugin.install was not called;
  • Special purpose IPv6 addresses were not being ignored causing exceptions when attempting to create candidate pairs with valid IPv6 addresses;
  • Resolved a NullPointerException with no exception message in ReliableChannel when attempting to sendDataBytes on a connection that is not yet connected;
  • Added null check to WebRtcConnection to avoid exception thrown when local has no tracks and remote peer joins with tracks;
  • Ensured that media format descriptions (RTP payload types names) are compared case-insensitively to ensure compativbility with Google Chrome;
  • Eliminated a race condition under which Connections could transition from Failing and Failed states to Closing and Closed states on all platforms. Failed and Closed states are terminal and no transitions from these states are possible;
  • Eliminated potential null reference exception in FM.IceLink.WebSync4.ClientExtensions in the cases when connection fails due to a locked camera;
  • Fixed iterators in TypeScript/JavaScript in audio/video mandatory constraints to resolve issue in WebRtcLocalMedia;
  • Resolved issue in WPF LayoutScale.Cover behaviour by using Grid to allow dynamic adjustment resolving issue in WPF where remote media was not being centered after canvas size changes;
  • Removing support for h.264 SingleNAL packetization mode till it can be supported properly on all platforms (VideoToolbox doesn't support fragmented NALs on iOS hardware and can not decode frames);
  • Removed CodecDelay from Matroska.AudioRecorder fixing recorder sync / delays;
  • Fixed IndexOutOfRangeException when AudioSources is empty;
  • DebugLogProvider writes to System.Diagnostics.Debug again;
  • Resolved null reference exception when calling RemoteMedia.ToggleAudioRecording if video is disabled.

3.0.12.100 - 2017-05-22

New Features:

  • Added new event listeners in Websync4 ClientExtensions to ensure that reconnections on transitions from cellular internet services (3G and LTE) to WiFi and vice versa are supported;

  • Improved VP9 Depacketizer based on latest packet format draft;
  • Added renegotiation logic demonstration to Swift 3 / ObjC Examples;
  • Added public ProtocolType TurnTransportProtocol { get; set; } to FM.IceLink.Candidate;
  • Changed the Join/Leave functionality in all Examples to from using DataChannel states to better demonstrate the use of Connection.Initializing and Connection.Closing/Failing states instead;
  • Added support for running multiple versions of ActiveX CABs side-by-side to support version control in production environments;
  • Upgraded Opus FEC algorithms to better adapt to poor network conditions and improve audio quality during severe packet loss conditions;
  • Ported manual signalling code to Java Examples;
  • Added support for XirSys v3 and v2 to FM.IceLink.XirSys;
  • Improved Android Camera performance allowing higher framerates to be captured and raised on all Android devices;
  • Improved AES performance by reducing nested calls to DataBuffer;
  • Improved RtpPacket performance by caching byte buffer reads;
  • Added support for all formats to VideoBuffer.Create;
  • Added ability to send binary data over DataChannels in IE;
  • Added ability to use Chrome Extension in Cross-Domain IFrames for Screen Share.

Breaking Changes:

  • Removed all references to MediaFormat (TFormat) in MediaDescription method signatures. Methods InsertNackPliAttribute, GetRtpMapAttribute and GetRtpMapAttributes now use string formatName, int clockRate and string formatParameters instead;
  • Modified method signature for FM.Icelink.ClientExtensions.ReconnectRemoteClient. It now includes a second parameter Connection failedConnection, which is a connection that failed and needs reconnecting.

Bug Fixes:

  • Signed DLLs for ActiveX CABs now stop "unverified publisher" prompt from being displayed multiple times for ActiveX API calls in IE;
  • Resolved a buffer issue in NAudio Sink causing poor audio quality due to buffer underruns;
  • Increased default value for TCP stream establishment and StunRequest timeout from 1,000 to 3,000 ms resolving inability to establish TCP TURN connections on long round trip times;
  • If an incoming buffer was null, Rtcp.Packet.Parse would throw an exception instead of returning null;
  • Fixed an exception when tapping back button in Android on Xamarin Example when on Video activity;
  • Resolved an issue causing dual remote views to be displayed that occurs due to local descriptions being logged prior to being fully prepared;
  • Ported Android VOICE_COMMUNICATION fix to Xamarin.Android causing various issues of low volume or background noise on some Android devices;
  • Resolved a bug in iOS VideoToolbox h.264 codecs causing random crashes when hardware failures occurred;
  • Resolved a bug in iOS VideoToolbox h.264 codecs causing green flickering to occur on all iPhone devices (this issue still occurs on iPhone 5S only and is being investigated);
  • Resolved a bug in macOS when VideoToolbox h.264 codecs used tri-planer image formats causing the video to not be rendered;
  • Resolved a bug on macOS VideoToolbox h.264 codecs when stride was used causing a striping of rendered video;
  • Added null check to avoid calling WebSocket.Close on send operations that are interrupted by a call to close the WebSocket;
  • Java can now switch screens using the changeInput method;
  • Resolved an issue where IceServerTest didn't execute callbacks in iOS/macOS;
  • Resolved a UDP Socket crash when running on Mono 5.0;
  • Java DateExtensions.getYear() returned incorrect value (off by 1900);
  • Fixed a bug causing null reference exception when answer to an SDP offer was received but connection no longer existed for that offer;
  • Fixed a bug, where CandidatePair objects were unnecessarily created on successful STUN connectivity checks and retained until Connection shutdown.

3.0.11.91 - 2017-04-30

New Features:

  • Pooled buffers and buffer subsets can now be resized as long as the operation does not require the allocation of new memory;
  • Exposed Fm.IceLink.Candidate.TurnTransportProtocol that gets or sets Transport Protocol in use by this candidate when communicating with Turn (relay) server;
  • Added LocalMedia.getView() and RemoteMedia.getView() in the JavaScript API. It is not longer necessary to create DomVideoSink or DomAudioSink objects or access audio/video tracks directly. Views can be accessed immediately without waiting for the connection to esablish. This is part of the effort to establish parity between the JavaScript and non-JavaScript SDKs;
  • Added the ability to create a RemoteMedia instance to the JavaScript API. If a RemoteMedia instance is not passed into the AudioStream or VideoStream constructors, one will be automatically created to maintain backwards compatibility. Connection.getRemoteMedia() is deprecated, but still accessible for backwards compatibility. This is part of the effort to establish parity between the JavaScript and non-JavaScript SDKs;
  • Added the ability to create new Connection, AudioStream, VideoStream, DataStream, DataChannel, and LocalMedia instances without using the Factory in JavaScript. The Factory class is now deprecated, but still accessible for backwards compatibility. This is part of the effort to establish parity between the JavaScript and non-JavaScript SDKs;
  • Upgraded WebSync libraries to 4.9.25;
  • Added source code to pregenerate DTLS certificate in Xamarin Examples to cut down connection times;
  • Added source code to JavaScript/TypeScript Example to refresh ActiveX after CAB installation to allow remote media to be rendered more fluidly;
  • Added Candidate and description logging for ActiveX;
  • Added several IObject and DRYed up the IObjectSafety constraint in ActiveX to bring API parity for the ActiveX and JavaScript with the native platforms (including, but not limited to getError() API);
  • Added generic Exception handler to UdpSocket; 
  • Added support in iOS h.264 decoder for Single NALU mode.

Breaking Changes:

  • Removed AudioTrack.setRemoteDomAudioSink and VideoTrack.setRemoteDomVideoSink from the JavaScript API. This is part of the effort to establish parity between the JavaScript and non-JavaScript SDKs. The functionality of these two methods is now handled automatically within the SDK, so any lines of code referencing these methods can safely be removed.

Bug Fixes:

  • Resolved an issue where a packet could be raised out-of-order by the FEC/jitter layer;
  • Audio stream and video stream should allow null tracks in typescript;
  • Resolved an issue in the .NET SDK where a non-SocketException would not be handled by the UdpSocket receiving thread;
  • Resolved an issue in the JavaScript SDK where an error-level log message could be handled as a debug-level log message;
  • Resolved an issue in the .NET SDK where a resize of the RTP packet for contributing sources could cause an exception depending on the type of the backing DataBuffer;
  • Resolved an issue causing iOS to iOS conferences using h.264 to not render video;
  • Resolved a stride issue causing video from h.264 video streams on iOS to have skewed rendered video on some models of iPhone;
  • Resolved several audio issues on various Android OS versions and hardware causing sound not to render in some cases, volume to be low, etc. This is resolved in the Open Source Examples as there is likely further refinement needed on other hardware. For example, Samsung S7 using Android 6.x would not render audio when using speaker phone, but would on Android 7.x. Nexus 6P would play low volume on all OSes tested;
  • Resolved a logger issue where log messages longer than 2000 characters would be logged multiple times;
  • Rebuild openh264 Android, Linux, and macOS libraries fixing a segfault in Java languages;
  • Resolved an index out of bounds exception when null video buffers are passed to VideoFrames when Mute is enabled;
  • Ensured that ActiveX PluginConnection properly raises events to the proper handlers in Javascript;
  • Worked-around an issue where Chrome 39+ sends incorrect rollover counter in SRTP context;
  • Resolve an issue in RCA Crypto layer causing an exception in Unity;
  • Resolved an issue in Android.AudioRecordSource causing audio not to be rendered on some hardware when DataBuffer polling was enabled;
  • Resolved an issue where SDP Direction is missing in session descriptions, assume that direction is SendReceive;
  • Ensured that connection data in SDP media description is populated with a server reflexive candidate rather than the local candidate from the current Active pair;
  • Resolved an issue in ActiveX installer where installation would not start after uninstalling a prior CAB;
  • Resolved an issue where MediaStreams without Sources or Sinks were generating null reference exceptions on startup;
  • Fixed a bug where a Connection detects loss of connectivity and then detects connectivity regain, then it still transitions to the FAILED state. Now connection remains in Connected state. This does not affect cases where Connection is lost permanently and attempt to establish a new connection is made.

3.0.10.83 - 2017-03-31

New Features:

  • Upgraded macOS and iOS Examples to Swift 3, working around several XCode compiler issues;
  • More data buffer pooling to prevent repeat allocations of large byte buffers, reducing GC runs;
  • Drastically lowereed the amount of allocations on the hotpath and elsewhere, further reducing GC runs;
  • Strategically forced GC to prevent pauses during critical real-time operations;
  • Enabled in-memory data transfer in FM.IceLink.TurnServer implementation that bypasses UDP sockets when connectivity is established between peers where both peers have allocations on the same server (primarily occurring when both peers require TCP connectivity);
  • Modified Server Example to include bypass of the STUN server's public address resolution, which is useful for local testing when deploying TURN server on a network that has restrictive firewall. It is still possible to specify fallback public IP address and port in this case if needed;
  • Exposed UdpSocket.DefaultReceiveBufferSize and UdpSocket.DefultSendBufferSize that allow to set buffer sizes that the application will attempt to set by default; in the case of failure, it will progressively lower buffer size by half three times before failing;
  • Exposed Sdp.MediaDescription.QualityAttribute setter and getter;
  • Exposed Error.ToString() method returning a string representation of this error;
  • Exposed MediaStream.NackPolicy and MediaStream.RedFecPolicy;
  • Sdp.MediaDescription.SetupAttribute is now a setter and a getter for consistency with the other MediaDescription modifiers;
  • Added ability to stream microphone audio in Chrome when screen sharing;
  • Cached encryption contexts to prevent recreating every frame prior to transport.

Breaking Changes:

  • Renamed Connection.TrickleIceSupport to Connection.TrickleIcePolicy and TrickleIceSupportPolicy enum to TrickleIcePolicy;
  • Removed NackConfig.DisableBuffering setter. Use MediaStream.NackPolicy instead. Exposed MediaStream.NackEnabled;
  • Removed FecConfig.Disabled setter. Use MediaStream.RedFecPolicy instead. Exposed MediaStream.RedFecEnabled. Renamed FecConfig to RedFecConfig.

Bug Fixes:

  • Fixed ActiveX installer where CAB was not being setup properly causing page refresh in the Example;
  • Fixed a bug where binding TCP and UDP sockets in Gatherer to the same port resulted in an internal exception (occurs when candidate gathering port restrictions were particularly strict);
  • Fixed a bug in Web Chat Example, where reconnection method was incorrectly invoked resulting in unrecognised method call at runtime on reconnection when IceLink detected a connectivity error;
  • Fixed a bug in JavaScript libraries that prevented conferences that did not have either an audio or a video stream (or both) enabled from starting up due to an error "Cannot read property 'getDirection' of undefined";
  • Fixed a bug causing null reference exception when connection creation failed due to setting stream or Connection properties to illegal values on Connection startup;
  • Fixed a bug where a Connection remained in Connected state despite all previously connected CandidatePairs transitioning to Disconnected state (e.g. due to the loss of connectivity);
  • FEC can now properly be negotiated and started;
  • VideoToolbox can now again be added back to the media chain;
  • Fixed a memory leak in iOS VideoToolbox;
  • Recompiled ARM Linux native libraries to provide more platform support;
  • Lowered default length of SendBuffer to prevent overlapping sequence numbers when large frames are being sent.

3.0.9.78 - 2017-03-06

New Features:

  • Added FM.IceLink.WebSync4.ClientExtensions.ReconnectRemoteClient(PeerClient) allowing user code to reconnect failed connections using existing setup. Updated examples to showcase this feature;
  • Added FM.IceLink.SessionDescription.SessionId, FM.IceLink.SessionDescription.SessionVersion exposing Origin Attributes from SDPs;
  • Added MaxPayload property to Native.cs in OpenH264 to allow MTU adjustments for SinglNAL packetization mode;
  • Renamed Xamarin Forms example to Chat.WebSync4;
  • Exposed ActiveX Mute/Unmute methods;
  • Upgraded Chrome screen sharing extension for audio support during screen sharing.

Bug Fixes:

  • Fixed a bug where competing Offers were sometimes not properly resolved resulting in Offer/Answer collisions at connection startup or at renegotiation;
  • Fixed bug in Java Server example causing icelink.key not to load;
  • Resolved bug causing ActiveX to not install in IE;
  • Fixed null reference exception when recording local preview;
  • Resolved Mono bug in RSA verifyData method causing Unity runtime exception during startup.

3.0.8.75 - 2017-03-01

New Features:

  • Support for SDP Renegotiation of MediaStream Direction;
  • Exposed SignallingState on Connection object on all platforms;
  • Exposed NonTrickleIce mode in TypeScript / JavaScript;
  • Web example now uses responsive design to support mobile browsers;
  • AES is back on software encryption after results from load testing with multiple peers;
  • Media Add/Remove track methods are now virtual to allow overriding;
  • Added Promise.All(Future[] promises) that resolves when all passed in promises resolve;
  • Added MediaConfig.IsEquivalent;
  • Added StringExtensions.replace for TypeScript / JavaScript;
  • Added Tag to MediaPipe/Sink/Source/Stream to assist with identification of media elements in pipeline JSON; 
  • Updated MediaPipe to always process through sinks that are not disabled, even if the input/output formats are identical - it's up to the pipe itself to decide whether it can bypass processing, since there are valid use cases for transforming or modifying media without a difference between the input/output format;
  • Added default constructors to Opus Decoder/Encoder/Depacketizer/Packetizer; 
  • Added default constructors to Pcmu/Pcma Encoder/Depacketizer/Packetizer;
  • Added constructor overload for AudioTrack and VideoTrack that takes an array of tracks and converts them to an AudioBranch/VideoBranch respectively, eliminating this step from being necessary in custom track-building code;
  • SDP Connection and SDP Media attributes now contain ip address and port of the local candidate of the currently active candidate pair if one is set.

Bug Fixes:

  • Fixed the bug where connections were sometimes not removed from ConnectionCollection in ClientExtensions when connections closed or failed;
  • Fixed the bug where the Gatherer does not generate an error when all the ports are in use, preventing opening new sockets;
  • Fixed the video depacketizers so they no longer allow corrupt frames to go through in some scenarios;
  • Android x86 libraries should now be available;
  • Initial setViewScale value no longer ignored by DomVideoSink;
  • macOS example now more closely follows .NET example.

Breaking Changes:

  • FM.IceLink.Sdp.Ice.NetworkProtocol is now FM.IceLink.Sdp.Ice.TransportProtocol.

Deprecations:

  • FM.IceLink.Sdp.MediaDescription.InsertMediaAttribute(FM.IceLink.Sdp.Attribute, int) is deprecated in favour of FM.IceLink.Sdp.MediaDescription.AddMediaAttribute(FM.IceLink.Sdp.Attribute).

3.0.7.70 - 2017-02-10

New Features:

  • Added pooling to Xamarin iOS video source;

Bug Fixes:

  • Updated and fixed ActiveX detection to resolve Xamarin freeze on Join;
  • Java Win_x86 Vpx no longer requires VC++ redistributable;
  • Adjusted VP8 and h.264 Depacketizers to handle cases of RtpSequenceNumber wrap-around mid frame;
  • YUV-to-RGB conversion caused rendering of images to be split into individual Red, Green and Blue planes when running the the Java examples on Windows (Merged in from 3.0.6.65 hotfix);
  • Fixed Receive-only bug in Java Example.

3.0.6.64 - 2017-02-06

New Features:

  • Async LogProviders;
  • ActiveX CAB now in Libraries and Web Example;
  • Modified some internal naming conventions to help ensure the App Store doesn't mistakenly flag certain API calls;
  • Packaged native libs into jars to simplify platform detection and deployment;
  • Added Unit, Pair, and Tuple convenience methods;
  • Updated Connection's ORTC wrappers to map to/from rtcp-fb and fmtp media attributes;
  • Beefed up the NET/Server example.

Bug Fixes:

  • Xamarin iOS audio quality has been improved due to some performance improvements in the audio source;
  • Fixed a bug in iOS where TCPSocket was using main thread;
  • Ensured that ICE Gatherer does not prematurely transition to Completed state when a SocketManager fails immediately on startup;
  • Fixed a bug where the VideoToolbox h.264 decoder was not blocking decode on pending keyframes;
  • Fixed a bug in Xamarin where enabling recording caused null reference exception in iOS;
  • Fixed console/dom log provider bug in TypeScript/JavaScript;
  • Resolved an issue which caused Java screen source to not raise frames.

3.0.5.62 - 2017-01-25

New Features:

  • ActiveX support has been added along with an example of how to build and sign your own cabs;

  • Experimental support for Unity via libraries and API docs has been added;
  • Several performance enhancements have been made for Xamarin and Mono;
  • RTP Transport is now factoring in round trip times when sending NACKs to help reduce network congestion;
  • More robust detection of connectivity loss on a given CandidatePair has been added. A particular CandidatePair is reported to have lost connectivity after 3,000 ms. A stream is reported to have lost connectivity when all the CandidatePairs remain in the lost connectivity state for 10,000 ms (this value can be chnaged via the Connection.DeadStreamTimeout interface).

Bug Fixes:

  • Resolved a bug preventing full connectivity establishment when RTP/RTCP multiplexing was disabled (for Audio and Video streams);
  • Resolved a casting issue for SRControlFrames;
  • Added support for non-zero, and unsynced audio / video source presentation timestamp start-points;
  • Fixed FEC disable bug and Opus Encoder quality/bitrate bug;
  • Resolved a bug in UI thread for Xamarin.Android;
  • OpenGLView in Xamarin.iOS is no longer throwing an exception on startup; 
  • TypeScript no longer causes a crash when Video is set to false;
  • FM.IceLink.NAudio no longer causes clipping.

3.0.4.53 - 2017-01-09

Bug Fixes:

  • Ensured that ICE Gathering does not shut down when TURN allocation fails in certain fatal cases on a given socket. Instead, ICE connectivity check is still conducted for local host candidatesl
  • Ensured that fatal Socket Manager and Gatherer errors are reported to Connection when Connection fails due to fatal issues on those levels;
  • Fixed a bug causing stack overflow on macOS TURN server running on macOS Sierra 10.12.3 beta 2;
  • Fixed a bug where server reflexive candidates were not raised to Connection when prepared based upon PublicIPAddresses property of Connection. Added additional logging when creating Gatherers;
  • Resolved issue in RTCP Sender Report's RTP timestamp;
  • Resolved issue in RTCP report feedback where ReceptionReportCount wasn't being set in Sender Reports causing malformed error in some versions of Chrome.

3.0.3.48 - 2016-12-23

New Features:

  • Added support for Xamarin iOS, Android, along with examples for iOS, Android and Forms.
  • DataBuffer pooling is now enabled in the media layer. DataBuffers will now get reused to prevent Garbage Collection from running as often.
  • Added new DTLS algorithm profiles to ensure compatibility with other services;
  • Support for some atomic operations;
  • Removing SDES support from SDP offers for compatibility with Chrome 57;
  • Changed Serializer to JsonSerializer;
  • Removed LegacyCandidate and LegacyOfferAnswer.

Bug Fixes:

  • Resolved issue where RTP Timestamp was not being synchronized with first RTP packet timestamp;
  • Resolved issue where RTCP report blocks were not being sent with sender reports;
  • Resolved TypeScript build issues so latest JavaScript examples are up to date;
  • Updated .NET ScreenCaptureProvider to handle locked screens;
  • Resolved a bug where ICE failed when connecting to Firefox 50 and above due to changed ICE Candidate transport type declaration;
  • Resolved a bug where application was crashing on generation of odd-length DTLS fingerprints;
  • Updated Java UI example to ensure that application does not crash when Data Channels text box has small size.

3.0.2.47 - 2016-12-13

New Features:

  • Improved efficiency of socket error reporting;
  • Updated Android Build tools to 25.0.1 for Android example.

Bug Fixes:

  • Resolved issue where inputs were unable to be set in JavaScript/TypeScript;
  • Fixed a bug where Connection was raising Closing and Closed states twice on shutdown in JavaScript;
  • Fixed a bug where Error property of Connection was sometimes not set on transition to Failing and Failed states;
  • Upgraded TCP Socket implementation for exception when recording local preview to CocoaAsyncSocket 7.5.1 fixing issues with deallocated memory access on TCP socket shutdown;
  • Local peer-to-peer connectivity is now established when no Stun servers are specified;
  • Fixed a bug preventing from obtaining allocations from the Java-based Turn servers;
  • Resolved issue causing null reference exceptions under certain scenarios when DNS resolution failed.

3.0.1.43 - 2016-11-10

New Features:

  • Added jniLibs for win_x86, win_x64;
  • Added experimental jniLibs for linux_x86, linux_x64, armv8, and arm64;
  • Added screen sharing to iOS and Android Chat examples;
  • Added Java Server example;
  • Implemented SCTP RFC 7053 SACK-IMMEDIATELY, where SCTP transport can request acknowledgments from peer. Optimised SCTP acknowledgment generation and dispatch;
  • Internet protocol used to discover candidates is now logged for local candidates, making it easier to identify which candidates were discovered over Tcp;

Bug Fixes:

  • Resolved issue where after backgrounding and foregrounding iOS app, video was not being rendered;
  • Several bug fixes around hard disconnects of turning off and on WiFi in ongoing conference;
  • Android Chat example now keeps screen on during a call;
  • Resolved a memory leak where rtcp-mux policy was set to null on RemoteDescription;
  • Resolved video rotation issue on iOS Swift example;
  • Several UI fixes in Cocoa examples;
  • Resolved a bug causing disconnection after 30 seconds if a stream attached to Connection started with a direction of inactive;
  • Connection deadstream timeout is now enforced;
  • Fixed the issue where LocalCandidates that were raised as a part of Sdp Session Description were not raised through via the OnLocalCandidate event. Such Candidates have their Dispatched property set.

3.0.0.42 - 2016-10-28

  • Initial general release.