This is the second post in a two-part series. Read the first post here.

It is quite common for AWS Elemental Live, which lets users encode live video on premises for events and 24/7 streams, to be used to deliver live streams into Amazon Web Services (AWS) for over-the-top (OTT) workflows and to distribute a linear stream to affiliated media outlets. In the example event below, AWS Elemental Live encodes live video and interacts with a placement opportunity information service (POIS) for conditioning. This conditioning is for the SCTE 35 standard, which was created by the American National Standards Institute (ANSI) and the Society of Cable Telecommunications Engineers (SCTE). AWS Elemental Live then sends the live stream into AWS through AWS Elemental MediaConnect, a high-quality transport service for live video, which then propagates to downstream AWS Media Services for processing and delivery. The event signaling and management (ESAM) configuration of this event uses an endpoint from a POIS reference server. We observe both the SCTE 35 signals that are in the live stream and ESAM transactions with the POIS in various log files on AWS Elemental Live.

Architecture diagram of AWS Elemental Live contributing a live stream to a cloud-based workflow

Walkthrough

In this walkthrough, we are going to do the following:

  • Create a new event on an AWS Elemental Live encoder
  • Configure the event to use the ESAM interface for when SCTE 35 signals are received in the source stream
  • Start the live output stream and observe channel logs to look at inbound SCTE 35 signals and ESAM notifications
  • Dive deeper into the ESAM notifications to see the exact messages sent to and received back from the POIS

Prerequisites

For this walkthrough, you should have the following:

  • An AWS Elemental Live encoder
  • A live stream source with SCTE 35 signaling or, for testing purposes, a transport stream (TS) file that has SCTE 35 signaling embedded
  • Access to a POIS endpoint
  • Knowledge of encoding, SCTE 35, and uses for ESAM

Create a new event with ESAM

  1. Connect to your AWS Elemental Live user interface (UI).
  2. In the AWS Elemental Live Event Control tab, create a new event.
  3. Scroll down to Ad Avail Controls and expand this section. From the Ad Avail Trigger drop-down list, select ESAM. Doing this will expose the fields required to successfully interact with the POIS. The following table outlines the parameters and their use:
Property Description Example
Ad Avail Offset An offset (in milliseconds) that can be added, when specified, to the input Ad Avail presentation timestamp (PTS) time and can be used for corrective action on when the SCTE 35 signal should be inserted 281
Acquisition Point ID A unique identity of the acquisition point identifying the signal acquisition system channel1
Asset URI Indentifier An optional uniform resource identifier (URI) of the asset being processed that is passed to the signal conditioner as part of the UriProcessingRequest message provider.com/Asset/UNVA2001081701004002
Zone Identity An optional string that represents the location of this stream (examples may include Ad Zone or VIRD) Z01
Signal Conditioner Endpoint Hypertext Transfer Protocol (HTTP) representational state transfer (REST) endpoint for signal conditioning requests https://a.execute-api.us-west-2.amazonaws.com/v1/scc
Alternate Signal Conditioner Endpoint Alternate signal confirmation and conditioning (SCC) endpoint for redundancy https://b.execute-api.us-west-2.amazonaws.com/v1/scc
Manifest Conditioner Endpoint HTTP RESTful endpoint for manifest conditioning requests https://a.execute-api.us-west-2.amazonaws.com/v1/mcc
Alternate Manifest Conditioner Endpoin Alternate manifest confirmation and conditioning (MCC) endpoint for redundancy https://b.execute-api.us-west-2.amazonaws.com/v1/mcc
Response Signal Preroll Specifies the stream distance between the placement of POIS-supplied SCTE 35 messages and the splice points that they refer to (if there is insufficient notification time to honor the entire preroll, then the SCTE 35 message will be placed immediately 4,000 (milliseconds)

For SCTE 35 signal conditioning, you need (at a minimum) to use the Acquisition Point Identifier field and the Signal Conditioner Endpoint. When an SCTE 35 signal is received on the input, the AWS Elemental Live encoder will send a call to the endpoint configured for instructions on what to do with the SCTE 35 signal.

Screen capture of Ad Avail Controls within the AWS Elemental Live event graphical user interface (GUI)

  1. Enter your POIS endpoint information in the Signal Conditioner Endpoint field.
  2. In your AWS Elemental Live event, scroll down to Output Groups and add an output group to the event. For the purposes of this test, you can add a UDP/TS output group (for output to local network) or Reliable TS for distribution across the wide area network (WAN) to a reliable transport receiver, such as AWS Elemental MediaConnect, Zixi Receiver, or a Secure Reliable Transport (SRT) Gateway.

Screen capture of supported output groups in AWS Elemental Live, with Reliable TS and UDP/TS highlighted

  1. After you’ve added the output group, add a stream to the group. You can build a video and audio encoding profile from scratch, or you can select one of the presets available on the encoder. Select Add Output to add the stream to the event.

Screen capture of AWS Elemental Live Add Output section

  1. In the Outputs section of the event, you will configure your stream destination. This is also where you will need to update the outbound transport stream to pass the ESAM-conditioned SCTE 35 signal to the output. To do this, expand PID Control and select the checkbox marked ESAM SCTE-35.

Screen capture of AWS Elemental Live Outputs section with PID Control and ESAM SCTE-35 properties highlighted

  1. Now finish configuring your live event:
    1. Add an input source for the live event
    2. Configure a valid output destination
    3. Configure your output stream’s video and audio settings (if needed)

Further information on how to do the above can be found in the AWS Elemental Live user guide here: https://docs.aws.amazon.com/elemental-live/.

  1. After you’ve completed your event configuration, press the Create button. This will save the event parameters and take you to the Event Control page in the AWS Elemental Live UI.

Screen capture of AWS Elemental Live Event Control with the Event Start button highlighted

  1. Press the Start button to begin the live event.

Good job! You’ve configured a live event and are utilizing the ESAM SCC interface to get SCTE 35 conditioning information from a POIS. Every time an SCTE 35 signal is detected in the source stream, a call to the POIS will be made.

Validate ESAM and SCTE 35 conditioning

  1. Go to your running events control window. You can do this by navigating to the Event Control tab and then selecting the magnifying glass to the right-hand side of the event.
  2. Within the Event Control window, select the Log File tab to reveal the live logs of the running event. The highlighted selection below shows you what you can expect when you receive an SCTE 35 signal in the source stream.

Screen capture of AWS Elemental Live Event logs with SCTE 35 and ESAM lines highlighted

The first line prints the time the SCTE 35 signal was received as well as the properties of the SCTE 35 signal:

2021-10-15 19:18:30 I [ 16034] {10,global} SCTE 35::time_signal [Clock=IngestM2TS] [PCR=00:00:54.066] [SpliceTimeBeforeAdjustment=00:00:52.866] [SpliceTime=00:00:54.900] [SplicePreroll=00:00:00.833] [Base64=/DA3AAAAAsrYAP/wBQb+AEiZ8AAhAh9DVUVJAAAAAX/YAAAUmXAMCXVwaWR2YWx1ZTQBAQEBudd/dw==] [pts_time=4758000] [pts_adjustment=183000] [SegmentationDescriptor [splice_descriptor_tag=0x02] [descriptor_length=31] [segmentation_event_id=0x00000001] [segmentation_event_cancel_indicator=0] [program_segmentation_flag=1] [segmentation_duration_flag=1] [delivery_not_restricted_flag=0] [web_delivery_allowed_flag=1] [no_regional_blackout_flag=1] [archive_allowed_flag=0] [device_restrictions=0x00] [segmentation_duration=1350000=00:00:15.000] [segmentation_upid_type=0x0C] [segmentation_upid_length=9] [segmentation_type_id=0x34=Provider Placement Opportunity Start] [segment_num=1] [segments_expected=1] [sub_segment_num=1] [sub_segments_expected=1]]

The second line reveals the utcPoint that the SCTE 35 signal relates to, and you can also see a print denoting when the SCTE 35 signal should take place from the current utcPoint:

2021-10-15 19:18:30 I [ 16072] {10,global} ESAM SCC incoming SCTE 35. ID=bfcdc8e6-ff1f-0336-c776-9bfeff7fada5 utcPoint=2021-10-15T19:18:31.432Z Avail in=0.833 sec

The logs related to ESAM have the “ESAM” prefix in the printout. Important entries here are as follows:

  • “ESAM Signal Event Created”—this indicates that the ESAM Signal Processing Event has been created and sent to the configured ESAM endpoint.
  • “ESAM Processing Notification Response Signals”—this indicates the number of response signal elements received in the ESAM response, as well as the classCode response that the POIS has returned. Valid classCode values are between zero and three. For more information about class codes and the statusCode object, you can refer to the ESAM I03 standard.
  • “ESAM ResponseSignal”—this entry prints the action specified in the signal processing event (SPE).

2021-10-15 19:18:30 I [ 16040] {10,global} ESAM Signal Event Created.
2021-10-15 19:18:31 I [ 16040] {10,global} ESAM TimeToDemuxPTS point time [2021-10-15T19:18:31.432Z]. Current time is [2021-10-15T19:18:31.232Z] uPTS=[4955910] iVideoPTS=[4755000] iPTSOffset=[183000].
2021-10-15 19:18:31 I [ 16040] {10,global} ESAM Processing Notification Response Signals [1]. ClassCode=[0].
2021-10-15 19:18:31 I [ 16040] {10,global} ESAM ResponseSignal: ID=bfcdc8e6-ff1f-0336-c776-9bfeff7fada5 CurrentUTC=2021-10-15T19:18:31.232Z UTC=2021-10-15T19:18:31.432Z Action=2 (delete).

If there are issues with connectivity to your POIS endpoint, you will see log entries similar to the following:

2021-10-11 17:22:33 I [ 7789] {10,global} ESAM Signal Event Created.
2021-10-11 17:22:33 W [ 7789] {10,global} ESAM retrying, [x] remaining for URL [https://n5gfnvl1b3.execute-api.us-west-2.amazonaws.com/v1/esam]
2021-10-11 17:22:43 W [ 7789] {10,global} ESAM exhausted retry count for URL [https://n5gfnvl1b3.execute-api.us-west-2.amazonaws.com/v1/esam]

  1. For further ESAM request/response analysis, you can look at the esam_scc log that gets created and updated while the event is running. To view this log, select the View Logs button to the right-hand side of the Event Control window.

Screen capture of AWS Elemental Live Event Control with the View Logs button highlighted

  1. In the log list view, select the most recent *_esam_scc.log file.

Screen capture of AWS Elemental Live Event Control Log list with the ESAM SCC log file highlighted

Every SPE that the transcoder creates and sends to the POIS gets printed in the esam_scc log. Likewise, every signal processing notification (SPN) that the transcoder receives back from the POIS also gets printed in this log. Below are examples of SPE and SPN entries in the esam_scc log:

2021-10-15 20:16:18 SignalProcessingEvent (1)
<SignalProcessingEvent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sig="urn:cablelabs:md:xsd:signaling:3.0" xsi:schemaLocation="urn:cablelabs:iptvservices:esam:xsd:signal:1 OC-SP-ESAM-API-I03-Signal.xsd" xmlns="urn:cablelabs:iptvservices:esam:xsd:signal:1">
<AcquiredSignal acquisitionPointIdentity="channel1" acquisitionSignalID="bfcdc8e6-ff1f-0336-c776-9bfeff7fadc6" acquisitionTime="2021-10-15T20:16:19.732Z" zoneIdentity="">
<sig:UTCPoint utcPoint="2021-10-15T20:16:19.732Z"/>
<sig:BinaryData signalType="SCTE 35">/DA3AAAAAsrYAP/wBQb+AEiZ8AAhAh9DVUVJAAAAAX/YAAAUmXAMCXVwaWR2YWx1ZTQBAQEBudd/dw==</sig:BinaryData>
<sig:StreamTimes>
<sig:StreamTime timeType="HLS" timeValue="316905000"/>
<sig:StreamTime timeType="PTS" timeValue="316905000"/>
</sig:StreamTimes>
</AcquiredSignal>
</SignalProcessingEvent>

2021-10-15 20:16:18 SignalProcessingNotification (1)
<SignalProcessingNotification xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sig="urn:cablelabs:md:xsd:signaling:3.0" xmlns:core="urn:cablelabs:md:xsd:core:3.0" xmlns="urn:cablelabs:iptvservices:esam:xsd:common:1" xsi:schemaLocation="urn:cablelabs:iptvservices:esam:xsd:common:1 OC-SP-ESAM- API-I0x-Common.xsd">
<ResponseSignal action="delete" acquisitionPointIdentity="channel1" acquisitionSignalID="bfcdc8e6-ff1f-0336-c776-9bfeff7fadc6" zoneIdentity="">
<sig:UTCPoint utcPoint="2021-10-15T20:16:19.732Z"/>
<sig:StreamTimes>
<sig:StreamTime timeType="HLS" timeValue="316905000"/>
<sig:StreamTime timeType="PTS" timeValue="316905000"/>
</sig:StreamTimes>
</ResponseSignal>
<StatusCode classCode="0">
<core:Note>matched rule '0'</core:Note>
</StatusCode>
</SignalProcessingNotification>

Conclusion

In this blog post, you learned how to create a live event that supports ESAM on an AWS Elemental Live encoder as well as how to validate POIS communication using the AWS Elemental Live ESAM interface. Stay tuned for Part 3: Virtual input switching in AWS Elemental Live, where we show you how use SCTE 35 signals and ESAM to manage frame accurate input switches on AWS Elemental Live.