{"id":442,"date":"2020-04-06T20:28:21","date_gmt":"2020-04-06T18:28:21","guid":{"rendered":"https:\/\/websites.fraunhofer.de\/video-dev\/?p=442"},"modified":"2023-05-26T11:14:59","modified_gmt":"2023-05-26T09:14:59","slug":"dash-js-common-media-client-data-cmcd","status":"publish","type":"post","link":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-common-media-client-data-cmcd\/","title":{"rendered":"dash.js &#8211; Common-Media-Client-Data"},"content":{"rendered":"\n<p>HTTP Live Streaming (HLS) and Dynamic Adaptive Streaming over HTTP (MPEG-DASH) are the two main formats used for adaptive streaming. While HLS is natively supported on most of its target platforms (iOS and MacOSX), external players are needed for MPEG-DASH. For browser-based environments, there is a great open-source option called <a href=\"https:\/\/github.com\/Dash-Industry-Forum\/dash.js\">dash.js<\/a>.&nbsp;It is written in JavaScript and use MediaSourceExtensions (MSE) and EncryptedMediaExtensions (EME) to enable playback directly in the browser without the need for external plugins. 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 focus on the concrete implementation of features in dash.js and how they can be used within applications. This time, we are looking at a specification called <strong>Common-Media-Client-Data (CTA-5004)<\/strong>, defined by CTA WAVE.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">CMCD &#8211; Who? How? What? Why?<\/h2>\n\n\n\n<p>Back when I was a kid, there was a very popular show called Sesame Street. To be honest, I don&#8217;t know what kids watch today, but the main message of the theme song is very valuable, even for technical blogs. The song goes something like this: &#8220;Who? How? What? Why? People who do not ask questions remain stupid&#8221;. That may be the <em>only<\/em> time something sounds better in German than in English. In any case, directing these questions towards the Common-Media-Client-Data (CMCD) specification will help us understand its purpose:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em>Who<\/em> <em>wrote CMCD?<\/em> The specification is an outcome of the CTA WAVE project (you can learn more about CTA WAVE <a href=\"https:\/\/cta.tech\/Resources\/Standards\/WAVE-Project\">here<\/a>). Essentially, the project consists of four different working groups that deal with different aspects of internet-delivered media.<\/li>\n\n\n\n<li><em>How<\/em> <em>is CMCD accessible? <\/em>The specification is currently under community review and accessible <a href=\"https:\/\/shop.cta.tech\/products\/web-application-video-ecosystem-common-media-client-data-cta-5004\">here<\/a>.<\/li>\n\n\n\n<li><em>What<\/em> <em>does CMCD specify?<\/em> CMCD defines data that is collected by a media streaming client and is sent to the CDN as a custom header or a custom query parameter alongside each segment or manifest request.<\/li>\n\n\n\n<li><em>Why<\/em> <em>do we need CMCD?<\/em> CMCD can help the CDN provider increase the overall performance of the CDN itself. Values defined in the specification can be useful for <em>&#8220;log analysis, QoS monitoring and delivery optimization&#8221;<\/em>. Additionally, CDNs can &#8220;<em>fine-tune their traffic<\/em> and <em>cross-correlated performance problems with player software versions or specific devices<\/em>&#8220;. <\/li>\n<\/ul>\n\n\n\n<p>So, to sum it up: with CMCD, the CDN provider improves the CDN performance while the user enjoys a better quality of experience.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">CMCD &#8211; Technical View<\/h2>\n\n\n\n<p>Now that we know what CMCD is about, we can dig deeper into the technical aspect of the specification.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">CMCD &#8211; Parameters<\/h3>\n\n\n\n<p>For starters, CMCD defines three types of identifiers: <em>content id<\/em>, <em>device id<\/em> and <em>session id<\/em>. These identifiers are unique strings that describe the current content, device and session. Using these identifiers, the CDN provider can detect potential problems with either the content itself, the device, a certain streaming session or a combination of all of them.<\/p>\n\n\n\n<p>Next to the identifiers, multiple streaming relevant metrics are defined in the specification:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Encoded bitrate: encoded bitrate of the audio or video object being requested.<\/li>\n\n\n\n<li>Buffer state: particular buffer states, such as b<em>uffer empty<\/em> or s<em>tartup<\/em>.<\/li>\n\n\n\n<li>Object duration: playback duration (in milliseconds) of the object being requested.<\/li>\n\n\n\n<li>Deadline: deadline from the request time until the first sample of this segment\/object needs to be available in order to prevent a buffer underrun or any other playback problems.<\/li>\n\n\n\n<li>Measured throughput: the throughput between the client and server, as measured by the client.<\/li>\n\n\n\n<li>Next object request: relative path of the next requested object.<\/li>\n\n\n\n<li>Object type: media type of the currently requested object. For instance, a manifest or a segment request.<\/li>\n\n\n\n<li>Playback rate: current playback rate on the client.<\/li>\n\n\n\n<li>Requested maximum throughput: requested maximum throughput that the client considers sufficient for the delivery of an asset.<\/li>\n\n\n\n<li>Streaming format: for example, DASH or HLS.<\/li>\n\n\n\n<li>Stream type: for example, VoD or live.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">CMCD &#8211; Delivery<\/h3>\n\n\n\n<p>Overall, there are several interesting and useful parameters. CMCD allows two ways in sending this data from the client to the CDN. One way is by adding a custom header to each request; the other is adding all parameters as a query object. Keep in mind, however, that a lot of CDNs reject requests with unknown headers. Consequently, we implemented the query parameter version in dash.js.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">CMCD with dash.js<\/h2>\n\n\n\n<p>Now that we&#8217;ve covered the theoretical aspects of the spec, we can move onto a more practical part, the implementation. To the best of my knowledge, dash.js is the only player that&#8217;s implemented the CMCD specification as of now. Let&#8217;s take a deeper look on how it works.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">CmcdModel<\/h3>\n\n\n\n<p>CmcdModel is the main class of the CMCD implementation in dash.js. It is responsible for collecting the required values from different parts of the player, as well as generating the final payload to send alongside the CDN request. Figure 1 illustrates the basic workflow in a simplified manner.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"541\" src=\"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/04\/cmcd.png\" alt=\"\" class=\"wp-image-450\" srcset=\"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/04\/cmcd.png 500w, https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/04\/cmcd-400x433.png 400w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><figcaption class=\"wp-element-caption\">Figure 1: CMCD implementation in dash.js<\/figcaption><\/figure>\n\n\n\n<p>In the bootstrap process of the player, CmcdModel registers for certain callback events, like manifestLoaded, playbackRateChanged and bufferLevelChanged. CmcdModel is a singleton class, and updates its internal state whenever it receives valid payload from one of those events. Before sending each request to the CDN, may it be a manifest request or a segment request, the HTTPLoader class will ask the CmcdModel for the CMCD-specific query parameter. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Building the Query String<\/h3>\n\n\n\n<p>In order to build the query string, CmcdModel internally distinguishes between different types of requests, namely, MPD, media segment and init segment requests, as illustrated below:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (request.type === HTTPRequest.MPD_TYPE) {\n     return _getCmcdDataForMpd(request);\n} else if (request.type === HTTPRequest.MEDIA_SEGMENT_TYPE) {\n     return _getCmcdDataForMediaSegment(request);\n} else if (request.type === HTTPRequest.INIT_SEGMENT_TYPE) {\n     return _getCmcdDataForInitSegment(request);\n}<\/code><\/pre>\n\n\n\n<p>This is mainly caused by the fact that requests for media segments require additional logic. For instance, we need to provide details on the type of media segment, which can be audio or video. Generic data, which is required by all of the different types of request objects, is provided by a generic function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    function _getGenericCmcdData() {\n        const data = {};\n\n        if (!isNaN(internalData.pr) &amp;&amp; internalData.pr !== 1 &amp;&amp; internalData.pr !== null) {\n            data.pr = internalData.pr;\n        }\n\n        if (internalData.st) {\n            data.st = internalData.st;\n        }\n\n        if (internalData.sf) {\n            data.sf = internalData.sf;\n        }\n\n        return data;\n    }<\/code><\/pre>\n\n\n\n<p>In the example above, you may have noticed that we used very short names for our variables. The CMCD specification tries to keep the required query string as short as possible &#8211; like sending &#8220;pr&#8221; instead of playback rate, or &#8220;sf&#8221; instead of streaming format. A complete list of the abbreviations can be found in <a href=\"https:\/\/shop.cta.tech\/products\/web-application-video-ecosystem-common-media-client-data-cta-5004\">specification<\/a> itself. <\/p>\n\n\n\n<p>The final decoded query string for a request to an audio segment can look like the following:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:\/\/dash.akamaized.net\/envivio\/EnvivioDash3\/v4_258-270146-i-17.m4s?Common-Media-Client-Data=v=1,sid=\"b248658d-1d1a-4039-91d0-8c08ba597da5\",cid=\"21cf726cfe3d937b5f974f72bb5bd06a\",did=\"dash.js-v3.0.3\",st=v,sf=d,br=130,ot=a,d=1997,mtp=17807,dl=31231<\/code><\/pre>\n\n\n\n<p>In this case, we specified a session id(sid), a content id(cid) and a device id(did). We also made some further specifications:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>stream type(st): VoD(v)<\/li>\n\n\n\n<li>streaming format(sf): DASH(d)<\/li>\n\n\n\n<li>bitrate of the requested segment(br): 130kbps<\/li>\n\n\n\n<li>object type(ot): audio(a)<\/li>\n\n\n\n<li>object duration(d): 1997ms<\/li>\n\n\n\n<li>measured throughput(mtp): 17807kbps <\/li>\n\n\n\n<li>deadline(dl): 31231ms <\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">How to Use CMCD Today<\/h2>\n\n\n\n<p>The current CMCD implementation was released in dash.js version 3.0.3. A concrete example on how to use it is available <a href=\"http:\/\/reference.dashif.org\/dash.js\/v3.0.3\/samples\/advanced\/cmcd.html\">here<\/a>. Feel free to leave comments below, we are happy to hear any feedback and\/or suggestions!<\/p>\n\n\n\n<p> If you have any question regarding our DASH activities or dash.js in particular, feel free to check out our <a onclick=\"wiredminds.trackEvent('TRACK-LINK: Link from:dashjs-cmcd to:go-dash')\" href=\"https:\/\/www.fokus.fraunhofer.de\/go\/dash\">website.<\/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 used for adaptive streaming. While HLS is natively supported on most of its target platforms (iOS and MacOSX), external players are needed for MPEG-DASH&#8230;.<\/p>\n","protected":false},"author":2,"featured_media":459,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,4,2,14],"tags":[],"coauthors":[6],"class_list":["post-442","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dash-js","category-media-source-extensions","category-mpeg-dash","category-video-quality-metrics"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>dash.js - Common-Media-Client-Data - Video-Dev<\/title>\n<meta name=\"description\" content=\"Implementation of Common-Media-Client-Data (CTA-5004) defined by CTA WAVE in dash.js.\" \/>\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-common-media-client-data-cmcd\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"dash.js - Common-Media-Client-Data - Video-Dev\" \/>\n<meta property=\"og:description\" content=\"Implementation of Common-Media-Client-Data (CTA-5004) defined by CTA WAVE in dash.js.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-common-media-client-data-cmcd\/\" \/>\n<meta property=\"og:site_name\" content=\"Video-Dev\" \/>\n<meta property=\"article:published_time\" content=\"2020-04-06T18:28:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-05-26T09:14:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/04\/Bildschirmfoto-2020-04-06-um-20.27.35.png\" \/>\n\t<meta property=\"og:image:width\" content=\"806\" \/>\n\t<meta property=\"og:image:height\" content=\"393\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\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-common-media-client-data-cmcd\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-common-media-client-data-cmcd\\\/\"},\"author\":{\"name\":\"Daniel Silhavy\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/#\\\/schema\\\/person\\\/f7e1eee3cb4eae87a59648195014a809\"},\"headline\":\"dash.js &#8211; Common-Media-Client-Data\",\"datePublished\":\"2020-04-06T18:28:21+00:00\",\"dateModified\":\"2023-05-26T09:14:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-common-media-client-data-cmcd\\\/\"},\"wordCount\":1160,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-common-media-client-data-cmcd\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/Bildschirmfoto-2020-04-06-um-20.27.35.png\",\"articleSection\":[\"dash.js\",\"Media Source Extensions\",\"MPEG-DASH\",\"Video Quality Metrics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-common-media-client-data-cmcd\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-common-media-client-data-cmcd\\\/\",\"url\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-common-media-client-data-cmcd\\\/\",\"name\":\"dash.js - Common-Media-Client-Data - Video-Dev\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-common-media-client-data-cmcd\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-common-media-client-data-cmcd\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/Bildschirmfoto-2020-04-06-um-20.27.35.png\",\"datePublished\":\"2020-04-06T18:28:21+00:00\",\"dateModified\":\"2023-05-26T09:14:59+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/#\\\/schema\\\/person\\\/f7e1eee3cb4eae87a59648195014a809\"},\"description\":\"Implementation of Common-Media-Client-Data (CTA-5004) defined by CTA WAVE in dash.js.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-common-media-client-data-cmcd\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-common-media-client-data-cmcd\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-common-media-client-data-cmcd\\\/#primaryimage\",\"url\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/Bildschirmfoto-2020-04-06-um-20.27.35.png\",\"contentUrl\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/Bildschirmfoto-2020-04-06-um-20.27.35.png\",\"width\":806,\"height\":393},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/dash-js-common-media-client-data-cmcd\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"dash.js &#8211; Common-Media-Client-Data\"}]},{\"@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 - Common-Media-Client-Data - Video-Dev","description":"Implementation of Common-Media-Client-Data (CTA-5004) defined by CTA WAVE in dash.js.","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-common-media-client-data-cmcd\/","og_locale":"en_US","og_type":"article","og_title":"dash.js - Common-Media-Client-Data - Video-Dev","og_description":"Implementation of Common-Media-Client-Data (CTA-5004) defined by CTA WAVE in dash.js.","og_url":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-common-media-client-data-cmcd\/","og_site_name":"Video-Dev","article_published_time":"2020-04-06T18:28:21+00:00","article_modified_time":"2023-05-26T09:14:59+00:00","og_image":[{"width":806,"height":393,"url":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/04\/Bildschirmfoto-2020-04-06-um-20.27.35.png","type":"image\/png"}],"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-common-media-client-data-cmcd\/#article","isPartOf":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-common-media-client-data-cmcd\/"},"author":{"name":"Daniel Silhavy","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/#\/schema\/person\/f7e1eee3cb4eae87a59648195014a809"},"headline":"dash.js &#8211; Common-Media-Client-Data","datePublished":"2020-04-06T18:28:21+00:00","dateModified":"2023-05-26T09:14:59+00:00","mainEntityOfPage":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-common-media-client-data-cmcd\/"},"wordCount":1160,"commentCount":0,"image":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-common-media-client-data-cmcd\/#primaryimage"},"thumbnailUrl":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/04\/Bildschirmfoto-2020-04-06-um-20.27.35.png","articleSection":["dash.js","Media Source Extensions","MPEG-DASH","Video Quality Metrics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-common-media-client-data-cmcd\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-common-media-client-data-cmcd\/","url":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-common-media-client-data-cmcd\/","name":"dash.js - Common-Media-Client-Data - Video-Dev","isPartOf":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/#website"},"primaryImageOfPage":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-common-media-client-data-cmcd\/#primaryimage"},"image":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-common-media-client-data-cmcd\/#primaryimage"},"thumbnailUrl":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/04\/Bildschirmfoto-2020-04-06-um-20.27.35.png","datePublished":"2020-04-06T18:28:21+00:00","dateModified":"2023-05-26T09:14:59+00:00","author":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/#\/schema\/person\/f7e1eee3cb4eae87a59648195014a809"},"description":"Implementation of Common-Media-Client-Data (CTA-5004) defined by CTA WAVE in dash.js.","breadcrumb":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-common-media-client-data-cmcd\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-common-media-client-data-cmcd\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-common-media-client-data-cmcd\/#primaryimage","url":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/04\/Bildschirmfoto-2020-04-06-um-20.27.35.png","contentUrl":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/04\/Bildschirmfoto-2020-04-06-um-20.27.35.png","width":806,"height":393},{"@type":"BreadcrumbList","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-common-media-client-data-cmcd\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/websites.fraunhofer.de\/video-dev\/"},{"@type":"ListItem","position":2,"name":"dash.js &#8211; Common-Media-Client-Data"}]},{"@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\/442","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=442"}],"version-history":[{"count":28,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/posts\/442\/revisions"}],"predecessor-version":[{"id":1544,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/posts\/442\/revisions\/1544"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/media\/459"}],"wp:attachment":[{"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/media?parent=442"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/categories?post=442"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/tags?post=442"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/coauthors?post=442"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}