SCTE-35 markers

Considerations for signaling ad insertion opportunities in source manifests

Live streams

Ad Replacement in Live streams can be achieved thanks to in-band signaling such as SCTE-35 Markers. broadpeak.io has specific requirements around the signalling of these markers in MPEG-DASH and HLS manifests, but also around the SCTE-35 Payload content that are worth noting.

SCTE-35 Signalling in MPEG-DASH Manifest

📘

Supported Markers

  • SCTE-35 markers are either urn:scte:scte35:2014:xml, urn:scte:scte35:2014:xml+bin or urn:scte:scte35:2013:xml

For Live Ad replacement, broadpeak.io relies on in-band markers to detect the beginning of an Ad in the stream. splice insert et time signal cue-out types are supported.

SCTE-35 Requirements

For both "urn:scte:scte35:2013:xml" and "urn:scte:scte35:2014:xml+bin":

  • The Event@messageData attribute must not be used.
  • The sum of Event@presentationTime (=epochTime x timescale) and Event@duration (seconds x timescale) must never exceed the period duration, if known at the time of creation. An event whose Event@presentationTime is later than the end of the period due to an MPD update must be ignored.
  • There should not be more than one SCTE-35 MPD event with an identical value of the Event@presentationTime attribute.

Presentation of the Manifest

In single period mode, the marker is signalled inside an EventStreamXML node parent, as Event element. Event elements must carry an XML and/or a binary representation of the SCTE-35 cue message.

SCTE-35 Marker's type

Supported SCTE-35 markers are the following:

  • urn:scte:scte35:2014:xml
  • urn:scte:scte35:2014:xml+bin
  • urn:scte:scte35:2013:xml

XML SCTE-35 Event

Example:

<EventStream timescale="90000" schemeIdUri="urn:scte:scte35:2013:xml">
  <Event duration="2699769">
    <scte35:SpliceInfoSection protocolVersion="0" ptsAdjustment="8586003992" tier="4095">
      <scte35:SpliceInsert spliceEventId="1" spliceEventCancelIndicator="false" outOfNetworkIndicator="true" spliceImmediateFlag="false" uniqueProgramId="1" availNum="1" availsExpected="1">
        <scte35:Program>
          <scte35:SpliceTime ptsTime="2346545680"/>
          </scte35:Program>
        <scte35:BreakDuration autoReturn="true" duration="2699769"/>
      </scte35:SpliceInsert>
    </scte35:SpliceInfoSection>
  </Event>
</EventStream>

Base-64 encoded SCTE-35 Event

Example:

<EventStream
      schemeIdUri="urn:scte:scte35:2014:xml+bin"
      timescale="10000000">
      <Event
        presentationTime="15516962501159406"
        id="3999785549">
        <Signal xmlns="http://www.scte.org/schemas/35/2016"> 
           <Binary>/DAnAAAAAAAAAP/wBQb/Y/SedwARAg9DVUVJAAAAPH+/AAAjAQEGLc/Q
           </Binary>
        </Signal>
      </Event>
</EventStream>

SCTE-35 signalling in HLS Manifest

📘

Supported markers

  • EXT-X-DATERANGE markers with a duration and start-time
  • EXT-OATCLS-SCTE35markers with a duration and start-time
  • EXT-X-CUE-OUT/INmarkers without payload and with a duration (but without attribute duration)

Supported markers in HLS are officials EXT-X-DATERANGE:ID markers and EXT-OATCLS-SCTE35 markers.

DATERANGE markers - Example:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:217514
#EXT-X-DISCONTINUITY-SEQUENCE:21
#EXT-X-PROGRAM-DATE-TIME:2022-09-20T08:43:59.640Z
#EXTINF:6.000,
index_4_217514.ts?m=1660741368
#EXTINF:3.760,
index_4_217515.ts?m=1660741368
#EXT-X-DATERANGE:ID="18",START-DATE="2022-09-20T08:44:09.400Z",PLANNED-DURATION=45.000,SCTE35-OUT=0xFC302F00015CE9AA1800FFF01405000000127FEFFEE51CEE007E003DCC50000112FF000A00084355454900000012C2A52C21
#EXTINF:6.240,
index_4_217516.ts?m=1660741368
#EXTINF:6.000,
index_4_217517.ts?m=1660741368
#EXTINF:6.000,
index_4_217518.ts?m=1660741368
#EXTINF:6.000,
index_4_217519.ts?m=1660741368
#EXTINF:6.000,
index_4_217520.ts?m=1660741368
#EXTINF:6.000,
index_4_217521.ts?m=1660741368
#EXTINF:6.000,
index_4_217522.ts?m=1660741368
#EXTINF:2.760,
index_4_217523.ts?m=1660741368
#EXTINF:5.240,
index_4_217524.ts?m=1660741368

Some mandatory requirements when using DATERANGE markers

  • each marker ID must be unique
  • the START-DATE must be specified in clear or inside the payload
  • the duration of the break should be specified under PLANNED-DURATION or DURATION in clear or inside the payload
  • there must be a SCTE35-OUT or SCTE35-CMD attribute

OATCLS markers - Example:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:51098
#EXT-X-PROGRAM-DATE-TIME:2022-12-27T09:37:00.000Z
#EXTINF:6.000,
video_1080p_1000010996/725449020000.ts
#EXTINF:6.000,
video_1080p_1000010996/725449026000.ts
#EXTINF:6.000,
video_1080p_1000010996/725449032000.ts
#EXTINF:3.240,
video_1080p_1000010996/725449038000.ts
#EXT-OATCLS-SCTE35:/DAqAAAAAAAAAP/wDwUAADTHf//+AKTLgAAAAAAACgAIQ1VFSQAAAAAD+kMv
#EXTINF:2.760,
video_1080p_1000010996/725449041240.ts
#EXTINF:6.000,
video_1080p_1000010996/725449044000.ts
#EXTINF:6.000,
video_1080p_1000010996/725449050000.ts
#EXTINF:6.000,
video_1080p_1000010996/725449056000.ts
#EXTINF:6.000,
video_1080p_1000010996/725449062000.ts
#EXTINF:6.000,
video_1080p_1000010996/725449068000.ts

Some information when using OATCLS markers

  • The start-time of the markers is not taken from the payload, but computed from the media manifest, based on EXT-X-PROGRAM-DATETIME value. The placement of the marker in the playlist is important.
  • The duration of the break must be specified inside the payload

CUE-OUT/CUE-IN markers - Example:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:51098
#EXT-X-PROGRAM-DATE-TIME:2022-12-27T09:37:00.000Z
#EXTINF:6.000,
video_1080p_1000010996/725449020000.ts
#EXTINF:6.000,
video_1080p_1000010996/725449026000.ts
#EXTINF:6.000,
video_1080p_1000010996/725449032000.ts
#EXTINF:3.240,
video_1080p_1000010996/725449038000.ts
#EXT-X-CUE-OUT:20.76
#EXTINF:2.760,
video_1080p_1000010996/725449041240.ts
#EXTINF:6.000,
video_1080p_1000010996/725449044000.ts
#EXTINF:6.000,
video_1080p_1000010996/725449050000.ts
#EXTINF:6.000,
video_1080p_1000010996/725449056000.ts
#EXT-X-CUE-IN
#EXTINF:6.000,
video_1080p_1000010996/725449062000.ts
#EXTINF:6.000,
video_1080p_1000010996/725449068000.ts

Some information when using CUE-OUT/CUE-IN markers

  • The start-time of the markers is not taken from the media manifest, based on EXT-X-PROGRAM-DATETIME value and the position of the marker in the playlist.
  • The #EXT-X-CUE-OUT must not come with the attribute duration as not supported.
    Ex: #EXT-X-CUE-OUT:DURATION=20.75 will not work.
  • No payload should be associated to the marker.

SCTE-35 Payload

📘

SCTE-35 Payload

  • Cue-out markers are either splice_insert() or time_signal() commands
  • segmentation_type_id must be 34 (0x22), 48 (0x30), 50 (0x32), 52 (0x34) or 54 (0x36)

Commands

broadpeak.io supports the two following SCTE commands:

  • splice_insert() - 0x05
  • time_signal() - 0x06

📘

Note

Both splice_insert() and time_signal() commands triggers the same type of behavior broadpeak.io when associated with the right segmentation_type_id value, which is to perform a VAST request to the Ad server, and to try to insert Creative(s) as per the VAST payload description.

SCTE-35 Segmentation type ids

The list of segmentation_type_id supported by the broadpeak.io is :

  • Break Start - 0x22 (34)
  • Provider Advertisement Start - 0x30 (48)
  • Distributor Advertisement Start - 0x32 (50)
  • Provider Placement Opportunity Start - 0x34 (52)
  • Distributor Placement Opportunity Start - 0x36 (54)

📘

Note

All supported segmentation_type_id values triggers the same type of behavior broadpeak.io when associated with the right SCTE-35 command, which is to perform a VAST request to the Ad server, and to try to insert Creative(s) as per the VAST payload description.

Ad-break duration

If not specified in the signalling itself, or if the value provided in the signalling is not valid, broadpeak.io will look for the Ad break duration within the payload itself.

On-demand streams

🚧

SCTE-35 are not supported on On-demand streams

SCTE-35 markers are only one way to signal mid-roll advertisement placement opportunities into a VOD content, and it is not supported by broadpeak.io. Instead we invite you to use out-of-band type of signaling through VMAP, combined with accurate content conditioning to achieve frame accurate mid-roll advertising on On-demand content.