@startuml participant SegmentLoader order 1 participant "media-segment-request" order 2 participant "videojs-contrib-media-sources" order 3 participant mux.js order 4 participant "Native Source Buffer" order 5 SegmentLoader -> "media-segment-request" : mediaSegmentRequest(...) group Request "media-segment-request" -> SegmentLoader : doneFn(...) note left At end of all requests (key/segment/init segment) end note SegmentLoader -> SegmentLoader : handleSegment(...) note left "Probe" (parse) segment for timing and track information end note SegmentLoader -> "videojs-contrib-media-sources" : append to "fake" source buffer note left Source buffer here is a wrapper around native buffers end note group Transmux "videojs-contrib-media-sources" -> mux.js : postMessage(...setAudioAppendStart...) note left Used for checking for overlap when prefixing audio with silence. end note "videojs-contrib-media-sources" -> mux.js : postMessage(...alignGopsWith...) note left Used for aligning gops when overlapping content (switching renditions) to fix some browser glitching. end note "videojs-contrib-media-sources" -> mux.js : postMessage(...push...) note left Pushes bytes into the transmuxer pipeline. end note "videojs-contrib-media-sources" -> mux.js : postMessage(...flush...) "mux.js" -> "videojs-contrib-media-sources" : postMessage(...data...) "videojs-contrib-media-sources" -> "Native Source Buffer" : append "Native Source Buffer" -> "videojs-contrib-media-sources" : //updateend// "videojs-contrib-media-sources" -> SegmentLoader : handleUpdateEnd(...) end end SegmentLoader -> SegmentLoader : handleUpdateEnd_() note left Saves segment timing info and starts next request. end note @enduml