Share this
Going Big Screen: Bringing Video to Samsung Tizen
by Pieter-Jan Speelmans on May 11, 2021
As recent as the last few years, online streaming has evolved tremendously. Initially, most streaming happened on desktop devices, but today that is not the case. Today, video streaming is conquering the big screen (Smart TVs).
Without a doubt, one of the most notable big screens is Samsung with the Tizen operating system (OS). Based on Conviva’s State of Streaming from 2020 Q4, Samsung accounts for 49% of streaming on Smart TV, leaving other vendors such as LG (±22%) and Vizio (±12%) in the rear view. Due to the growing popularity, and almost 50M smart Samsung Smart TVs being shipped every year, interest to deploy OTT apps directly on Samsung Smart TVs has risen significantly.
While deploying an OTT app on the Tizen operating system is far from complex, there are a number of caveats.
In this blog, we will go through the possible approaches to deliver apps and getting video playback as well as shed some light on how to tackle the large set of different devices and the problem with different Tizen versions.
Developing Apps on Tizen
When it’s your goal to bring streaming to the big screen, Samsung’s Tizen is a great place to start. It’s popularity and fast evolution over the past years make it a solid choice for an investment in your streaming apps’ platform expansion. Tizen apps can be installed from the Samsung Apps TV-store. Publishing an app in this app store isn’t all too difficult. Same as with most app stores for other platforms, applications are to be submitted for review to Samsung and will, once approved, be published in the store. The disadvantage to this process is that you need to go through it again for any update you want to perform to your application.
When talking video apps, one of the most crucial choices to make is the choice for a video player as this will drive a big part of the viewer experience, as well as the amount of features your own team will need to build and maintain themselves. In general, there are two approaches to choose from:
- Leveraging the streaming support of the native video player AVPlay.
- Use a “Build Your Own” video player leveraging available advanced APIs
Approach 1: AVPlay, Tizen’s native video player
As with most smart TV system, Tizen comes with its own native video player, providing support for the most common streaming protocols. Tizen’s native video player is called AVPlay. Using AVPlay isn’t all too difficult and simply requires loading the AVPlay API library. This is as simple as loading the following script:
<script type= "text/javascript" src= "$WEBAPIS/webapis/webapis.js"></script>
With this library loaded, you can enable playback easily with AVPlay API by:
1.defining the playback window and indicating AVPlay is to be used,
var objElem = document.createElement('object');
objElem.type = 'application/avplayer';
document.body.appendChild(objElem);
2. configuring a media source,
webapis.avplay.open('https://content.domain.com/channel1.m3u8');
3. loading the media source to prepare for playback,
webapis.avplay.prepare();
4. and trigger playback.
webapis.avplay.play();
As you can see, getting playback up and running is very simple. Beyond this, AVPlay brings some additional capabilities such as:
- support for streaming protocols such as Smooth Streaming, MPEG-DASH and HTTP Live Streaming (HLS),
- allowing to perform basic trick play by seeking or changing the playback speed,
- the ability to receive notifications in case of buffering or errors,
- support for alternative audio channels,
- basic DRM playback,
- and support for subtitle formats such as SMPTE-TT, SAMI and DFXP.
AVPlay has been around since Tizen’s early days in 2015 (with the launch of Tizen 2.3) and has evolved a lot, but as a result, AVPlay differs significantly in capabilities across different platform versions of Tizen. The main purpose of AVPlay however hasn’t changed: empower media apps to use basic playback capabilities. When building a full media app however, in practice the capabilities of AVPlay will soon reach its limitations.
There are two main challenges which OTT video publishers often start to encounter when working with AVPlay:
- Capabilities are limited to basic use cases and offer little flexibility.
- Different version of AVPlay are tied down to support of specific versions of streaming protocols and (greatly) differ in capabilities.
Where the limited basic use cases support is often initially not seen as a huge issue, the problems start growing once new business cases get added. Some notable use cases which are difficult or even impossible to support properly are:
- Monetization through client-side (CSAI) or server-side ad insertion (SSAI).
- Reducing playback latency for optimal user experience in interactive or live broadcasts.
- Advanced bitrate selection (or even manual bitrate selection)
- Identifying streaming issues as error responses are extremely brief.
- Monitoring QoE due to lack of detailed events (no possibility to inspect the size of the buffer, details of different tracks and qualities, …)
- Support for alternative subtitle formats and subtitle styling.
- Improved scrubbing with thumbnails or I-FRAME streams.
On top of these limitations, the support for streaming protocols differs significantly between different versions of AVPlay. The root cause of this seems to be the lack of software updates for Samsung TVs: Samsung tends to have a policy of locking models released in specific years to the Tizen version released that year. Samsung TVs from 2015 will be locked to Tizen 2.3, the 2016 version to 2.4, 2017 to 3.0 and so forth. At the time of writing, the 2020 models are running Tizen 5.5.
As a result, if you are an OTT video publisher and you want to support different models of Samsung Smart TVs, some even only a couple of years old, AVPlay will cause some headaches for your product and engineering teams. For example, a stream tested on a 2017 model Tizen 3.0 device with alternative audio tracks will not work properly on 2016 model with Tizen 2.4. These and similar limitations force you to either:
- setup a specific stream for every Tizen version and incrementally add capabilities, or
- go for a lowest common denominator approach with limited capabilities across all devices.
A decision which can have a huge impact on either operational cost or viewer experience.
To make things even worse, while there is a relatively clear overview available on HLS protocol version support, this is not the case for MPEG-DASH support and the different IOPs which were published. A list of the most important differences in AVPlay’s support between recent Tizen versions can be found below. Note that additional limitations on top of the ones listed below are in effect as well.
|
Model |
NOTABLE LIMITATIONS |
---|---|---|
2015 Models Tizen 2.3 |
DRM: - PlayReady 2.5 with SL2000 (software - CENC/CTR only) - Widevine Classic only (no Modular) HLS: - No support for session keys - No byte range request support - All limitations of more recent versions MPEG-DASH - All limitations of more recent versions |
|
2016 Models Tizen 2.4 |
DRM: - PlayReady 2.5 with SL2000 (software - CENC/CTR only) - Widevine Modular 2.08 HLS (Limited version 7 support): - No support for discontinuity sequence (improper handling of SSAI) - No support for alternative audio tracks - No support for in band subtitles (WebVTT) - No support for in band captions (CEA-608) - All limitations of more recent versions MPEG-DASH: - Not following DASH interop on HEVC usage - No support for alternative audio tracks - No support for in-band subtitles - No support for trick modes - No support for in-band captions (CEA-608) - All limitations of more recent versions |
|
2017 Models Tizen 3.0 |
DRM: - PlayReady 2.5 with SL2000 (software - CENC/CTR only) - Widevine Modular 2.08 HLS (Limited version 7 support): - All limitations of more recent versions MPEG-DASH: - No support for key rotation - All limitations of more recent versions |
|
2018 Models Tizen 4.0 |
DRM: - PlayReady 3.3 with SL3000 (hardware - CENC/CTR only) - Widevine Modular 3.2 HLS (Limited version 7 support): - All limitations of more recent versions MPEG-DASH: - All limitations of more recent versions |
|
2019 Models Tizen 5.0 |
DRM: - PlayReady 3.3 with SL3000 (hardware - CENC/CTR only) - Widevine Modular 14.1 HLS (limited version 7 support): - All limitations of more recent versions MPEG-DASH: - All limitations of more recent versions |
|
2020 Models Tizen 5.5 |
DRM: - PlayReady 4.2 with SL3000 (hardware - including CBCS support) - Widevine Modular 15.2 HLS (limited version 7 support): - No low latency support - No support for CMAF or HEVC - No metadata support (daterange, programdatetime, ...) - No support for initializations through MAP - No support for start offsets - No support for IMSC1 subtitles - No support for alternative video tracks - No support for parts, delta playlists, gapmarking, preload hints, ... MPEG-DASH: - No low latency support - No SSAO: multi-period support is not stable - Mixed results for enabling/disabling DRM and rotating keys - No metadata support (eventstream, emsg, ...) - No support for alternative video tracks |
As a result of these limitations, the AVPlay APIs provide a very simple approach for OTT video publishers to get up and running fast with basic OTT video apps, but once video requirements grow, this approach quickly shows its limitations. Furthermore, if it is your ambition to target Tizen versions as of 2015 or 2016, it is often needed to have specific streams set up in order to be compatible with Tizen. This will result in duplicating pipelines and multiplying stream generation and operational distribution costs.
Approach 2: Build Your Own Video Player with MSE/EME
Due to the limitations of native players such as AVPlay, popularity of the “build your own” approach to video players is growing rapidly with OTT video publishers. This approach allows to avoid the biggest issues with AVPlay due to the differences between Samsung TV models and Tizen versions.
When taking the build your own player approach, it is important that hardware capabilities for DRM decryption and media decoding can be leveraged. This has an impact on viewer experience as it allows to unlock capabilities such as HDR, but also is often important for battery efficiency. On Samsung’s Tizen platform media hardware access is possible thanks to the the presence of the Media Source Extension (MSE) API and the Encrypted Media Extension (EME) API. Tizen has support for different versions of these APIs since Tizen 2.3 (2015 models). While versions differ, support is broad enough to implement al the most important use cases with only a limited set of limitations (but more on this later).
The MSE API provides access to the decoders. Samsung has gradually extended support on this over the last years, increasing frame rates, resolutions and bitrates as devices became more powerful. The API allows an application to allocate buffers on the audio and video decoders of the device and feed it with media data. This allows implementation of common streaming protocols such as HLS and MPEG-DASH (as well as others). A video player can download the required playlist or manifest, identify the relevant segments, download them and append them one after the other as playback happens.
Leveraging MSE for basic playback can be quite simple. In a rudimentary form, you should use the following steps:
1. Get a handle on an HTML5 Video Element (or<video>-tag).
var video = document.getElementById('video');
2. Create a new MediaSource through MSE-API.
var mediaSource = new MediaSource();
3. Wait for the MediaSource to "open" to create a SourceBuffer (the direct interface to the decoders buffer where you can store raw data) and load it in the video element.
mediaSource.addEventListener('sourceopen', function (e) {// ...var videoSourceBuffer = mediaSource.addSourceBuffer(‘videoMimeType’);// ...});video.src = window.URL.createObjectURL(mediaSource);
4. Download and parse the right playlist for your stream (keeping in mind bitrate selection) and identify the segments you want to load.
5. Download the appropriate segments and append them to your SourceBuffer.
while (nextSegment) {var segment = await download(nextSegment.uri);sourceBuffer.appendBuffer(segment);nextSegment = findNextSegment(playlist);}
In parallel the EME API enables applications to play back DRM protected content and provides access to the Content Decryption Modules (CDMs) which are available on the platform. On Tizen this allows you to access the underlying key systems for PlayReady and Widevine. When media is protected with one of these DRMs, the EME API will expose this and allow the application to configure the CDM with a response to its license challenge.
Leveraging the Encrypted Media Extensions API to enable playback of DRM protected content is relatively straightforward:
1. Request access to the Key System
navigator.requestMediaKeySystemAccess('com.widevine.alpha', options);
2. Create a MediaKeys object on which the media session will live later on.
var mediaKeys = keySystemAccess.createMediaKeys();
3. Listen for an encrypted-event indicating a new DRM session to be started.
video. addEventListener('encrypted', function (event) {var keySession = mediaKeys.createSession();keySession.generateRequest(event.initDataType, event.initData);// ...});
4. Handle Messages from the session when it faces encrypted content with a key it doesn't know.
keySession.addEventListener("message", function (event) {var request = event.message;var response = await postRequest(licenseServerURI, request);keySession.update(response);});
5. With the License response the CDM can then start decryption of the content so it can be played.
Thanks to these MSE/EME APIs, developing video playback with complex handling of media became possible. Where THEOplayer was the first media player to do complex handling of streaming media in browser environments (even without the use of MSE/EME), various other companies started providing libraries since the APIs became available. As MSE and EME are only APIs, there is however more than meets the eye: development based on these APIs still requires a proper understanding of media and the web as the entire implementation of the streaming protocols has to happen in dedicated code.
The very simple examples earlier in this article can already provide basic playback of the downloaded segments. A fully featured media player however does much, much more such as:
- Identifying user behavior such as playing / pausing.
- Reacting to the user seeking to a new timestamp.
- Modifying the media player’s volume.
- Following the appropriate autoplay policies to start playback upon the application being opened.
- Providing support for changing the playback speed.
- Monitoring the available network environment and dynamically switching to the appropriate bitrate.
- Ensure continued playback in case media data is unavailable.
- Avoiding and handling buffer underrun (and the resulting stalling behavior for viewers).
- Exposing alternative audio and video tracks to the viewer and allow them to switch.
- Retrieving and overlaying subtitles and closed captions timed exactly right to ensure a good viewer experience.
- Handling errors in the DRM license request flow.
- And much, much more…
Even with all of the basics implemented, there is a large difference between different media player options. While there are open source libraries such as hls.js, dash.js and Shaka Player that provide basic playback support for the HLS and/or MPEG-DASH protocol, more advanced players such as THEOplayer provide even more support such as integrations with various DRM systems, monetization options with CSAI and SSAI, picture in picture support, support for offline downloading, etc.
The most important parameter to take into account when picking a media player for Tizen is the list of platforms and versions which are supported. Most popular libraries are built with web browsers on laptop and mobile in mind. Often the assumption is made all browsers implement all APIs in exactly the same way. Browser implementations can however differ significantly. Also, the Tizen platform and smart TVs in general often have significantly different hardware and use cases compared to standard playback on laptop. With smart TV platforms being forgotten and not making it into the testing cycle this opens up a risk. For example, the compatibility list of hls.js does not list Tizen, dash.js doesn’t list any platforms at all and only claims to rely on MSE being implemented and Shaka Player only mentions Tizen 2017 models as actively tested and supported. At THEOplayer, we actively support the Tizen platform and have code to handle differences and quirks compared to a standard browser environments in our THEOplayer Web SDK such as handling for limitations in the number of decoders which can be used in parallel, switching from one video codec into another, enabling and disabling DRM, handling for higher bitrates, alternative codecs and HDR content on big screens just to name a few.
The compatibility problem doesn’t just show in regard to testing. As already mentioned earlier, there are still significant differences in the web environment, MSE and EME implementations across different Tizen versions. Where most players assume an always up-to-date API, this is not the case on smart TV platforms such as Tizen for which different models often support older draft specifications only. For example, Tizen 3.0 (models from 2017) makes use of Chromium M47, a version from December 2015 and boasts a November 2015 based MSE implementation and an EME version from February 2016. This is far from the recent specification and can have a significant impact on compatibility. An overview of differences in MSE and EME support for different Tizen models and versions can be found below.
Model
|
WEB
|
MSE
|
EME
|
NOTABLE
|
---|---|---|---|---|
2015 Models Tizen 2.3 |
Webkit r152340 |
Dec 2013 (Draft) |
Aug 2012 (Draft 0.1b) |
Hard to implement DRM ("Promise-bug" in EME) DRM toggling limitations (SSAI) Codec switching limitations (SSA) Only seeking to keyframes |
2016 Models Tizen 2.4 |
Webkit r152340 |
Dec 2013 (Draft) |
Aug 2012 (Draft 0.1b) |
Same as 2015 models |
2017 Models Tizen 3.0 |
Chromium M47 (Dec 2015) |
Nov 2015 (Draft) |
Feb 2016 (Draft) |
DRM toggling limitations (SSAI) Codec switching limitations (SSAI) Only seeking to keyframes allowed |
2018 Models Tizen 4.0 |
Chromium M56 (Jan 2017) |
July 2016 (Draft) |
July 2016 (Draft) |
Codec switching limitations (SSAI) |
2019 Models Tizen 5.0 |
Chromium M63 (Sept 2017) |
Nov 2016 (Rec.) |
Sep 2017 (Rec.) |
Mostly OK |
2020 Models Tizen 5.5 |
Chromium M69 (sept 2018) |
Nov 2016 (Rec.) |
Sep 2017 (Rec.) |
Mostly OK |
Key Takeaways on Deciding on a Player Strategy for Tizen
- Bringing video efficiently to all different versions of Tizen is a challenge, but your viewers are across a wide range of different Tizen versions, therefore premium OTT video service can mostly not simply ignore these older platforms.
- Native playback is available using AVPlay, but it comes at a cost. Where it is often tempting to go with Tizen’s native AVPlay streaming support as it is easy to get started, it is in practice often too limiting for premium OTT video providers and can incur issues due to different support across versions. This becomes especially apparent you’re your use case includes DRM or SSAI.
- You can use a third party, or your own video player on Tizen. MSE and EME make this possible. As there are still a broad variation of different versions of the APIs available, it is crucial that the video player you use is optimized as well for the older versions used in Tizen. Due to the quirks in the Tizen platform and its decoders, it is also crucial to ensure your player optimizes for these in order to avoid hiccups during playback. When picking which player to use, make sure to check compatibility: try to avoid making the choice for a player which does not really support the Tizen versions you want to support unless if you are willing to pick up the testing, bug fixing (where even possible) and maintenance internally.
- You could use a Hybrid Approach where you leverage a “Build Your Own Video Player” approach, and fall back to AVPlay for other use cases. THEOplayer allows to configure on which version you want to use the MSE/EME approach, and on which versions you want to leverage AVPlay through a single API for configuration and interaction with other systems such as QoE and QoS monitoring. In practice we see it is most interesting to leverage MSE/EME, especially for later versions of Tizen. For really early versions of Tizen, using a Hybrid Approach allows you to enable AVPlay on those specific old versions where it still makes sense in your target audience. The Hybrid Approach can bring a best of both worlds with extensive capabilities using a BYO video player, while falling back on AVPlay for difficult to support versions.
Choosing your video player approach is subject to careful decision making to ensure all key features are present and compatibility across different version of Tizen is guaranteed for your use cases. Making the wrong choice in this strategy can cause a significant setback if at a later point in time the player has to be swapped out for a different one.
Questions about our Tizen support? Contact our THEO experts.
Share this
- THEOplayer (46)
- online streaming (40)
- live streaming (35)
- low latency (32)
- video streaming (32)
- HESP (24)
- HLS (21)
- new features (21)
- THEO Technologies (20)
- SDK (19)
- THEOlive (17)
- best video player (17)
- cross-platform (16)
- html5 player (16)
- LL-HLS (15)
- online video (15)
- SmartTV (12)
- delivering content (12)
- MPEG-DASH (11)
- Tizen (11)
- latency (11)
- partnership (11)
- Samsung (10)
- awards (10)
- content monetisation (10)
- innovation (10)
- Big Screen (9)
- CDN (9)
- High Efficiency Streaming Protocol (9)
- fast zapping (9)
- video codec (9)
- SSAI (8)
- Ultra Low Latency (8)
- WebOS (8)
- advertising (8)
- viewers expercience (8)
- "content delivery" (7)
- Adobe flash (7)
- LG (7)
- Online Advertising (7)
- Streaming Media Readers' Choice Awards (7)
- html5 (7)
- low bandwidth (7)
- Apple (6)
- CMAF (6)
- Efficiency (6)
- Events (6)
- drm (6)
- interactive video (6)
- sports streaming (6)
- video content (6)
- viewer experience (6)
- ABR (5)
- Bandwidth Usage (5)
- Deloitte (5)
- HTTP (5)
- ad revenue (5)
- adaptive bitrate (5)
- nomination (5)
- reduce buffering (5)
- release (5)
- roku (5)
- sports betting (5)
- video monetization (5)
- AV1 (4)
- DVR (4)
- Encoding (4)
- THEO Technologies Partner Success Team (4)
- Update (4)
- case study (4)
- client-side ad insertion (4)
- content encryption (4)
- content protection (4)
- fast 50 (4)
- google (4)
- monetization (4)
- nab show (4)
- streaming media west (4)
- support matrix (4)
- AES-128 (3)
- Chrome (3)
- Cost Efficient (3)
- H.265 (3)
- HESP Alliance (3)
- HEVC (3)
- IBC (3)
- IBC trade show (3)
- React Native SDK (3)
- THEOplayer Partner Success Team (3)
- VMAP (3)
- VOD (3)
- Year Award (3)
- content integration (3)
- customer case (3)
- customise feature (3)
- dynamic ad insertion (3)
- scalable (3)
- server-side ad insertion (3)
- video (3)
- video trends (3)
- webRTC (3)
- "network api" (2)
- Amino Technologies (2)
- Android TV (2)
- CSI Awards (2)
- Encryption (2)
- FireTV (2)
- H.264 (2)
- LHLS (2)
- LL-DASH (2)
- MPEG (2)
- Microsoft Silverlight (2)
- NAB (2)
- OMID (2)
- Press Release (2)
- React Native (2)
- Start-Up Times (2)
- UI (2)
- VAST (2)
- VP9 (2)
- VPAID (2)
- VPAID2.0 (2)
- ad block detection (2)
- ad blocking (2)
- adobe (2)
- ads in HTML5 (2)
- analytics (2)
- android (2)
- captions (2)
- chromecast (2)
- chromecast support (2)
- clipping (2)
- closed captions (2)
- deloitte rising star (2)
- fast500 (2)
- frame accurate clipping (2)
- frame accurate seeking (2)
- metadata (2)
- multiple audio (2)
- playback speed (2)
- plugin-free (2)
- pricing (2)
- seamless transition (2)
- server-side ad replacement (2)
- subtitles (2)
- video publishers (2)
- viewer engagement (2)
- wowza (2)
- "smooth playback" (1)
- 360 Video (1)
- AOM (1)
- API (1)
- BVE (1)
- Best of Show (1)
- CEA-608 (1)
- CEA-708 (1)
- CORS (1)
- DIY (1)
- Edge (1)
- FCC (1)
- HLS stream (1)
- Hudl (1)
- LCEVC (1)
- Microsoft Azure Media Services (1)
- Monoscopic (1)
- NAB Show 2016 (1)
- NPM (1)
- NetOn.Live (1)
- OTT (1)
- Periscope (1)
- Real-time (1)
- SGAI (1)
- SIMID (1)
- Scale Up of the Year award (1)
- Seeking (1)
- Stereoscopic (1)
- Swisscom (1)
- TVB Europe (1)
- Tech Startup Day (1)
- Telenet (1)
- Uncategorized (1)
- University of Manitoba (1)
- User Interface (1)
- VR (1)
- VR180 (1)
- Vivaldi support (1)
- Vualto (1)
- adblock detection (1)
- apple tv (1)
- audio (1)
- autoplay (1)
- cloud (1)
- company news (1)
- facebook html5 (1)
- faster ABR (1)
- fmp4 (1)
- hiring (1)
- iGameMedia (1)
- iOS (1)
- iOS SDK (1)
- iPadOS (1)
- id3 (1)
- language localisation (1)
- micro moments (1)
- mobile ad (1)
- nagasoft (1)
- new web browser (1)
- offline playback (1)
- preloading (1)
- program-date-time (1)
- server-guided ad insertion (1)
- stream problems (1)
- streaming media east (1)
- support organization (1)
- thumbnails (1)
- use case (1)
- video clipping (1)
- video recording (1)
- video trends in 2016 (1)
- visibility (1)
- vulnerabilities (1)
- zero-day exploit (1)
- November 2024 (1)
- August 2024 (1)
- July 2024 (1)
- January 2024 (1)
- December 2023 (2)
- September 2023 (1)
- July 2023 (2)
- June 2023 (1)
- April 2023 (4)
- March 2023 (2)
- December 2022 (1)
- September 2022 (4)
- July 2022 (2)
- June 2022 (3)
- April 2022 (3)
- March 2022 (1)
- February 2022 (1)
- January 2022 (1)
- November 2021 (1)
- October 2021 (3)
- September 2021 (3)
- August 2021 (1)
- July 2021 (1)
- June 2021 (1)
- May 2021 (8)
- April 2021 (4)
- March 2021 (6)
- February 2021 (10)
- January 2021 (4)
- December 2020 (1)
- November 2020 (1)
- October 2020 (1)
- September 2020 (3)
- August 2020 (1)
- July 2020 (3)
- June 2020 (3)
- May 2020 (1)
- April 2020 (3)
- March 2020 (4)
- February 2020 (1)
- January 2020 (3)
- December 2019 (4)
- November 2019 (4)
- October 2019 (1)
- September 2019 (4)
- August 2019 (2)
- June 2019 (1)
- December 2018 (1)
- November 2018 (3)
- October 2018 (1)
- August 2018 (4)
- July 2018 (2)
- June 2018 (2)
- April 2018 (1)
- March 2018 (3)
- February 2018 (2)
- January 2018 (2)
- December 2017 (1)
- November 2017 (1)
- October 2017 (1)
- September 2017 (2)
- August 2017 (3)
- May 2017 (3)
- April 2017 (1)
- March 2017 (1)
- February 2017 (1)
- December 2016 (1)
- November 2016 (3)
- October 2016 (2)
- September 2016 (4)
- August 2016 (3)
- July 2016 (1)
- May 2016 (2)
- April 2016 (4)
- March 2016 (2)
- February 2016 (4)
- January 2016 (2)
- December 2015 (1)
- November 2015 (2)
- October 2015 (5)
- August 2015 (3)
- July 2015 (1)
- May 2015 (1)
- March 2015 (2)
- January 2015 (2)
- September 2014 (1)
- August 2014 (1)