DPI Summary Data

Micro Playing TimeDefinition: The total time in milliseconds that a session spent in continuous play time that is less than 200 milliseconds.

Updated 2026-06-30 eco, summary, api developer center, ssd, conviva connect

This document describes how to use DPI Connect Summary reports. The report is a daily offline historical log (view DPI Connect sample) that provides session-level information for app events other than video playback in a given day.

Audience

The summary report is beneficial to many critical business departments, but it's mainly used by:

  • Business analysts

  • Operations teams

  • Research teams

To include the Conviva Household ID in your content summary data or to receive the data in parquet format, reach out to your Conviva representative. Content summary now supports traffic rule accounts. You can now select traffic rule accounts (along with the preexisting non traffic rule accounts) to include in the content summary data pipelines. For more details, contact Conviva Support.

Get the Conviva Connect Reports

The supported delivery destinations are:

  • Google Cloud Storage Bucket

  • Amazon S3 Bucket

  • SFTP

The file path is:

[c3 account name]/[file type]/[date of data]/part-*

Data is delivered in multi-part files; part-* is used to enumerate the files.

The Conviva Connect file name is in the format:

DailyContentSessionLog__.csv

* ByHousehold* is appended to the file name if the household ID column is included.

Tools to Use

Typically, users load DPI Connect into a database such as MySQL or into analytics tools such as Tableau or Micro Strategy to analyze the data and correlate it with other data sets. Refer to the sample SQL queries section for examples.

Metrics List

DPI SessionId

Session ID of the specific video session.

UserId

ClientId

SensorVersion

City

State

ZipCode

Country

DeviceHardwareType

Platform

DeviceCategory

DeviceManufacturer

DeviceName

DeviceModel

DeviceMarketingName

DeviceOperatingSystemFamily

DeviceOperatingSystem

DeviceOperatingSystemVersion

BrowserName

Name of the browser where a particular session is played.

BrowserVersion

Version of the browser, if a session is played on a browser.

PlayerFrameworkVersion

PlayerFrameworkName

AppName

Name of the application a session is played.

AppVersion

Version of the application the specific video session played on (appVersion).

AppBuild

UserAgent

Asn

Isp

IpV4

IpV6

SessionStartTimeMs

The datatype is long. It represents epoch timestamp in milliseconds when the session is started or revived.

SessionEndTimeMs

The datatype is long. It represents epoch timestamp in milliseconds when the session is ended. The value is null if Conviva hasn't seen the end of the session when the query is processed.

UserActiveTimeMs

AppStartupCount

TotalAppStartupDurationMs

MaxAppStartupDurationMs

PageLoadAttemptCount

PageLoadSuccessCount

MaxPageLoadDurationMs

TotalPageLoadDurationMs

AppCrashCount

EventCount

BadEventCount

UserEventCount

NetworkRequestSuccessCount

NetworkRequestFailureCount

The total number of failed network requests during the specified time interval. A network request is classified as failed if its response code is not null, and is outside the range from 100 to 399. This metric is only available for the preset Server Side Performance dashboard.

NetworkRequestSuccessDurationMs

NetworkRequestFailureDurationMs

HasFirstVideoAttempt

TimeToFirstVideoAttempt

Core Metrics

Attempts

Plays

**Engagement Metrics**

Ended Plays

Unique Devices

Minutes Ended Play

Average % Complete

**Quality of Experience (QoE) Metrics**

Video Startup Failures (VSF)

Video Startup Failures Business (VSF-B)

Video Startup Failures Technical (VSF-T)

Video Playback Failures (VPF)

Video Playback Failures Business (VPF-B)

Video Playback Failures Technical (VPF-T)

Exits Before Video Start (EBVS)

Rebuffering Ratio

Connection Induced Rebuffering Ratio

Average Peak Bitrate

Avg Average Bitrate

Session Duration

Bandwidth

Video Startup Time

Video Restart Time

Micro Playing Time

Micro Playing Interrupts

Micro Buffering Time

Micro Buffering Interrupts

Long Rebuffering Time

Long Rebuffering Interrupts

Abandonment

Paused Time

Paused Ratio

Last Playhead Time

Bitrate Switches

CIR Related Exits

Metric Definitions and Calculations

In most cases, lifetime metrics at the session level are provided in the Conviva Connect dataset. In cases where lifetime metrics at the session level are not provided, this section includes examples of the formulas and SQL code. The section below also shows how to aggregate the lifetime metrics across sessions. The SQL code is based on Conviva Connect date with December 16 (2022) pipeline end date.

Core Metrics

  1. Attempts

Definition: An attempt is initiated when a viewer clicks play or a video auto-plays. An attempt can result in a successful play, or an early termination due to Video Start Failures (VSF) or Exits Before Video Start (EBVS). In Conviva Connect, each unique ConvivaSessionID + StartTimeUnix is an attempt. Across all sessions, the total number of Attempts is:

SELECT
    COUNT(*) as Attempts
FROM
    Demo
  1. Plays

Definition: A Play is a session with Playing Time greater than zero, which indicates that at least one video frame was played during the session lifetime.**

There are two ways to aggregate the Plays. The first is a count of all sessions with PlayingTime > 0 milliseconds:

SELECT
    COUNT(*) as Plays
FROM
    Demo
WHERE
    PlayingTime > 0

The second way is to count all session attempts that didn’t have a failure like VSF or EBVS:

In some cases, the player may report a joined state, but the user might have exited before the first video frame was played. Joined time is indicated by StartupTime > 0. If the session joined but we don't have the actual join time, then we display -3 for StartupTime. Therefore, to aggregate Plays, you can include sessions where StartupTime = -3 and PlayingTime >= 0. See also What does VST = -3 stand for? in the FAQ section.

-- Alternative method
SELECT
    COUNT(*) as Plays
FROM
    Demo
WHERE
    StartupTime > 0
or  (
        StartupTime = -3
    and PlayingTime >= 0)

QoE Metrics

  1. Video Startup Failures (VSF)

Definition: VSF indicates if a video failed to play due to a startup error. This metric is available in Conviva Connect but is called StartupError. You can find the list of associated errors in the ErrorList field.

Across all sessions, the VSF % can be aggregated using the Attempts metric:

SELECT
    (VSF / Attempts) * 100 as VSF_Perc
FROM
    (
        SELECT
            SUM (
                case
                WHEN
                    StartupError = 'true'
                then
                    1
                else
                    0
                END) as VSF,
            COUNT(*) as Attempts
        FROM
            Demo)
Conviva lists all the VSF errors the player reports within 90 seconds of the failure in the order in which they were reported. Modifying the player error reporting and error message text can help to clarify which error caused the failure.
1. ### Video Startup Failures Business (VSF-B)

Definition: VSF-B indicates if a video failed to play due to a business error. Find the list of associated errors in the VSFBusinessErrorList field.

Across all sessions, the VSF-B % can be aggregated using the Attempts metric:

SELECT
    (VSFB / Attempts) * 100 as VSFB_Perc
FROM
    (
        SELECT
            SUM (
                case
                WHEN
                    VSFBusiness = 'true'
                then
                    1
                else
                    0
                END) as VSFB,
            COUNT(*) as Attempts
        FROM
            Demo)
Conviva lists all the VSF-B errors the player reports within 90 seconds of the failure in the order in which they were reported. Modifying the player error reporting and error message text can help to clarify which error caused the failure.
1. ### Video Startup Failures Technical (VSF-T)

Definition: VSF-T indicates if a video failed to play due to a technical error. Find the list of associated errors in the VSFTechnicalErrorList field.

Across all sessions, the VSF-T % can be aggregated using the Attempts metric:

SELECT
    (VSFT / Attempts) * 100 as VSFT_Perc
FROM
    (
        SELECT
            SUM (
                case
                WHEN
                    VSFTechnical = 'true'
                then
                    1
                else
                    0
                END) as VSFT,
            COUNT(*) as Attempts
        FROM
            Demo)
Conviva lists all the VSF-T errors the player reports within 90 seconds of the failure in the order in which they were reported. Modifying the player error reporting and error message text can help to clarify which error caused the failure.
1. ### Video Playback Failures (VPF)

Definition: VPF indicates if the video play terminates due to a playback error. VPFs are an important measurement of service quality and audience engagement, especially when a large percentage of plays terminate due to VPF. Find the list of associated errors in the VPFErrorList field.

Across all sessions, the VPF % can be aggregated using the EndedPlays metric:

SELECT
    (VPF / EndedPlays) * 100 as VPF_Perc
FROM
    (
        SELECT
            SUM (
                case
                WHEN
                    VPF = 'true'
                then
                    1
                else
                    0
                END) as VPF,
            COUNT(*) as EndedPlays
        FROM
            Demo
        WHERE
            PlayingTime > 0
        and EndedStatus > 0)
Conviva lists all the VPF errors the player reports within 90 seconds of the failure in the order in which they were reported. Modifying the player error reporting and error message text can help to clarify which error caused the failure.
1. ### Video Playback Failures Business (VPF-B)

Definition: VPF-B indicates if the video play terminates due to a business playback error. VPF-Bs are an important measurement of service quality and audience engagement, especially when a large percentage of plays terminate due to VPF-B. Find the list of associated errors in the VPFBusinessErrorList field.

Across all sessions, the VPF-B % can be aggregated using the EndedPlays metric:

SELECT
    (VPFB / EndedPlays) * 100 as VPFB_Perc
FROM
    (
        SELECT
            SUM (
                case
                WHEN
                    VPFBusiness = 'true'
                then
                    1
                else
                    0
                END) as VPFB,
            COUNT(*) as EndedPlays
        FROM
            Demo
        WHERE
            PlayingTime > 0
        and EndedStatus > 0)
Conviva lists all the VPF-B errors the player reports within 90 seconds of the failure in the order in which they were reported. Modifying the player error reporting and error message text can help to clarify which error caused the failure.
1. ### Video Playback Failures Technical (VPF-T)

Definition: VPF-T indicates if the video play terminated due to a technical playback error. VPF-Ts are an important measurement of service quality and audience engagement, especially when a large percentage of plays terminate due to VPF-T. Find the list of associated errors in the VPFTechnicalErrorList field.

Across all sessions, the VPF-T % can be aggregated using the EndedPlays metric:

SELECT
    (VPFT / EndedPlays) * 100 as VPFT_Perc
FROM
    (
        SELECT
            SUM (
                case
                WHEN
                    VPFTechnical = 'true'
                then
                    1
                else
                    0
                END) as VPFT,
            COUNT(*) as EndedPlays
        FROM
            Demo
        WHERE
            PlayingTime > 0
        and EndedStatus > 0)
Conviva lists all the VPF-T errors the player reports within 90 seconds of the failure in the order in which they were reported. Modifying the player error reporting and error message text can help to clarify which error caused the failure.
1. ### Exits Before Video Start (EBVS)

Definition: EBVS measures the number of viewing attempts that were terminated, typically by the viewer, before the video started. If an error is not generated, we count the failed attempt as an EBVS. An EBVS is similar to a VSF (failure to play video), but an EBVS does not include a descriptive error message.

The EBVS for each session needs to be computed from the Conviva Connect data.

Across all sessions, the EBVS % can be aggregated using the Attempts metric:

SELECT
    (EBVS / Attempts) * 100 as EBVS_Perc
FROM
    (
        SELECT
            SUM (
                CASE
                WHEN
                    StartupError    = 'false'
                    and PlayingTime = 0
                    and StartupTime = -1
                then
                    1
                else
                    0
                END) as EBVS,
            COUNT(*) as Attempts
        FROM
            Demo)

An alternative way to calculate EBVS is:

  1. Rebuffering Ratio

Definition: Rebuffering Ratio shows the percentage of buffering during Playing Time. From this metric, we exclude the initial player startup buffering time (before the first video frame).

Across all sessions, the Rebuffering Ratio % can be aggregated as:

SELECT
    (TotalBufTime / (TotalBufTime + TotalPlayTime)) * 100 as RebufferingRatio_Perc
FROM
    (
        SELECT
            SUM(BufferingTime) as TotalBufTime,
            SUM(PlayingTime)   as TotalPlayTime
        FROM
            Demo
        WHERE
            PlayingTime > 0)
  1. Connection Induced Rebuffering Ratio (CIRR)

Definition: Rebuffering occurs when video play must wait for the buffer to fill because there's insufficient buffered video. CIRR is rebuffering unrelated to user-initiated seeks, but potentially caused by network conditions.

Across all sessions, the CIRR % is calculated using the ConnectionInducedRebufferingTime, BufferingTime, and PlayingTime fields in Conviva Connect:

SELECT
    COUNT(*) as Plays
FROM
    Demo
WHERE
    StartupTime > 0
or  (
        StartupTime = -3
    and PlayingTime >= 0)
The Zero CIRR Ended Plays % metric can be derived by identifying the sessions that played without CIRR and calculating that percentage of sessions from the total sessions that played.
1. ### Average Peak Bitrate

Definition: The average bitrate in kilobytes per second of delivered content across the lifetime session, as derived from the bandwidth attribute in the player manifest file. Some players may not report the bandwidth attribute.

Across all sessions, the Average Peak Bitrate can be aggregated as:

-- Because bitrate is per second, convert PlayingTime to seconds
SELECT
    (TotalBits / TotalPlayTimeSec) as AggAveragePeakBitRate
FROM
    (
        SELECT
            SUM(AverageBitRate * PlayingTime / 1000) as TotalBits,
            SUM(PlayingTime    / 1000) TotalPlayTimeSec
        FROM
            Demo
        WHERE
            PlayingTime > 0)
  1. Avg Average Bitrate

Definition: The average bitrate in kilobytes per second of delivered content across the lifetime session, as derived from the average bandwidth attribute in the player manifest file. It represents the time-weighted average bitrates played by the player. Because some manifest files do not report average bandwith, the Avg Average Bitrate field tends to have more zero values than the Average Peak Bitrate field. Across all sessions, the Avg Average Bitrate can be aggregated as:

-- Because bitrate is per second, convert PlayingTime to seconds
SELECT
    (TotalBits / TotalPlayTimeSec) as AggAvgAverageBitRate
FROM
    (
        SELECT
            SUM(AvgAverageBitRate * PlayingTime / 1000) as TotalBits,
            SUM(PlayingTime / 1000) TotalPlayTimeSec
        FROM
            Demo
        WHERE
            PlayingTime > 0)
  1. Session Duration

**Definition **: Session Duration is the total time in seconds from the session start to the session end. It is calculated as:

SELECT
    EndTimeUnix - StartTimeUnix as SessionDuration
FROM
    Demo
1. ### Bandwidth

Definition: Bandwidth is the amount of data transferred in megabytes (MB) per second across the lifetime session.

Across all sessions, the Bandwidth can be aggregated as:

-- Since bitrate is in seconds, convert PlayingTime to seconds
-- Since Average bitrate is kilobytes, convert to megabytes
SELECT
    SUM(Bandwidth) / COUNT(*) as Bandwidth
FROM
    (
        SELECT
            PlayingTime,
            (PlayingTime / 1000) * (AverageBitRate / 8000) as Bandwidth
        FROM
            Demo
        WHERE
            PlayingTime > 0)
  1. Video Startup Time (VST)

Definition: VST is the number of seconds between the start of the Conviva monitoring (i.e. Session Start) and the first played video frame. We exclude any time trying to play or playing ads.

Across all sessions, VST can be aggregated using the StartUpTime value:

SELECT
    ROUND(TotalStartupTimeSec / Plays, 2) as StartupTimeSec
FROM
    (
        SELECT
            SUM(StartupTime) / 1000 as TotalStartupTimeSec,
            COUNT(*)                as Plays
        FROM
            Demo
        WHERE
            StartUpTime >= 0)
  1. Video Restart Time (VRT)

Definition: VRT is the amount of time in seconds after seeking is completed by the user until the video begins playing.

Across all sessions, the VRT can be aggregated as:

SELECT
    ROUND(TotalRestartTimeSec / Plays, 2) as RestartTimeSec
FROM
    (
        SELECT
            SUM(VideoRestartTime) / 1000 as TotalRestartTimeSec,
            COUNT(*)                     as Plays
        FROM
            Demo
        WHERE
            PlayingTime      > 0
        AND VideoRestartTime != -1 )
  1. Micro Playing Time

Definition: The total time in milliseconds that a session spent in continuous play time that is less than 200 milliseconds. Sometimes, the player reports false play duration; this time is excluded from the Playing Time.

Across all sessions, the Micro Playing Time can be aggregated as:

SELECT
    SUM(MicroplayingTime) as MicroplayingTimeMs
FROM
    Demo
WHERE
    PlayingTime > 0
  1. Micro Playing Interrupts

Definition: The total number of times a session spent in continuous play time that is less than 200 milliseconds. Sometimes, the player reports false play duration; this time is excluded from the Playing Time.

Across all sessions, Micro Playing Interrupts can be aggregated as:

SELECT
    SUM(MicroplayingInterruptions) as MicroplayingInterrupts
FROM
    Demo
WHERE
    PlayingTime > 0
  1. Micro Buffering Time

Definition: The total time in milliseconds that a session spent in continuous buffering that is less than 200 milliseconds. Micro buffering could result in jittering due to the video playback; this is not excluded from the session's buffering time.

Across all sessions, Micro Buffering Time can be aggregated as:

SELECT
    SUM(MicroBufferingTime) as MicroBufferingTimeMs
FROM
    Demo
WHERE
    PlayingTime > 0
  1. Micro Buffering Interrupts

Definition: The total count of number of times a session spent in continuous buffering that is less than 200 milliseconds. Micro buffering could result in jittering due to the video playback; this is not excluded from the session's buffering time.

Across all sessions, Micro Buffering Interrupts can be aggregated as:

SELECT
    SUM(MicroBufferingInterruptions) as MicroBufferingInterrupts
FROM
    Demo
WHERE
    PlayingTime > 0
1. ### Long Rebuffering Time **Definition**: The total time in milliseconds that a session spent in continuous buffering that is more than 90 seconds. Long buffering occurs when a player is stuck in a buffering state; this is excluded from the session's buffering time.

Across all sessions, Long Rebuffering Time can be aggregated as:

SELECT
    SUM(LongRebufferingTime) as LongRebufferingTimeMs
FROM
    Demo
WHERE
    PlayingTime > 0
  1. Long Rebuffering Interrupts

Definition: The number of times a session spent in continuous buffering that is more than 90 seconds. Long buffering occurs when a player is stuck in a buffering state; this is excluded from the session's buffering time.

Across all sessions, Long Rebuffering Interrupts can be aggregated as:

SELECT
    SUM(LongRebufferingInterruptions) as LongRebufferingInterrupts
FROM
    Demo
WHERE
    PlayingTime > 0
  1. Abandonment

Definition:Abandonment occurs when a viewer exits a video before the video start with a wait time greater than 10 seconds (SPI setting defined as Good) or 8 seconds (SPI setting defined as Best). At the session level, the Abandonment metric can be calculated as:

SELECT
    CASE
    WHEN
        (StartUpTime           = -1
        and StartupError       = 0
        and PlayingTime        = 0
        and SessionDurationSec > 10)
    then
        1
    else
        0
    END as Abandonment10Sec
FROM
    (
        SELECT
            StartUpTime ,
            StartupError,
            PlayingTime ,
            (EndTimeUnix - StartTimeUnix) as SessionDurationSec
        FROM
            Demo)

Across all sessions, Abandonment % can be aggregated as:

SELECT
    (SUM(Abandonment10Sec) / Count(*)) * 100 as Abandonment10Sec_Perc
FROM
    (
        SELECT
            CASE
            WHEN
                (StartUpTime           = -1
                and StartupError       = 0
                and PlayingTime        = 0
                and SessionDurationSec > 10)
            then
                1
            else
                0
            END as Abandonment10Sec
        FROM
            (
                SELECT
                    StartUpTime ,
                    StartupError,
                    PlayingTime ,
                    (EndTimeUnix - StartTimeUnix) as SessionDurationSec
                FROM
                    Demo) )

A second approach more closely matches the SPI Streams calculation on VSI. This calculation excludes from the denominator sessions that:

a) exited before the video started and the viewer did not wait a significant time (e.g. 8 seconds).

b) sessions impacted by business logic errors.

SELECT
    (SUM(Abandonment10Sec) / (COUNT(*) - SUM(BusinessError))) * 100 as Abandonment_Perc
FROM
    (
        SELECT
            CASE
            WHEN
                (StartUpTime           = -1
                and StartupError       = 0
                and PlayingTime        = 0
                and SessionDurationSec > 10)
            then
                1
            else
                0
            END as Abandonment10Sec,
            CASE
            WHEN
                (SessionDurationSec < 8
                or VSFBusiness      = true
                or VPFBusiness      = true)
            then
                1
            END as BusinessError
        FROM
            (
                SELECT
                    StartUpTime                                        ,
                    StartupError                                       ,
                    PlayingTime                                        ,
                    (EndTimeUnix - StartTimeUnix) as SessionDurationSec,
                    VSFBusiness                                        ,
                    VPFBusiness
                FROM
                    Demo))

1. ### Paused Time

Definition: Paused Time shows the total time in milliseconds the viewer paused during the session. A pause occurs when the viewer hits the pause button. Across all sessions, the Paused Time can be aggregated as:

SELECT
    AVG(PausedTime) as AggPausedTimeMs
FROM
    Demo
  1. Paused Ratio

Definition:Paused Ratio gives the paused time as a ratio of the total playing time, including rebuffering and pauses. This metric helps you understand the impact of total pause time during your video sessions. Across all sessions, the Paused Ratio can be aggregated using the EndedPlays metric:

SELECT
    SUM(PausedTime)/SUM(PausedTime + PlayingTime + BufferingTime) as AggPausedRatio
FROM
    Demo
WHERE
    EndedStatus > 0
and PlayingTime > 0
  1. Last Playhead Time

Definition: The time in milliseconds of the last playhead position. This metric is available only at the session level.

  1. Bitrate Switches

Definition: A bitrate switch occurs whenever a change in bitrate is detected. The Bitrate Switches metric displays the number of the bitrate switches over a lifetime session. Across all sessions, the average number of Bitrate Switches can be aggregated using the EndedPlays metric:

SELECT
    AVG(NumBitrateSwitches) as AggNumBitRateSwitches
FROM
    Demo
WHERE
    EndedStatus > 0
and PlayingTime > 0

Definition: An exit that occurs during connection induced rebuffering (and not due to seek) within 5 seconds before the session end. Across all sessions, CIRRelatedExits % can be aggregated using the EndedPlays metric:

SELECT
    (CIRRelatedExits / EndedPlays) * 100 as CIRRelatedExits_Perc
FROM
    ( SUM(
        CASE
        WHEN
            CIRRelatedExit = 'true'
        then
            1
        END) as CIRRelatedExits, COUNT(*) as EndedPlays FROM Demo WHERE EndedStatus > 0
    and PlayingTime > 0)

Engagement Metrics

  1. Ended Plays

Definition: An Ended Play is a session with a Play (PlayingTimeMs > 0) that ended (EndedStatus > 0) during the selected time frame, in this case the day (for example, December 16) of the Conviva sessions data.

Across all sessions, the number of Ended Plays can be aggregated as:

**```sql SELECT Count(*) as EndedPlays FROM Demo WHERE PlayingTime > 0 and EndedStatus > 0


            1. ### Unique Devices

            
<strong>Definition</strong>: <cite>Unique Devices </cite>counts the total number of devices that had any <cite>Ended Plays</cite> during the during the selected timeframe, in this case the pipeline end date (for example, December 16) of the Conviva sessions data. A unique device is not equivalent to a unique person. If a person uses multiple devices, each device is counted as <cite>Unique Devices</cite>. If there are more than one applications offered to the same device, the <cite>Client ID</cite> will be identified for each application separately. This <cite>Client ID</cite> is represented by the first four components of the <cite>Conviva Session ID</cite>, as explained <a href="#Metrics">here</a>.

            
Across all sessions, <cite>Unique Devices</cite> can be aggregated using the <code>EndedPlays </code>metric:

            
<img src="/resources/images/equations/equation180_connect_content_unique_devices.svg"  class="doc-img" />

            
            
```sql
SELECT
COUNT(DISTINCT(CONCAT(ID[0], ":", ID[1], ":", ID[2], ":", ID[3]))) as UniqueDevices
FROM
(
-- first split sessionID into components, then construct clientID from first four
SELECT
SPLIT(ConvivaSessionID, ":") as ID
FROM
Demo
WHERE
PlayingTime > 0
and EndedStatus > 0)
        1. ### Minutes Ended Play

        

Definition: The Minutes Ended Plays metric is calculated by dividing the total amount of Playing Time minutes by the number of Ended Plays during the selected timeframe, in this case the pipeline end date (for example, December 16).

Across all sessions, Minutes Ended Plays can be aggregated using the EndedPlays metric:

SELECT
TotalPlayTimeMin / TotalEndedPlays as MinuteEndedPlay
FROM
(
SELECT
-- convert millisec to minutes
SUM(PlayingTime / (1000 * 60)) as TotalPlayTimeMin,
COUNT(*)                       as TotalEndedPlays
FROM
Demo
WHERE
PlayingTime > 0
and EndedStatus > 0)
        1. ### Average % Complete

        

Definition: Average % Complete shows the amount of viewed play duration compared with the total length of the content. A high % indicates a high level of viewer engagement with the asset, channel, and service.

The field PercentageComplete exists at the session level, which can be used to calculate the Average % Complete across all sessions.

SELECT
AVG(PercentageComplete) as AvePercComplete
FROM
Demo
WHERE
PercentageComplete >= 0

Calculating Interval (day) Metrics

It is not always possible to directly calculate interval metrics from the Conviva Connect lifetime sessions. In this section, we show how to calculate interval based metrics from lifetime sessions using the example from the Get Started with Content Summary Reports section. In this dataset, the third session (ID: 1003) spans two days, which means that we cannot infer the exact Playing Time and CIRR for the December 16 day-interval (00:00:00 to 23:59:59) using the December 16 pipeline end date. One solution is to obtain a dataset using the December 15 pipeline end date. For example, the following dataset has only one session (ID: 1003) because the other sessions start on the next day.

    <table class="doc-table doc-table--center" cellspacing="0">
        <col />
        <col />
        <col />
        <col />
        <col />
        <col />
        <col />
        <thead>
            <tr>
                <th>Conviva
                    **Session ID</th>
                <th>Start Time</th>
                <th>End Time</th>
                <th>Playing Time

(seconds) CIRR Attempt

Ended

Status

                </th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>1003</td>
                <td>2022-12-15 

23:54:00 2022-12-15 23:59:59 355 2 true 0

To calculate Playing Time and CIRR for the December 16 day-interval, subtract the respective lifetime metric ending on December 15 from the lifetime metric ending on December 16. So for the December 16 day-interval, intvPlayingTime = 950 - 355 = 595 and intvCIRR = 5 - 2 = 3. Similarly, for ConvivaSessionIDs 1001 and 1002, intvAttempt = true since both sessions started on this day whereas the third session (ID: 1003) did not, hence, intvAttempt = false.

Sample metrics for the December 16 day-interval:

    <table class="doc-table doc-table--center" cellspacing="0">
        <col />
        <col />
        <col />
        <col />
        <col />
        <col />
        <col />
        <thead>
            <tr>
                <th>Conviva
                    

Session ID Start Time End Time

intv Playing Time (seconds)

                </th>
                <th>intv

CIRR intv Attempt

Ended

Status

                </th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>1001</td>
                <td>2022-12-16 

18:38:10 2022-12-16 18:59:10 1250 10 true 1 1002 2022-12-16 23:59:37 2022-12-16 23:59:59 20 0 true 0 1003 2022-12-15 23:54:00 2022-12-16 00:10:00 595 3 false 1

The SQL code shows one way to do this interval calculation, where Demo16Dec is the December 16 pipeline end date and Demo15Dec is the December 15 pipeline end date.

SELECT
L.ConvivaSessionID                                              ,
L.PlayingTime                                                   ,
L.CIRR                                                          ,
L.PlayingTime - IFNULL(P.PlayingTimePrior, 0) as IntvPlayingTime,
L.CIRR        - IFNULL(P.CIRRPrior, 0)        as IntvCIRR
FROM
Demo16Dec L
LEFT OUTER JOIN
Demo15Dec P
ON
(
L.ConvivaSessionId = P.ConvivaSessionID)

To determine an attempt for the 16 December day-interval, we use the Demo16Dec data and the StartTimeUnix field:

SELECT
CASE
(
WHEN
FROM_UNIXTIME(StartTimeUnix, 'y-MM-dd') = "2022-12-16"
then
1
else
0
END) as intvAttempt
FROM
Demo

To calculate the interval-based metrics such as Plays, Video Startup Failure, Video Restart Time, and others, follow the same logic described above. Please contact Conviva support if needed.

KPIs

Startup

        - <code>Startuptime</code><code>>= 0</code> AND <code>PlayingTime = (number)</code> AND no error code, corresponds to a successful play.

        - <code>Startuptime</code><code>= -1</code> AND <code>PlayingTime = 0</code> AND an error code, corresponds to a VSF.

        - <code>Startuptime = -1</code> AND <code>PlayingTime = 0</code> AND no error code, corresponds to an EBVS.

    

    

Quality KPI: Successfully started sessions

        - <code>StartupError = 0</code> and <code>BufferingTime > 0 </code>=> Pass

        - <code>StartupError <> 0</code> or <code>PlayingTime < 1</code> => Fail

    

    

Quality KPI: Sessions with StartupTime below acceptable threshold

        - <code>StartupTime <= Threshold</code> => Pass

        - <code>StartupTime > Threshold</code> => Fail

    

    

Quality KPI: Sessions Played with an acceptable bitrate

        - <code>AvgBitrate >= Threshold</code> => Pass

        - <code>AvgBitrate < Threshold</code> => Fail

    

    

Quality KPI: Sessions Played with acceptable buffering ratio

        - (<code>BufferingTime</code> / <code>BufferingTime</code> + <code>PlayingTime</code>) <code>* 100 <= Threshold</code> => Pass

        - (<code>BufferingTime</code> / <code>BufferingTime</code> + <code>PlayingTime</code>) <code>* 100 > Threshold</code> => Fail

    

    

Conviva SPI Calculation

The Conviva SPI provides a visual indicator of your KPIs performance so you can quickly determine the number and percent of impacted streams and performance level. A stream is impacted when it fails to meet one or more of the defined KPI settings.

Conviva formulates a unified streaming performance KPI based on the percentage of streaming sessions with good or best viewing experience. This KPI represents the Conviva Streaming Performance Index, and is based on the percentage of streams with:

        - No errors (VSF-T or VPF-T)

        - No or very low Rebuffering (using CIRR)

        - Acceptable picture quality based on average bitrate for different screen sizes

        - Acceptable Video Start Time

        - No EBVS if the viewer was waiting a long time before exiting.

    

    

Conviva provides KPI settings based on Good and Best performance. You can also set custom KPI settings to match your specific performance goals.

Good Performance KPI Settings

                - No Errors (VSF-T or VPF-T)

                - VST < 10sec

                - EBVS wait time < 10sec

                - <cite>Avg. Peak Bitrate</cite> > 800Kbps for TV screens

                - <cite>Avg. Peak Bitrate</cite> > 400Kbps for desktop or tablets

                - <cite>Avg. Peak Bitrate</cite> > 200Kbps for mobile devices screens

                - CIRR < 0.4%

                - CIRT < 2sec

            

        
    
    
           

** Best Performance KPI Settings**

                - No Errors (VSF-T or VPF-T)

                - VST < 10sec

                - EBVS wait time < 8sec

                - <cite>Avg. Peak Bitrate</cite> > 2Mbps for TV screens **<b>Note</b>: Encoding compression are not considered in the bit rates.

                - <cite>Avg. Peak Bitrate</cite> > 800Kbps for desktop or tablets

                - <cite>Avg. Peak Bitrate</cite> > 400Kbps for mobile devices screens

                - CIRR < 0.02%

                - CIRT < 1sec

            

        
    
    

Frequently Asked Questions

        1. ### Difference between VSI dashboard data and Conviva Connect

        

There are differences between the data that you see within Conviva VSI vs what you see in the Conviva Connect SSD. This is by design, and there are a couple of reasons why Conviva Connect and Conviva VSI have differences:

        <ol>
            1. Conviva VSI uses real-time, 1-minute or 1-hour interval metrics whereas Conviva Connect SSD provides lifetime metrics and can provide a historical 1-day interval. The averages between the two will get closer the longer the window you use. That is, a 24-hour average results in a better match than a 1-hour average.

            1. Although Conviva VSI and Conviva Connect share the same session level sanitization rules, Conviva VSI adds additional aggregation logic based on metrics calculations. The idea here is for the consumer of Session Source Data to apply aggregation logic based on the desired use case.

        

        

Pursuing an exact match between Conviva VSI and offline Conviva Connect calculations is difficult and often inadvisable.

A Note on Heartbeats:

Conviva uses Heartbeats to monitor the video sessions. Heartbeats continue to be sent while the video is buffering, unless the internet connection itself has been interrupted and the Conviva library and backend cannot communicate. In this case, the library will continue monitoring and will send a "catch-up" heartbeat when the connection is re-established. If the video is paused or the connection is lost for more than 2 minutes, then no heartbeats will be sent and the Conviva back-end will automatically clean-up the session. We do not count paused time, so if the viewer was paused for more than 2 minutes then the session will time out. We still collect heartbeats during rebuffering, so this would not cause a session to timeout. However, if the player ends up in what we call a 'zombie state' (incessant/perpetual buffering) then that contributes to Conviva VSI and Conviva Connect metrics. The only difference is that Conviva VSI metrics cap buffering at 30 minutes, whereas Conviva Connect has no such cap.

        <li>
            

What does VST = -3 stand for?

        </li>
        

VST=-3 means we don't have a specific Video Startup Time. Possible reasons include:

            - The current session is the revived portion of an expired session. Sessions expire when there is 120 seconds of inactivity. The expired and revived sessions have the same session ID, so you can group the sessions by session id (Conviva SessionID). The session End flag of the expired session is set to 2 (Session End Status = 2),  while the revived portion has VST of -3.

            - Conviva flags indicate that the <cite>Startup Time</cite> is not reliable.

            - <cite>Startup Time</cite> exceeded 10 minutes and the VST is flagged as unknown.

        

        <li>
            

Why do I see unexpected ASCII characters in certain fields?

        </li>
        

Conviva Connect reports are delivered as CSV files. The Session Tags column in Conviva Connect is customer defined and can contain arbitrary strings with special characters which could prevent parsing of CSV; therefore we use URI encoding to remove any offending characters. We recommend that you run URI decoding on the "Session Tags" field, by using various libraries that provide this decode functionality (available in all mainstream languages).

        <li>
            

How do I stitch Conviva Connect across multiple days?

        </li>
        

The data in Conviva Connect is already "stitched" for sessions that span across multiple days. Conviva Connect provides lifetime metrics, which means that when a session data spans across many days, the last session record contains the complete details of the metrics for that session. This is a quick mechanism to view Conviva Connect session data across multiple sets. Therefore, when combining Conviva Connect sessions, overriding earlier sessions with the most recent session provides the most accurate and quick mechanism to stitch session logs.

        <li>
            

What is the difference between -1 and 0 in Percent Complete?

        </li>
        

The value in Percentage Complete is rounded to the nearest integer value. A value of 0 is a rounded value when percentage complete is less than 1%. This covers the occasions when the StartupTime>0 but the video only played for a very small period of time. A value of -1 (usually for live content) indicates that we do not receive content length.

    </ol>
    

DPI Minute Schema

DPI Minute Schema Descriptions

    <div class="doc-scroll-x">
        <table class="doc-table doc-table--center" border="1" cellspacing="0" cellpadding="0">
            <col />
            <col />
            <col />
            <thead>
                <tr>
                    <td width="198" nowrap="" valign="top">
                        

Field name

                    </td>
                    <td width="102" nowrap="" valign="top">
                        

Type

                    </td>
                    <td width="234" valign="top">
                        

Description

                    </td>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>ConvivaSessionId</td>
                    <td>STRING
Unique Conviva session identifier in this format: five integer numbers separated by a colon (:). Client ID is part of the Conviva session id - the first 4 blocks of the numbers separated by : represents client id. For example: Conviva session id value = "20048757:2397552430:4151350518:1876058113:4487054" then client id = 20048757:2397552430:4151350518:1876058113 & session id = 4487054 pageId STRING Page/Screen ID pageStartTimeMs LONG Page/Screen Period Start Time - Ms lifeSessionAppCrashCount INTEGER Life Session - App Crash Count lifeSessionSessionDurationMs LONG Life Session - Session Duration - Ms lifeSessionPageLoadDurationMs LONG Life Session - Page Load Duration - Ms lifeSessionMaxPageLoadDurationMs LONG Life Session - Max Page Load Duration - Ms lifeSessionUserActiveTimeMs Life Session - User Active Time - Ms lifeSessionAppStartupDurationMs Life Session - App Startup Duration - Ms lifeSessionMaxAppStartupDurationMs Life Session - Max App Startup Duration - Ms lifeSessionAppStartupCount INTEGER Life Session - Number of App Startup Count lifeSessionNetworkRequestFailureDurationMs Life Session - Network Request Duration - Ms lifeSessionNetworkRequestFailureCount INTEGER Life Session - Network Request Count lifeSessionNetworkRequestSuccessDurationMs LONG Life Session - Network Request Duration - Ms lifeSessionNetworkRequestSuccessCount INTEGER Life Session - Network Request Count lifeSessionEventCount INTEGER Life Session - Total Event Count lifeSessionUserEventCount INTEGER lifeSessionPageLoadSuccessCount INTEGER lifeSessionPageLoadAttemptCount INTEGER lifeSessionEndStatus INTEGER lifePageAppCrashCount INTEGER lifePagePageLoadDurationMs LONG lifePageUserActiveTimeMs LONG lifePageNetworkRequestFailureDurationMs LONG lifePageNetworkRequestFailureCount INTEGER lifePageNetworkRequestSuccessDurationMs LONG lifePageNetworkRequestSuccessCount INTEGER lifePageEventCount INTEGER lifePageUserEventCount INTEGER clientId STRING sessionStartTimeMs LONG platform STRING appName STRING appBuild STRING appVersion STRING appType STRING sensorVersion STRING referrerHost STRING host STRING path STRING query STRING referrer STRING title STRING url STRING userAgent STRING deviceName STRING deviceCategory STRING deviceHardwareType STRING The type of your device hardware such as set top box, mobile phone, tablet, and TV. deviceManufacturer STRING The manufacturer of the device from which the content was watched, such as Google, Roku, Huawei, and Apple. deviceMarketingName STRING Marketing name of the device from which the content was watched, such as, Google Chromecast, Huawei P20, and Apple iPhone 12 Pro. deviceOperatingSystem STRING deviceOperatingSystemVersion STRING The version of the operating system used by the device. deviceOperatingSystemFamily STRING The name of the operating system group, such as PlayStation for PlayStation 3 and PlayStation 4, or Windows for Windows 10 and Windows XP. deviceModel STRING Model of the device, such as, iPad Pro 11-inch (2nd generation), EML-L29. browserName STRING The browser used by the viewer's device."Non-Browser Apps" is shown if the video stream was viewed on a mobile app or a connected TV. browserVersion STRING The browser version of the device on which the content was watched. playerFrameworkName STRING The name of the player framework used for video playback, for example, AVFoundation, NexPlayer, and HTML5. playerFrameworkVersion STRING The version of the framework used for video playback. city LONG City Name (geography, like San Francisco). country LONG Country Name. state LONG State Name (geography, like California). postalCode STRING A series of numbers used for postal delivery area identification. This field is null when the Postal Code is unavailable. ipV4 STRING The public IP address of the viewer's video playing device in v4 version. For example, 84.106.90.230. ipV6 STRING The public IP address of the viewer's video playing device in v6 version. For example, 2600:8801:8d07:e100:c0a9:9de9:8741:267. userId STRING isp STRING Internet Service Provider's name. asn STRING Autonomous System Number for the ISP. domain STRING lifeSessionEventName ARRAY lifeSessionEventCategory ARRAY

ViewerID

                    </td>
                    <td>
                        

VARCHAR(128)

                    </td>
                    <td>
                        

Unique identifier of the viewer (sometimes called subscriber) watching content in that session. This is typically a number, or a hashed/masked identifier without any personally identifiable information. The same ViewerId can have multiple sessions.

This field is null when the ViewerID is unavailable.

                    </td>
                </tr>
                <tr>
                    <td>
                        

AssetName

                    </td>
                    <td>
                        

STRING

                    </td>
                    <td>
                        

The name of the viewed video asset

                    </td>
                </tr>
                <tr>
                    <td>
                        

DeviceOS

                    </td>
                    <td>
                        

STRING

                    </td>
                    <td>
                        

The operating system of the device

                    </td>
                </tr>
                <tr>
                    <td>DMA
STRING The Designated Market Area or media region in which the session was viewed.

This field is null when the DMA is unavailable. Postal Code STRING A series of numbers used for postal delivery area identification.

This field is null when the Postal Code is unavailable.

Country

                    </td>
                    <td>
                        

STRING

                    </td>
                    <td>
                        

The country location where the content was watched.

                    </td>
                </tr>
                <tr>
                    <td>
                        

State

                    </td>
                    <td>
                        

VARCHAR(128)

                    </td>
                    <td>
                        

The state location where the content was watched

                    </td>
                </tr>
                <tr>
                    <td>
                        

City

                    </td>
                    <td>
                        

STRING

                    </td>
                    <td>
                        

The city location where the content was watched

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

ASN

                    </td>
                    <td width="102" valign="top">
                        

STRING

                    </td>
                    <td width="234" valign="top">
                        

Autonomous System Number for the ISP from which the video was streamed

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

ISP

                    </td>
                    <td width="102" valign="top">
                        

STRING

                    </td>
                    <td width="234" valign="top">
                        

The name of the Internet Service Provider

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

StartTimeUnix

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">
                        

The time when Conviva received the first heartbeat for the session. The format is Unix epoch time in seconds.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

StartTimeUnixMs

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">
                        

The time when Conviva received the first heartbeat for the session. The format is Unix epoch time in milliseconds.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

StartupTime

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">
                        

The time in milliseconds between the start of the Conviva monitoring and the first-played video frame.

StartupTime excludes pre-roll ad time.

-1 indicates an unsuccessful play (no startup time).

-3 indicates the session connected, but the client didn't send us the necessary information to determine when the video began playing.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

PlayingTime

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">The amount of time in milliseconds when a player is actively displaying video content during a session. PlayingTime excludes rebuffering time.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">ReBufferingTime</td>
                    <td width="102" valign="top">INTEGER</td>
                    <td width="234" valign="top">The time between the video stalling during playback and the viewer waiting for the video to resume playing.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

Interrupts

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">The number of times the session was interrupted for rebuffering.  If a pause or other viewer action caused  buffering, that buffering is counted as an interrupt. Viewer pausing and resuming a session without any buffering is not counted as interrupt.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

AverageBitRate

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">
                        

Average bitrate in kbps at which content was delivered during the session. The ability to determine bitrate depends on the player integration. Not all players can deliver bitrate information.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

StartupError

                    </td>
                    <td width="102" valign="top">
                        

SMALLINT

                    </td>
                    <td width="234" valign="top">
                        

If value = true, then the video played and there was no startup error.

If value = false, then the video failed to play and there was a startup error (see Error list).

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

SessionTags

                    </td>
                    <td width="102" valign="top">
                        

RECORD[VARCHAR(64)/each key, VARCHAR(256)/each Value]

                    </td>
                    <td width="234" valign="top">
                        

The custom player metadata that is defined during your Conviva integration. Session tags reflect your specific business needs and player information.

For CSV output file the value is in String* format, where:

                            - Key-value pairs are delimited by ampersand (&)

                            - Key and value are separated by equals sign (=)

                        

                        

For example, c3.cmp.0._id=da&c3.cmp.0._ver=1&c3.cluster.name=production&c3.cmp.0._cfg_ver=1516215389&c3.cmp.0._type=DEVATLAS&c3.pt.os=UNIX&c3.protocol.type=cws.

For Parquet file format, the value is in array> format.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">IPV4</td>
                    <td width="102" valign="top">VARCHAR(32)	</td>
                    <td width="234" valign="top">The public IP address of the viewer's video playing device in v4 version. For example, 84.106.90.230.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">IPV6</td>
                    <td width="102" valign="top">VARCHAR(48)	</td>
                    <td width="234" valign="top">The public IP address of the viewer's video playing device in v6 version. For example, 2600:8801:8d07:e100:c0a9:9de9:8741:267.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

IPAddress

                    </td>
                    <td width="102" valign="top">
                        

VARCHAR(48)

                    </td>
                    <td width="234" valign="top">
                        

The public IP address of the viewer's video playing device. The IP address - as seen by the Conviva gateway - typically corresponds to the modem gateway for fixed connections or the packet gateway for mobile connections.

For European customers, due to legal/privacy reasons, the IP address is not shown.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">IPType</td>
                    <td width="102" valign="top">STRING</td>
                    <td width="234" valign="top">The type of the device's public IP address, such as, IPV4 Only, IPV6 Only</td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

CDN

                    </td>
                    <td width="102" valign="top">
                        

VARCHAR(256)

                    </td>
                    <td width="234" valign="top">
                        

The CDN associated with the streaming session

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

Browser

                    </td>
                    <td width="102" valign="top">
                        

STRING

                    </td>
                    <td width="234" valign="top">The browser used by the viewer's device."Non-Browser Apps" is shown if the video stream was viewed on a mobile app or a connected TV.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

ConvivaSessionID

                    </td>
                    <td width="102" valign="top">
                        

VARCHAR(128)

                    </td>
                    <td width="234" valign="top">
                        

The unique Conviva session identifier in format of five, colon-separated integer numbers. The last block represents the Conviva Client ID. The last number block represents the Conviva Session ID.

Example: Conviva session id value = "20048757:2397552430:4151350518:1876058113:4487054"

Client ID = 20048757:2397552430:4151350518:1876058113

Session ID = 4487054

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

StreamURL

                    </td>
                    <td width="102" valign="top">
                        

VARCHAR(2048)

                    </td>
                    <td width="234" valign="top">
                        

The URL of the video stream

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

ErrorList

                    </td>
                    <td width="102" valign="top">
                        

[VARCHAR(1024)/each]

                    </td>
                    <td width="234" valign="top">
                        

A list of fatal errors that occurred during this session, separated by "&". A session Startup Time of -1 and Playing Time of 0 with no error list, indicates an Exit Before Video Start (EBVS) occurred.

For CSV output file, the ErrorList value is in String format. For Parquet file, the value is in array format.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

PercentageComplete

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">
                        

The percentage of video content the viewer watched during a session. % Complete is calculated by dividing the total playing time for the session by the total content length. % Complete is rounded to the nearest integer value.

A value of -1 means we couldn't obtain content length (for example, in live content).

A value of 0 means that the video did not start or that the Percentage Complete is less than 1%.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

ConnectionInducedRebufferingTime

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">The non-seek rebuffering time in milliseconds</td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

VideoRestartTime

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">The total time between the user's seek complete and the video replay. VideoRestartTime in milliseconds is the sum of all such occurrences for the entire session.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

RejoinedCount

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">
                        

Number of times the video rejoined after a user seek

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

VPF

                    </td>
                    <td width="102" valign="top">
                        

SMALLINT

                    </td>
                    <td width="234" valign="top">
                        

Video Playback Failures (VPF) occurs when a fatal error causes a video playback to fail.

The field is set to TRUE if the session started successfully but ended with a fatal error.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

VPFErrorList

                    </td>
                    <td width="102" valign="top">
                        

RECORD

                    </td>
                    <td width="234" valign="top">
                        

Video Playback Failure Error list contains errors (including custom errors) that caused the playback to fail.

For CSV output file, the VPFErrorList value is in String format. For Parquet file, the value is in array format.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

ContentLength

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">The asset length in milliseconds. Applicable only for VOD traffic. For LIVE video, the content length value is set to -1 for unknown</td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

EndedStatus

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">
                        

An integer (0-5) showing the session status at the end of the day:

0 = Not Ended; at the SSD issue time, the session is still active.

1 = Gracefully ended; the session ended with a session ended event.

2 = Expired due to lack of heartbeat update; No heartbeat update was received for 2 minutes.

3 = Expired due to long buffering; the total session lifetime buffering exceeded longer than 30 minutes, classified as a zombie session.

4 = Ended due to long pause; the session paused for a continuous period of longer than 10 minutes.

5 = Ended due to continuous buffering; session was in a continuous buffering state for longer than four minutes.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">SessionEndedStatus</td>
                    <td width="102" valign="top">STRING</td>
                    <td width="234" valign="top">The state of the session when it was ended, such as, GracefulEnd, NotEnded, or ByExpiration.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

EndTimeUnix

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">The time the last session heartbeat within the day was received.

The format is Unix epoch time in seconds.

EndTimeUnixMs

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">The time the last session heartbeat within the day was received.

The format is Unix epoch time in milliseconds.

VSFBusiness

                    </td>
                    <td width="102" valign="top">
                        

SMALLINT

                    </td>
                    <td width="234" valign="top">
                        

Video Start Failures (VSF) Business measures how often Attempts terminated during video startup before the first video frame was played, and a fatal error was reported due to a business logic issue, such as usage limits

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

VSFBusinessErrorList

                    </td>
                    <td width="102" valign="top">
                        

RECORD

                    </td>
                    <td width="234" valign="top">
                        

Video Start Failures (VSF) Business Error list contains errors (including custom errors) that caused the video start to fail due to business logic issue.

For CSV output file, the VSFBusinessErrorList value is in String format. For Parquet file, the value is in array format.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

VSFTechnical

                    </td>
                    <td width="102" valign="top">
                        

SMALLINT

                    </td>
                    <td width="234" valign="top">
                        

Video Start Failures (VSF) Technical measures how often Attempts terminated during video startup before the first video frame was played, and a fatal error was reported due to a technical logic issue, such as prolonged buffering.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

VSFTechnicalErrorList

                    </td>
                    <td width="102" valign="top">
                        

RECORD

                    </td>
                    <td width="234" valign="top">
                        

Video Start Failures (VSF) Technical Error list contains errors (including custom errors) that caused the video start to fail due to technical logic issue.

For CSV output file, the VSFTechnicalErrorList value is in String format. For Parquet file, the value is in array format.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

VPFBusiness

                    </td>
                    <td width="102" valign="top">
                        

SMALLINT

                    </td>
                    <td width="234" valign="top">
                        

Video Playback Failures (VPF) Business measures how often Attempts terminated during video playback and a fatal error was reported due to a business logic issue, such as usage limits

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

VPFBusinessErrorList

                    </td>
                    <td width="102" valign="top">
                        

RECORD

                    </td>
                    <td width="234" valign="top">
                        

Video Playback Failures (VPF) Business Error list contains errors (including custom errors) that caused the video playback to fail due to business logic issue.

For CSV output file, the VPFBusinessErrorList value is in String format. For Parquet file, the value is in array format.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

VPFTechnical

                    </td>
                    <td width="102" valign="top">
                        

SMALLINT

                    </td>
                    <td width="234" valign="top">
                        

Video Playback Failures (VPF) Technical measures how often Attempts terminated during video playback, and a fatal error was reported due to a technical logic issue, such as prolonged buffering.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

VPFTechnicalErrorList

                    </td>
                    <td width="102" valign="top">
                        

RECORD

                    </td>
                    <td width="234" valign="top">
                        

Video Playback Failures (VPF) Technical Error list contains errors (including custom errors) that caused the video playback to fail due to technical logic issue.

For CSV output file, the VPFTechnicalErrorList value is in String format. For Parquet file, the value is in array format.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

PauseTime

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">
                        

Total pause time in milliseconds for a session.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">CIRRInterruptCount</td>
                    <td width="102" valign="top">INTEGER</td>
                    <td width="234" valign="top">The number of plays with interrupts caused by connection induced rebuffering.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

MicroPlayingTime

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">
                        

The total time in milliseconds that a session spent in continuous play time that lasted less than 200 milliseconds.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

MicroPlayingInterruptions

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">The total number of times a session spent in continuous play time that lasted less than 200 milliseconds. Sometimes, the player reports false play duration; this time is excluded from the Playing Time.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

MicroBufferingTime

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">
                        

The total time in milliseconds that a session spent in continuous buffering that is less than 200 milliseconds. Micro buffering could result in jittering due to the video playback and this is not excluded from the session's buffering.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

MicroBufferingInterruptions

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">The total number of times a session spent in continuous buffering that lasted less than 200 milliseconds. There can be jittering in the video playback when micro buffering occurs, and is not excluded from the session's buffering.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

LongRebufferingTime

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">
                        

The total time in milliseconds that a session spent in continuous buffering that lasted more than 90 seconds. Long buffering can occur because a player is stuck in a buffering state. Long rebuffering is excluded from rebuffering time.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

LongRebufferingInterruptions

                    </td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">
                        

The total number of times a session spent in continuous buffering that lasted more than 90 seconds. Long buffering can occur because a player is stuck in a buffering state. Long rebuffering this is excluded from rebuffering time.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

LastCDNEdgeServer

                    </td>
                    <td width="102" valign="top">
                        

STRING

                    </td>
                    <td width="234" valign="top">
                        

The IP address of the CDN Edge Server.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">
                        

LastCDNGroupID

                    </td>
                    <td width="102" valign="top">
                        

STRING

                    </td>
                    <td width="234" valign="top">
                        

The region or pop identifier of the CDN Edge Server.

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">ExitDuringPreRoll</td>
                    <td width="102" valign="top">
                        

SMALLINT

                    </td>
                    <td width="234" valign="top">A started session exited after a pre-roll ad break start was reported and before the pre-roll ad break end was reported. The session never reported ‘play’ state. </td>
                </tr>
                <tr>
                    <td width="198" valign="top">AdRelatedRebuffering</td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">
                        

Rebuffering duration in milliseconds which started up to 60 seconds after an ad

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">RebufferingDuringAds</td>
                    <td width="102" valign="top">
                        

INTEGER

                    </td>
                    <td width="234" valign="top">
                        

Rebuffering duration in milliseconds happening during the ad playback, using main video session playback

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">PausedRatio</td>
                    <td width="102" valign="top">FLOAT</td>
                    <td width="234" valign="top">The paused time as a ratio of the total playing time, including rebuffering and pauses.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">LastPlayheadTime</td>
                    <td width="102" valign="top">INTEGER</td>
                    <td width="234" valign="top">The last play time, after which a pause, end, or expire event occurred in a session that did not resume playing</td>
                </tr>
                <tr>
                    <td width="198" valign="top">NumBitrateSwitches</td>
                    <td width="102" valign="top">INTEGER</td>
                    <td width="234" valign="top">The number of the bitrate switches that occurred during the lifetime session. A bitrate switch occurs whenever a change in bitrate is detected. </td>
                </tr>
                <tr>
                    <td width="198" valign="top">AvgAverageBitRate</td>
                    <td width="102" valign="top">INTEGER</td>
                    <td width="234" valign="top">The average bitrate (in kilobytes per second) across the lifetime sessions as derived from the average bandwidth field of the manifest file. This value represents the time-weighted average bitrates played by the player.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">CIRRelatedExit</td>
                    <td width="102" valign="top">SMALLINT					</td>
                    <td width="234" valign="top">A user initiated exit that occurred either during connection induced rebuffering (non-seek rebuffering) or within 5 seconds of connection induced rebuffering before the session end.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">HouseholdID</td>
                    <td width="102" valign="top">
                        

VARCHAR(128)

                    </td>
                    <td width="234" valign="top">
                        

Unique identifier for a Household

                    </td>
                </tr>
                <tr>
                    <td width="198" valign="top">HouseholdIP</td>
                    <td width="102" valign="top">VARCHAR(48)</td>
                    <td width="234" valign="top">
                        

The physical residence's IP address, where the devices are located.

                        <div class="doc-callout doc-callout--note"><div class="doc-callout__body">If a <cite>Household IP</cite> address is accessible in IPv4 and IPv6 formats, then each session in the output file contains two records for that <cite>Household ID</cite>, one with an IPv4 address and the other with an IPv6 address.

To differentiate the records, Conviva advises to include both Household ID and Household IP fields in the custom column selection while creating a pipeline.

DeviceHardwareType

STRING

                    </td>
                    <td width="234" valign="top">The type of your device hardware such as set top box, mobile phone, tablet, and TV</td>
                </tr>
                <tr>
                    <td width="198" valign="top">DeviceManufacture</td>
                    <td width="102" valign="top">
                        

STRING

                    </td>
                    <td width="234" valign="top">The manufacturer of the device from which the content was watched, such as Google, Roku, Huawei, and Apple</td>
                </tr>
                <tr>
                    <td width="198" valign="top">DeviceMarketingName</td>
                    <td width="102" valign="top">
                        

STRING

                    </td>
                    <td width="234" valign="top">Marketing name of the device from which the content was watched, such as, Google Chromecast, Huawei P20, and Apple iPhone 12 Pro</td>
                </tr>
                <tr>
                    <td width="198" valign="top">DeviceName</td>
                    <td width="102" valign="top">
                        

STRING

                    </td>
                    <td width="234" valign="top">Name of the device from which the content was watched, such as, Android phone, Apple iPhone, and  Chromecast</td>
                </tr>
                <tr>
                    <td width="198" valign="top">DeviceOSVersion</td>
                    <td width="102" valign="top">STRING</td>
                    <td width="234" valign="top">The version of the operating system used by the device</td>
                </tr>
                <tr>
                    <td width="198" valign="top">DeviceOSFamily</td>
                    <td width="102" valign="top">STRING</td>
                    <td width="234" valign="top">The name of the operating system group, such as PlayStation for PlayStation 3 and PlayStation 4, or Windows for Windows 10 and Windows XP.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">BrowserVersion</td>
                    <td width="102" valign="top">STRING</td>
                    <td width="234" valign="top">The browser version of the device on which the content was watched</td>
                </tr>
                <tr>
                    <td width="198" valign="top">PlayerFrameworkName</td>
                    <td width="102" valign="top">STRING</td>
                    <td width="234" valign="top">The name of the player framework used for video playback, for example, AVFoundation, NexPlayer, and HTML5.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">PlayerFrameworkVersion</td>
                    <td width="102" valign="top">STRING</td>
                    <td width="234" valign="top">The version of the framework used for video playback.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">DeviceModel</td>
                    <td width="102" valign="top">
                        

STRING

                    </td>
                    <td width="234" valign="top">Model of the device, such as, iPad Pro 11-inch (2nd generation), EML-L29</td>
                </tr>
                <tr>
                    <td width="198" valign="top">DeviceVendor</td>
                    <td width="102" valign="top">STRING</td>
                    <td width="234" valign="top">Vendor of the device</td>
                </tr>
                <tr>
                    <td width="198" valign="top">ConnectionType</td>
                    <td width="102" valign="top">STRING</td>
                    <td width="234" valign="top">The type of network connection used to consume content, for example, mobile, wired, and wireless.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">DecisionBitrate</td>
                    <td width="102" valign="top">INTEGER</td>
                    <td width="234" valign="top">The btirate associated with resource returned  to  Precision. A value of 0 indicates the bitrate is not known. </td>
                </tr>
                <tr>
                    <td width="198" valign="top">DecisionResource</td>
                    <td width="102" valign="top">STRING</td>
                    <td width="234" valign="top">The internal  resource returned to  Precision.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">DecisionResourceId</td>
                    <td width="102" valign="top">STRING</td>
                    <td width="234" valign="top">The internal Conviva id for the component returning the result to Conviva Precision.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">DecisionResourceResolved</td>
                    <td width="102" valign="top">STRING</td>
                    <td width="234" valign="top">The resource being returned by Conviva Precision, for example Akamai Live Content Node.</td>
                </tr>
                <tr>
                    <td width="198" valign="top">pCoreCDN</td>
                    <td width="102" valign="top">STRING</td>
                    <td width="234" valign="top">The CDN being returned by Conviva Precision, for example AKAMAI. </td>
                </tr>
            </tbody>
        </table>
    </div>
    <div class="doc-callout doc-callout--note"><div class="doc-callout__body">HouseholdID is available only for customers who have StreamID feature enabled.</div></div>
    
    
    
create or replace temporary view simple_ssd as
  select
case when 'startup_error' = 0 and 'startup_time_ms' = -1 then true else false end as ebvs,
end_time_unix_time - start_time_unix_time as session_time_sec,
VSF_T,
VPF_T,
case when ended_status > 0 and playing_time_ms > 0 then true else false end as ended_play,
startup_time_ms,
playing_time_ms,
connection_induced_rebuffering_time_ms,
average_bitrate_kbps,
session_tags['Device Hardware Type'] as device_hardware_type
  from
ssd
create or replace temporary view base as
  select
*,
round(connection_induced_rebuffering_time_ms / (playing_time_ms + connection_induced_rebuffering_time_ms), 4) as cirr,
case
when ebvs and session_time_sec > 10 then true
when VSF_T then true
when VPF_T then true
when ended_play then true
else false
end as good_spi_stream,
case
when ebvs and session_time_sec > 8 then true
when VSF_T then true
when VPF_T then true
when ended_play then true
else false
end as best_spi_stream
  from
simple_ssd
create or replace temporary view prep as
  select
good_spi_stream,
best_spi_stream,
case
when ebvs and session_time_sec > 10 then "Bad"
when VSF_T then "Bad"
when VPF_T then "Bad"
when ended_play
and
(
startup_time_ms > 10000
or
(cirr > 0.004 and connection_induced_rebuffering_time_ms > 2000) -- I calculate percentages as values between 0 and 1 instead of 0 and 100, so threshold is 0.004 instead of 0.4
or
(
average_bitrate_kbps <= 200
or
device_hardware_type in ("Desktop","Tablet") and average_bitrate_kbps <= 400
or
device_hardware_type in ("TV","Set Top Box","Games Console") and average_bitrate_kbps <= 800
)
) then "Bad"
end as good_spi_bad,
case
when ebvs and session_time_sec > 8 then "Bad"
when VSF_T then "Bad"
when VPF_T then "Bad"
when ended_play
and
(
startup_time_ms > 10000
or
(cirr > 0.0002 and connection_induced_rebuffering_time_ms > 1000) -- I calculate percentages as values between 0 and 1 instead of 0 and 100, so threshold is 0.004 instead of 0.4
or
(
average_bitrate_kbps <= 400
or
device_hardware_type in ("Desktop","Tablet") and average_bitrate_kbps <= 800
or
device_hardware_type in ("TV","Set Top Box","Games Console") and average_bitrate_kbps <= 2000
)
) then "Bad"
end as best_spi_bad
from
base
select
  round((1 - sum(case when good_spi_bad = "Bad" then 1 else 0 end) / sum(case when good_spi_stream then 1 else 0 end)), 4) as good_spi,
  round((1 - sum(case when best_spi_bad = "Bad" then 1 else 0 end) / sum(case when best_spi_stream then 1 else 0 end)), 4) as best_spi
from
  prep
-- Select and compute fields necessary for SPI calculation from SSD
create or replace temporary view simple_ssd as
  select
case when 'startup_error' = 0 and 'startup_time_ms' = -1 then true else false end as ebvs,
end_time_unix_time - start_time_unix_time as session_time_sec,
VSF_T,
VPF_T,
case when ended_status > 0 and playing_time_ms > 0 then true else false end as ended_play,
startup_time_ms,
playing_time_ms,
connection_induced_rebuffering_time_ms,
average_bitrate_kbps,
session_tags['Device Hardware Type'] as device_hardware_type
  from
ssd

-- Determine whether each session is an SPI stream.
-- SPI streams do not include non-ended plays, VPF-B, VSF-B, and non-abandonment EBVS.
-- This is because we cannot definitively say whether such sessions are good or bad.
create or replace temporary view base as
  select
*,
round(connection_induced_rebuffering_time_ms / (playing_time_ms + connection_induced_rebuffering_time_ms), 4) as cirr,
case
when ebvs and session_time_sec > 10 then true
when VSF_T then true
when VPF_T then true
when ended_play then true
else false
end as good_spi_stream,
case
when ebvs and session_time_sec > 8 then true
when VSF_T then true
when VPF_T then true
when ended_play then true
else false
end as best_spi_stream
  from
simple_ssd

-- Compute whether a session is good or bad based on Good and Best SPI thresholds.
create or replace temporary view prep as
  select
good_spi_stream,
best_spi_stream,
case
when ebvs and session_time_sec > 10 then "Bad"
when VSF_T then "Bad"
when VPF_T then "Bad"
when ended_play
and
(
startup_time_ms > 10000
or
(cirr > 0.004 and connection_induced_rebuffering_time_ms > 2000) -- I calculate percentages as values between 0 and 1 instead of 0 and 100, so threshold is 0.004 instead of 0.4
or
(
average_bitrate_kbps <= 200
or
device_hardware_type in ("Desktop","Tablet") and average_bitrate_kbps <= 400
or
device_hardware_type in ("TV","Set Top Box","Games Console") and average_bitrate_kbps <= 800
)
) then "Bad"
end as good_spi_bad,
case
when ebvs and session_time_sec > 8 then "Bad"
when VSF_T then "Bad"
when VPF_T then "Bad"
when ended_play
and
(
startup_time_ms > 10000
or
(cirr > 0.0002 and connection_induced_rebuffering_time_ms > 1000) -- I calculate percentages as values between 0 and 1 instead of 0 and 100, so threshold is 0.004 instead of 0.4
or
(
average_bitrate_kbps <= 400
or
device_hardware_type in ("Desktop","Tablet") and average_bitrate_kbps <= 800
or
device_hardware_type in ("TV","Set Top Box","Games Console") and average_bitrate_kbps <= 2000
)
) then "Bad"
end as best_spi_bad
from
base

-- Compute aggregate SPI scores.
select
  round((1 - sum(case when good_spi_bad = "Bad" then 1 else 0 end) / sum(case when good_spi_stream then 1 else 0 end)), 4) as good_spi,
  round((1 - sum(case when best_spi_bad = "Bad" then 1 else 0 end) / sum(case when best_spi_stream then 1 else 0 end)), 4) as best_spi
from
  prep