How a SCTE-35 cue is structured
A SCTE-35 splice_info_section is a binary message that starts with a table_id of 0xFC followed by length, optional encrypted fields, the pts_adjustment, a splice_command_type, the command body, and finally a descriptor loop. Each segmentation_descriptor in that loop carries the meaning of the event - is this a provider ad start, a network ad end, a content break, a chapter, a placement opportunity?
Common splice_command_type values
| Hex | Name | Body | When used |
|---|---|---|---|
0x00 | splice_null | None | Heartbeat / spec test |
0x05 | splice_insert | splice_event_id, out-of-network flag, duration, splice_time | Legacy explicit splice point |
0x06 | time_signal | splice_time | Modern marker - meaning carried by descriptors |
0x07 | bandwidth_reservation | None | Reserve bandwidth for an event |
0xFF | private_command | Vendor-defined | Operator-specific signaling |
Common segmentation_type_id values
| Hex | Name | Meaning |
|---|---|---|
0x10 | Program Start | Program begins at this PTS |
0x11 | Program End | Program ends |
0x20 | Chapter Start | Chapter boundary - skip target |
0x21 | Chapter End | Chapter boundary - end |
0x30 | Provider Advertisement Start | National / provider ad break begins |
0x31 | Provider Advertisement End | National / provider ad break ends |
0x32 | Distributor Advertisement Start | Local / distributor ad break begins |
0x33 | Distributor Advertisement End | Local / distributor ad break ends |
0x34 | Provider Placement Opportunity Start | SSAI insertion point begins |
0x35 | Provider Placement Opportunity End | SSAI insertion point ends |
0x36 | Distributor Placement Opportunity Start | Distributor insertion point begins |
0x37 | Distributor Placement Opportunity End | Distributor insertion point ends |
0x40 | Unscheduled Event Start | Network start |
0x41 | Unscheduled Event End | Network end |
Frequently Asked Questions
What is SCTE-35?
SCTE-35 is the standard signaling format that tells downstream systems where ad breaks, program boundaries, and content metadata occur in a video stream. It is delivered as a binary splice_info_section in MPEG-2 Transport Streams or referenced by HLS EXT-X-DATERANGE and DASH EventStream entries.
How do I decode a SCTE-35 cue?
Decode the base64 or hex payload to bytes, then parse the splice_info_section: table_id, length, splice_command_type, command body, then a descriptor loop of segmentation_descriptors. Each segmentation_descriptor has a segmentation_type_id that names the event (for example 0x30 = Provider Advertisement Start).
What is the difference between splice_insert and time_signal?
splice_insert is older and explicitly directs a downstream splicer to switch at a given PTS. time_signal carries the splice point as a single PTS and relies on segmentation_descriptors for what the event is. Modern workflows favor time_signal + segmentation_descriptors.
How do PTS values map to seconds?
PTS ticks at 90,000 per second, so seconds = pts_ticks / 90000. A 30-second ad break covers 30 × 90,000 = 2,700,000 ticks.