Demuxed 2023, which took place Oct. 24–25 in San Francisco, is the premier peer-organized and peer-approved video developer conference. There’s supposed to be no marketing at the event. Although the first person I ran into was a sales rep, much of the time I spent there was listening or talking with technical contacts. The most interesting presentation for me was from Pluto.
Server-Initiated Client-Side Just-In-Time Stitching in ABR Streaming
Spencer Shanson, SVP Streaming Architecture at Paramount, introduced the presentation. Pluto’s 2000 linear channels on their FAST service are powered by a proprietary stitcher to generate manifests for HLS and DASH. Ads are inserted dynamically for virtual linear live (playlists) and VOD content. They started off a research project to see about improving their ad delivery.
Previously in virtual linear live stream delivery, 60 seconds before the ad break, a request for ads for the upcoming pod was stitched in. Meanwhile, VOD assets would request the entire manifest in advance, and this often could delay time to first frame. The goal of their research project was to create a complete manifest with ad pod placeholders (not real ads) and enables ad pods to be filled just in time (JIT).
Prabhu Hosur, Principal Architect, Video Services at Paramount, continued the presentations, speaking about how the client requests a manifest and the stitcher collects content manifest and inserts placeholders without requesting or waiting for ads. An ad system (ads, ad transcoder, and packager) will make decisions offline before the next placeholder appears. The decisions are provided to the ad manifest server ahead of time. The client requests the ad pod manifest JIT, requesting only the next upcoming pod (rather than all ad pods in the entire clip). After this ad pod manifest is received, client side stitching is done.
For HLS, player one plays content and player two plays the ad pod, and then player one resumes control. Code is as follows:
Start date is the scheduling of the placeholder. JSON file is the placeholder that contains the ad URL’s. These are downloaded JIT.
DASH period file is the placeholder for ad pod. Code is as follows:
In either HLS or DASH there is no mention of the number of ads or the pod duration. The backend services can make those choices dynamically.
Client work was described by Kevin Yu, Video Architect, Streaming Services at Paramount. First he covered HLS using AVPlayer Interstitials APIs, event controller, and event. The pink boxes in the photo below are custom work. The JSON file is used first as the placeholder and then later replaced by the m3u8 ad file.
For MPEG-DASH, the focus was on DASH.js (4.7.2), which they consider the most standard compliant open-source player. Brown boxes represent player modules, pink is the project’s enhancements. They are extending the onRequest capability of DASH.js. Brown shows Fragment model taking MP4 segments from the CDN. PlayBackController and ScheduleController work with BufferController to initiate manage source buffer and eventually the MSE is played back.
They designed a dynamic event trigger to trigger the manifest updater identified in the rounded box in diagram to update dynamically. It’s triggered by an event provided by the stream controller. This starts the manifest loader and refreshing process. XlinkController is used next to start resolving and parse original MPD to look for any periods, and it updates the original manifest.