An MPD is the DASH equivalent of HLS's multi-variant m3u8, but with everything packed into a single XML file. The root MPD element contains one or more Period elements (representing program segments, ad breaks, etc.), each containing AdaptationSet elements (one per content type — video, audio, subtitle), each containing Representation elements (one per rendition). Inside each Representation, either a SegmentList enumerates segment URLs or a SegmentTemplate parameterises them with $Number$ or $Time$ substitution.
MPD's XML structure is more expressive than m3u8's flat tag list — it can describe complex use cases like multi-period content with mid-roll ads, alternate camera angles, time-shifted live, dynamic insertion of representations, and per-period encryption. The cost is that MPDs are much harder to inspect by eye, and even small live MPDs run to 10–20 KB. dash.js uses the MPD's availabilityStartTime and publishTime to compute the live edge precisely.
In 2026, MPDs are most commonly generated by Shaka Packager, Bento4 or commercial packagers (Wowza, AWS MediaPackage, EZDRM). Most operators produce CMAF segments and emit both MPD (for DASH) and m3u8 (for HLS) pointing at the same files. The 2022 revision of ISO/IEC 23009-1 (the third edition) added precise low-latency operating points, CMCD support and updated DRM signalling for the modern PlayReady/Widevine/FairPlay combination.

