SPI Calculation based on Content Summary

This document describes how to derive the Streaming Performance Index (SPI) data based on Content Summary reports of Conviva Connect.

Updated 2026-07-02 conviva-connect-spi-calculation

SPI Calculation based on Content Summary

This document describes how to derive the Streaming Performance Index (SPI) data based on Content Summary reports of Conviva Connect.

SPI provides a visual indicator of your KPIs performance, allowing you to quickly assess the number and percentage of affected streams and their performance levels. A stream is impacted if 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.

This example shows one approach for deriving SPI from your connect data.

  1. Select and compute fields necessary for SPI calculation, such as startup time, average bitrate, and re-buffering.

Copy
create or replace temporary view simple_ssd as
  select
    case when StartupError = 'false' and StartupTime = -1 then true else false end as ebvs,
    EndTimeUnix - StartTimeUnix as session_time_sec,
    VSFTechnical as VSF,
    VPFTechnical as VPF,
    case when EndedStatus > 0 and PlayingTime > 0 then true else false end as ended_play,
    StartupTime,
    PlayingTime,
    ReBufferingTime,
    ConnectionInducedRebufferingTime,
    AverageBitRate,
    DeviceHardwareType
  from
    ssd
  1. Determine if each session is a valid SPI stream. SPI streams do not include non-ended plays, failures due to business errors, and non-abandonment EBVS.

Copy
create or replace temporary view valid_spi as
  select
      *,
      (case when ended_play then ConnectionInducedRebufferingTime else 0 end) / (case when StartupTime > 0 or (StartupTime = -3 and PlayingTime >= 0) then ReBufferingTime + PlayingTime end) as cirr,
      case
          when ebvs and session_time_sec >= 10 then true
          when VSF = 'true' then true
          when VPF = 'true' 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 = 'true' then true
          when VPF = 'true' then true
          when ended_play then true
          else false
        end as best_spi_stream
    FROM
      simple_ssd
  1. Compute whether the SPI sessions qualify against the SPI Good and Best threshold settings.

Copy
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 = 'true' then "Bad"
        when VPF = 'true' then "Bad"
        when ended_play
          and
            (
                  startup_time_ms >= 10000
                  or
                  (cirr > 0.004 and ConnectionInducedRebufferingTime >= 2000) -- calculate percentages as values between 0 and 1 instead of 0 and 100, so threshold is 0.004 instead of 0.4
                  or
                  (
                       (AverageBitRate > 0 and AverageBitRate <= 200)
                       or
                       (DeviceHardwareType in ("Desktop","Tablet") and AverageBitRate > 0 and AverageBitRate <= 400)
                       or
                       (DeviceHardwareType in ("TV","Set Top Box","Games Console") and AverageBitRate > 0 and AverageBitRate <= 800)
                  )
         ) then "Bad"
        end as good_spi_bad,
      case
        when ebvs and session_time_sec >= 8 then "Bad"
        when VSF = 'true' then "Bad"
        when VPF = 'true' then "Bad"
        when ended_play
          and
            (
                  startup_time_ms >= 10000
                  or
                  (cirr > 0.0002 and ConnectionInducedRebufferingTime >= 1000) -- calculate percentages as values between 0 and 1 instead of 0 and 100, so threshold is 0.0002 instead of 0.02
                  or
                  (
                       (AverageBitRate > 0 and AverageBitRate <= 400)
                       or
                       (DeviceHardwareType in ("Desktop","Tablet") and AverageBitRate > 0 and AverageBitRate <= 800)
                       or
                       (DeviceHardwareType in ("TV","Set Top Box","Games Console") and AverageBitRate > 0 and AverageBitRate <= 2000)
                  )
         ) then "Bad"
        end as best_spi_bad
    from
      valid_spi
  1. Aggregate and total the session performance and compute the SPI scores.

Copy
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) * 100 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) * 100 as best_spi
from
  prep
Copy
-- Select and compute fields necessary for SPI calculation from SSD
create or replace temporary view simple_ssd as
  select
    case when StartupError = 'false' and StartupTime = -1 then true else false end as ebvs,
    EndTimeUnix - StartTimeUnix as session_time_sec,
    VSFTechnical as VSF,
    VPFTechnical as VPF,
    case when EndedStatus > 0 and PlayingTime > 0 then true else false end as ended_play,
    StartupTime,
    PlayingTime,
    ReBufferingTime,
    ConnectionInducedRebufferingTime,
    AverageBitRate,
    DeviceHardwareType
  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 valid_spi as
  select
      *,
      (case when ended_play then ConnectionInducedRebufferingTime else 0 end) / (case when StartupTime > 0 or (StartupTime = -3 and PlayingTime >= 0) then ReBufferingTime + PlayingTime end) as cirr,
      case
          when ebvs and session_time_sec >= 10 then true
          when VSF = 'true' then true
          when VPF = 'true' 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 = 'true' then true
          when VPF = 'true' 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 = 'true' then "Bad"
        when VPF = 'true' then "Bad"
        when ended_play
          and
            (
                  startup_time_ms >= 10000
                  or
                  (cirr > 0.004 and ConnectionInducedRebufferingTime >= 2000) -- calculate percentages as values between 0 and 1 instead of 0 and 100, so threshold is 0.004 instead of 0.4
                  or
                  (
                       (AverageBitRate > 0 and AverageBitRate <= 200)
                       or
                       (DeviceHardwareType in ("Desktop","Tablet") and AverageBitRate > 0 and AverageBitRate <= 400)
                       or
                       (DeviceHardwareType in ("TV","Set Top Box","Games Console") and AverageBitRate > 0 and AverageBitRate <= 800)
                  )
         ) then "Bad"
        end as good_spi_bad,
      case
        when ebvs and session_time_sec >= 8 then "Bad"
        when VSF = 'true' then "Bad"
        when VPF = 'true' then "Bad"
        when ended_play
          and
            (
                  startup_time_ms >= 10000
                  or
                  (cirr > 0.0002 and ConnectionInducedRebufferingTime >= 1000) -- calculate percentages as values between 0 and 1 instead of 0 and 100, so threshold is 0.0002 instead of 0.02
                  or
                  (
                       (AverageBitRate > 0 and AverageBitRate <= 400)
                       or
                       (DeviceHardwareType in ("Desktop","Tablet") and AverageBitRate > 0 and AverageBitRate <= 800)
                       or
                       (DeviceHardwareType in ("TV","Set Top Box","Games Console") and AverageBitRate > 0 and AverageBitRate <= 2000)
                  )
         ) then "Bad"
        end as best_spi_bad
    from
      valid_spi
-- 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) * 100 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) * 100 as best_spi
from
  prep