{"id":48,"date":"2019-06-20T17:09:36","date_gmt":"2019-06-20T15:09:36","guid":{"rendered":"https:\/\/websites.fraunhofer.de\/video-dev\/?p=48"},"modified":"2019-08-23T11:32:14","modified_gmt":"2019-08-23T09:32:14","slug":"dash-js-license-acquisition-for-multiple-eme-versions","status":"publish","type":"post","link":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-license-acquisition-for-multiple-eme-versions\/","title":{"rendered":"dash.js: License acquisition for multiple EME versions"},"content":{"rendered":"\n<p>HTTP Live Streaming (HLS) and Dynamic Adaptive Streaming over HTTP (MPEG-DASH) are the two main formats for adaptive streaming. While HLS is natively supported on most of its target platforms (iOS and MacOSX), we need external players for MPEG-DASH. For browser based environments, there are two great open-source options, namely&nbsp;<a href=\"https:\/\/github.com\/google\/shaka-player\">shaka-player<\/a>&nbsp;and&nbsp;<a href=\"https:\/\/github.com\/Dash-Industry-Forum\/dash.js\">dash.js<\/a>.&nbsp; Both are written in JavaScript and use the MediaSourceExtensions (MSE) and EncryptedMediaExtensions (EME) to enable playback directly in the browser without the need for external plugins. Both offer a wide set of features and have an active community. Shaka-player is maintained and developed by Google, dash.js is the official reference player of the&nbsp;<a href=\"https:\/\/dashif.org\/\">DASH Industry Forum<\/a>.&nbsp;<\/p>\n\n\n\n<p>In this series of blog posts I will focus on dash.js. I will explain how certain features are implemented and how they can be used within applications. Today we are taking a closer look on the license acquisition process and how dash.js supports different versions of the Encrypted Media Extensions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why we need support for multiple EME versions<\/h2>\n\n\n\n<p><br>The&nbsp;<a href=\"https:\/\/www.w3.org\/TR\/encrypted-media\/\">EME<\/a>&nbsp;is the API that enables playback of protected content in the browser. It provides the necessary function calls to discover and interact with the underlying DRM system. EME was published as a W3C recommendation at 18.September 2017. However, many companies have adopted EME much earlier. In 2013 Netflix published a&nbsp;<a href=\"https:\/\/medium.com\/netflix-techblog\/html5-video-at-netflix-721d1f143979\">blog post<\/a>&nbsp;in which they shared their intent to move away from Silverlight to an MSE\/EME stack. At this time, they already had a working player on the Google Chromebook using the two new APIs.&nbsp;<\/p>\n\n\n\n<p>Like any other API, EME changed over time and the current version is a lot different compared to the one in 2013. While desktop and mobile browsers are frequently updated, some embedded devices and set-top boxes are still running on outdated or even customized versions of the EME. For that reason we need a player which detects the EME version on the client and triggers the right API functions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Different EME versions in dash.js<\/h2>\n\n\n\n<p>By default, dash.js comes with support for three different versions of EME:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><em>ProtectionModel_01b.js<\/em>: initial implementation of the EME, implemented by Google Chrome prior to version 36. This EME version is not-promised based and uses outdated or prefixed events like \u201cneedkey\u201d or \u201cwebkitneedkey\u201d.<\/li><li><em>ProtectionModel_3Feb2014.js<\/em>:&nbsp; implementation of EME APIs as of the 3 Feb 2014 state of the specification.&nbsp;Implemented by Internet Explorer 11 (Windows 8.1).&nbsp;<\/li><li><em>ProtectionModel_21Jan2015.js<\/em>: most recent EME implementation. Latest changes in the EME specification are added to this model and It supports the promised-based EME function calls.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">How to select the right EME version<\/h2>\n\n\n\n<p>Ideally, we only want to inject the correct EME version once the player is initialized. This is exactly how dash.js does it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> if ((!videoElement || videoElement.onencrypted !== undefined) &amp;&amp;\n            (!videoElement || videoElement.mediaKeys !== undefined)) {\n            return ProtectionModel_21Jan2015\n        } \n\nelse if (getAPI(videoElement, APIS_ProtectionModel_3Feb2014)) {\n            return ProtectionModel_3Feb2014 \n        } \n\nelse if (getAPI(videoElement, APIS_ProtectionModel_01b)) {\n            return ProtectionModel_01b\n        } <\/code><\/pre>\n\n\n\n<p>For means of simplicity, I removed the actual instantiation of the protection models. The player checks for the correct EME version in reversed order. That way, the latest available EME version is selected and the appropriate&nbsp;<em>ProtectionModel<\/em>&nbsp;is returned to the controlling entity (&nbsp;<em>ProtectionController.js<\/em>) . At this point, we could also plug in our own protection model to support customized versions of the EME.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The big picture<\/h2>\n\n\n\n<p>Now that we know how the EME version is selected, we can go through the entire license acquisition process.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Detecting encrypted content<\/h3>\n\n\n\n<p>First of all, we need to check to see if our content is encrypted. In general, the information in regards to if and how the content is encrypted can either be part of the manifest file or\/and be embedded in the media segments. Let\u2019s assume the latter. If the content is encrypted, we will receive an&nbsp;<em>encrypted<\/em>&nbsp;event from the browser. We register for that type of event and pass the DRM initialization data to our callback function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> case 'encrypted':\n   if (event.initData) {\n         let initData = event.initData\n         eventBus.trigger(events.NEED_KEY, \n                    {key:new NeedKey(initData, event.initDataType)});\n     }<\/code><\/pre>\n\n\n\n<p>By parsing the initialization data, we can identify which DRM systems can be used in order to decrypt the content. For instance, one content might require a Playready DRM while another one supports Playready and Widevine.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Requesting access to the DRM system<\/h3>\n\n\n\n<p>Before trying to decrypt the content, we need to check if our platform supports one of the required DRM systems. For that purpose, the&nbsp;<em>requestMediaKeySystemAccess()<\/em>&nbsp;function of the EME is used. A successful call to this function will return a&nbsp;<em>MediaKeySystemAccess<\/em>&nbsp;object.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Selecting the right DRM system<\/h3>\n\n\n\n<p>Some platforms have multiple DRMs available \u2013 for instance, Playready and Widevine at the same time. From my experience, dash.js will choose the first valid configuration. Thus, to guarantee a consistent behavior, the content provider should write the initialization data (PSSH boxes) in the media segments in chronological order.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Generating the payload for the license request<\/h3>\n\n\n\n<p>Using the&nbsp;<em>MediaKeySystemAccess<\/em>&nbsp;object, we can now create&nbsp;<em>MediaKeys<\/em>&nbsp;and assign them to the HTML5 video element. Later on, <em>MediaKeys<\/em>&nbsp;will be used to decrypt our content:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> keySystemAccess.mksa.createMediaKeys()\n    .then(function (mkeys) {\n            mediaKeys = mkeys;\n            videoElement.setMediaKeys(mediaKeys)\n                  .then(function () {             \n                     \/\/ Cool it worked\n                   });\n            }<\/code><\/pre>\n\n\n\n<p>In order to receive a valid license for our content, we need to add a payload to our license request. For that purpose, we create a&nbsp;<em>MediaKeySession<\/em>&nbsp;in which we call the&nbsp;<em>generateRequest()<\/em>&nbsp;function.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const session = mediaKeys.createSession(sessionType);\nsession.generateRequest(dataType, initData)\n    .then(function () {\n         \/\/ Request generated\n        })\n    .catch(function (error) {\n        \/\/ Ups this is not good \n        });<\/code><\/pre>\n\n\n\n<p>The browser will forward this request to the underlying Content Decryption Module (CDM). As a result, the CDM generates the payload for our license request.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. Sending the license request<\/h3>\n\n\n\n<p>When the CDM has generated the required payload, the data is forwarded to the browser. By registering for the&nbsp;<em>message<\/em>&nbsp;event, we are able to grab everything we need:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>case 'message':\n   let message = ArrayBuffer.isView(event.message) ? event.message.buffer : event.message; <\/code><\/pre>\n\n\n\n<p>Now we can finally issue our license request with&nbsp;<em>reqPayload<\/em>&nbsp;derived from the previous key message:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>doLicenseRequest(url, reqHeaders, reqMethod, responseType, withCredentials, reqPayload, LICENSE_SERVER_REQUEST_RETRIES, timeout, onLoad, onAbort, onError);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">6. Working with the license response<\/h3>\n\n\n\n<p>Let\u2019s say our license server likes what he sees and returns a valid license. All we have to do now is update our&nbsp;<em>MediaKeySession<\/em>&nbsp;with the data we received from the license server:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>session.update(message).catch(function (error) {\n    \/\/ Please don't throw an error\n});<\/code><\/pre>\n\n\n\n<p>At this point, we have everything we need to play our content. The rest is up to the browser and CDM.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>This concludes our small example of the license acquisition process in dash.js. In reality, the complete process is a little more complicated due to dealing with different response formats, request headers and so on. Nevertheless, the steps remain the same, at least for the current version of the EME. If you want to find out more about our work on DRM, check out our website <a href=\"https:\/\/www.fokus.fraunhofer.de\/go\/dash\" onclick=\"wiredminds.trackEvent('TRACK-LINK: Link from:multiple-eme-versions to:go-drm')\">https:\/\/www.fokus.fraunhofer.de\/go\/drm<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>HTTP Live Streaming (HLS) and Dynamic Adaptive Streaming over HTTP (MPEG-DASH) are the two main formats for adaptive streaming. While HLS is natively supported on most of its target platforms (iOS and MacOSX), we need external players for MPEG-DASH. For&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,9,5,4,2,11,10],"tags":[],"coauthors":[6],"class_list":["post-48","post","type-post","status-publish","format-standard","hentry","category-dash-js","category-drm","category-encrypted-media-extensions","category-media-source-extensions","category-mpeg-dash","category-playready","category-widevine"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>dash.js: License acquisition for multiple EME versions - Video-Dev<\/title>\n<meta name=\"description\" content=\"Today we are taking a closer look on the license acquisition process and how dash.js supports different versions of the Encrypted Media Extensions.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-license-acquisition-for-multiple-eme-versions\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"dash.js: License acquisition for multiple EME versions - Video-Dev\" \/>\n<meta property=\"og:description\" content=\"Today we are taking a closer look on the license acquisition process and how dash.js supports different versions of the Encrypted Media Extensions.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-license-acquisition-for-multiple-eme-versions\/\" \/>\n<meta property=\"og:site_name\" content=\"Video-Dev\" \/>\n<meta property=\"article:published_time\" content=\"2019-06-20T15:09:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-08-23T09:32:14+00:00\" \/>\n<meta name=\"author\" content=\"Daniel Silhavy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@dsilhavy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Silhavy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-license-acquisition-for-multiple-eme-versions\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-license-acquisition-for-multiple-eme-versions\\\/\"},\"author\":{\"name\":\"Daniel Silhavy\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/#\\\/schema\\\/person\\\/f7e1eee3cb4eae87a59648195014a809\"},\"headline\":\"dash.js: License acquisition for multiple EME versions\",\"datePublished\":\"2019-06-20T15:09:36+00:00\",\"dateModified\":\"2019-08-23T09:32:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-license-acquisition-for-multiple-eme-versions\\\/\"},\"wordCount\":1082,\"commentCount\":0,\"articleSection\":[\"dash.js\",\"DRM\",\"Encrypted Media Extensions\",\"Media Source Extensions\",\"MPEG-DASH\",\"Playready\",\"Widevine\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-license-acquisition-for-multiple-eme-versions\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-license-acquisition-for-multiple-eme-versions\\\/\",\"url\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-license-acquisition-for-multiple-eme-versions\\\/\",\"name\":\"dash.js: License acquisition for multiple EME versions - Video-Dev\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/#website\"},\"datePublished\":\"2019-06-20T15:09:36+00:00\",\"dateModified\":\"2019-08-23T09:32:14+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/#\\\/schema\\\/person\\\/f7e1eee3cb4eae87a59648195014a809\"},\"description\":\"Today we are taking a closer look on the license acquisition process and how dash.js supports different versions of the Encrypted Media Extensions.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-license-acquisition-for-multiple-eme-versions\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-license-acquisition-for-multiple-eme-versions\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-license-acquisition-for-multiple-eme-versions\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"dash.js: License acquisition for multiple EME versions\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/#website\",\"url\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/\",\"name\":\"Video-Dev\",\"description\":\"Future Applications and Media - Video Development Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/#\\\/schema\\\/person\\\/f7e1eee3cb4eae87a59648195014a809\",\"name\":\"Daniel Silhavy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/0-1-150x150.jpegccb13c1b60303228bf3c575f3345fe29\",\"url\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/0-1-150x150.jpeg\",\"contentUrl\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/0-1-150x150.jpeg\",\"caption\":\"Daniel Silhavy\"},\"description\":\"Daniel Silhavy studied Computer Science at the Technical University of Berlin (TUB). He received his Masters degree with the completion of his thesis \u201cAd Insertion in MPEG-DASH\u201d at Fraunhofer Institute for Open Communication Systems (FOKUS) in 2015. Currently, he is employed as a scientific assistant and project manager at the Business Unit Future Applications and Media (FAME). He specializes in the R&amp;D of topics dealing with IPTV and adaptive media streaming.\",\"sameAs\":[\"https:\\\/\\\/www.fokus.fraunhofer.de\\\/fame\\\/team\\\/silhavy\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/daniel-silhavy-21650a129\\\/\",\"https:\\\/\\\/x.com\\\/dsilhavy\"],\"url\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/author\\\/silhavy\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"dash.js: License acquisition for multiple EME versions - Video-Dev","description":"Today we are taking a closer look on the license acquisition process and how dash.js supports different versions of the Encrypted Media Extensions.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-license-acquisition-for-multiple-eme-versions\/","og_locale":"en_US","og_type":"article","og_title":"dash.js: License acquisition for multiple EME versions - Video-Dev","og_description":"Today we are taking a closer look on the license acquisition process and how dash.js supports different versions of the Encrypted Media Extensions.","og_url":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-license-acquisition-for-multiple-eme-versions\/","og_site_name":"Video-Dev","article_published_time":"2019-06-20T15:09:36+00:00","article_modified_time":"2019-08-23T09:32:14+00:00","author":"Daniel Silhavy","twitter_card":"summary_large_image","twitter_creator":"@dsilhavy","twitter_misc":{"Written by":"Daniel Silhavy","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-license-acquisition-for-multiple-eme-versions\/#article","isPartOf":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-license-acquisition-for-multiple-eme-versions\/"},"author":{"name":"Daniel Silhavy","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/#\/schema\/person\/f7e1eee3cb4eae87a59648195014a809"},"headline":"dash.js: License acquisition for multiple EME versions","datePublished":"2019-06-20T15:09:36+00:00","dateModified":"2019-08-23T09:32:14+00:00","mainEntityOfPage":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-license-acquisition-for-multiple-eme-versions\/"},"wordCount":1082,"commentCount":0,"articleSection":["dash.js","DRM","Encrypted Media Extensions","Media Source Extensions","MPEG-DASH","Playready","Widevine"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-license-acquisition-for-multiple-eme-versions\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-license-acquisition-for-multiple-eme-versions\/","url":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-license-acquisition-for-multiple-eme-versions\/","name":"dash.js: License acquisition for multiple EME versions - Video-Dev","isPartOf":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/#website"},"datePublished":"2019-06-20T15:09:36+00:00","dateModified":"2019-08-23T09:32:14+00:00","author":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/#\/schema\/person\/f7e1eee3cb4eae87a59648195014a809"},"description":"Today we are taking a closer look on the license acquisition process and how dash.js supports different versions of the Encrypted Media Extensions.","breadcrumb":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-license-acquisition-for-multiple-eme-versions\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-license-acquisition-for-multiple-eme-versions\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-license-acquisition-for-multiple-eme-versions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/websites.fraunhofer.de\/video-dev\/"},{"@type":"ListItem","position":2,"name":"dash.js: License acquisition for multiple EME versions"}]},{"@type":"WebSite","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/#website","url":"https:\/\/websites.fraunhofer.de\/video-dev\/","name":"Video-Dev","description":"Future Applications and Media - Video Development Blog","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/websites.fraunhofer.de\/video-dev\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/#\/schema\/person\/f7e1eee3cb4eae87a59648195014a809","name":"Daniel Silhavy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2019\/11\/0-1-150x150.jpegccb13c1b60303228bf3c575f3345fe29","url":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2019\/11\/0-1-150x150.jpeg","contentUrl":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2019\/11\/0-1-150x150.jpeg","caption":"Daniel Silhavy"},"description":"Daniel Silhavy studied Computer Science at the Technical University of Berlin (TUB). He received his Masters degree with the completion of his thesis \u201cAd Insertion in MPEG-DASH\u201d at Fraunhofer Institute for Open Communication Systems (FOKUS) in 2015. Currently, he is employed as a scientific assistant and project manager at the Business Unit Future Applications and Media (FAME). He specializes in the R&amp;D of topics dealing with IPTV and adaptive media streaming.","sameAs":["https:\/\/www.fokus.fraunhofer.de\/fame\/team\/silhavy","https:\/\/www.linkedin.com\/in\/daniel-silhavy-21650a129\/","https:\/\/x.com\/dsilhavy"],"url":"https:\/\/websites.fraunhofer.de\/video-dev\/author\/silhavy\/"}]}},"_links":{"self":[{"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/posts\/48","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/comments?post=48"}],"version-history":[{"count":7,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/posts\/48\/revisions"}],"predecessor-version":[{"id":229,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/posts\/48\/revisions\/229"}],"wp:attachment":[{"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/media?parent=48"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/categories?post=48"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/tags?post=48"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/coauthors?post=48"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}