Tech Stack › Standards & Specs

SCTE-35 in CTV: how ad break signals work in video streams

SCTE-35 is the digital program insertion standard that tells ad systems where commercial breaks occur in a video stream. Every ad break in a live or linear CTV stream is triggered by a SCTE-35 marker embedded in the video transport stream. SSAI systems watch for these markers and use them as the signal to splice in advertising. For publishers moving content from broadcast to OTT streaming, SCTE-35 is the bridge between broadcast ad operations and programmatic CTV delivery.

What is SCTE-35

SCTE-35 (Society of Cable Telecommunications Engineers standard 35) defines a binary message format that is multiplexed into MPEG-2 transport streams. The message encodes when a break starts, how long it is, and what type of content should fill it. Originally designed for cable TV systems to trigger local commercial insertion, SCTE-35 has become the de facto standard for ad break signalling in any streaming video context.

For OTT and CTV streaming, SCTE-35 messages are extracted from the broadcast transport stream and converted to metadata markers that travel alongside the HLS or DASH video segments (typically as EXT-X-CUE-OUT/IN tags in HLS, or EventStream elements in DASH MPD). SSAI systems parse these markers to know when to run an ad decisioning call.

How SCTE-35 works in a video stream

  1. Broadcast origin: The content encoder embeds SCTE-35 splice_insert() or time_signal() messages at commercial break points in the MPEG-TS stream.
  2. OTT packaging: The video packager (e.g., AWS Elemental MediaPackage, Harmonic, Envivio) extracts SCTE-35 messages and converts them to HLS cue markers or DASH EventStream entries in the manifest.
  3. SSAI detection: The SSAI platform (SpringServe, FreeWheel, AWS MediaTailor) monitors the packaged stream for cue markers. When a splice-out marker is detected, the SSAI platform initiates an ad auction.
  4. Ad decisioning: The SSAI platform calls its ad server or SSP, receives an ad, fetches the creative, and has it ready to stitch.
  5. Stream stitching: At the splice point, the SSAI platform replaces the broadcast content stream with the stitched ad content, then returns to programme at the splice-in marker.

SSAI and SCTE-35: the timing challenge

The core challenge is timing. SCTE-35 splice markers typically arrive 4–6 seconds before the actual break, giving the SSAI system its decision window. If ad decisioning and creative fetching take longer than this pre-roll window, the SSAI system either delivers a late ad (causing viewer interruption) or falls back to a slate.

This is why SSAI systems pre-cache likely ad content and why auction timeout windows are so tight — the system must have the ad ready before the stream needs it, not after the viewer reaches the break.

Key SCTE-35 splice commands

CommandFunction
splice_insert()Marks start and end of an ad break; specifies duration and break ID
time_signal()More flexible; used for chapter markers, content identification, and segmentation descriptors beyond simple ad breaks
splice_null()Keep-alive message; confirms the SCTE-35 stream is active without triggering an action
bandwidth_reservation()Pre-allocates bandwidth for upcoming insertion; less commonly used in OTT

The segmentation_descriptor associated with time_signal() is increasingly used in OTT to carry more structured break information — content type (program start, chapter, ad break), content ratings, and segment identifiers used for addressable advertising.

India CTV context

India's OTT market has two distinct SCTE-35 scenarios:

Live linear streaming (news, live sports): Feeds from broadcast partners (Star Sports, Sony ESPN, News18) carry SCTE-35 markers from the broadcast chain. JioHotstar and SonyLIV's live streams extract and process these for SSAI. Ad break structures follow broadcast schedules — breaks are longer (2–4 minutes) and more frequent than on-demand content.

On-demand content: Pre-recorded content encoded for OTT may or may not carry SCTE-35 markers depending on the encoding workflow. Many Indian OTT originals are encoded without SCTE-35 and instead use manifest-level ad break markers (VMAP or HLS-level cues defined during packaging). The ad break structure is set by the publisher, not derived from broadcast signals.

For publishers integrating broadcast and OTT ad operations, proper SCTE-35 passthrough from broadcast chain to OTT packager is a common technical gap. Missing or malformed SCTE-35 markers result in missed ad opportunities — the SSAI system never receives the break signal and defaults to no-fill.

Common SCTE-35 implementation issues

  • Marker loss in transcoding: Some transcoders strip SCTE-35 from the TS stream. Verify that your encoding pipeline explicitly preserves SCTE-35 passthrough.
  • Timing drift: Presentation timestamps in SCTE-35 messages can drift from the actual video timeline after repeated re-encoding. Causes late or missed splice points.
  • Duration mismatch: Break duration in the SCTE-35 message doesn't match the actual ad pod configured in the ad server. Results in either dead air (too short) or content being cut off (too long).
  • Missing splice-in markers: If only splice-out markers are present (no corresponding splice-in), SSAI systems must estimate break end from the duration field — less reliable.
  • HLS cue tag format: Different SSAI platforms expect different HLS cue tag formats (EXT-X-CUE-OUT, EXT-X-DATERANGE, EXT-X-SPLICEPOINT-SCTE35). Confirm your packager outputs the format your SSAI platform expects.