<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://nielsentest.mywikis.net/w/index.php?action=history&amp;feed=atom&amp;title=DCR_Chromecast_browser_SDK</id>
	<title>DCR Chromecast browser SDK - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://nielsentest.mywikis.net/w/index.php?action=history&amp;feed=atom&amp;title=DCR_Chromecast_browser_SDK"/>
	<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Chromecast_browser_SDK&amp;action=history"/>
	<updated>2026-04-09T17:13:22Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Chromecast_browser_SDK&amp;diff=6510&amp;oldid=prev</id>
		<title>NickParrucci: /* SENDER side */</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Chromecast_browser_SDK&amp;diff=6510&amp;oldid=prev"/>
		<updated>2023-09-05T18:27:10Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;SENDER side&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:27, 5 September 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l136&quot;&gt;Line 136:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 136:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;           	  &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;           	  &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	};&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	};&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       window.nolSDKInstance.ggPM(&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;15&lt;/del&gt;, contentMetadata);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       window.nolSDKInstance.ggPM(&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;'loadMetadata'&lt;/ins&gt;, contentMetadata);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	   var ottMetadataObject ={&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	   var ottMetadataObject ={&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			ottStatus: &amp;quot;1&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			ottStatus: &amp;quot;1&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>NickParrucci</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Chromecast_browser_SDK&amp;diff=6470&amp;oldid=prev</id>
		<title>NickParrucci: Created page with &quot;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp; DTVR}}  {{CurrentBreadcrumb}} Category:Digital  == 1. General Cast architecture == &lt;br /&gt; File:GeneralCastArch....&quot;</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Chromecast_browser_SDK&amp;diff=6470&amp;oldid=prev"/>
		<updated>2023-07-31T19:07:19Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}} &lt;a href=&quot;/wiki/Category:Digital&quot; title=&quot;Category:Digital&quot;&gt;Category:Digital&lt;/a&gt;  == 1. General Cast architecture == &amp;lt;br /&amp;gt; File:GeneralCastArch....&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== 1. General Cast architecture ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:GeneralCastArch.png||600px|center|]]&lt;br /&gt;
See https://developers.google.com/cast/docs/developers&lt;br /&gt;
&lt;br /&gt;
=== Sender App ===&lt;br /&gt;
is a user controlled JavaScript/HTML5 application which can run on browsers in mobile or desktop devices.&lt;br /&gt;
&lt;br /&gt;
=== Receiver App ===&lt;br /&gt;
is an HTML5/JavaScript application placed at a custom URL that handles communication between the Sender app and the Chromecast device.&lt;br /&gt;
&lt;br /&gt;
== 2. Cast scenarios ==&lt;br /&gt;
&lt;br /&gt;
=== 2.1 Pure casting scenario === &lt;br /&gt;
In the Pure casting scenario the video plays on the Chromecast device, while playback stops on the sender app &amp;lt;br /&amp;gt;&lt;br /&gt;
The sender app should not pass any Nielsen API calls once the pure casting scenario starts. All Nielsen API calls are handled by the receiver app.&lt;br /&gt;
[[File:NielsenChromecastCast.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Chromecast mirroring scenario ===&lt;br /&gt;
In the Chromecast mirroring scenario the video plays on both the sender and receiver apps.  &amp;lt;br /&amp;gt; &lt;br /&gt;
[[File:NielsenChromecastMirror.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
== 3.Sender App JavaScript - Nielsen Browser SDK implementation ==&lt;br /&gt;
&lt;br /&gt;
=== 3.1 General ===&lt;br /&gt;
By adding the below cast-specific API calls alongside the standard implementation of the Nielsen Browser SDK, a sender app can pass appropriate cast-specific metadata.&lt;br /&gt;
&lt;br /&gt;
=== 3.2 API calls ===&lt;br /&gt;
&lt;br /&gt;
==== 3.2.1 updateOTT ====&lt;br /&gt;
The below call should be made to the Browser SDK whenever the player switches from not casting to casting and vice versa.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
nolSDKInstance.ggPM('updateOTT',contentMetadataObject);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Use the updateOTT method to notify the casting BrowserSDK instance whether the remote OTT device (like Google ChromeCast, Roku, Amazon FireTV, etc.) is connected or disconnected (indicated by &amp;quot;ottStatus&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
When the OTT device is connected, call updateOTT with &amp;quot;ottStatus&amp;quot;: &amp;quot;1&amp;quot; as well as a set of OTT device related parameters in the contentMetadataObject.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var contentMetadataObject ={&lt;br /&gt;
        type: &amp;quot;content&amp;quot;,&lt;br /&gt;
        ottStatus: &amp;quot;1&amp;quot;,&lt;br /&gt;
        ottType: &amp;quot;casting&amp;quot;,&lt;br /&gt;
        ottDevice: &amp;quot;chromecast&amp;quot;,&lt;br /&gt;
        ottDeviceName: &amp;quot;Google Chromecast&amp;quot;,&lt;br /&gt;
        ottDeviceID: nolSDKInstance.getId(),&lt;br /&gt;
        ottDeviceManufacturer: &amp;quot;Google&amp;quot;,&lt;br /&gt;
        ottDeviceModel: &amp;quot;ChromeCastModel&amp;quot;,&lt;br /&gt;
        ottDeviceVersion: &amp;quot;1.0.0&amp;quot; &lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the OTT device is disconnected, call updateOTT with “ottStatus”: “0”.&lt;br /&gt;
&lt;br /&gt;
==== 3.2.2 getOptOutStatus() and sessionId ====&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Assign the below mediaInfo metadata parameters in the target load so that they may be passed to the receiver at the beginning of the casting session.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
mediaInfo.metadata.kGCKMetadataNlsKeyDeviceID = nolSDKInstance.sessionId; //Session Id&lt;br /&gt;
mediaInfo.metadata.kGCKMetadataNlsKeyOptout   = nolSDKInstance.getOptOutStatus(); //OptOut status&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Below is a sample code snippet on how the sender browser app should retrieve and relay the information from sender to receiver app.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        var mediaInfo = new chrome.cast.media.MediaInfo(&lt;br /&gt;
         this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');&lt;br /&gt;
&lt;br /&gt;
        mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();&lt;br /&gt;
        mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;&lt;br /&gt;
        mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];&lt;br /&gt;
        mediaInfo.metadata.length = this.currentMediaDuration;&lt;br /&gt;
        mediaInfo.metadata.images = [&lt;br /&gt;
            {'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']}];&lt;br /&gt;
&lt;br /&gt;
        /*Adding custom parameters in metadata to be passed to receiver*/&lt;br /&gt;
        mediaInfo.metadata.kGCKMetadataNlsKeyDeviceID = nolSDKInstance.sessionId; //Session Id&lt;br /&gt;
        mediaInfo.metadata.kGCKMetadataNlsKeyOptout   = nolSDKInstance.getOptOutStatus(); //OptOut status&lt;br /&gt;
&lt;br /&gt;
        var request = new chrome.cast.media.LoadRequest(mediaInfo);&lt;br /&gt;
          castSession.loadMedia(request).then(&lt;br /&gt;
           this.playerHandler.loaded.bind(this.playerHandler),&lt;br /&gt;
           function (errorCode) {&lt;br /&gt;
             this.playerState = PLAYER_STATE.ERROR;&lt;br /&gt;
             console.log('Remote media load error: ' +&lt;br /&gt;
               CastPlayer.getErrorMessage(errorCode));&lt;br /&gt;
          }.bind(this));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. Summary - Sequence of API calls  ==&lt;br /&gt;
Below is the sequence of API calls from the beginning to the end of casting.&lt;br /&gt;
&lt;br /&gt;
=== SENDER side ===&lt;br /&gt;
1) If the video is playing only on the Sender App, the standard Nielsen Browser SDK API calls should be invoked.&amp;lt;br /&amp;gt; &lt;br /&gt;
2) Once a user presses the cast icon and if the video is playing already, call browser sdk '''end()''' api. &amp;lt;br /&amp;gt;&lt;br /&gt;
3) Inform the Browser SDK about the Chromecast's status (connected or disconnected) by calling '''updateOTT()''' and passing metadata object. &amp;lt;br /&amp;gt; &lt;br /&gt;
4) Retrieve the OptOutStatus and sessionId.&amp;lt;br /&amp;gt;&lt;br /&gt;
5) Pass the optOutStatus and sessionId into the MediaInfo metadata object.&amp;lt;br /&amp;gt; &lt;br /&gt;
6) When the Start casting (the video should be stopped on the sender device).&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== RECEIVER side === &lt;br /&gt;
Playback has started at ChromeCast device (TV).&amp;lt;br /&amp;gt;&lt;br /&gt;
7) Retrieve the MediaInfo metadata sent by the sender device. &amp;lt;br /&amp;gt;&lt;br /&gt;
8) [https://engineeringportal.nielsen.com/docs/DCR_Video_Browser_SDK#Initialization_API_Call Instantiate] the Browser SDK. &amp;lt;br /&amp;gt;&lt;br /&gt;
9) Pass content/ad metadata by calling '''loadMetaData()'''. &amp;lt;br /&amp;gt;&lt;br /&gt;
10) Send '''updateOTT''' event to BSDK receiver instance, to relay the sender OTT metadata ( kGCKMetadataNlsKeyDeviceID and kGCKMetadataNlsKeyOptout) received from sender app.&amp;lt;br /&amp;gt;&lt;br /&gt;
11) Pass content/ad playheads every second by calling '''setPlayheadPosition()'''. &amp;lt;br /&amp;gt;&lt;br /&gt;
12) Based on the user's interactions or the playlist state, call '''stop()''' (once paused) or '''end()''' (once the content or casting has ended).&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SENDER side ===&lt;br /&gt;
Casting has ended and playback resumes on the sender device.&amp;lt;br /&amp;gt;&lt;br /&gt;
13) Start a new session by calling content/ad '''loadMetaData()'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
14) Continue sending API calls as usual.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a sample code snippet on how the receiver app should retrieve the ottMetadata received from sender apps and relay the information  to receiver BSDK instance.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
sampleplayer.CastPlayer.prototype.onLoad_ = function(event) {&lt;br /&gt;
var senderMetadata = event.data.media.metadata,&lt;br /&gt;
sessionId = senderMetadata.kGCKMetadataNlsKeyDeviceID,&lt;br /&gt;
optout = senderMetadata.kGCKMetadataNlsKeyOptout;&lt;br /&gt;
  this.cancelDeferredPlay_('new media is loaded');&lt;br /&gt;
  this.load(new cast.receiver.MediaManager.LoadInfo( (event.data),  event.senderId));&lt;br /&gt;
	var contentMetadata = {&lt;br /&gt;
         	   &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
          	  &amp;quot;dataSrc&amp;quot;: &amp;quot;cms&amp;quot;,&lt;br /&gt;
           	 &amp;quot;assetid&amp;quot;: &amp;quot;vid-123&amp;quot;,&lt;br /&gt;
          	  &amp;quot;assetName&amp;quot;: &amp;quot;Test video&amp;quot;,&lt;br /&gt;
           	 &amp;quot;program&amp;quot;: &amp;quot;Test program&amp;quot;,&lt;br /&gt;
          	  &amp;quot;title&amp;quot;: &amp;quot;Clickbaby&amp;quot;,&lt;br /&gt;
          	  &amp;quot;length&amp;quot;:”60”,&lt;br /&gt;
          	  &amp;quot;segA&amp;quot;: &amp;quot;CustomSegmentValueA&amp;quot;,&lt;br /&gt;
          	  &amp;quot;segB&amp;quot;: &amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
          	  &amp;quot;segC&amp;quot;: &amp;quot;CustomSegmentValueC&amp;quot;&lt;br /&gt;
	};&lt;br /&gt;
      window.nolSDKInstance.ggPM(15, contentMetadata);&lt;br /&gt;
	   var ottMetadataObject ={&lt;br /&gt;
			ottStatus: &amp;quot;1&amp;quot;,&lt;br /&gt;
			ottType: &amp;quot;casting&amp;quot;,&lt;br /&gt;
			ottDevice: &amp;quot;chromecast&amp;quot;,&lt;br /&gt;
			ottDeviceName: &amp;quot;Google Chromecast&amp;quot;,&lt;br /&gt;
			ottDeviceID: nolSDKInstance.getId(),&lt;br /&gt;
			ottDeviceManufacturer: &amp;quot;Google&amp;quot;,&lt;br /&gt;
			ottDeviceModel: &amp;quot;ChromeCastModel&amp;quot;,&lt;br /&gt;
			ottDeviceVersion: &amp;quot;1.0.0&amp;quot;, &lt;br /&gt;
			kGCKMetadataNlsKeyOptout : optout,&lt;br /&gt;
		    kGCKMetadataNlsKeyDeviceID : sessionId	&lt;br /&gt;
		  };&lt;br /&gt;
window.nolSDKInstance.ggPM('updateOTT', ottMetadataObject);};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Chromecast Developer Documentation: &amp;lt;https://developers.google.com/cast/docs/developers&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Browser SDK API Reference: &amp;lt;https://engineeringportal.nielsen.com/docs/Browser_SDK_API_Reference&amp;gt; &amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>NickParrucci</name></author>
	</entry>
</feed>