March Product Release (x.4.7)

by anton.venema 16. March 2014 04:58

The March product release is here! There have been a few minor releases in between, and we opted to go past February to make sure we could get some "bigger" changes implemented. Performance improvements have been a major focus for us in this release, especially on mobile platforms. This build brings mobile performance up to the max, and should free us up to add reliable data-channels and support for Windows Phone (which we know many of you are waiting for). Aside from bug fixes, here are some of the highlights for this release:

  • IceLink gets full WebRTC support (audio/video) for Xamarin.Android. Xamarin.iOS is in the works, coming soon.
  • The pipeline for the IceLink, WebSync, and TheRest Java SDKs have received major performance improvements.
  • For IceLink, the WebRTC extension for Android now uses an OpenGL video render provider that is radically faster than the previous iteration.
  • The Android video capture provider also discards late frames so there is never a backlog of video for remote clients to process.
  • The WebRTC Java applet for IceLink is confirmed working 100% across Windows/Mac/Linux 32-bit/64-bit in a plethora of web browsers that don't natively support WebRTC.
  • IceLink now limits PLI packet delivery to avoid over-congesting the network with keyframes. It also now includes improved packet-loss detection at the video codec level to avoid messy artifacts in lossy network conditions.
  • All issues related to DTLS on Android are resolved.
  • In IceLink, all issues related to WebRTC audio playback quality in Chrome/Firefox are resolved.
  • The WebSync SDK now includes a WCF extension for .NET so you can consume or host a WCF service using WebSync for duplex communication. You can even host a WCF service using a WebSync client.
  • TheRest now supports "local only" methods so you can trigger various internal operations (like migrations) using a thin web request instead of a separate thick application.

As always, please send us your feedback! Check out to submit and vote on feature requests/ideas as well as ask questions from our technical staff and receive prompt answers. For any other issues, feel free to send us a message.


January Product Release (x.4.3)

by anton.venema 3. January 2014 05:21

We just narrowly missed the end of December due to holidays, so we're going to call this one the January release (x.4.3). We are actively working on new features like SCTP and support for Windows Phone, but this release includes too many good things to hold it off any longer. Besides miscellaneous bug fixes, notable improvements are:

  • Windows 8 gets some love with an IceLink WebRTC audio/video chat example.
  • Windows Phone libraries get awaitable "Async" method overloads for asynchronous methods.
  • Support for clients without DTLS-SRTP support (like Chrome on Android) has been improved.
  • LocalMediaStream in IceLink gets new API methods to help make muting/unmuting easier (MuteAudio/MuteVideo/UnmuteAudio/UnmuteVideo/IsAudioMuted/IsVideoMuted).
  • IceLink now supports retrieving a list of audio/video device names (GetAudioDeviceNames and GetVideoDeviceNames in UserMedia).
  • IceLink now has support for sending different frames to different peers (via RaiseFrame overloads in AudioCaptureProvider/VideoCaptureProvider).
  • Visual Studio 2013 solution files for all Microsoft platform examples.
  • libvpx has been updated, and now includes an x86_64 slice in the iOS WebRTC example to support the new 64-bit simulator.
  • The JavaScript API has been improved across the board. Date-time serialization should be 100% consistent with other platforms. The error messages thrown when an invalid object literal is passed into a method have been vastly improved.
  • In WebSync, extension values can now be set as object literal key/values in JavaScript. Calling "client.connect({ foo: 'bar' });" will automatically set the Bayeux extension named "foo" to value "bar" and send it to the server.
  • WebSyncProxy has been added to the WebSync 4 On-Demand SDK (in FM.WebSync.Server.dll).

As always, please send us your feedback! Check out to submit and vote on feature requests/ideas as well as ask questions from our technical staff and receive prompt answers. For any other issues, feel free to send us a message.


November Product Release (x.4.1)

by anton.venema 25. November 2013 20:28

The November release is out as version x.4.1! We were Gold sponsors at the WebRTC World conference last week in Santa Clara, California, where we had the privilege of presenting IceLink (and WebSync) as premium SDKs for developing cross-platform WebRTC applications. This release includes some of the features announced at that conference, including DTLS key exchange (now integrating with Firefox nightly) across all platforms and improved video call quality. Video calls on the local network have always been good, but we are working tirelessly to make remote video calls crystal clear. We received some great feedback from people at the conference, and we look forward to bringing you reliable data channels and even better call quality before the end of the year.

But wait, there's more! We are proud to introduce WebSync 4 On-Demand to you today. The new SDK is available for you to download, so please check it out! WebSync 4 On-Demand bring all the features of WebSync 4 to our hosted solution, including WebSocket protocol support, binary data streams, client-to-client notifications, and support for new client platforms like Windows Phone, Windows 8, Mac, Unity, and Xamarin.iOS/Android!

Here are some highlights from this release.

  • WebSync 4 On-Demand SDK is available!
  • IceLink now supports DTLS-SRTP key exchange across all platforms. Tested working against Firefox nightly (public release December 10).
  • IceLink now includes network-level jitter buffers to improve audio and video call quality on WAN links.
  • TheRest now automatically parses incoming file streams for multipart form submissions.
  • Fixed several bugs in FM core libraries, including date serialization inconsistencies in Java/iOS/Mac/JavaScript and UTF-8 decoding quirks in JavaScript.
  • IceLink's JavaScript SDK now properly handles broadcast/receive application scenarios where one of the peers receives, but does not send, media.
  • IceLink's JavaScript SDK now better handles audio-only conferences.

As always, we love your feedback! Check out to submit and vote on feature requests/ideas as well as ask questions from our technical staff and receive prompt answers. For any other issues, feel free to send us a message.


October Product Release (x.3.12)

by anton.venema 11. October 2013 20:31

The October product release is here! This is primarily a bug fix release, and quite a big one at that. A big thank you to everyone who reported issues and helped us diagnose problems. Support for DTLS handshaking almost made it into this release (it's about 95% complete), but we felt stability needed to take priority over new features. Some bug fix highlights:

  • Updated Android video capture in IceLink to use NV21 instead of YV12 since several Samsung devices implement YV12 incorrectly.
  • Added query-string parameter value encoding for JavaScript across the board.
  • Added exception handling for bad references in WebSync/TheRest when initializing. (Bad references should still be fixed, but at least the software loads.)
  • Updated socket receive code to iterative instead of recursive implementation in WebSync Cache. (Should avoid StackOverflowException on very large requests/responses.)
  • Updated NET.Server's HttpListener implementation so HEAD requests are ignored. (Should avoid ProtocolViolationException.)
  • Added proper handling of wildcards in domains when using HTML5 postMessage for transport in JavaScript (WebSync and TheRest).
  • Updated CORS transport in JavaScript to re-use pre-flight OPTIONS requests whenever possible (WebSync and TheRest).
  • Resolved glitch in iOS/Mac base64 implementation.
  • Updated IceLink WPF image render provider to avoid race condition with initial Image control creation.
  • Updated IceLink JavaScript to allow audio/video=false for receive-only implementations.
  • Updated STUN client implementations to accept either XOR-MAPPED-ADDRESS or MAPPED-ADDRESS in response.
  • Fixed several bugs related to Android audio capture and playback in IceLink.
  • Fixed bug where video could not be received without video being offered in IceLink.
  • Fixed race condition in IceLink where candidates might arrive before a link had completely initialized.
  • Fixed UDP socket implementation in Java so it returns the proper dot-notation of an IP address.
  • Updated TURN server implementation to interface with Chrome's TURN client implementation.
  • Added SecuritySafeCritical attribute to Windows 8 DNS resolution methods in IceLink to avoid security exception.
  • Fixed locking issue in IceLink Conference when connecting to multiple peers.
  • Fixed bug where some TURN connections might not be established if the controlled client was behind a symmetric firewall.
  • Updated IceLink WebSync extension so all events are properly detached when leaving a conference.
  • Updated .NET LayoutManager to catch exceptions thrown when manipulating controls in IceLink.
  • Fixed data-channel SSRC generation in IceLink so it never overflows to a negative number.
  • Fixed error thrown when sending an empty string to a data-channel in IceLink.

It's not all bug fixes, though. A few new features:

  • Added DomainName to WebSyncEventArgs. This represents the client-side referrer (or DomainName specified by thick clients).
  • Added ConnectArgs to StreamFailureArgs. This represents the connect arguments about to be used to re-handshake with the server and allows simple modification of the arguments before this happens.
  • Added TextViewLogProvider for Android, FMTextViewLogProvider for iOS/Mac, and TextBlockLogProvider for Windows 8/Phone.
  • Added LocalCandidates and RemoteCandidates properties to Link in IceLink for access to selected local/remote candidates.

As always, we welcome your feedback! Check out to submit and vote on feature requests/ideas as well as ask questions from our technical staff and receive prompt answers. For any other issues, feel free to send us a message.


WebRTC World Coming Up!

by jerod.venema 27. September 2013 19:27

WebRTC World Conference in Santa Clara

We are pleased to announce that we'll be joining a number of companies at the upcoming WebRTC World conference in Santa Clara, CA!

In addition to a 10-minutes presentation on IceLink by yours truly, our lead developer Anton will be leading a workshop on Android and Chrome development and debugging. Learn about how we go about building software that needs to be reliable and highly interoperable, while debugging extremely low-level communications and performance issues!

Come Join Us - For Free!

We'd love to see you at the conference. If you have a great story about how you used IceLink, send it to us @ info at! The top 3 stories will get a FREE conference pass - sorry, travel costs aren't included ;).

Tags: , ,

icelink | webrtc

September Product Release (x.3.7)

by anton.venema 10. September 2013 01:20

The September product release is out! Here are the highlights:

  • By request, WebSync and TheRest have been updated to support ArrayBuffer/Uint8Array in JavaScript. This means that modern web browsers can receive and process raw binary data from the server using either WebSockets or XHR without any base64 encoding (related feature request).
  • By request, IceLink now has DNS resolution. You can use a host name for the server address and it will be resolved to an IP address automatically (related feature request). Using a hard-coded IP address is of course still OK.
  • WebRTC data-channel support has been added! The new DataChannelStream class can be used to create a stream definition that allows text data to be passed between Chrome and .NET/Java/iOS/Mac/Android/etc. Web browser support is currently limited to Chrome, but will be expanded to include Firefox once SCTP integration is finalized in both Chrome and our own implementation for thick clients. Binary support is coming as soon as it is supported in Chrome.
  • WebRTC codec registration no longer requires a payload type. We've made several improvements like this to the public API to make things more intuitive and reduce the learning curve as much as possible.
  • IceLink servers have a new event API that makes parsing and responding to various request types a much simpler task.
  • A bug has been fixed in IceLink that caused audio and/or video to freeze randomly. A glitch in the roll-over counter caused decryption to fail on the receiving end.
  • A periodic memory leak in the IceLink server implementations has been sealed.

As always, we welcome your feedback! Check out to submit and vote on feature requests/ideas as well as ask questions from our technical staff and receive prompt answers. For any other issues, feel free to send us a message.

Update: There was a bug in the JavaScript SDK that slipped into this release. Version x.3.8 is now available to resolve this issue.


Customer Testimonial (IceLink/WebSync)

by anton.venema 11. August 2013 01:26

A testimonial from one of our customers who recently developed an application using IceLink and WebSync:

The FM libraries have been an extraordinary help to the app I'm working on. Honestly, it would have been practically impossible or time-prohibitive without using FM.

Currently, everything is working like a charm, 100% as advertised for my needs, scenarios, & use cases. The 2.3.1 IceLink "touch-ups" have also really simplified the implementation. There is a pinch more code, but the process flow is much easier to understand and work against.

My current configuration:
Azure web role for my WCF services (and all of the WebSync support)
GoDaddy Virtual Private Server for the IceLink server - this is wrapped in a Windows service, runs without a problem and memory usage stays below 100MB (no bleeding, running for weeks, very solid).

Also, the GoDaddy asset is a lower-end (cheap) virtual machine: the required overhead to run IceLink (properly) is incredibly low and very simple.

Thanks for the kind words!


August Product Release (x.3.4)

by anton.venema 11. August 2013 01:07

The August product release is out! Here are the highlights:

  • IceLink's connection algorithms have been updated to handles some edge cases when connecting two WAN peers. The Community edition has been updated so WAN connections are allowed for a full 10 seconds to demonstrate P2P establishment.
  • To demonstrate IceLink's P2P establishment, a virtualization module has been added that allows you, in code, to simulate any possible network configuration. A test suite is included that provides full coverage and indicates when a P2P link is possible with STUN only, and when TURN is required.
  • Support for WPF has been added in parallel with WinForms for .NET-based WebRTC applications.
  • The groundwork for DTLS-SRTP has been laid. Firefox and Opera now use the native WebRTC implementation, so Internet Explorer is the only major browser that relies on the Java applet. DTLS-SRTP is not yet complete for non-JavaScript platforms, but it is very close and should be ready for the September release.
  • WebSync now comes bundled with an installer for the WebSync Cache Service. One of the major advantages of the SQL Server providers was the ability to "see" what was happening inside the data store using ad-hoc SQL queries. We didn't want to lose that ability when using the WebSync Cache, so we created a WebSync Cache Manager, which allows you to remotely perform data queries against the Cache Service as well as remotely control the service state (start/stop/restart).

As always, we welcome your feedback! Check out to submit and vote on feature requests/ideas as well as ask questions from our technical staff and receive prompt answers. For any other issues, feel free to send us a message.


July Product Release (x.3.2)

by anton.venema 12. July 2013 23:09

A little late, but it's here! The July product release is out and it has lots of goodies for you to enjoy, especially in IceLink :) Aside from the usual bug fixes, here are the highlights:

  • IceLink has a new Java applet that provides WebRTC functionality for non-WebRTC browsers using the pure JavaScript API. The exact same code that uses native WebRTC in Chrome will use Java in Internet Explorer, Firefox, and other browsers without having to change a single line of code or do one bit of browser detection.
  • IceLink now has full WebRTC support for Android. Check out our new Android.Client.WebRTC example to see it in action!
  • IceLink received a new cross-platform layout manager that will automatically position local and remote video feeds optimally in a container you supply. It's fully configurable - set the local preview position, size, and padding.
  • Full support for device rotation has been added for IceLink on iOS and Android. Rotate the device and watch the remote feeds automatically adjust - no more head-turning!
  • Mute/unmute support has been added to IceLink so individual audio and video tracks can be silenced.
  • BIG performance enhancements across the board for binary support in Java. All methods use the primitive byte now, and memory movement has been reduced to an absolute minimum.
  • TheRest now allows multiple TheRestEvents to be tied to a single method.
  • WebSync now allows you to dynamically adjust the reconnect interval after receiving a message on a client. Just set e.ReconnectAfter to the desired sleep period when receiving a message.

As always, we welcome your feedback! Check out to submit and vote on feature requests/ideas as well as ask questions from our technical staff and receive prompt answers. For any other issues, feel free to send us a message.


IceLink, WebSync, and Unity

by anton.venema 4. June 2013 03:33

Earlier today, we got an email from a clever developer who has combined IceLink and WebSync on the Unity platform to create a direct P2P text chat. Read about it and check out the sample, including full source code, over at Entrepreneurial Coder. Thanks for the email, Mohan!

If you have a cool use case and want to share it, feel free to contact us and we'll highlight it right here on our blog!