Conviva Xbox One/Windows: MediaPlayer/MediaElement Sensor Integration

Follow these instructions to complete the Conviva VSI Sensor integration on Windows/Xbox One C# players.

Updated 2026-08-03 xbox, mediaplayer, stream, sensor, sensor developer center, sensor integration

Follow these instructions to complete the Conviva VSI Sensor integration on Windows/Xbox One C# players.

Step 1: Install Conviva Library

  • Install the Conviva library and add dependencies.

  • Initialize the main Conviva object.

Developer Steps

  • Install the Conviva library and add dependencies.

  • Initialize the WinClient object using your CUSTOMER_KEY.

  • Create an instance of WinClient to report video related events.

Step 2: Configure Metadata

  • Most metadata is autocollected.

  • Configure additional custom metadata tags (if applicable).

Developers Steps

  • Use the pre-defined metadata key/value pairs.

  • Optionally, set custom metadata.

Step 3: Report Events and Metadata

  • Use Conviva methods to report video stream events and metadata. Conviva computes stream data and metrics.

Developer Steps

  • Implement the WinClient.createSession(contentInfo, playerProxy) method to report playback attempt request along with metadata (content, workflow, audience, and other relevant metadata) and the player proxy.

  • Use the WinClient.createAdSession(sid, contentInfo, playerProxy) for each ad in the ad break.

  • Use the WinClient.cleanupSession() method to report end of playback.

Step 4: Handle User Actions

Use Conviva methods to report custom events.

Developer Steps

  • Report custom events.

Step 5: Clean Up Session

  • Use Conviva release methods to clean up objects on player application exit.

Developer Steps

  • When video playback ends, implement WinClient.cleanupSession(sid);.

  • When ad content ends, implement WinClient.cleanupSession(adsid);.

  • On application exit, implement WinClient.cleanup();.

Prerequisites

  • Obtain your account's CUSTOMER_KEYs.**Conviva provides a test account and a production account for Test and Production environments, respectively. You can find your CUSTOMER_KEY here: Pulse - Account Info. Ask your Conviva representative for assistance if you have problems accessing it.

  • Pass the gatewayUrl parameter to init() method of Conviva SDK. The gatewayUrl is specific for your account and shall ONLY be used for tests, never for production deployment.

    Sample gatewayUrl for Testing:

    https://<*customer_key*>.ts-testonly.conviva.com

    IMPORTANT: If there's any doubt on how to set the gateway URL, consult your Conviva representative - this is a critical parameter. For production, Conviva library uses the automatically-assigned gatewayUrl.

    Use Touchstone 2.0 in Pulse to perform self-validation and debugging of video sensor integration

  • For Conviva JavaScript Sensor Integration, you can use any custom gateway URL with a proxy service setup. This is applicable for JavaScript version 4.7.13 onwards.

  • Plan your metadata

    Conviva supports Pre-defined, Device, and Custom metadata. Work with your project team to determine the need to collect any custom metadata. It's also recommended to work with your Conviva representative to create your metadata plan prior to integration.

  • Integration Summary

    1. Install Conviva Library
    • Install the library and add dependencies.

    • Initialize the WinClient object using your CUSTOMER_KEY.

    • Using an instance of WinClient report video related events.

    1. Configure Metadata
    • Implement the metadata by following the instructions to use the pre-defined keys, as well as custom metadata if defined.

    • Conviva library autocollects device metadata.

    • Implement advanced metadata and events as prescribed by the corresponding specification.

    • Report ad break start / end.

    • Pause/Resume monitoring of video metrics by marking the start and end of ads in the video stream.

    1. Report Events and Metadata
    • Implement the WinClient.createSession(contentInfo, playerProxy) method to report playback attempt request along with metadata (content, workflow, audience, and other relevant metadata) and the player proxy.

    • Use the WinClient.createSession(contentInfo, playerProxy) for each ad in the ad break.

    • Use the WinClient.cleanupSession() method to report the of end playback or ad playback.

    1. Handle User Actions

    Conviva library autocollects Network Metrics.

    1. Clean Up

    Call the WinClient.cleanupSession() and playerProxy.cleanupStreamerProxy() API's to gracefully end the monitoring session associated with current video asset playback.

    Test and Validate

    1. After integration, perform a sanity check following the test cases in the Stream Sensor Sanity Test Plans spreadsheet. For the full validation test, use the test cases in the Stream Sensor Full Test Plans spreadsheet.

    2. Use Touchstone in Pulse to perform self-validation and debugging of video sensor integration.

    Be sure to replace your TEST CUSTOMER_KEY with the PRODUCTION key to go live with your application, and generate the session traffic to the following Touchstone gateway URL:https://.ts-testonly.conviva.com
    1. Done! Analyse your data in Pulse and improve your viewer experience - let's make video experience better!

    1. Install Conviva Library

    Add Conviva Libraries and Configure Dependencies

    Add core SDK

    To integrate a Windows/Xbox One MediaPlayer/MediaElement with Conviva, please include the Conviva library in your project.

    Download and add the library explicitly: Conviva Windows/Xbox One: MediaPlayer/MediaElement library.

    Initialize the top level object

    Conviva initialization is a one-time call that must occur at the earliest possibility in your application's initialization flow.

    WinClient.init( customerKey, settings ):

    • customerKey: string to identify specific customer account. Different keys shall be used for development / debug versus production environment. Find your keys on the account info page in Pulse;

    • settings: WinSettings(); settings to enable debug.

    No need to set gatewayUrl and LogLevel settings for your production release explicitly. The Conviva sensor has the right default value. The allowed parameters are:

    • settings.setGatewayUrl: once enabled, the data will appear in Pulse for performing self-validation of video sensor integration. For more information, see Self-validation using Touchstone.
    • settings.setLogLevel: set to LogLevel.DEBUG for debug-level log verbosity.Sample code illustrating initialization with/without debug:
    //test or dev phase
    string customerKey = TEST_CUSTOMER_KEY;
    WinSettings settings = new WinSettings();
    settings.setGatewayUrl(TOUCHSTONE_SERVICE_URL);
    ettings.setLogLevel(LogLevel.DEBUG);
    WinClient.init( customerKey, settings );
     
    //production release
    string customerKey = PRODUCTION_CUSTOMER_KEY;
    WinSettings settings = new WinSettings();
    WinClient.init( customerKey, settings );
    

    IMPORTANT: No need to set GatewayUrl and LogLevel settings for your production release. The Conviva library provides the default values for production.

    Expected Errors Due to Dual Stack IPv4/v6 Network Support

    When the Conviva sensor is initialized with production settings, the SDK sends a single request to the endpoints below:

    • [customer_key].ipv4.cws.conviva.com for IPv4 only

    • [customer_key].ipv6.cws.conviva.com for IPv6 only

    Sending both requests enables correlation of IPv4 and IPv6 addresses in dual-stack networks. If only IPv4 or IPv6 addressing is used (single-stack networking), it is expected that one request will fail. All the following requests will be sent to the endpoint below which supports both IPv4 and IPv6:

    • [customer_key].cws.conviva.com

    2. Configure Metadata

    Metadata enables analysis of your data using different dimensions, for example, content, audience, device, workflow, player, and operating system.

    Conviva categorizes metadata tags into three buckets (Predefined, Device, Custom).

    Pre-defined Video and Content Metadata for Video and Ads

    Conviva defines the constants or fixed string keys for commonly used metadata. These metadata keys provide critical information about video content, versioning, workflow.

    Populate contentInfo object an instance of WinContentInfo() with the specified metadata.

    IMPORTANT: To assign content category labels, such as Audio, Trailer, Tile Play, or Short Video, use the c3.cm.categoryType pre-defined content metadata constant.

    Constants for Pre-defined Video and Content Metadata

    Key Type Implementation Note
    assetName string contentInfo.setAssetName(string assetName) For video content, use unique name for each stream/video asset. Values are up to your choice, but a human-readable text prefixed with the unique video ID works best in most Conviva sensors. This provides for clarity in reports and makes most popular content easily identifiable.Pattern: [videoID] Video Title The following are typical patterns for VOD (movies and episodic content) and Live streams: Movie Pattern: [{contentId}] {Movie Title} Sample Value: [12345] The ABC Movie Episode Pattern: [{contentId}] {Show Title} - S:{Season Number}:E{Episode Number} - {Episode Title} Sample Value: [67890] The XYZ Show - S3:E1 - The Pilot Episode Live Stream Pattern: [{channelNumber}] {Chanel Name} Sample Value: [10] PQRS Bay Area
    isLive BOOL contentInfo.setIsLive(BOOL isLive);

    Denotes whether the content is video on-demand or a live stream. Affects the computation and availability of the Conviva metrics. false = VOD and true = Live

    playerName string contentInfo.setPlayerName(string playerName)

    A string value used to distinguish video players (applications). Simple values that are unique across all of your integrated platforms work best here. If the same player used across multiple platforms, e.g Tizen, LG TV, WEB, give separate names for each application / platform: e.g "JS Tizen", "JS LGTV", "JS WEB". Do not include the build or version number in this property. The intention is to have a simple way of differentiating data from different players / platforms.

    viewerId string contentInfo.setViewerId(string viewerId)

    Required for Viewers Module. A unique identifier to distinguish individual viewers or devices through Conviva's Viewers Module. The value shall be unique abstract user's identifier. If user is anonymous, do not set any value for this tag.

    streamUrl string

    contentInfo.setStreamURL(string streamURL)

    The manifest URL of the video stream.

    The Conviva backend config server attempts to map a portion of StreamURL into a CDN name. For example: In the URL https://www.akamai.net/avengers.m3u8, akamai.net maps to the AKAMAI label. Conviva VSI users can then retrieve metrics based on the mapped CDN name (AKAMAI, in this case).

    The URL values reported in the streamURL are case insensitive. The streamURLs with either uppercase or all lowercase are acceptable.
    defaultCDN string contentInfo.setDefaultCDN(string defaultCDN)

    This value specifies the video server or CDN name from where the streaming resource is played. Set this field when the video server resource cannot be inferred from the STREAM_URL.

    For example, if the streamURL is https://cbd12348.cdn.cms.somewebsitehostname.com/abc.txt, it is not possible to infer the AKAMAI name from the streamURL, and in such a case, it is necessary to report the DEFAULT_Resource as AKAMAI.

    The DEFAULT_Resource value is case sensitive. If the resource name is initially reported as AKAMAI (uppercase) and subsequently modified in the app to akamai (lowercase), it is necessary to inform Conviva about the change because both need to be mapped in the Conviva backend configuration server to ensure that both point to the same CDN name (AKAMAI).
    duration integer Autocollected by the Conviva library.contentInfo.setDuration(int32 duration) Duration of the video content, in seconds.
    Player Framework Name string Autocollected by the Conviva library.
    Player Framework Version string NOTE: Refer to the existing Limitations.
    "c3.app.version" string Autocollected by the Conviva library.If you want to set it manually, report application build version from the application.contentInfo.setTag("c3.app.version", string value)
    "c3.cm.contentType" string Advanced content delivery methods along with Live and VOD.

    Acceptable values: "Live", "Live-Linear", "DVR", "Catchup", "VOD".

    "c3.cm.channel" string The channel on which the content is consumed.

    Example: "ABC".

    "c3.cm.brand" string The name of the brand to which the content belongs.

    Examples: "ABC X", "ABC Y".

    "c3.cm.affiliate" string Affiliate or MVPD name for TV Everywhere authenticated services.

    Examples: "Xfinity", "Comcast".

    "c3.cm.categoryType" string

    Content business categories of interest.

    Use this constant to assign content category labels, such as Audio, Trailer, Tile Play, or Short Video.

    Examples: "Episodic", "Movies", "News", "Sports", "Events", "Informercials", "Shorts", "Promos", "Audio", "Tile Play", "Short Videos", "Trailer".

    "c3.cm.name" string Name of CMS Provider.

    Examples: "CMS", "ROVI", "TMS".

    "c3.cm.id" string Unique asset identifier to query CMS system to gather additional asset metadata information for a specific asset.

    Example: "003b094d-fc5c-3d5a-8ed0-301bf848291e".

    "c3.cm.seriesName" string The name of Series. Set the value only if the metadata cannot be gathered from CMS System. Null if not applicable.

    Examples: "Friends", "Null".

    "c3.cm.seasonNumber" string The Season number. Set the value only if the details cannot be inferred from Asset Provider Server. Null if not applicable.

    Examples: "1", "Null".

    "c3.cm.showTitle" string The name of the Episode or Show Title. Set the value only if the details cannot be inferred from Asset Provider Server. Null if not applicable.

    Examples: "The One with All the Cheesecakes", "Null".

    "c3.cm.episodeNumber" string The Episode number. Set the value only if the details cannot be inferred from Asset Provider Server. Null if not applicable.

    Examples: "3", "Null".

    "c3.cm.genre" string The Primary content genre. Set the value only if the details cannot be inferred from Asset Provider Server. Null if not applicable.

    Examples: "Drama", "Null".

    "c3.cm.genreList" string The list of the applicable content genre. Set the values in a comma separated list only if the details cannot be inferred from Asset Provider Server. Null if not applicable.

    Examples: "Drama, Crime, Political, Violence", "Null"

    "c3.cm.utmTrackingUrl" string Provide the UTM parameters in the URL to track the effectiveness of the online marketing campaign across traffic sources and publishing media. Conviva uses CONTAINS logic to parse the individual UTM parameters from the URL provided, so either the full URL or just the UTM parameters is acceptable.

    Example values: http://www.example.com/?utm_source=newsletter1&utm_medium=email&utm_campaign=summer-sale&utm_content=toplink or utm_source=newsletter1&utm_medium=email&utm_campaign=summer-sale&utm_content=toplink

    This tag is only applicable for web and mobile devices.

    Constants for Pre-defined Metadata for Ads

    Key Type Implementation Note
    streamUrl string contentInfo.setStreamURL(string streamURL)

    The manifest URL of the ad stream.

    assetName string contentInfo.setAssetName(string assetName)

    Report as ad title or : [ad ID] ad title

    isLive BOOL contentInfo.setIsLive(BOOL isLive);

    For Ads, the value should be the same as for the video stream.

    playerName string contentInfo.setPlayerName(string playerName)

    Automatically copied from the video session.

    viewerId string contentInfo.setViewerId(string viewerId) Automatically copied from the video session.
    defaultCDN string contentInfo.setDefaultCDN(string defaultCDN) Ad server resource the stream is played from. Set this field when the video server resource cannot be inferred from the STREAM_URL.
    duration integer Autocollected by the Conviva library.contentInfo.setDuration(int32 duration) Duration of the single ad session, in seconds. For example, in a block of 3 ads each 30 seconds long, report 30 sec for each corresponding ad.
    Player Framework Name string Autocollected by the Conviva library.
    Player Framework Version string NOTE: Refer to the existing Limitations.

    Implement the pre-defined metadata specified in the table below. These metadata tags shall be set via WinContentInfo setTag method for the ad session:

    Key Type Description
    "c3.ad.technology" string Set the technology of the ad. Only allows the Constants.AdType.CLIENT_SIDE/SERVER_SIDE values. Allowed values: "Server Side" and "Client Side".
    "c3.ad.id" string The Ad ID extracted from the Ad Server that actually has the ad creative. For wrapper ads, this is the last Ad ID at the end of the wrapper chain. Example: "411687224".
    "c3.ad.system" string The name of the Ad System (i.e. the Ad Server). This Ad System represents the Ad Server that actually has the ad creative. For wrapper ads, this is the last Ad System at the end of the wrapper chain. Set to "NA" if not available. Examples: "Freewheel", "Innovid", "Extreme IO", "NA".
    "c3.ad.position" string The position of the ad. Only allows Constants.AdPosition.PREROLL/MIDROLL/POSTROLL values which are string constants of "Pre-roll", "Mid-roll", and "Post-roll".
    "c3.ad.isSlate" string A value that indicates whether this ad is a Slate or not. Set to "true" for Slate and "false" for a regular ad. By default, set to "false".
    "c3.ad.mediaFileApiFramework" string The name of the creative media framework. Generally used for VPAID ads. Set to "NA" for non-VPAID ads. Examples: "VPAID", "NA".
    "c3.ad.adStitcher" string The name of the Ad Stitcher. If not using an Ad Stitcher, set to "NA". Examples: "Uplynk", "Google DAI", "Google Anvato", "YoSpace", "NA".
    "c3.ad.firstAdSystem" string Only valid for wrapper VAST responses. This tag must capture the "first" Ad System in the wrapper chain when a Linear creative is available or there is an error at the end of the wrapper chain. Set to "NA" if not available. If there is no wrapper VAST response then the Ad System and First Ad System should be the same. Examples: "GDFP", "NA".
    "c3.ad.firstAdId" string Only valid for wrapper VAST responses. This tag must capture the "first" Ad Id in the wrapper chain when a Linear creative is available or there is an error at the end of the wrapper chain. Set to "NA" if not available. If there is no wrapper VAST response then the Ad Id and First Ad Id should be the same. Examples: "709684096", "NA".
    "c3.ad.firstCreativeId" string Only valid for wrapper VAST responses. This tag must capture the "first" Creative Id in the wrapper chain when a Linear creative is available or there is an error at the end of the wrapper chain. Set to "NA" if not available. If there is no wrapper VAST response then the Ad Creative Id and First Ad Creative Id should be the same. Examples: "57861167296", "NA".
    "c3.ad.creativeId" string The creative id of the ad. This creative id is from the Ad Server that actually has the ad creative. For wrapper ads, this is the last creative id at the end of the wrapper chain. Set to "NA" if not available. Examples: "57861167296", "NA".

    Custom Metadata

    Refer to App Manager->Setup Metadata page for your account to find the custom tags which shall be implemented.

    Set custom tags in a similar way for video/ads, by adding the tags to the contentInfo object, passed into corresponding methods of WinClient object.

    Conviva recommends to label the custom tags as "MyCustomTag1" or "my_custom_tag", and not use the c3.cm format, for instance, c3.cm.MyCustomTag1. Conviva reserved the c3.cm naming convention for the pre-defined or required metadata.

    Update/Amend Metadata

    To update or amend pre-defined and custom tags for video, use WinClient.updateContentInfo(sessionId, contentInfo):

    • sessionId: previously referenced sessionId during createSession call.

    • contentInfo: map containing the key - value pairs of metadata tags for video content.

    To update or amend pre-defined and custom tags for ads, use WinClient.updateContentInfo(adSessionId, contentInfo):

    • adSessionId: previously referenced sessionId during createAdSession call.

    • contentInfo: map containing the key - value pairs of metadata tags for ad content.

    Refer to the below example of setting pre-defined and custom metadata for video:

    // Fetch metadata from CMS and pass non-null values to Conviva
    // WinContentInfo Metadata Creation Block
    WinContentInfo contentInfo = new WinContentInfo();
       
    // required: unique value for every asset
    if (assetName != null) {
      contentInfo.setAssetName(assetName);
    }
       
    // highly recommended: dictionary of your custom metadata key/value string pairs
    foreach (pair in customMetadata) {
        string key = pair.key;
        string value = pair.value;
        if (key != null && value != null) {
            contentInfo.setTag(key, value);
        }
    }
    // required: e.g. "http://your.cdn.com/stream.m3u8"
    if (streamURL != null) {
        contentInfo.setStreamURL(streamURL);
    }
       
    // required: 1 for live content, 0 for VOD content
    if (isLive == 1 || isLive == 0) {
        contentInfo.setIsLive(isLive);
    }
       
    // required: e.g. "Windows UWP C# App"
    if (playerName != null) {
        contentInfo.setPlayerName(playerName);
    }
       
    // required for Viewers Module: e.g. "john@doe.com" or "12345"
    if (viewerId != null) {
        contentInfo.setViewerId(viewerId);
    }
       
    // optional: needed when the content's stream URL patterns
    //           are not sufficient to identify the CDN
    if (defaultCDN != null) {
        contentInfo.setDefaultCDN(defaultCDN);
    }
    //Update Content Info.
    WinClient.updateContentInfo(sessionId, contentInfo);
    

    Refer to the below example of setting pre-defined and custom metadata for ad:

    // Fetch metadata from CMS and pass non-null values to Conviva
    // WinContentInfo Metadata Creation Block
    WinContentInfo winAdcontentInfo = new WinContentInfo();
       
    // required: unique value for every asset
    if (assetName != null) {
      winAdcontentInfo.setAssetName(assetName);
    }
       
    // highly recommended: dictionary of your custom metadata key/value string pairs
    foreach (pair in customMetadata) {
        string key = pair.key;
        string value = pair.value;
        if (key != null && value != null) {
            winAdcontentInfo.setTag(key, value);
        }
    }
    // required: e.g. "http://your.cdn.com/stream.m3u8"
    if (streamURL != null) {
        winAdcontentInfo.setStreamURL(streamURL);
    }
       
    // required: 1 for live content, 0 for VOD content
    if (isLive == 1 || isLive == 0) {
        winAdcontentInfo.setIsLive(isLive);
    }
       
    // required: e.g. "Windows UWP C# App"
    if (playerName != null) {
        winAdcontentInfo.setPlayerName(playerName);
    }
       
    // required for Viewers Module: e.g. "john@doe.com" or "12345"
    if (viewerId != null) {
        winAdcontentInfo.setViewerId(viewerId);
    }
       
    // optional: needed when the content's stream URL patterns
    //           are not sufficient to identify the CDN
    if (defaultCDN != null) {
        winAdcontentInfo.setDefaultCDN(defaultCDN);
    }
    //Update Content Info.
    WinClient.updateContentInfo(adsid, winAdcontentInfo);
    

    IMPORTANT: Please note that different Conviva products, such as Conviva VSI and Conviva Viewer Insights may have different logic with respect to handling updated values. Conviva recommends to update the metadata only when it is available and do not set any default values before the metadata is available.

    Predefined metadata such as playerName, viewerId, defaultCDN, and isLive will be taken from the content session for both client-side and server-side ad sessions if not provided during ad session creation.

    Ad Events and Metadata

    Report Ad Break

    An ad break is a single or a sequence of ads in the video stream. To collect the ad break metadata, notify Conviva of the start and end of an ad break.

    This step is required to accurately report Video Startup Time. The time taken by the ad break shall not be counted towards VST. Notify Conviva sensor of the ad break events using the following APIs:

    Report ad break start to the video session

    WinClient.reportAdBreakStarted(sessionId, enAdType);

    sessionId: The identifier of the video monitoring session.

    enAdType: CLIENT_SIDE (for Client Side Ad) or SERVER_SIDE (for Server Side Ad)

    On Ad Break ended, call

    WinClient.reportAdBreakEnded(sessionId);

    sessionId: The identifier of the video monitoring session.

    3. Report Events and Metadata

    3. a. Integrate Video Player:

    Report Playback Start

    WinClient.createSession( contentInfo, playerProxy ):

    • contentInfo: object carries on metadata associated with the video playback.

    • playerProxy: MediaPlayerProxy/MediaElementProxy proxy object.

    The keys / methods and expected values of the required metadata tags are defined in the Implement Metadata section below.

    IMPORTANT: WinClient.createSession() API returns session ID which shall be stored till session lifecycle and shall be used for session specific API's.

    Player Proxy

    Media Player object shall be registered with Conviva proxy while creating player proxy object (MediaPlayerProxy / MediaElementProxy). Player proxy object shall be attached to Conviva session to monitor video experience.

    public void playVideo() {
      this.player = mediaPlayerElement.MediaPlayer;
     
      // WinContentInfo Metadata Creation Block
      WinContentInfo contentInfo = new WinContentInfo();
     
      // required: unique value for every asset
      if (assetName != null) {
        contentInfo.setAssetName(assetName);
      }
         
      // highly recommended: dictionary of your custom metadata key/value string pairs
      foreach (pair in customMetadata) {
          string key = pair.key;
          string value = pair.value;
          if (key != null && value != null) {
              contentInfo.setTag(key, value);
          }
      }
     
      // Add the contentInfo as required
      ...
     
      // Wrap the player with a monitoring proxy
      this.playerProxy = new MediaPlayerProxy(this.player);
     
      // Create a monitoring session and keep a reference to its ID
      // WinClient.createSession() will return an integer 0 or greater
      // this.player is also known as streamer
      this.sessionId = WinClient.createSession( contentInfo, this.playerProxy );
     
      // Finish player initialization
      this.player.Source = MediaSource.CreateFromUri(new System.Uri(streamURL));
    }
    

    IMPORTANT: It's critical to make this API call correctly to monitor video experience - monitoring session created from this moment, and key metrics are captured based on this event. For example, if this call done late (say, when video starts rather than user clicks "play"), the Video Startup Time will be under-reported, Video Start Failures will be missed, etc.

    Please note that each video should be monitored separately - call this method for each new video played.

    IMPORTANT: If some of the content metadata tags aren't available at start, they can be set later or amended by WinClient.updateContentInfo(sessionId, contentInfo); API - refer here for details.

    Please note, in most cases that it's required to set content metadata before the player reports "play" for the first time, to accurately attribute metadata to the video asset.

    Invoke createSession() On: Invoke cleanupSession() On:
    User clicks play button User stops the video User starts another video Video ends
    Video starts in autoplay mode
    User replays video again
    A new video starts in playlist Video item ends in playlist

    Adaptive Streaming

    If you are using the AdaptiveMediaSource object, which can be used to obtain media properties for adaptive formats, set the AdaptiveMediaSource object with the player proxy. This API is used to obtain stream bitrate information. For additional information, refer to the relevant Microsoft documentation. The method signature is:

    AdaptiveMediaSourceCreationResult result;
     
    result = awaits AdaptiveMediaSource.CreateFromUriAsync(new System.Uri(streamURL));
     
    AdaptiveMediaSource adaptiveMediaSource = result.MediaSource;
     
    // Link to an AdaptiveMediaSouce
    this.playerProxy.setMediaStreamSource( adaptiveMediaSource );
    

    Attach or Detach Player

    When media player instance is available after session creation, media player instance can be attached with the Conviva session through WinClient.attachPlayer() API. Similarly, if media player instance is removed or changed, attached media player instance can be detached from the Conviva session through WinClient.detachPlayer() API.

    The method signatures are:

    // Attach the player proxy to the monitoring session
    WinClient.attachPlayer(this.sessionId, this.playerProxy);
     
    // Detach the player proxy from monitoring session
    WinClient.detachPlayer(this.sessionId);
    

    Report Playback Start with Deferred Streamer Attachment

    In certain scenarios, you create a video session but attach your player instance at a later stage, after checking for any errors that might occur after session creation but before streamer attachment. This is common when you use a DRM, when you create the player/streamer instance after a successful DRM validation. In such cases, you still create the monitoring session with its metadata as soon as the user has expressed intent to play the video (whether via auto-play or manually) but you attach your player/streamer instance via another method call, after manually reporting any errors that may have prevented successful playback. We count these errors with their corresponding messages - as Video Start Failures (VSFs).

    Your code will look similar to:

    public void playVideo() {
      // WinContentInfo Metadata Creation Block
      WinContentInfo contentInfo = new WinContentInfo();
     
      // Update the contentInfo as required
      ...
     
      // Create monitoring proxy with null player object
      this.playerProxy = new MediaPlayerProxy( null );
     
      // Create a monitoring session and keep a reference to its ID
      // WinClient.createSession() will return an integer 0 or greater
      // this.player is also known as streamer
      this.sessionId = WinClient.createSession( contentInfo, this.playerProxy );
         
      // Perform your own extra logic (e.g. DRM check)
      ...
         
      // If a fatal error preventing playback is encountered,
      //   report it manually and clean up the monitoring session
      if ( fatalErrorEncountered ) {
        WinClient.reportError( this.sessionId, "Your error message", WinErrorSeverity.FATAL );
        WinClient.cleanupSession( this.sessionId );
        return;
    } else {
        this.player = mediaPlayerElement.MediaPlayer;
     
        // Detach the monitoring proxy with null player object
        WinClient.detachPlayer(this.sessionId);
        this.playerProxy = null;
           
        // Wrap the player with a monitoring proxy
        this.playerProxy = new MediaPlayerProxy( this.player );
           
        // Attach the video player to the monitoring session
        WinClient.attachPlayer( this.sessionId, this.playerProxy );
           
        // Finish player initialization
        this.player.Source = MediaSource.CreateFromUri(new System.Uri(streamURL));
      }
    }
    

    Report Playback End

    Report end of playback by using these methods:

    If used, remove the AdaptiveMediaSource object from the player proxy:

    // Remove AdaptiveMediaSource
    this.playerProxy.removeMediaStreamSource();
    

    Clean up each player proxy once the video stream it is registered to is no longer used. This avoids memory or resource leaks.

    // Clean up the player when the video has ended
    protected void closePlayer() {
      if ( this.playerProxy >= 0 ) {
              this.playerProxy.cleanupStreamerProxy();
              this.playerProxy = null;
      }
    }
    

    Finally, close the monitoring session:

    WinClient.cleanupSession( sessionId );
    sessionId = -1;
    
    After integrating the video player, review advanced use cases such as live program and playlist changes, fatal errors, and foreground and background actions that can be applicable for specific goals.

    Implement Advanced Metadata and Events

    Set Peak Bitrate

    Peak Bitrate Reporting for HLS when Using AdaptiveMediaSource

    MediaPlayer alone is not enough to gather information on video peak bitrate. If you use the Microsoft AdaptiveMediaSource class to play HLS content, add the following code to enable video peak bitrate reporting:

    // Wrap the player with a monitoring proxy
    this.playerProxy = new MediaPlayerProxy( this.player );
      
    // Link to an AdaptiveMediaSource
    this.playerProxy.setMediaStreamSource( adaptiveMediaSource );
    

    If you change the AdaptiveMediaSource during playback, the following code is required to keep monitoring the right AdaptiveMediaSource:

    // Remove link to the old AdaptiveMediaSource
    this.playerProxy.removeMediaStreamSource();
    // Link to a new AdaptiveMediaSource
    this.playerProxy.setMediaStreamSource( newAdaptiveMediaSource );
    

    Peak Bitrate Reporting for HLS when Not Using AdaptiveMediaSource

    To report peak bitrates for an HLS stream when you are not using the AdaptiveMediaSource class, use the setBitrate API as described below.

    Peak Bitrate Reporting for MP4 and Smooth Streaming

    For MP4 and Smooth Streaming, the Conviva library does not automatically detect the playing peak bitrate due to a limitation of the Windows UWP/Smooth Streaming Client SDK API. To report peak bitrate information from another source, use the setBitrate API, as follows:

    //set new peak bitrate and send the peak bitrate change event.
    WinClient.setBitrate(this.sessionId, this.bitrateInKbps);
    
    For Smooth Streaming, the playing bitrate is defined as the total playing bitrate, which includes both the audio and video tracks.

    For the Average Peak Bitrate definition, refer to Average Peak Bitrate in the Metric Dictionary.

    Set Average Bitrate

    Conviva library does not automatically detect the playing average bitrate due to a limitation of the Windows UWP. Conviva's UWP library depends on the application to report the average bitrate. Use the following API to report the video average bitrate:

    // Report the Average Bitrate:
    // sessionId is Session ID for a given session
    // avgBitrateInKbps is the new average bitrate available with application
    WinClient.setAverageBitrate(this.sessionId, this.avgBitrateInKbps);
    

    For the Avg. Average Bitrate definition, refer to Avg. Average Bitrate in the Metric Dictionary.

    Report Seek Events

    Seek events allow us to calculate the Video Restart Time (VRT) metric, to differentiate between buffering caused by user seek and buffering caused by network conditions. Please visit the seek scenarios page to review VRT calculations.

    After a seek is triggered, and once the player has enough chunks downloaded to execute playback, Windows MediaPlayer raises a player seek end event. The player does not report any information on seek start, therefore the Conviva library cannot detect it. Due to this limitation, call Conviva's setSeekStart() API before the user initiates a seek.

    The following code sample reports the player seek start event to the Conviva library:

    // sessionId : is the Session ID.
    // seekToPositon : is new play head position
    // that the seek is trying to reach, in milliseconds.
    // specify -1 if targeted time is unknown.
     
    WinClient.setSeekStart(sessionId, seekToPosition);
    
    If the player's seek start event is not reported, the Video Restart Time metric will be under-reported and the Connection Induced Rebuffering Ratio metric will be over-reported.

    Report Custom Errors

    Fatal errors are any events preventing the user from seeing the video they attempted to play or any non-user event that causes midstream video playback failure (after the video starts successfully). These fatal errors should be reported and will be used to calculate Video Playback Failures (VPF) and Video Start Failures (VSF) metrics in Conviva VSI.

    Sample code for DRM Error reporting

    int sessionId = WinClient.createSession( convivaMetadata );
     
    // The DRM errors can be reported via:
    WinClient.reportError( this.sessionId, "errMessage", WinErrorSeverity.FATAL );
     
    // followed by cleaning up the session:
    WinClient.cleanupSession( this.sessionId );
     
    // If no error occurs, the player instance will be created as usual and should be attached
    // to the session with this call:
    WinClient.attachPlayer( this.sessionId, this.playerProxy );
    

    Report CDN Server IP

    The Conviva UWP library depends on the application to report CDN server IP. When the CDN Server IP is available to the application, the same can be reported to Conviva. The CDN Server IP is of type String and is set as attribute of the WinClient class, which provides the following method:

    WinClient.setCDNServerIP(SessionID sessionId, String newCDNServerIP);
    

    The following code sample reports CDN Server IP to the Conviva UWP library:

    // Report the CDN Server IP:
    // sessionId is Session ID for given session
    // cdnserverip is the CDN Server IP available with application
    WinClient.setCDNServerIP(sessionId, cdnserverip);
    

    Report Dropped Frames Count

    The dropped frames count for a specific interval is reported periodically. The Conviva UWP library depends on the application to report the dropped frames count. The dropped frames count is of the type Integer and is set as an attribute of the WinClient class, which provides the following method:

    WinClient.setDroppedFrameCount(SessionID sessionId, int droppedFrameCount);
    

    The following code sample reports the dropped frames count to the Conviva UWP library:

    // Report the dropped frames count:
    // sessionId is Session ID for the given session
    // droppedFrameCount is the number of frames dropped by the player since last reported
    WinClient.setDroppedFrameCount(sessionId, droppedFrameCount);
    
    Report Audio, Subtitles, or Closed Captions Language

    The Conviva UWP library depends on the application to report languages. Report the playback audio, closed captions, or subtitles language using:

    Winclient.reportLanguage(SessionID sessionId, WinLanguageEventType languageType, String languageName);
    

    The languageType denotes the type of the reporting language and holds one of these values:

    • EVENT_AUDIO_LANGUAGE for audio

    • EVENT_SUBTITLES_LANGUAGE for subtitles

    • EVENT_CLOSED_CAPTIONS_LANGUAGE for closed captions

    The languageName is the name of the language in [langCode]:langName format, for example, [en]:English. When only one of them is available, report it as such, for example, en or English.

    IMPORTANT: At any given time, a player can report the language of either the subtitles or the closed captions. When it reports one of them, the other language is set to off if it has already been reported. Report these languages (if they're available) on session start as well as when the user changes them on the current playback.

    Example:

    // sessionId is the Session ID for the given session
    // report closed_captions_language as "[en]:English” ([langCode]:langName)
    WinClient.reportLanguage(sessionId, EVENT_CLOSED_CAPTIONS_LANGUAGE, "[en]:English");
    // report the subtitles_language = "fr" (consider only language code is available)
    // reporting the subtitles will set the previously-reported closed_captions_language = "off"
    WinClient.reportLanguage(sessionId, EVENT_SUBTITLES_LANGUAGE, "fr");
    

    If the audio, subtitle, or closed captions language option was initially enabled but later disabled, ensure to report the most recent language option value as off. Example:

    WinClient.reportLanguage(sessionId, EVENT_SUBTITLES_LANGUAGE, "off");
    

    3. b. Integrate Ad Managers:

    Conviva core SDK is universal and player agnostic, therefore it can be used to integrate any Ad SDK using the programming language it's written for.

    For ease and speed of integration, Conviva also provides plug-in modules for the most common Ad SDKs. The modules allow to auto-detect events from the particular player / Ad SDK.

    If instructions for your Ad SDK are not shown below, please follow the instructions for "Custom Ad Manager" integration, or contact your Conviva representative.

    Custom Ad Manager:

    Report Ad Playback Start

    WinClient.createAdSession( contentInfo, playerProxy ):

    • contentInfo: object carries on metadata associated with the ad video playback.

    • playerProxy: MediaPlayerProxy proxy object.

    The keys / methods and expected values of the required metadata tags are defined in the Implement Metadata section below.

    IMPORTANT: WinClient.createAdSession() API returns session ID which shall be stored till session lifecycle and shall be used for session specific API's.

    Player Proxy

    Media Player object shall be registered with Conviva proxy while creating player proxy object (MediaPlayerProxy / MediaElementProxy). Player proxy object shall be attached to Conviva session to monitor video experience.

    • MediaPlayer
    public void playVideo() {
      this.player = mediaPlayerElement.MediaPlayer;
     
      // WinContentInfo Metadata Creation Block
      WinContentInfo winAdcontentInfo = new WinContentInfo();
     
      // required: unique value for every asset
      if (assetName != null) {
        winAdcontentInfo.setAssetName(assetName);
      }
         
      // highly recommended: dictionary of your custom metadata key/value string pairs
      foreach (pair in customMetadata) {
          string key = pair.key;
          string value = pair.value;
          if (key != null && value != null) {
              winAdcontentInfo.setTag(key, value);
          }
      }
     
      // Add the winAdcontentInfo as required
      …
     
      // Wrap the player with a monitoring proxy
      this.playerProxy = new MediaPlayerProxy(this.player);
     
      // Create a monitoring session and keep a reference to its ID
      // WinClient.createAdSession() will return an integer 0 or greater
      // this.player is also known as streamer
      this.adSessionId = WinClient.createAdSession(winAdcontentInfo, this.playerProxy );
     
      // Finish player initialization
      this.player.Source = MediaSource.CreateFromUri(new System.Uri(streamURL));
    }
    

    IMPORTANT: It's critical to make this API call correctly to monitor ad video experience - monitoring session created from this moment, and key metrics are captured based on this event.

    Please note that each ad video should be monitored separately - call this method for each new ad video played.

    IMPORTANT: If some of the content metadata tags aren't available at start, they can be set later or amended by WinClient.updateContentInfo(adSessionId, winAdcontentInfo); API - refer here for details.

    Please note, in most cases that it's required to set content metadata before the player reports "play" for the first time, to accurately attribute metadata to the video asset.

    Invoke createAdSession() On: Invoke cleanupSession() On:
    Every Ad starts Every Ad ends

    Attach or Detach Player

    For a Client side Ad, at the start of the ad, the media player instance can be attached with the Conviva Ad session through WinClient.attachPlayer() API. Similarly,at the end of the ad, when the media player instance is removed or changed, attached media player instance can be detached from the Conviva Ad session through WinClient.detachPlayer() API.

    The method signatures are:

    // Attach the player proxy to the Ad monitoring session
    WinClient.attachPlayer(this.adSessionId, this.playerProxy);
     
    // Detach the player proxy from Ad monitoring session
    WinClient.detachPlayer(this.adSessionId);
    

    Report Ad Playback End

    Report end of Ad playback by using these methods:

    If used, remove the AdaptiveMediaSource object from the player proxy:

    // Remove AdaptiveMediaSource
    this.playerProxy.removeMediaStreamSource();
    

    Clean up each player proxy once the video stream it is registered to is no longer used. This avoids memory or resource leaks.

    // Clean up the player when the video has ended
    protected void closePlayer() {
      if ( this.playerProxy >= 0 ) {
              this.playerProxy.cleanupStreamerProxy();
              this.playerProxy = null;
      }
    }
    

    Finally, close the monitoring session:

    WinClient.cleanupSession( adSessionId );
    adSessionId = -1;
    

    Implement Advanced Ad Metadata and Events

    Report Ad metrics to Ad Session by using the following:

    Set Peak Bitrate

    Peak Bitrate Reporting for HLS when Using AdaptiveMediaSource

    MediaPlayer alone is not enough to gather information on video peak bitrate. If you use the Microsoft AdaptiveMediaSource class to play HLS content, add the following code to enable video peak bitrate reporting:

    • MediaPlayer
    // Wrap the player with a monitoring proxy
    this.playerProxy = new MediaPlayerProxy( this.player );
      
    // Link to an AdaptiveMediaSource
    this.playerProxy.setMediaStreamSource( adaptiveMediaSource );
    

    If you change the AdaptiveMediaSource during playback, the following code is required to keep monitoring the right AdaptiveMediaSource:

    // Remove link to the old AdaptiveMediaSource
    this.playerProxy.removeMediaStreamSource();
    
    // Link to a new AdaptiveMediaSource
    this.playerProxy.setMediaStreamSource( newAdaptiveMediaSource );
    

    Peak Bitrate Reporting for HLS when Not Using AdaptiveMediaSource

    To report peak bitrates for an HLS stream when you are not using the AdaptiveMediaSource class, use the setBitrate API as described below.

    Peak Bitrate Reporting for MP4 and Smooth Streaming

    For MP4 and Smooth Streaming, the Conviva library does not automatically detect the playing peak bitrate due to a limitation of the Windows UWP/Smooth Streaming Client SDK API. To report peak bitrate information from another source, use the setBitrate API, as follows:

    //set new peak bitrate and send the peak bitrate change event.
    WinClient.setBitrate(adSessionId, this.bitrateInKbps);
    
    For Smooth Streaming, the playing bitrate is defined as the total playing bitrate, which includes both the audio and video tracks.

    For the Average Peak Bitrate definition, refer to Average Peak Bitrate in the Metric Dictionary.

    Set Average Bitrate

    Conviva Library does not automatically detect the average bitrate due to a limitation of the Windows UWP. Conviva's UWP library depends on the application to report the average bitrate. Use the following API to report the average bitrate:

    // Report the Average Bitrate:
    // adSessionId is Session ID for a given Ad session
    // avgBitrateInKbps is the new average bitrate available with application
    WinClient.setAverageBitrate(this.adSessionId, this.avgBitrateInKbps);
    

    For the Avg. Average Bitrate definition, refer to Avg. Average Bitrate in the Metric Dictionary.

    Report Seek Events

    Seek events allow us to calculate the Video Restart Time (VRT) metric, to differentiate between buffering caused by user seek and buffering caused by network conditions. Please visit the seek scenarios page to review VRT calculations.

    After a seek is triggered, and once the player has enough chunks downloaded to execute playback, Windows MediaPlayer raises a player seek end event. The player does not report any information on seek start, therefore the Conviva library cannot detect it. Due to this limitation, call Conviva's setSeekStart() API before the user initiates a seek.

    The following code sample reports the player seek start event to the Conviva library:

    // adSessionId : is the Session ID of the ad.
    // seekToPositon : is new play head position
    // that the seek is trying to reach, in milliseconds.
    // specify -1 if targeted time is unknown.
     
    WinClient.setSeekStart(adSessionId, seekToPosition);
    
    If the player's seek start event is not reported, the Video Restart Time metric will be under-reported and the Connection Induced Rebuffering Ratio metric will be over-reported.

    Report Custom Errors

    Fatal errors are any events preventing the user from seeing the video they attempted to play or any non-user event that causes midstream video playback failure (after the video starts successfully). These fatal errors should be reported and will be used to calculate Video Playback Failures (VPF) and Video Start Failures (VSF) metrics in Conviva VSI.

    Sample code for DRM Error reporting

    int adSessionId = WinClient.createSession( convivaMetadata );
     
    // The DRM errors can be reported via:
    WinClient.reportError( this.adSessionId, "errMessage", WinErrorSeverity.FATAL );
     
    // followed by cleaning up the session:
    WinClient.cleanupSession( this.adSessionId );
     
    // If no error occurs, the player instance will be created as usual and should be attached
    // to the session with this call:
    WinClient.attachPlayer( this.adSessionId, this.playerProxy );
    

    Report CDN Server IP

    The Conviva UWP library depends on the application to report CDN server IP. When the CDN Server IP is available to the application, the same can be reported to Conviva. The CDN Server IP is of type String and is set as attribute of the WinClient class, which provides the following method:

    WinClient.setCDNServerIP(SessionID adSessionId, String newCDNServerIP);
    

    The following code sample reports CDN Server IP to the Conviva UWP library:

    // Report the CDN Server IP:
    // adSessionId is Session ID for given ad session
    // cdnserverip is the CDN Server IP available with application
    WinClient.setCDNServerIP(adSessionId, cdnserverip);
    

    Report Dropped Frames Count

    The dropped frames count for a specific interval is reported periodically. The Conviva UWP library depends on the application to report the dropped frames count. The dropped frames count is of the type Integer and is set as an attribute of the WinClient class, which provides the following method:

    WinClient.setDroppedFrameCount(SessionID adSessionId, int droppedFrameCount);
    

    The following code sample reports the dropped frames count to the Conviva UWP library:

    // Report the dropped frames count:
    // adSessionId is Session ID for the given ad session
    // droppedFrameCount is the number of frames dropped by the player since last reported
    WinClient.setDroppedFrameCount(adSessionId, droppedFrameCount);
    
    For Server Side Ads, the metrics such as Bitrate, Errors, and Playing States need not be reported on the Ad session separately; they are reported by taking the values from the corresponding Main Content session because it's the same stream.

    4. Handle User Actions

    Report Network Metrics

    The Conviva library automatically detects the network connection type (Ethernet, WiFi, 3G, OTHER). The Conviva library reports the raw values returned by the WWAN network connection data service class.

    Use the following Conviva mapping to reference the raw values:

    Raw Value Mapping
    WiFi WiFi
    Cdma1xEvdo 3G
    Cdma1xEvdoRevA 3G
    Cdma1xEvdoRevB 3G
    Cdma1xEvdv 3G
    Cdma1xRtt 3G
    Cdma3xRtt 3G
    CdmaUmb 3G
    Edge 2G
    Gprs 2G
    Hsdpa 3G
    Hsupa 3G
    LetAdvanced 4G
    Umts 2G
    Custom Other
    Connection Type can be updated after session creation, before the first video frame is rendered.

    Report Custom Events

    Player Insight is an advanced feature which allows you to track custom events that are not related to video rendering, but rather specific to your player's functionality. These events and their attributes are then tabulated in the Player Insight dashboard at Conviva VSI (Pulse). Contact your Conviva representative to enable Player Insights in Pulse.

    You may send a custom Player Insight event that can be associated with a video playback using the following method:

    Report video-related events by the method WinClient.sendEvent(SessionId sessionId, string eventName, Dictionary eventAttributes):

    Following is an example of a custom event named TestEvent with two attributes:

    WinClient.sendEvent(sessionId, "CustomEvent", {"attr1":"value1", "attr2":"value2"});
    

    You may send a custom Player Insight event specific to your player's functionality, but not associated with a monitoring session by passing "0" (integer) for sessionId.

    WinClient.sendEvent(0, "CustomEvent", {"attr1":"value1", "attr2":"value2"});
    

    5. Clean Up Session

    Each monitoring session needs to be cleaned up once the video stream it's attached to is no longer used. Depending on how the app/player is set up, this step may occur at the end of playback, during player deallocation, or before transitioning to a different stream.

    Remove AdaptiveMediaSource (if applicable)

    If used, remove the AdaptiveMediaSource object from the player proxy:

    // Remove AdaptiveMediaSource
    this.playerProxy.removeMediaStreamSource();
    

    Clean up each player proxy once the video stream it is registered to is no longer used. This avoids memory or resource leaks.

    // Clean up the player when the video has ended
    protected void closePlayer() {
      if ( this.playerProxy >= 0 ) {
          this.playerProxy.cleanupStreamerProxy();
          this.playerProxy = null;
      }
    }
    

    Close the content monitoring session

    WinClient.cleanupSession( sessionId );
    sessionId = -1;
    

    Close the Ad monitoring session

    WinClient.cleanupSession( adSessionId );
    adSessionId = -1;
    

    Advanced Use Cases

    You can use specific APIs in the Conviva sensor for various advanced use cases, such as:

    • Live or live linear streaming program changes

    • Video changes in the playlist

    • Playback does not recover from error and is reported once only

    • Multiple errors due to retrying when playback does not recover

    • Playback recovers from a fatal error by switching to a different asset URL or CDN

    • A warning occurs when there's no impact on the playback

    • Handling user actions, such as user dialogues

    To learn more about these advanced use cases, see here.

    Limitations

    Metric Name Impact Conditions Issue
    Peak Bitrate Under-reported HLS/DASH Windows.Media.Streaming.Adaptive doesn't report audio bitrate. Conviva's bitrate calculations include both video and audio data, therefore the bitrate value is under-reported.
    Under-reported SS VOD Smooth Streaming SDK doesn't report audio bitrate. Conviva's bitrate calculations include both video and audio data, therefore the bitrate value is under-reported.
    Not reported SS LIVE Smooth Streaming SDK doesn't report bitrate for LIVE streams. The stream bitrate can be manually updated by implementing ConvivaUWP.WinClient.setBitrate() API.
    Average Bitrate Under-reported HLS/DASH Windows.Media.Streaming.Adaptive doesn't report audio bitrate. Conviva's bitrate calculations include both video and audio data, therefore the bitrate value is under-reported.
    Under-reported SS VOD Smooth Streaming SDK doesn't report audio bitrate. Conviva's bitrate calculations include both video and audio data, therefore the bitrate value is under-reported.
    Not reported SS LIVE Smooth Streaming SDK doesn't report bitrate for LIVE streams. The average bitrate can be manually updated by implementing ConvivaUWP.WinClient.setAverageBitrate() API.
    Average Frame Rate Not reported All Player doesn't support an API to fetch frame rate information.
    Connection Induced Rebuffering Ratio (CIRR) Under-reported MediaElement, low bandwidth When the video freezes due to lack of video data, Windows MediaElement on occasion does not start/report a buffering event until 20 seconds after the freeze.
    Over-reported Seek event The player reports a seek event only when it has reached the requested seek point and is ready for playback.
    Under-reported Media played after pause state while buffering The player reports PLAYING state when played from PAUSED state during buffering.
    Rebuffering Ratio (RR) Under-reported MediaElement, low bandwidth When the video freezes due to lack of video data, Windows MediaElement on occasion does not start/report a buffering event until 20 seconds after the freeze.
    Under-reported Media played after pause state while buffering The player reports PLAYING state when played from PAUSED state during buffering.
    Video Restart Time (VRT) Under-reported Seek event The player reports a seek event only when it has reached the requested seek point and is ready for playback.
    Metadata Name Impact Conditions Issue
    Device Operating System Incorrectly reported Windows 11 The device operating system for Windows 11 devices are detected as Windows 10.
    Player Framework Version Not reported All The Conviva library doesn't set this metadata.
    Connection Type Not reported Xbox (Windows 11) The connection type is not detected for Xbox devices running with Windows 11.
    Screen Resolution Not reported Xbox Screen resolution is not detected on Xbox devices.

    Self Validation

    Upon completion of your integration, and before submission to Conviva QA team, developers should complete a comprehensive self-validation test pass of each Device Application.

    Perform self-validation of video sensor integration using Touchstone in Pulse.

    Conviva provides sample test cases with detailed steps and expected results.

    Developers should be checking for both metric and metadata accuracy. Based on our experience, comprehensive self-validation can reduce your QE cycles, saving your costly project time.